From de4e9a843920912fed05bcd88f1eed4d7e078260 Mon Sep 17 00:00:00 2001 From: Ryan Niebur Date: Thu, 14 May 2009 21:14:10 -0700 Subject: [PATCH] Imported Upstream version 0.1.6 --- AUTHORS | 64 + COPYING | 504 ++ ChangeLog | 314 ++ EXPAT | 18 + HACKING | 94 + INSTALL | 56 + README | 26 + TODO | 43 + TRANSLATE | 41 + configure | 153 + data/com.nokia.midori.service | 3 + data/logo-shade.svg | 150 + data/midori.desktop.in | 14 + data/search | 21 + docs/api/wscript_build | 34 + docs/user/midori.css | 114 + docs/user/midori.txt | 254 + extensions/colorful-tabs.c | 151 + extensions/cookie-manager.c | 970 ++++ extensions/mouse-gestures/main.c | 229 + extensions/mouse-gestures/mouse-gestures.h | 37 + extensions/page-holder.c | 187 + extensions/statusbar-features.c | 114 + extensions/tab-panel/main.c | 77 + extensions/tab-panel/tab-panel-extension.c | 38 + extensions/tab-panel/tab-panel-extension.h | 43 + extensions/wscript_build | 32 + icons/16x16/extension.png | Bin 0 -> 780 bytes icons/16x16/midori.png | Bin 0 -> 937 bytes icons/16x16/news-feed.png | Bin 0 -> 832 bytes icons/22x22/extension.png | Bin 0 -> 1105 bytes icons/22x22/midori.png | Bin 0 -> 1400 bytes icons/22x22/news-feed.png | Bin 0 -> 1249 bytes icons/scalable/extension.svg | 199 + icons/scalable/midori.svg | 230 + icons/scalable/news-feed.svg | 280 ++ icons/wscript_build | 39 + katze/katze-array.c | 439 ++ katze/katze-array.h | 81 + katze/katze-arrayaction.c | 574 +++ katze/katze-arrayaction.h | 53 + katze/katze-http-auth.c | 212 + katze/katze-http-auth.h | 42 + katze/katze-http-cookies.c | 300 ++ katze/katze-http-cookies.h | 42 + katze/katze-item.c | 530 ++ katze/katze-item.h | 117 + katze/katze-net.c | 598 +++ katze/katze-net.h | 89 + katze/katze-separatoraction.c | 134 + katze/katze-separatoraction.h | 43 + katze/katze-throbber.c | 919 ++++ katze/katze-throbber.h | 104 + katze/katze-utils.c | 768 +++ katze/katze-utils.h | 122 + katze/katze.h | 25 + katze/marshal.list | 1 + katze/wscript_build | 14 + midori/compat.c | 67 + midori/compat.h | 56 + midori/gtkiconentry.c | 1608 ++++++ midori/gtkiconentry.h | 135 + midori/main.c | 1768 +++++++ midori/marshal.list | 6 + midori/midori-app.c | 785 +++ midori/midori-app.h | 69 + midori/midori-array.c | 374 ++ midori/midori-array.h | 29 + midori/midori-browser.c | 5234 ++++++++++++++++++++ midori/midori-browser.h | 135 + midori/midori-extension.c | 772 +++ midori/midori-extension.h | 110 + midori/midori-locationaction.c | 1363 +++++ midori/midori-locationaction.h | 108 + midori/midori-locationentry.c | 436 ++ midori/midori-locationentry.h | 42 + midori/midori-panel.c | 943 ++++ midori/midori-panel.h | 84 + midori/midori-preferences.c | 672 +++ midori/midori-preferences.h | 57 + midori/midori-searchaction.c | 1337 +++++ midori/midori-searchaction.h | 71 + midori/midori-stock.h | 46 + midori/midori-view.c | 2681 ++++++++++ midori/midori-view.h | 194 + midori/midori-viewable.c | 263 + midori/midori-viewable.h | 73 + midori/midori-websettings.c | 1399 ++++++ midori/midori-websettings.h | 144 + midori/midori.h | 38 + midori/sokoke.c | 882 ++++ midori/sokoke.h | 137 + midori/wscript_build | 31 + panels/midori-addons.c | 1081 ++++ panels/midori-addons.h | 67 + panels/midori-bookmarks.c | 959 ++++ panels/midori-bookmarks.h | 43 + panels/midori-console.c | 362 ++ panels/midori-console.h | 56 + panels/midori-extensions.c | 390 ++ panels/midori-extensions.h | 45 + panels/midori-history.c | 988 ++++ panels/midori-history.h | 43 + panels/midori-plugins.c | 329 ++ panels/midori-plugins.h | 43 + panels/midori-transfers.c | 417 ++ panels/midori-transfers.h | 47 + po/LINGUAS | 2 + po/POTFILES.in | 31 + po/POTFILES.skip | 2 + po/da.po | 1712 +++++++ po/de.po | 1852 +++++++ po/el.po | 1358 +++++ po/en_GB.po | 1559 ++++++ po/es.po | 1598 ++++++ po/et.po | 1665 +++++++ po/fi.po | 1410 ++++++ po/fr.po | 1865 +++++++ po/gl.po | 1594 ++++++ po/he.po | 1805 +++++++ po/hu.po | 1494 ++++++ po/id.po | 1370 +++++ po/it.po | 1656 +++++++ po/ja.po | 1867 +++++++ po/midori.pot | 1815 +++++++ po/nl.po | 1515 ++++++ po/pl.po | 1515 ++++++ po/pt_PT.po | 1724 +++++++ po/ru.po | 2023 ++++++++ po/sv.po | 1485 ++++++ po/tr.po | 1380 ++++++ po/uk.po | 1371 +++++ po/zh_CN.po | 1707 +++++++ po/zh_TW.po | 1579 ++++++ tests/bookmarks.c | 157 + tests/browser.c | 63 + tests/completion.c | 295 ++ tests/extensions.c | 142 + tests/magic-uri.c | 185 + tests/properties.c | 183 + tests/wscript_build | 30 + waf | Bin 0 -> 78495 bytes wscript | 417 ++ 143 files changed, 77181 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 EXPAT create mode 100644 HACKING create mode 100644 INSTALL create mode 100644 README create mode 100644 TODO create mode 100644 TRANSLATE create mode 100755 configure create mode 100644 data/com.nokia.midori.service create mode 100644 data/logo-shade.svg create mode 100644 data/midori.desktop.in create mode 100644 data/search create mode 100644 docs/api/wscript_build create mode 100644 docs/user/midori.css create mode 100644 docs/user/midori.txt create mode 100644 extensions/colorful-tabs.c create mode 100644 extensions/cookie-manager.c create mode 100644 extensions/mouse-gestures/main.c create mode 100644 extensions/mouse-gestures/mouse-gestures.h create mode 100644 extensions/page-holder.c create mode 100644 extensions/statusbar-features.c create mode 100644 extensions/tab-panel/main.c create mode 100644 extensions/tab-panel/tab-panel-extension.c create mode 100644 extensions/tab-panel/tab-panel-extension.h create mode 100644 extensions/wscript_build create mode 100644 icons/16x16/extension.png create mode 100644 icons/16x16/midori.png create mode 100644 icons/16x16/news-feed.png create mode 100644 icons/22x22/extension.png create mode 100644 icons/22x22/midori.png create mode 100644 icons/22x22/news-feed.png create mode 100644 icons/scalable/extension.svg create mode 100644 icons/scalable/midori.svg create mode 100644 icons/scalable/news-feed.svg create mode 100644 icons/wscript_build create mode 100644 katze/katze-array.c create mode 100644 katze/katze-array.h create mode 100644 katze/katze-arrayaction.c create mode 100644 katze/katze-arrayaction.h create mode 100644 katze/katze-http-auth.c create mode 100644 katze/katze-http-auth.h create mode 100644 katze/katze-http-cookies.c create mode 100644 katze/katze-http-cookies.h create mode 100644 katze/katze-item.c create mode 100644 katze/katze-item.h create mode 100644 katze/katze-net.c create mode 100644 katze/katze-net.h create mode 100644 katze/katze-separatoraction.c create mode 100644 katze/katze-separatoraction.h create mode 100644 katze/katze-throbber.c create mode 100644 katze/katze-throbber.h create mode 100644 katze/katze-utils.c create mode 100644 katze/katze-utils.h create mode 100644 katze/katze.h create mode 100644 katze/marshal.list create mode 100644 katze/wscript_build create mode 100644 midori/compat.c create mode 100644 midori/compat.h create mode 100644 midori/gtkiconentry.c create mode 100644 midori/gtkiconentry.h create mode 100644 midori/main.c create mode 100644 midori/marshal.list create mode 100644 midori/midori-app.c create mode 100644 midori/midori-app.h create mode 100644 midori/midori-array.c create mode 100644 midori/midori-array.h create mode 100644 midori/midori-browser.c create mode 100644 midori/midori-browser.h create mode 100644 midori/midori-extension.c create mode 100644 midori/midori-extension.h create mode 100644 midori/midori-locationaction.c create mode 100644 midori/midori-locationaction.h create mode 100644 midori/midori-locationentry.c create mode 100644 midori/midori-locationentry.h create mode 100644 midori/midori-panel.c create mode 100644 midori/midori-panel.h create mode 100644 midori/midori-preferences.c create mode 100644 midori/midori-preferences.h create mode 100644 midori/midori-searchaction.c create mode 100644 midori/midori-searchaction.h create mode 100644 midori/midori-stock.h create mode 100644 midori/midori-view.c create mode 100644 midori/midori-view.h create mode 100644 midori/midori-viewable.c create mode 100644 midori/midori-viewable.h create mode 100644 midori/midori-websettings.c create mode 100644 midori/midori-websettings.h create mode 100644 midori/midori.h create mode 100644 midori/sokoke.c create mode 100644 midori/sokoke.h create mode 100644 midori/wscript_build create mode 100644 panels/midori-addons.c create mode 100644 panels/midori-addons.h create mode 100644 panels/midori-bookmarks.c create mode 100644 panels/midori-bookmarks.h create mode 100644 panels/midori-console.c create mode 100644 panels/midori-console.h create mode 100644 panels/midori-extensions.c create mode 100644 panels/midori-extensions.h create mode 100644 panels/midori-history.c create mode 100644 panels/midori-history.h create mode 100644 panels/midori-plugins.c create mode 100644 panels/midori-plugins.h create mode 100644 panels/midori-transfers.c create mode 100644 panels/midori-transfers.h create mode 100644 po/LINGUAS create mode 100644 po/POTFILES.in create mode 100644 po/POTFILES.skip create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/el.po create mode 100644 po/en_GB.po create mode 100644 po/es.po create mode 100644 po/et.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/gl.po create mode 100644 po/he.po create mode 100644 po/hu.po create mode 100644 po/id.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/midori.pot create mode 100644 po/nl.po create mode 100644 po/pl.po create mode 100644 po/pt_PT.po create mode 100644 po/ru.po create mode 100644 po/sv.po create mode 100644 po/tr.po create mode 100644 po/uk.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_TW.po create mode 100644 tests/bookmarks.c create mode 100644 tests/browser.c create mode 100644 tests/completion.c create mode 100644 tests/extensions.c create mode 100644 tests/magic-uri.c create mode 100644 tests/properties.c create mode 100644 tests/wscript_build create mode 100755 waf create mode 100644 wscript diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..daa0e4fe --- /dev/null +++ b/AUTHORS @@ -0,0 +1,64 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + +Developers: + Christian Dywan + +Contributors: + Ori Bernstein + Przemek Sitek + Enrico Tröger + Arnaud Renevier + Dale Whittaker + Anders F Björklund + Alexander Hesse + Brian Vuyk + Nick Schermer + Matthias Kruk + Johannes Reinhardt + +Graphics: + extension: Nancy Runge + midori: Nancy Runge + news-feed: Nancy Runge + logo-shade: Nancy Runge + +Translations: + da: Per Kongstad + de: Enrico Tröger + de: Christian Dywan + el: Evaggelos Balaskas + en_GB: Bastien Nocera + en_GB: Abigail Brady + es: Miguel Anxo Bouzada + es: Antonio Sanchez + es: Christian Dywan + es: Elega + et: Kristjan Siimson + fi: Elias Julkunen + fr: Christian Dywan + fr: Adrien Nader + fr: Robert-André Mauchin + fr: Pascal Gervais + gl: Miguel Anxo Bouzada + he: Shlomi Israel + hu: SZERVÁC Attila + id: Andhika Padmawan + it: Sergio Durzu + ja: Masato Hashimoto + nl: Vincent Tunru + pl: Przemysław Sitek + pl: Lukasz Romanowicz + pt_PT: Sérgio Marques + ru: Troitskiy Nikita + ru: Anton Shestakov + sv: Mikael Magnusson + tr: Mirat Can Bayrak + uk: Dmitry Nikitin + zh_CN: Stanley Zhang + zh_TW: Wei-Lun Chao + +Code from other projects: + GTK+/ GdkPixbuf, Matthias Clasen + GTK+/ GtkEntry, Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + Modified by the GTK+ Team and others 1997-2000 + libSoup/ CookieJarText, Copyright (C) 2008 Xan Lopez , Dan Winship diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..8fe7c5d1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,314 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + +v0.1.6: + + Add Delete All to transferbar + + Show search in context menu + + Implement 'Default' search engine + + Show only icons in Statusbar Features + + Implement Clear private data + + Support News Feed icon and external aggregator + + Fix reloading of Not found pages + + Fixup spaces when middle click opening + + Fix possibly wrong identificaton string + + Optionally search engines in completion + + Optionally Gtk 2.16 entry progress and icon + + Experimental panel detaching + + Support external download manager again + + Implement '-a', '--app' argument + + Implement '-c', '--config' argument + + Fix a bookmark saving issue + + Support data: URIs in the address entry + + Several performance and memory leak fixes + + Load cookies idle to accelerate startup + + Support mailto: links + + Save tab reordering in the session + + Add a Cookie Manager extension + + Fix crashers in Colourful Tabs + +v0.1.5: + + Add a Colorful Tabs extension + + Support downloading with WebKitGTK+ 1.1.3 + + Load and save settings of extensions + + Drop internal source view + + Require WebKitGTK+ 1.1.1, Glib 2.16 and libsoup 2.25.2 + +v0.1.4: + + Automatic inline find can be disabled + + Implement an Encoding menu + + Add Open all in Tabs for bookmarks and history + + Bookmarks can be moved to other folders + + Fix blank page 'loading' and HTTP authentication + + Display history dates in the local format + + Allow editing of completion items + +v0.1.3: + + Sidepanel can be aligned on the right + + Bookmarks can be organized in folders + + Support find as you type + + Support international domain names + + Tweak location completion + + Provide default search engines + + Integrate with Maemo if available + + Implement Mouse Gestures extension + + Implement a Plugins panel + + Editing the toolbar via a context menu + + Introduce Zoom Text and Images preference + +v0.1.2: + + Open new tabs by clicking on the tabbar + + Refactor and speed up location completion + + Show a Crash dialog after crashes + + Dynamically save files when needed + + Support Back/ Forward mouse buttons + + Support javascript: bookmarklets + + Implement Proxy and Identification string + + Implement cookie storage on disk + + Remove autotooled build system + + Add a new Extensions panel + + Implement opening of new windows + + Display tooltips in Preferences + +v0.1.1: + + Reimplement page holder as an extension + + Introduce a C extension interface + + Introduce unit tests for automated testing + + Implement history based location completion + + Support the Web Inspector in new WebKit versions + + Bookmarkbar properly reflects changes + + Improve overall OS X integration + + Add a Text Editor Preference + + Add a Compat sidebar Preference + + Add an Open external pages in Preference + + Implement source view and cached favicons with libsoup + +v0.1.0: + + Allow for hiding the menubar + + Make the navigationbar customizable + + Implement a History panel + + Remove the HTTP Proxy hack + + Add an Always Show Tabbar Preference + + Implement 404 error pages + + Remove the Primary Clipboard hack + + Provide user documentation + + Display Not found errors when possible + + Remove Stylesheet and Zoom Stepping preferences + + Make dialogs more compact + + Ellipsize extremely long menu items + + Save the trash again when quitting + + Implement enabling/ disabling addons + +v0.0.21: + + Update some translations + + Show progress in location when statusbar is hidden + + Alt + Enter in location should issue a new tab + + Warn at configure time if GVfs is not installed + + Remove GVfs code that could caused huge problems + + Update wad to 1.4.4 to fix building on some systems + +v0.0.20: + + Single instance support using Unique + + Make it clear that WAF is preferred + + Provide an 'extension' icon + + Load user styles from ~/.local/share/midori/styles + + Use Ctrl+Shift+T for Undo Close Tab + + Add "open-tabs-next-to-current" preference + + Use rsvg-convert instead of imagemagick's convert + + @name in the meta data of userscripts is recognized + + Remove "small-toolbar" preference + +v0.0.19: + + Improved Greasemonkey compatibility + + Improve multiple window support + + Use WAF buildscripts, still keeping autotools + + Install and use Midori logo + + Support zooming and printing + + Enhance Gjs functionality + + Refactor in some places, particularly Web Search + + Implement favicons and source view with GIO + + Introduce new fancy location entry + + Detect and show news feeds on web sites + + Save the session as needed, not only on quit + + Reintroduce Download Manager preference + +v0.0.18: + + First attempt at userscripts and extensions. + + Show hidden location/ web search temporarily when needed. + + Turn prefs into MidoriPreferences + + Fix background tabs, strings and new tab focus. + + Switch configuration to MidoriWebSettings. + + Remove 'External programs' logic + + Append the closed tabs items as a proper submenu. + + The location is empty and focused by default + + Implement proper menu positioning. + + Implement the Console panel for script messages. + + Implement localization via Gettext. + + Initial refactoring work, regressions expected + + Build fix: Webkit's header and pkgconfig name have changed. + + Implement Fullscreen mode + +v0.0.17: + + Add a preference to choose a user stylesheet. + + Implement a few preferences with new settings API in WebKit + + Implement Add Bookmark and a small panel toolbar + + Escape search engine name and description. + + Cleanup and WebKit API update + + Make sure selection actions have a widget. + + Allow Find Next and Find Previous when the findbox is hidden. + + Fixed the header of the KatzeThrobber + + Move XBEL implementation to katze. + + Implement a throbber widget. + + Always enable Select All if an editable widget is focussed. + + Previous/ next tab menu items should be disabled when not needed. + + Handle the context menu on button press, not release. + + Open the default page only if there is no session and no uri on the cli. + +v0.0.16: + + Implement editing menu items for the web view. + + Implement the bookmarks panel with editing capabilities. + + Prevent repeated checks for the desktop environment. + + Fix coding style in sokoke.c/ sokoke.h, particularly variable names. + + Don't update the remembered window size when maximized. + + Don't remember the window position but the size only. + + Command line uris should replace the default page. + + More effective status updates and less entry flickering + + Enable inline find for websites + + Make the progressbar work properly again + + Build fix: Adapt WebKit api changes + + Add Tab Size to preferences dialog + +v0.0.15: + + Build fix: Remove search api + +v0.0.14: + + FIX Reopening a tab from the trash causes a crash + + FIX An untitled website keeps the previous title + + FIX When switching tabs the location/ title isn't updated correctly + + FIX Issues with the preferences dialog + + Disable location completion for now + + Save tabtrash to file + + Restructure some code + + Remove color picker and throbber + + Change the license to LGPL + +v0.0.13: + + Adapt WebKit api change, remove engine wrappers, remove dialog hack + + Improve XBEL loading and saving + + Show dialog and backup files on startup errors + + Rearranged and removed some menus + +v0.0.12: + + FIX Improve flawed window creation + + Build with and eliminate all compiler warnings + + Implement clipboard handling menus + + Allow editing of search engines + + Update search engines properly + + Implement bookmarks saving + + Implement session saving and loading + + Cleaned up and revised most code + + Remove legacy webi code + +v0.0.11: + + FIX Back/ forward and initial check menu item states + + Remove rather useless debugging helpers + + Improvements on the preferences + + First attempt at websearch + + Preserve typed uri on tab switch + + First attempt at bookmarks, readonly for now + + Add an animated throbber + +v0.0.10: + + FIX Can crash on context menu or new protocol + + FIX Location isn't updated on tab switch + + Remember last window position and size + + Implement Open menu item + + Allow using location and web search if hidden + +v0.0.9: + + FIX Close tab not insensitive for only one tab + + FIX Debug output is broken + + Display uri when hovering a link + + Implement link uri related part of context menu + + Implement alt/ middle/ shift click link + + First attempt at external protocol handlers + + Initial download manager integration + + Adapt WebKit api prefix change + + More code reorganization and cleanup + +v0.0.8: + + FIX Crash when invoking document context menu via keyboard + + FIX Can't build with debug = yes on GTK+2.12 + + Changes related to icons in the gui + + Reorganize code by splitting into several files + + Switch from WebkitGdk to WebkitGtk + +v0.0.7: + + FIX Make settings finally work flawlessly + + FIX Can crash when settings are opened + + Handle all panels in a general way + + Install xdg compliant desktop file + + Implement location and web search menu items + + Display a loading icon on tabs again + + Changed the settings dialog again + +v0.0.6: + + FIX Closing an individual tab doesn't work correctly. + + FIX Doesn't build with gtkwebcore. + + Reimplement menus and and navibar with GtkUIManager. + + Improve document handling in general. + + Finished tab trash menu. + + Implement searchbox default text. + + Remove some gtkwebcore code. + + Use Xfce style dialog in Xfce. + + Implement a few settings. + + Change the panel's look. + + Implement a 'pageholder' panel. + +v0.0.5: + + Implement a few more signals for WebkitGdk. + + Add tooltips to navigation toolbar buttons. + + First attempt on a settings dialog. + + Reimplemented color picker. + + Autocompletion for location and searchbox. + + Changed menu items and incremental findbar. + + Implement tab switching via keyboard. + +v0.0.4: + + FIX Midori segfaults when quitting. + + FIX Config loading and saving is broken. + + Switch WebkitGdk to gtk api and make it the build default. + + Register custom stock icons instead of icon theme magic. + + Implement dynamic window menu. + + First attempt on resizable panels. + + Add about dialog. + +v0.0.3: + + FIX Refresh via menu or shortcut crashes the browser. + + FIX Assertions with and visibility of the progressbar. + + FIX Tabs are not reorderable. + + Package versions in ./configure result and --version output. + + Improve view menu and add tools menu. + + Replace deprecated functions and macros. + + Implement settings saving and loading. + + Fill the common context menu with items + + Allow multiple homepages, seperated by '|'. + + Make code typesafe and C++ friendly. + + Initially support WebkitGdk directly. + + Urlify location inputs automatically. + +v0.0.2: + + Dynamic tab trash menu. + + Update UI when page is changed. + + Enhanced WebkitGtk support. + + New function sokoke_dialog_run_modeless. + + Finished on_document_request_script_prompt. + + One name and version, visible in the user agent. + + Changed some accelerators and menu items. + + Create and destroy color picker properly. + + Ctrl + Wheel resets the zoom level. + + Escape in the location entry resets the uri. + + Use gtk-webcore prefix instead of osb now. + + Save keybindings on quit. + + Fancy autotools build setup. + +v0.0.1: + + Initial release diff --git a/EXPAT b/EXPAT new file mode 100644 index 00000000..7da1ab30 --- /dev/null +++ b/EXPAT @@ -0,0 +1,18 @@ +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/HACKING b/HACKING new file mode 100644 index 00000000..88342471 --- /dev/null +++ b/HACKING @@ -0,0 +1,94 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + +It is 4 spaces, no tabs, preferrably at 80 columns per line. + +The preferred coding style is explained by example. + +Source file example: + + /* + Copyright + LICENSE TEXT + */ + + #include "foo.h" + + #include "bar.h" + + #include + + void + foobar (FooEnum bar, const gchar* foo) + { + gint n, i; + + if (!foo) + return; + + #ifdef BAR_STRICT + if (bar == FOO_N) + { + g_print ("illegal value for 'bar'.\n"); + return; + } + #endif + + /* this is an example */ + switch (bar) + { + case FOO_FOO: + n = bar + 1; + break; + case FOO_BAR: + n = bar + 10; + break; + default: + n = 1; + } + + for (i = 0; i < n; i++) + { + g_print ("%s\n", foo); + } + } + +Header file example: + + /* + Copyright + LICENSE TEXT + */ + + #ifndef __FOO_H__ + #define __FOO_H__ 1 + + #ifdef HAVE_BAR_H + #define BAR_STRICT + #endif + + /* Types */ + + typedef enum + { + FOO_FOO, + FOO_BAR, + FOO_N + } FooEnum; + + typedef struct + { + FooEnum foo_bar; + } FooStruct; + + /* Declarations */ + + void + foo_bar (FooEnum bar, + const gchar* foo); + + const gchar* + foo_foo (FooStruct foo_struct, + guint number, + gboolean flag); + + #endif /* !__FOO_H__ */ diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..9eb4519c --- /dev/null +++ b/INSTALL @@ -0,0 +1,56 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + ++++ Installing Midori +++ + +Building and installing Midori is straightforward. + +Make sure you have Python 2.4 or higher installed. + +Change to the Midori folder on your hard disk in a terminal. + +Run './waf configure' + +Run './waf build' + +You can now run Midori from the build folder like so + +'./waf build --run' + +This is a convenience that will load extensions as well as +localizations from the build folder. + +You can install it with './waf install' + +For further options run './waf --help' + ++++ Debugging Midori +++ + +Run './waf configure -d full' from the Midori folder. + +Run './waf build' + +Midori is now built with debugging symbols. + +Make sure you have installed 'gdb', the GNU Debugger. + +Run Midori as 'gdb _build_/default/midori/midori'. + +Try to reproduce a crash that you experienced earlier, +this time Midori will freeze at the point of the crash. +Switch to your terminal, type bt ('backtrace') and hit Return. +What you obtained now is a backtrace that should include +function names and line numbers. + +If the problem is a warning and not a crash, try this: + +'G_DEBUG=all gdb _build_/default/midori/midori' + +If you are interested in HTTP communication, try this: + +'MIDORI_SOUP_DEBUG=2 _build_/default/midori/midori' + +Where '2' can be a level between 0 and 3. + +For further information a tutorial for gdb and +reading up on how you can install debugging +symbols for libraries used by Midori are recommended. diff --git a/README b/README new file mode 100644 index 00000000..fab2dc01 --- /dev/null +++ b/README @@ -0,0 +1,26 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + +Midori is a lightweight web browser. + +* Full integration with GTK+2. +* Fast rendering with WebKit. +* Tabs, windows and session management. +* Flexibly configurable Web Search. +* User scripts and user styles support. +* Straightforward bookmark management. +* Customizable and extensible interface. +* Extensions written in C. + +Requirements: GTK+ 2.10, WebkitGTK+ 1.1.1, libXML2, libsoup 2.25.2 + +Optional: Unique 0.9, libidn, sqlite 3.0, docutils + +For installation instructions read INSTALL. + +Please report comments, suggestions and bugs to: + http://www.twotoasts.de/bugs + +And join the IRC channel #midori on irc.freenode.net + +Check for new versions at: + http://www.twotoasts.de diff --git a/TODO b/TODO new file mode 100644 index 00000000..a9852067 --- /dev/null +++ b/TODO @@ -0,0 +1,43 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + +TODO: + . Use an update timeout in KatzePropertyProxy instead of only focus-out + . Show a loading mouse pointer + . Scroll tabs w/o switching tabs + . Import and export of the bookmarks file, or using one from a specific path + . Custom context menu actions, like in Thunar or Epiphany + . Custom tab names + . Analogus to blocked popups, blocked scripts moving layers on load (extension) + . Per-site blocking of individual elements on a page + . Statusbar icon 'cookies blocked', icon 'popups blocked' + . Per-site settings accessible via statusbar icons, ie. cookies, popups, plugins + . CookieSafe like, a list of cookies, with type, block, allow + . Automatic update checks (browser, extensions)? + . Auto-group tabs by opener, with colors? + . Mark (dogear) a selection so that it isn't cleared implicitly, multiply on one page + . Have an internal uri scheme, eg. 'res:', to reference eg. themed icons + . 'about:' uris: about, blank, cache, config, plugins + . Panel of open tabs (with tree-structure), optional thumbnail-view + . Spell check support + . Check specific bookmarks for updates automatically (extension) + . Mark "new" as well as "actually modified" tabs specially (even over sessions) + . SearchEngine: "Show in context menu" + . Use libnotify for events, e.g. download finished + . Save screenshot of a document? + . Right-click a textbox in a search form and choose 'add to websearch' + . Honor design principle "no warnings but undo of backups"? + . Support widgets 1.0 spec in tool windows and standalone? + . Blank page: several custom links, displayed as thumbnails, like Opera? + . Handle downloads, optionally in a downloadbar + . Protected tabs prompt when attempting to close them + . Provide a 'sleep mode' after a crash where open documents are loaded manually + . Option to run plugins or scripts only on demand, like NoScript, per-site + . Optional http redirection manually or on timeout + . Style: none, compatible (b/w), default, [styles], "media", ["media" styles], ... + . Mouse pointer coordinates in the status bar (extension) + . Draw rectangle with the mouse, x/y/x2/y2 in the statusbar (extension) + . Formfill (like Opera's magic wand) + . Private browsing mode (no browsing, download or search history) + . Shared bookmarks and config + . Custom-mode, e.g. hide menubar and use help icon to have a help viewer + . Prevent dead tabs: download, aborted page diff --git a/TRANSLATE b/TRANSLATE new file mode 100644 index 00000000..9b2bbffb --- /dev/null +++ b/TRANSLATE @@ -0,0 +1,41 @@ +This file is licensed under the terms of the expat license, see the file EXPAT. + ++++ Translating Midori +++ + +If you want to translate Midori, here are a few helpful tips. + +To update the localization template: + +./waf build --update-po + +If you want to add a new language 'aa', create it like this: + +cd po +msginit -l aa_CC -o aa.po -i midori.pot +sed -i 's/PACKAGE/midori/g' aa.po + +Make sure you add your language to the file po/LINGUAS. +Just open the file with a text editor and add your code. + +To check your language 'aa' for errors, do this: + +msgfmt -c --check-accelerators=_ aa.po + +To test your changes, run Midori like so: + +./waf build --run + +This is a convenience command that will setup localization in +the build folder so you don't need to install translations. + +To run Midori in a particular language, run it like this: + +LANG=fr_FR.utf8 ./waf build --run + +As a general rule, your localization should be based off of the +current git repository or the latest midori.pot in git. + +Some strings have comments, starting with 'i18n', which are meant +to describe the role of a string to translators. +Please don't hesitate to ask for additional descriptive comments +for any unclear strings that you are uncertain about. diff --git a/configure b/configure new file mode 100755 index 00000000..1f801a4a --- /dev/null +++ b/configure @@ -0,0 +1,153 @@ +#! /bin/sh + +# waf configure wrapper + +# Fancy colors used to beautify the output a bit. +# +if [ "$NOCOLOR" ] ; then + NORMAL="" + BOLD="" + RED="" + YELLOW="" + GREEN="" +else + NORMAL="\033[0m" + BOLD="\033[1m" + RED="\033[91m" + YELLOW="\033[01;93m" + GREEN="\033[92m" +fi + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_ERROR=2 +EXIT_BUG=10 + +CUR_DIR=$PWD + +#possible relative path +WORKINGDIR=`dirname $0` +cd $WORKINGDIR +#abs path +WORKINGDIR=`pwd` +cd $CUR_DIR + +# Checks for Python interpreter. Honours $PYTHON if set. Stores path to +# interpreter in $PYTHON. +# +checkPython() +{ + if [ -z "$PYTHON" ] ; then + PYTHON=`which python 2>/dev/null` + fi + printf "Checking for Python\t\t\t: " + if [ ! -x "$PYTHON" ] ; then + printf $RED"not found!"$NORMAL"\n" + echo "Please make sure that the Python interpreter is available in your PATH" + echo "or invoke configure using the PYTHON flag, e.g." + echo "$ PYTHON=/usr/local/bin/python configure" + exit $EXIT_FAILURE + fi + printf $GREEN"$PYTHON"$NORMAL"\n" +} + +# Checks for WAF. Honours $WAF if set. Stores path to 'waf' in $WAF. +# Requires that $PYTHON is set. +# +checkWAF() +{ + printf "Checking for WAF\t\t\t: " + #installed miniwaf in sourcedir + if [ -z "$WAF" ] ; then + if [ -f "${WORKINGDIR}/waf" ] ; then + WAF="${WORKINGDIR}/waf" + if [ ! -x "$WAF" ] ; then + chmod +x $WAF + fi + fi + fi + if [ -z "$WAF" ] ; then + if [ -f "${WORKINGDIR}/waf-light" ] ; then + ${WORKINGDIR}/waf-light --make-waf + WAF="${WORKINGDIR}/waf" + fi + fi + #global installed waf with waf->waf.py link + if [ -z "$WAF" ] ; then + WAF=`which waf 2>/dev/null` + fi + # neither waf nor miniwaf could be found + if [ ! -x "$WAF" ] ; then + printf $RED"not found"$NORMAL"\n" + echo "Go to http://code.google.com/p/waf/" + echo "and download a waf version" + exit $EXIT_FAILURE + else + printf $GREEN"$WAF"$NORMAL"\n" + fi +} + +# Generates a Makefile. Requires that $WAF is set. +# +generateMakefile() +{ + cat > Makefile << EOF +#!/usr/bin/make -f +# Waf Makefile wrapper +WAF_HOME=$CUR_DIR + +all: + @$WAF build + +all-debug: + @$WAF -v build + +all-progress: + @$WAF -p build + +install: + @if test -n "\$(DESTDIR)"; then \\ + $WAF install --destdir="\$(DESTDIR)"; \\ + else \\ + $WAF install; \\ + fi; + +.PHONY: install + +uninstall: + @if test -n "\$(DESTDIR)"; then \\ + $WAF uninstall --destdir="\$(DESTDIR)"; \\ + else \\ + $WAF uninstall; \\ + fi; + +clean: + @$WAF clean + +distclean: + @$WAF distclean + @-rm -rf _build_ + @-rm -f Makefile + +check: + @$WAF check + +dist: + @$WAF dist + +EOF +} + +checkPython +checkWAF + +echo "calling waf configure with parameters" +$WAF configure $* || exit $EXIT_ERROR + +if [ -f "Makefile" ] ; then + echo "" +else + generateMakefile +fi + +exit $EXIT_SUCCESS diff --git a/data/com.nokia.midori.service b/data/com.nokia.midori.service new file mode 100644 index 00000000..f8d1df0f --- /dev/null +++ b/data/com.nokia.midori.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=com.nokia.midori +Exec=/usr/bin/midori diff --git a/data/logo-shade.svg b/data/logo-shade.svg new file mode 100644 index 00000000..7a21a99b --- /dev/null +++ b/data/logo-shade.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Nancy Runge <nancy@twotoasts.de> + + + + + + + + + + + + + + + + + diff --git a/data/midori.desktop.in b/data/midori.desktop.in new file mode 100644 index 00000000..d5c3515f --- /dev/null +++ b/data/midori.desktop.in @@ -0,0 +1,14 @@ +[Desktop Entry] +Version=1.0 +Type=Application +_Name=Midori +_GenericName=Web Browser +_Comment=Lightweight web browser +Categories=GTK;Network;WebBrowser; +MimeType=text/html;text/xml;application/xhtml+xml;application/xml; +Exec=midori %u +Icon=midori +Terminal=false +StartupNotify=true +X-Osso-Type=application/x-executable +X-Osso-Service=midori diff --git a/data/search b/data/search new file mode 100644 index 00000000..b650d9f9 --- /dev/null +++ b/data/search @@ -0,0 +1,21 @@ + +[Google] +name=Google +text=Web Search +uri=http://www.google.com/search?q=%s +icon= +token=g + +[Wikipedia] +name=Wikipedia +text=The free encyclopedia +uri=http://en.wikipedia.org/wiki/%s +icon= +token=wp + +[TheFreeDictionary] +name=The Free Dictionary +text=Dictionary, Encyclopedia and Thesaurus +uri=http://www.thefreedictionary.com/%s +icon= +token=fd diff --git a/docs/api/wscript_build b/docs/api/wscript_build new file mode 100644 index 00000000..ddbcfc59 --- /dev/null +++ b/docs/api/wscript_build @@ -0,0 +1,34 @@ +#! /usr/bin/env python +# WAF build script for midori +# This file is licensed under the terms of the expat license, see the file EXPAT. + +import pproc as subprocess + +for module in ('midori', 'katze'): + try: + if not os.access ('_build_', os.F_OK): + Utils.check_dir ('_build_') + if not os.access ('_build_/docs', os.F_OK): + Utils.check_dir ('_build_/docs') + if not os.access ('_build_/docs/api', os.F_OK): + Utils.check_dir ('_build_/docs/api') + subprocess.call (['gtkdoc-scan', '--module=' + module, + '--source-dir=' + module, '--output-dir=_build_/docs/api/' + module, + '--rebuild-sections', '--rebuild-types']) + os.chdir ('_build_/docs/api/' + module) + subprocess.call (['gtkdoc-mktmpl', '--module=' + module, + '--output-dir=.' + module]) + subprocess.call (['gtkdoc-mkdb', '--module=' + module, + '--source-dir=.', '--output-dir=xml', + '--source-suffixes=c,h', '--output-format=xml', + '--default-includes=%s/%s.h' % (module, module), + '--sgml-mode', '--main-sgml-file=%s.sgml' % module]) + if not os.access ('html', os.F_OK): + Utils.check_dir ('html') + os.chdir ('html') + subprocess.call (['gtkdoc-mkhtml', module, '../%s.sgml' % module]) + Utils.pprint ('YELLOW', "Created documentation for %s." % module) + os.chdir ('../../../../..') + except Exception, msg: + print msg + Utils.pprint ('RED', "Failed to create documentation for %s." % module) diff --git a/docs/user/midori.css b/docs/user/midori.css new file mode 100644 index 00000000..eb96e13e --- /dev/null +++ b/docs/user/midori.css @@ -0,0 +1,114 @@ +/* +:Author: Christian Dywan +:Contact: christian@twotoasts.de +:Copyright: This file is licensed under the terms of the expat license, see the file EXPAT. + +Stylesheet for Midori's documentation based on a version of Enrico Troeger. +*/ + +@media screen { + + body { + background-color: #f6fff3; + color: #404040; + margin-left: 0.4em; + width: 60em; + font-size: 90%; + } + + a { + color: #013100; + } + + a:visited { + color: #7E558E; + } + + a:hover { + text-decoration: none; + } + + h1, h2, h3 { + font-family: sans-serif; + color: #002a00; + } + + h1 { + border-top: 1px dotted; + margin-top: 2em; + } + + h1.title { + text-align: left } + + h2 { + margin-top: 30px; + } + + h2.subtitle { + text-align: left } + + h3 { + padding-left: 3px; + } + + blockquote, pre { + border: 1px solid; + padding: 0.4em; + } + + blockquote { + font-family: sans-serif; + background-color: #DBEDD5; + border: 1px dotted; + border-left: 4px solid; + border-color: #9FD98C; + } + + pre { + background-color: #deefd4; + border: 1px dotted; + border-left: 4px solid; + border-color: #9acb7d; + } + + tt, pre, code { + color: #002a00; + } + + table { + border: 1px solid #9acb7f; + } + + th { + border: none; + background-color: #9acb7d; + } + + tr:nth-child(even) { + background-color: #d3eac6; + } + + td { + border: none; + } + + .docinfo-name { + color: #002a00; + } + + p.admonition-title { + color: #990000; + font-weight: bold; + } + + div.note { + margin: 1em 3em; + padding: 0em; + } + + dt { + font-style: italic; + } + +} diff --git a/docs/user/midori.txt b/docs/user/midori.txt new file mode 100644 index 00000000..fbb93022 --- /dev/null +++ b/docs/user/midori.txt @@ -0,0 +1,254 @@ +.. |(version)| replace:: 0.1.6 + +''''''' + Midori +''''''' + +----------------------------------------- + A lightweight, portable GTK+ web browser +----------------------------------------- + +:Authors: Christian Dywan +:Date: $Date: 2009-04-14 18:00:35 +0100 (Tue, 14 Apr 2009) $ +:Version: |(version)| + +Copyright © 2008-2009 + +This documentation is distributed under the terms of the +`GNU Lesser General Public License`_; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + + +.. contents:: + + + +Introduction +'''''''''''' + + +What is Midori +-------------- + +Midori is a lightweight and portable web browser based on Gtk+. The +interface is designed to be intuitive yet powerful. + +* Full integration with GTK+2. +* Fast rendering with WebKit. +* Tabs, windows and session management. +* Flexibly configurable Web Search. +* User scripts and user styles support. +* Straightforward bookmark management. +* Customizable and extensible interface. +* Extensions written in C. + + +Running Midori +-------------- + + +* If you are using a graphical desktop environment you will usually find + Midori in the menu under Network. + +* You can also run Midori from a console or a Run dialog. + See also `Command line usage`. + + $ midori + +A browser window appears where you can start navigating the web right away. + + +The main interface +-------------------------- + + +The main browser window consists of a few basic elements: + + +* The menubar. It's pretty much standardized and gives you access to + allmost all features, many of the items have a keyboard shortcut by default. + See also `Keyboard shortcuts`_. + +* The navigationbar. It lets you open tabs, go back and forward, enter + addresses, search the web and reopen closed tabs. + See also `The navigationbar`. + +* The sidepanel. It takes a pretty central role in the functionality it provides, + yet it can be hidden and resized to not distract you. + See also `The sidepanel`. + +* The statusbar. It displays informational text when hovering something + with a pointer. That's it. + + +Taking a closer look +'''''''''''''''''''' + + +Command line usage +------------------ + + +Running Midori normally works as follows: + + +* $ midori + + Just run a new instance of Midori. If an instance of Midori is already + running a new window in that instance will be opened. + +* $ midori [URIs] + + You can supply any number of URIs to open as arguments. If you have a + saved session or a running instance they will be added to the last + active window. + +* $ midori [URI1]|[URI2]|... + + You can separate URIS by a pipe (|) as well. They are handled as if you + provided all URIs as separate arguments. + +* $ midori --run [JAVASCRIPT] + + If you pass the filename of a javascript Midori will attempt to run + the contents of the file as javascript code. + + +Note that support for opening tabs in an existing instance depends on +your build and may not be available on some platforms. + + +The following arguments are supported if you call Midori from a command line. + + ++-------+--------------------+------------------------------------------------+ +| Short | Long option | Function | ++=======+====================+================================================+ +| -a | --app | Run ADDRESS as a web application | ++-------+--------------------+------------------------------------------------+ +| -c | --config | Use FOLDER as configuration folder | ++-------+--------------------+------------------------------------------------+ +| -r | --run | Run the specified filename as javascript | ++-------+--------------------+------------------------------------------------+ +| -V | --version | Show version information and exit. | ++-------+--------------------+------------------------------------------------+ + + +Configuration files +------------------- + + +The configuration files in Midori that save related states are by default +stored in the folder ~/.config/midori in the home directory. It is possible +to use a different folder by specifying '--config' on the command line. + +The files stored in the primary configuration folder are the following: + ++----------------+------------------------------------------------------------+ +| Filename | Contents | ++================+============================================================+ +| accels | Keyboard shortcuts, GtkAccelMap resource | ++----------------+------------------------------------------------------------+ +| bookmarks.xbel | Bookmarks, XBEL | ++----------------+------------------------------------------------------------+ +| config | Preferences, text key file | ++----------------+------------------------------------------------------------+ +| cookies.txt | Cookies, Mozilla text cookies | ++----------------+------------------------------------------------------------+ +| history.db | History, sqlite3 | ++----------------+------------------------------------------------------------+ +| running | A file created to track whether Midori quit cleanly | ++----------------+------------------------------------------------------------+ +| session.xbel | The current or last session, ie. open tabs, | ++----------------+------------------------------------------------------------+ +| tabtrash.xbel | The 10 last closed tabs | ++----------------+------------------------------------------------------------+ + +Note that generally manual modifications to these files aren't recommended. As +an exception, while Midori is *not* running, it is possible to edit or +replace the 'bookmarks.xbel' as long as it is valid XBEL/ XML. + +Currently while Midori is running it will happily overwrite files as needed and +never read back any changes. + +Incidentally Midori will recognize readonly files and not write modifications +to readonly files back to disk. This can be useful for kiosk systems where +particular changes shouldn't be saved. + + +Keyboard shortcuts +------------------ + + +... + + +The navigationbar +----------------- + + +The navigationbar is the primary toolbar containing notably back and forward +buttons, the location entry and a search entry. Except for the location entry +any item can be removed and others can be added by right-clicking the toolbar +and using the Add and Remove menu items. + + +The sidepanel +------------- + + +... + + +Extensions +---------- + + +... + + +Frequently asked questions +'''''''''''''''''''''''''' + + +How do you pronounce Midori and what does it mean anyway? +--------------------------------------------------------- + +Pronounce it "midoɺi", with a Bavarian/ Japanese "r" or "Mee-Doh-Ree" +in English or read it Italian. The name comes from the Japanese word +緑 (みどり) for the colour "green". + + +What does the logo mean? +------------------------ + +The paw of a green cat. Obviously. Also it resembles the letter "M" +in "Midori". The curving is supposed to emphasize speed. + + +On which platforms does Midori run currently? +--------------------------------------------- + +Midori is basically very portable and should run on all platforms that +its dependencies support. + + + +Under which license is Midori distributed? +------------------------------------------ + +Midori, documentation and all delivered artwork are licensed under the LGPL2. + + +GNU Lesser General Public License +''''''''''''''''''''''''''''''''' + +:: + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + FIXME: Provide full license text + diff --git a/extensions/colorful-tabs.c b/extensions/colorful-tabs.c new file mode 100644 index 00000000..6d8a46e5 --- /dev/null +++ b/extensions/colorful-tabs.c @@ -0,0 +1,151 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include + +static void +colorful_tabs_button_toggled_cb (GtkWidget* button, + MidoriExtension* extension) +{ + midori_extension_set_boolean (extension, "tint", + !midori_extension_get_boolean (extension, "tint")); + /* FIXME: Update all tab colors */ +} + +static void +colorful_tabs_view_notify_uri_cb (MidoriView* view, + GParamSpec* pspec, + MidoriExtension* extension) +{ + GtkWidget* label; + SoupURI* uri; + gchar* hash; + gchar* colorstr; + GdkColor color; + + label = midori_view_get_proxy_tab_label (view); + if (!midori_extension_get_boolean (extension, "tint")) + { + gtk_widget_modify_bg (label, GTK_STATE_NORMAL, NULL); + gtk_widget_modify_bg (label, GTK_STATE_ACTIVE, NULL); + return; + } + + /* Find a color that is unique to an address. We merely compute + a hash value, pick the first 6 + 1 characters and turn the + first into a hash sign, ie. #8b424b. In case a color is too + dark, we lighten it up a litte. Finally we make the event box + visible and modify its background. */ + + if ((uri = soup_uri_new (midori_view_get_display_uri (view))) && uri->host) + { + hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri->host, -1); + soup_uri_free (uri); + colorstr = g_strndup (hash, 6 + 1); + g_free (hash); + colorstr[0] = '#'; + gdk_color_parse (colorstr, &color); + if (color.red < 35000) + color.red += 25000 + (color.blue + 1) / 2; + if (color.green < 35000) + color.green += 25000 + (color.red + 1) / 2; + if (color.blue < 35000) + color.blue += 25000 + (color.green + 1) / 2; + gtk_event_box_set_visible_window (GTK_EVENT_BOX (label), TRUE); + gtk_widget_modify_bg (label, GTK_STATE_NORMAL, &color); + gtk_widget_modify_bg (label, GTK_STATE_ACTIVE, &color); + } + else + { + gtk_widget_modify_bg (label, GTK_STATE_NORMAL, NULL); + gtk_widget_modify_bg (label, GTK_STATE_ACTIVE, NULL); + } +} + +static void +colorful_tabs_browser_add_tab_cb (MidoriBrowser* browser, + MidoriView* view, + MidoriExtension* extension) +{ + g_signal_connect (view, "notify::uri", + G_CALLBACK (colorful_tabs_view_notify_uri_cb), extension); +} + +static void +colorful_tabs_deactivate_cb (MidoriExtension* extension, + GtkWidget* bbox) +{ + gtk_widget_destroy (bbox); + g_signal_handlers_disconnect_by_func ( + extension, colorful_tabs_deactivate_cb, bbox); + /* FIXME: Disconnect signals */ + /* FIXME: Reset all tab colors */ +} + +static void +colorful_tabs_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension) +{ + GtkWidget* statusbar; + GtkWidget* bbox; + GtkWidget* button; + + statusbar = katze_object_get_object (browser, "statusbar"); + bbox = gtk_hbox_new (FALSE, 0); + button = gtk_check_button_new_with_label (_("Tint tabs distinctly")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), + midori_extension_get_boolean (extension, "tint")); + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2); + gtk_widget_show (button); + gtk_widget_show (bbox); + gtk_box_pack_start (GTK_BOX (statusbar), bbox, FALSE, FALSE, 3); + + g_signal_connect (button, "toggled", + G_CALLBACK (colorful_tabs_button_toggled_cb), extension); + g_signal_connect (browser, "add-tab", + G_CALLBACK (colorful_tabs_browser_add_tab_cb), extension); + g_signal_connect (extension, "deactivate", + G_CALLBACK (colorful_tabs_deactivate_cb), bbox); +} + +static void +colorful_tabs_activate_cb (MidoriExtension* extension, + MidoriApp* app) +{ + KatzeArray* browsers; + MidoriBrowser* browser; + guint i; + + browsers = katze_object_get_object (app, "browsers"); + i = 0; + while ((browser = katze_array_get_nth_item (browsers, i++))) + colorful_tabs_app_add_browser_cb (app, browser, extension); + g_signal_connect (app, "add-browser", + G_CALLBACK (colorful_tabs_app_add_browser_cb), extension); +} + +MidoriExtension* +extension_init (void) +{ + MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION, + "name", _("Colorful Tabs"), + "description", _("Tint each tab distinctly"), + "version", "0.1", + "authors", "Christian Dywan ", + NULL); + midori_extension_install_boolean (extension, "tint", FALSE); + + g_signal_connect (extension, "activate", + G_CALLBACK (colorful_tabs_activate_cb), NULL); + + return extension; +} diff --git a/extensions/cookie-manager.c b/extensions/cookie-manager.c new file mode 100644 index 00000000..0d043718 --- /dev/null +++ b/extensions/cookie-manager.c @@ -0,0 +1,970 @@ +/* + Copyright (C) 2009 Enrico Tröger + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "config.h" +#include +#include +#include +#include + +#define CM_DEBUG 0 + +#define STOCK_COOKIE_MANAGER "cookie-manager" +#define CM_EMPTY_LABEL_TEXT "\n\n\n\n\n\n" + +enum +{ + COL_NAME, + COL_COOKIE, + COL_VISIBLE, + N_COLUMNS +}; + +typedef struct _CMData +{ + MidoriApp *app; + MidoriBrowser *browser; + MidoriExtension *extension; + + GtkWidget *panel_page; + GtkWidget *desc_label; + GtkWidget *delete_button; + GtkWidget *delete_popup_button; + GtkWidget *delete_all_button; + GtkWidget *expand_buttons[4]; + + GtkWidget *treeview; + GtkTreeStore *store; + GtkTreeModel *filter; + + GtkWidget *filter_entry; + + GtkWidget *popup_menu; + + SoupCookieJar *jar; + GSList *cookies; + + guint timer_id; + gint ignore_changed_count; +} CMData; + +static void cm_app_add_browser_cb(MidoriApp *app, MidoriBrowser *browser, MidoriExtension *ext); +static void cm_filter_tree(CMData *cmdata, const gchar *filter_text); +static void cm_deactivate_cb(MidoriExtension *extension, CMData *cmdata); +static void cm_jar_changed_cb(SoupCookieJar *jar, SoupCookie *old, SoupCookie *new, CMData *cmdata); + + +#if CM_DEBUG +static gchar *cookie_to_string(SoupCookie *c) +{ + if (c != NULL) + { + static gchar s[256]; /* this might be too small but for debugging it should be ok */ + g_snprintf(s, sizeof(s), "%s\t%s = %s", c->domain, c->name, c->value); + return s; + } + return NULL; +} +#endif + + +static void cm_free_cookie_list(CMData *cmdata) +{ + if (cmdata->cookies != NULL) + { + GSList *l; + + for (l = cmdata->cookies; l != NULL; l = g_slist_next(l)) + soup_cookie_free(l->data); + g_slist_free(cmdata->cookies); + cmdata->cookies = NULL; + } +} + + +static void cm_browser_close_cb(GtkObject *browser, CMData *cmdata) +{ + g_signal_handlers_disconnect_by_func(cmdata->extension, cm_deactivate_cb, cmdata); + g_signal_handlers_disconnect_by_func(cmdata->browser, cm_browser_close_cb, cmdata); + g_signal_handlers_disconnect_by_func(cmdata->jar, cm_jar_changed_cb, cmdata); + + cm_free_cookie_list(cmdata); + + /* the panel_page widget gets destroyed automatically when a browser is closed but not + * when the extension is deactivated */ + if (cmdata->panel_page != NULL && GTK_IS_WIDGET(cmdata->panel_page)) + gtk_widget_destroy(cmdata->panel_page); + + gtk_widget_destroy(cmdata->popup_menu); + g_free(cmdata); +} + + +static void cm_deactivate_cb(MidoriExtension *extension, CMData *cmdata) +{ + g_signal_handlers_disconnect_by_func(cmdata->app, cm_app_add_browser_cb, extension); + cm_browser_close_cb(NULL, cmdata); +} + + +static void cm_refresh_store(CMData *cmdata) +{ + GSList *l; + GHashTable *parents; + GtkTreeIter iter; + GtkTreeIter *parent_iter; + SoupCookie *cookie; + const gchar *filter_text; + + g_object_ref(cmdata->filter); + gtk_tree_view_set_model(GTK_TREE_VIEW(cmdata->treeview), NULL); + + gtk_tree_store_clear(cmdata->store); + + /* free the old list */ + cm_free_cookie_list(cmdata); + + cmdata->cookies = soup_cookie_jar_all_cookies(cmdata->jar); + + /* Hashtable holds domain names as keys, the corresponding tree iters as values */ + parents = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + for (l = cmdata->cookies; l != NULL; l = g_slist_next(l)) + { + cookie = l->data; + + /* look for the parent item for the current domain name and create it if it doesn't exist */ + if ((parent_iter = (GtkTreeIter*) g_hash_table_lookup(parents, cookie->domain)) == NULL) + { + parent_iter = g_new0(GtkTreeIter, 1); + + gtk_tree_store_append(cmdata->store, parent_iter, NULL); + gtk_tree_store_set(cmdata->store, parent_iter, + COL_NAME, cookie->domain, + COL_COOKIE, NULL, + COL_VISIBLE, TRUE, + -1); + + g_hash_table_insert(parents, g_strdup(cookie->domain), parent_iter); + } + + gtk_tree_store_append(cmdata->store, &iter, parent_iter); + gtk_tree_store_set(cmdata->store, &iter, + COL_NAME, cookie->name, + COL_COOKIE, cookie, + COL_VISIBLE, TRUE, + -1); + } + g_hash_table_destroy(parents); + + gtk_tree_view_set_model(GTK_TREE_VIEW(cmdata->treeview), GTK_TREE_MODEL(cmdata->filter)); + g_object_unref(cmdata->filter); + + /* if a filter is set, apply it again */ + filter_text = gtk_entry_get_text(GTK_ENTRY(cmdata->filter_entry)); + if (*filter_text != '\0') + { + cm_filter_tree(cmdata, filter_text); + gtk_tree_view_expand_all(GTK_TREE_VIEW(cmdata->treeview)); + } +} + + +static gchar *cm_get_cookie_description_text(SoupCookie *cookie) +{ + static gchar date_fmt[512]; + gchar *expires; + gchar *text; + time_t expiration_time; + const struct tm *tm; + + g_return_val_if_fail(cookie != NULL, NULL); + + if (cookie->expires != NULL) + { + expiration_time = soup_date_to_time_t(cookie->expires); + tm = localtime(&expiration_time); + /* even if some gcc versions complain about "%c", there is nothing wrong with and here we + * want to use it */ + strftime(date_fmt, sizeof(date_fmt), "%c", tm); + expires = date_fmt; + } + else + expires = _("At the end of the session"); + + text = g_markup_printf_escaped( + _("Host: %s\nName: %s\nValue: %s\nPath: %s\n" + "Secure: %s\nExpires: %s"), + cookie->domain, + cookie->name, + cookie->value, + cookie->path, + cookie->secure ? _("Yes") : _("No"), + expires); + + return text; +} + + +static void cm_set_button_sensitiveness(CMData *cmdata, gboolean set) +{ + guint i, len; + gboolean expand_set = (gtk_tree_model_iter_n_children(cmdata->filter, NULL) > 0); + + gtk_widget_set_sensitive(cmdata->delete_popup_button, set); + gtk_widget_set_sensitive(cmdata->delete_button, set); + + gtk_widget_set_sensitive(cmdata->delete_all_button, expand_set); + len = G_N_ELEMENTS(cmdata->expand_buttons); + for (i = 0; i < len; i++) + { + gtk_widget_set_sensitive(cmdata->expand_buttons[i], expand_set); + } +} + + +static void cm_tree_selection_changed_cb(GtkTreeSelection *selection, CMData *cmdata) +{ + GtkTreeIter iter, iter_store; + GtkTreeModel *model; + gchar *text; + gboolean valid = TRUE; + gboolean delete_possible = FALSE; + SoupCookie *cookie; + + if (! gtk_tree_selection_get_selected(selection, &model, &iter)) + valid = FALSE; + else + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), + &iter_store, &iter); + + if (valid && gtk_tree_store_iter_is_valid(cmdata->store, &iter_store)) + { + delete_possible = TRUE; + + gtk_tree_model_get(model, &iter, COL_COOKIE, &cookie, -1); + if (cookie != NULL) + { + text = cm_get_cookie_description_text(cookie); + + gtk_label_set_markup(GTK_LABEL(cmdata->desc_label), text); + + g_free(text); + } + else + valid = FALSE; + } + /* This is a bit hack'ish but we add some empty lines to get a minimum height of the + * label at the bottom without any font size calculation. */ + if (! valid) + gtk_label_set_text(GTK_LABEL(cmdata->desc_label), CM_EMPTY_LABEL_TEXT); + cm_set_button_sensitiveness(cmdata, delete_possible); +} + + +static gboolean cm_tree_button_press_event_cb(GtkWidget *widget, GdkEventButton *ev, CMData *cmdata) +{ + if (ev->type == GDK_2BUTTON_PRESS) + { + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + + if (gtk_tree_selection_get_selected(selection, &model, &iter)) + { + /* double click on parent node expands/collapses it */ + if (gtk_tree_model_iter_has_child(model, &iter)) + { + GtkTreePath *path = gtk_tree_model_get_path(model, &iter); + + if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path)) + gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path); + else + gtk_tree_view_expand_row(GTK_TREE_VIEW(widget), path, FALSE); + + gtk_tree_path_free(path); + + return TRUE; + } + } + } + + return FALSE; +} + + +static void cm_tree_show_popup_menu(GtkWidget *widget, GdkEventButton *event, CMData *cmdata) +{ + gint button, event_time; + + if (event != NULL) + { + button = event->button; + event_time = event->time; + } + else + { + button = 0; + event_time = gtk_get_current_event_time (); + } + + gtk_menu_popup(GTK_MENU(cmdata->popup_menu), NULL, NULL, NULL, NULL, button, event_time); +} + + +static gboolean cm_tree_popup_menu_cb(GtkWidget *widget, CMData *cmdata) +{ + cm_tree_show_popup_menu(widget, NULL, cmdata); + return TRUE; +} + + +static gboolean cm_tree_button_release_event_cb(GtkWidget *widget, GdkEventButton *ev, CMData *cmdata) +{ + if (ev->button == 3) + { + cm_tree_show_popup_menu(widget, ev, cmdata); + return TRUE; + } + return FALSE; +} + + +static void cm_tree_popup_collapse_activate_cb(GtkCheckMenuItem *item, CMData *cmdata) +{ + gtk_tree_view_collapse_all(GTK_TREE_VIEW(cmdata->treeview)); +} + + +static void cm_tree_popup_expand_activate_cb(GtkCheckMenuItem *item, CMData *cmdata) +{ + gtk_tree_view_expand_all(GTK_TREE_VIEW(cmdata->treeview)); +} + + +static void cm_store_remove(CMData *cmdata, GtkTreeIter *iter_model) +{ + GtkTreeIter iter_store; + + gtk_tree_model_filter_convert_iter_to_child_iter( + GTK_TREE_MODEL_FILTER(cmdata->filter), &iter_store, iter_model); + gtk_tree_store_remove(cmdata->store, &iter_store); +} + + +static void cm_delete_cookie(GtkTreeModel *model, GtkTreeIter *child, CMData *cmdata) +{ + SoupCookie *cookie; + + gtk_tree_model_get(model, child, COL_COOKIE, &cookie, -1); + + if (cookie != NULL) + { + cmdata->ignore_changed_count++; + + soup_cookie_jar_delete_cookie(cmdata->jar, cookie); + /* the SoupCookie object is freed when the whole list gets updated */ + } +} + + +static void cm_button_delete_clicked_cb(GtkToolButton *button, CMData *cmdata) +{ + GtkTreeIter iter, iter_store, child; + GtkTreeModel *model; + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cmdata->treeview)); + if (! gtk_tree_selection_get_selected(selection, &model, &iter)) + return; + + if (gtk_tree_model_iter_has_child(model, &iter)) + { + GtkTreePath *path = gtk_tree_model_get_path(model, &iter); + + while (gtk_tree_model_iter_children(model, &child, &iter)) + { + cm_delete_cookie(model, &child, cmdata); + cm_store_remove(cmdata, &child); + /* we retrieve again the iter at path because it got invalid by the delete operation */ + gtk_tree_model_get_iter(model, &iter, path); + } + gtk_tree_path_free(path); + /* remove/hide the parent */ + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(cmdata->filter), + &iter_store, &iter); + if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(cmdata->store), &iter_store)) + gtk_tree_store_set(cmdata->store, &iter_store, COL_VISIBLE, FALSE, -1); + else + cm_store_remove(cmdata, &iter); + } + else + { + GtkTreePath *path_store, *path_model; + + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(cmdata->filter), + &iter_store, &iter); + path_store = gtk_tree_model_get_path(GTK_TREE_MODEL(cmdata->store), &iter_store); + path_model = gtk_tree_model_get_path(model, &iter); + + cm_delete_cookie(model, &iter, cmdata); + gtk_tree_store_remove(cmdata->store, &iter_store); + + /* check whether the parent still has children, otherwise delete it */ + if (gtk_tree_path_up(path_store)) + { + gtk_tree_model_get_iter(GTK_TREE_MODEL(cmdata->store), &iter_store, path_store); + if (! gtk_tree_model_iter_has_child(GTK_TREE_MODEL(cmdata->store), &iter_store)) + /* remove the empty parent */ + gtk_tree_store_remove(cmdata->store, &iter_store); + } + /* now for the filter model */ + if (gtk_tree_path_up(path_model)) + { + gtk_tree_model_get_iter(model, &iter, path_model); + if (! gtk_tree_model_iter_has_child(model, &iter)) + { + gtk_tree_model_filter_convert_iter_to_child_iter( + GTK_TREE_MODEL_FILTER(cmdata->filter), &iter_store, &iter); + /* hide the empty parent */ + gtk_tree_store_set(cmdata->store, &iter_store, COL_VISIBLE, FALSE, -1); + } + } + gtk_tree_path_free(path_store); + gtk_tree_path_free(path_model); + } +} + + +static void cm_delete_all_cookies_real(CMData *cmdata) +{ + GtkTreeIter iter, iter_store, child; + GtkTreePath *path_first, *path; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(cmdata->treeview)); + + path_first = gtk_tree_path_new_first(); + while (gtk_tree_model_get_iter(model, &iter, path_first)) + { + path = gtk_tree_model_get_path(model, &iter); + while (gtk_tree_model_iter_children(model, &child, &iter)) + { + cm_delete_cookie(model, &child, cmdata); + cm_store_remove(cmdata, &child); + /* we retrieve again the iter at path because it got invalid by the delete operation */ + gtk_tree_model_get_iter(model, &iter, path); + } + gtk_tree_path_free(path); + /* remove/hide the parent */ + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(cmdata->filter), + &iter_store, &iter); + if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(cmdata->store), &iter_store)) + gtk_tree_store_set(cmdata->store, &iter_store, COL_VISIBLE, FALSE, -1); + else + cm_store_remove(cmdata, &iter); + } + gtk_tree_path_free(path_first); + + cm_set_button_sensitiveness(cmdata, FALSE); +} + + +static void cm_button_delete_all_clicked_cb(GtkToolButton *button, CMData *cmdata) +{ + GtkWidget *dialog; + GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(button)); + const gchar *filter_text; + + dialog = gtk_message_dialog_new(GTK_WINDOW(toplevel), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + _("Do you really want to delete all cookies?")); + + gtk_window_set_title(GTK_WINDOW(dialog), _("Question")); + /* steal Midori's icon :) */ + gtk_window_set_icon_name(GTK_WINDOW(dialog), gtk_window_get_icon_name(GTK_WINDOW(toplevel))); + + filter_text = gtk_entry_get_text(GTK_ENTRY(cmdata->filter_entry)); + if (*filter_text != '\0') + { + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + _("Only the visible cookies are deleted which match the entered filter string.")); + } + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) + cm_delete_all_cookies_real(cmdata); + + gtk_widget_destroy(dialog); +} + + +static void cm_tree_drag_data_get_cb(GtkWidget *widget, GdkDragContext *drag_context, + GtkSelectionData *data, guint info, guint ltime, CMData *cmdata) +{ + GtkTreeIter iter, iter_store; + GtkTreeSelection *selection; + GtkTreeModel *model; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cmdata->treeview)); + if (! gtk_tree_selection_get_selected(selection, &model, &iter)) + return; + + gtk_tree_model_filter_convert_iter_to_child_iter( + GTK_TREE_MODEL_FILTER(model), &iter_store, &iter); + + if (gtk_tree_store_iter_is_valid(cmdata->store, &iter_store)) + { + SoupCookie *cookie; + gchar *name, *text; + + gtk_tree_model_get(model, &iter, COL_NAME, &name, COL_COOKIE, &cookie, -1); + + if (cookie == NULL && name != NULL) + { + /* skip a leading dot */ + text = (*name == '.') ? name + 1 : name; + + gtk_selection_data_set_text(data, text, -1); + } + g_free(name); + } +} + + +#if GTK_CHECK_VERSION(2, 12, 0) +static gboolean cm_tree_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, + GtkTooltip *tooltip, CMData *cmdata) +{ + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_view_get_tooltip_context(GTK_TREE_VIEW(widget), &x, &y, + keyboard_mode, &model, NULL, &iter)) + { + gchar *tooltip_text; + SoupCookie *cookie; + + gtk_tree_model_get(model, &iter, COL_COOKIE, &cookie, -1); + + if (cookie == NULL) /* not an item */ + return FALSE; + + tooltip_text = cm_get_cookie_description_text(cookie); + + gtk_tooltip_set_markup(tooltip, tooltip_text); + + g_free(tooltip_text); + + return TRUE; + } + + return FALSE; +} +#endif + + +static gboolean cm_filter_match(const gchar *haystack, const gchar *needle) +{ + gchar *haystack_lowered, *needle_lowered; + gboolean result; + + /* empty strings always match */ + if (haystack == NULL || needle == NULL || *needle == '\0') + return TRUE; + + haystack_lowered = g_utf8_strdown(haystack, -1); + needle_lowered = g_utf8_strdown(needle, -1); + + /* if one of both could not be converted into lower case, skip those */ + if (haystack_lowered == NULL || needle_lowered == NULL) + return FALSE; + + result = (strstr(haystack_lowered, needle_lowered) != NULL); + + g_free(haystack_lowered); + g_free(needle_lowered); + + return result; +} + + +static void cm_filter_tree(CMData *cmdata, const gchar *filter_text) +{ + GtkTreeIter iter, child; + GtkTreeModel *model; + gboolean show_child, show_parent; + gboolean child_visible; + gint i, n; + gchar *name; + gchar *domain; + + model = GTK_TREE_MODEL(cmdata->store); + if (! gtk_tree_model_get_iter_first(model, &iter)) + return; + + do + { + if (gtk_tree_model_iter_has_child(model, &iter)) + { + child_visible = FALSE; + + gtk_tree_model_get(model, &iter, COL_NAME, &domain, -1); + show_parent = cm_filter_match(domain, filter_text); + g_free(domain); + n = gtk_tree_model_iter_n_children(model, &iter); + for (i = 0; i < n; i++) + { + gtk_tree_model_iter_nth_child(model, &child, &iter, i); + + gtk_tree_model_get(model, &child, COL_NAME, &name, -1); + show_child = show_parent || cm_filter_match(name, filter_text); + g_free(name); + + if (show_child) + child_visible = TRUE; + + gtk_tree_store_set(cmdata->store, &child, COL_VISIBLE, show_child, -1); + } + gtk_tree_store_set(cmdata->store, &iter, COL_VISIBLE, child_visible, -1); + } + } + while (gtk_tree_model_iter_next(model, &iter)); +} + + +static void cm_filter_entry_changed_cb(GtkEditable *editable, CMData *cmdata) +{ + const gchar *text = gtk_entry_get_text(GTK_ENTRY(editable)); + + cm_filter_tree(cmdata, text); + + if (*text != '\0') + gtk_tree_view_expand_all(GTK_TREE_VIEW(cmdata->treeview)); + else + gtk_tree_view_collapse_all(GTK_TREE_VIEW(cmdata->treeview)); +} + + +static void cm_filter_entry_clear_icon_released_cb(GtkIconEntry *e, gint pos, gint btn, CMData *cmdata) +{ + if (pos == GTK_ICON_ENTRY_SECONDARY) + gtk_entry_set_text(GTK_ENTRY(e), ""); +} + + +static void cm_tree_prepare(CMData *cmdata) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeSelection *sel; + GtkWidget *tree; + GtkWidget *item; + GtkWidget *menu; + + cmdata->treeview = tree = gtk_tree_view_new(); + cmdata->store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, SOUP_TYPE_COOKIE, G_TYPE_BOOLEAN); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes( + _("Name"), renderer, "text", COL_NAME, NULL); + gtk_tree_view_column_set_sort_indicator(column, TRUE); + gtk_tree_view_column_set_sort_column_id(column, COL_NAME); + gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); + gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), COL_NAME); + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(cmdata->store), COL_NAME, GTK_SORT_ASCENDING); + + /* selection handling */ + sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); + + /* setting filter and model */ + cmdata->filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(cmdata->store), NULL); + gtk_tree_model_filter_set_visible_column(GTK_TREE_MODEL_FILTER(cmdata->filter), COL_VISIBLE); + + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(cmdata->filter)); + g_object_unref(cmdata->store); + g_object_unref(cmdata->filter); + + /* signals */ + g_signal_connect(sel, "changed", G_CALLBACK(cm_tree_selection_changed_cb), cmdata); + g_signal_connect(tree, "button-press-event", G_CALLBACK(cm_tree_button_press_event_cb), cmdata); + g_signal_connect(tree, "button-release-event", G_CALLBACK(cm_tree_button_release_event_cb), cmdata); + g_signal_connect(tree, "popup-menu", G_CALLBACK(cm_tree_popup_menu_cb), cmdata); + + /* tooltips */ +#if GTK_CHECK_VERSION(2, 12, 0) + gtk_widget_set_has_tooltip(tree, TRUE); + g_signal_connect(tree, "query-tooltip", G_CALLBACK(cm_tree_query_tooltip), cmdata); +#endif + + /* drag'n'drop */ + gtk_tree_view_enable_model_drag_source( + GTK_TREE_VIEW(tree), + GDK_BUTTON1_MASK, + NULL, + 0, + GDK_ACTION_COPY + ); + gtk_drag_source_add_text_targets(tree); + /*gtk_drag_source_add_uri_targets(tree);*/ + g_signal_connect(tree, "drag-data-get", G_CALLBACK(cm_tree_drag_data_get_cb), cmdata); + + /* popup menu */ + menu = gtk_menu_new(); + + item = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL); + gtk_widget_show(item); + gtk_container_add(GTK_CONTAINER(menu), item); + g_signal_connect(item, "activate", G_CALLBACK(cm_button_delete_clicked_cb), cmdata); + cmdata->delete_popup_button = item; + + item = gtk_separator_menu_item_new(); + gtk_widget_show(item); + gtk_container_add(GTK_CONTAINER(menu), item); + + item = gtk_image_menu_item_new_with_mnemonic(_("_Expand All")); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), + gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU)); + gtk_widget_show(item); + gtk_container_add(GTK_CONTAINER(menu), item); + g_signal_connect(item, "activate", G_CALLBACK(cm_tree_popup_expand_activate_cb), cmdata); + cmdata->expand_buttons[2] = item; + + item = gtk_image_menu_item_new_with_mnemonic(_("_Collapse All")); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), + gtk_image_new_from_icon_name(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); + gtk_widget_show(item); + gtk_container_add(GTK_CONTAINER(menu), item); + g_signal_connect(item, "activate", G_CALLBACK(cm_tree_popup_collapse_activate_cb), cmdata); + cmdata->expand_buttons[3] = item; + + cmdata->popup_menu = menu; +} + + +static gboolean cm_delayed_refresh(CMData *cmdata) +{ + cm_refresh_store(cmdata); + cmdata->timer_id = 0; + + return FALSE; +} + + +static void cm_jar_changed_cb(SoupCookieJar *jar, SoupCookie *old, SoupCookie *new, CMData *cmdata) +{ + if (cmdata->ignore_changed_count > 0) + { + cmdata->ignore_changed_count--; + return; + } + + /* We delay these events a little bit to avoid too many rebuilds of the tree. + * Some websites (like Flyspray bugtrackers sent a whole bunch of cookies at once. */ + if (cmdata->timer_id == 0) + { + cmdata->timer_id = g_timeout_add_seconds(1, (GSourceFunc) cm_delayed_refresh, cmdata); + } +} + + +static void cm_app_add_browser_cb(MidoriApp *app, MidoriBrowser *browser, MidoriExtension *ext) +{ + GtkWidget *panel; + GtkWidget *tree_swin; + GtkWidget *desc_swin; + GtkWidget *toolbar; + GtkWidget *paned; + GtkWidget *filter_hbox; + GtkWidget *filter_label; + GtkToolItem *toolitem; + SoupSession *session; + CMData *cmdata; + + cmdata = g_new0(CMData, 1); + cmdata->app = app; + cmdata->extension = ext; + cmdata->browser = browser; + + panel = katze_object_get_object(browser, "panel"); + toolbar = gtk_toolbar_new(); + gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), GTK_ICON_SIZE_BUTTON); + gtk_widget_show(toolbar); + + toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_DELETE); + gtk_tool_item_set_is_important(toolitem, TRUE); + g_signal_connect(toolitem, "clicked", G_CALLBACK(cm_button_delete_clicked_cb), cmdata); + gtk_widget_show(GTK_WIDGET(toolitem)); + gtk_widget_set_sensitive(GTK_WIDGET(toolitem), FALSE); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + cmdata->delete_button = GTK_WIDGET(toolitem); + + toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_DELETE); + gtk_tool_button_set_label(GTK_TOOL_BUTTON(toolitem), _("Delete All")); + gtk_tool_item_set_tooltip_text(toolitem, + _("Deletes all shown cookies. " + "If a filter is set, only those cookies are deleted which match the filter.")); + gtk_tool_item_set_is_important(toolitem, TRUE); + g_signal_connect(toolitem, "clicked", G_CALLBACK(cm_button_delete_all_clicked_cb), cmdata); + gtk_widget_show(GTK_WIDGET(toolitem)); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + cmdata->delete_all_button = GTK_WIDGET(toolitem); + + toolitem = gtk_separator_tool_item_new(); + gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem), FALSE); + gtk_tool_item_set_expand(toolitem, TRUE); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + gtk_widget_show(GTK_WIDGET(toolitem)); + + toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_ADD); + gtk_tool_item_set_tooltip_text(toolitem, _("Expand All")); + g_signal_connect(toolitem, "clicked", G_CALLBACK(cm_tree_popup_expand_activate_cb), cmdata); + gtk_widget_show(GTK_WIDGET(toolitem)); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + cmdata->expand_buttons[0] = GTK_WIDGET(toolitem); + + toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_REMOVE); + gtk_tool_item_set_tooltip_text(toolitem, _("Collapse All")); + g_signal_connect(toolitem, "clicked", G_CALLBACK(cm_tree_popup_collapse_activate_cb), cmdata); + gtk_widget_show(GTK_WIDGET(toolitem)); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + cmdata->expand_buttons[1] = GTK_WIDGET(toolitem); + + cmdata->desc_label = gtk_label_new(CM_EMPTY_LABEL_TEXT); + gtk_label_set_selectable(GTK_LABEL(cmdata->desc_label), TRUE); + gtk_label_set_line_wrap(GTK_LABEL(cmdata->desc_label), TRUE); + gtk_label_set_line_wrap_mode(GTK_LABEL(cmdata->desc_label), PANGO_WRAP_CHAR); + gtk_misc_set_alignment(GTK_MISC(cmdata->desc_label), 0, 0); + gtk_misc_set_padding(GTK_MISC(cmdata->desc_label), 3, 3); + gtk_widget_show(cmdata->desc_label); + + desc_swin = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(desc_swin), + GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(desc_swin), GTK_SHADOW_NONE); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(desc_swin), cmdata->desc_label); + gtk_widget_show(desc_swin); + + cm_tree_prepare(cmdata); + gtk_widget_show(cmdata->treeview); + + tree_swin = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tree_swin), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(tree_swin), GTK_SHADOW_IN); + gtk_container_add(GTK_CONTAINER(tree_swin), cmdata->treeview); + gtk_widget_show(tree_swin); + + filter_label = gtk_label_new(_("Filter:")); + gtk_widget_show(filter_label); + + cmdata->filter_entry = gtk_icon_entry_new(); + gtk_widget_set_tooltip_text(cmdata->filter_entry, + _("Enter a filter string to show only cookies whose name or domain " + "field match the entered filter")); + gtk_widget_show(cmdata->filter_entry); + gtk_icon_entry_set_icon_from_stock(GTK_ICON_ENTRY(cmdata->filter_entry), + GTK_ICON_ENTRY_SECONDARY, GTK_STOCK_CLEAR); + gtk_icon_entry_set_icon_highlight(GTK_ICON_ENTRY (cmdata->filter_entry), + GTK_ICON_ENTRY_SECONDARY, TRUE); + g_signal_connect(cmdata->filter_entry, "icon-release", + G_CALLBACK(cm_filter_entry_clear_icon_released_cb), NULL); + g_signal_connect(cmdata->filter_entry, "changed", G_CALLBACK(cm_filter_entry_changed_cb), cmdata); + g_signal_connect(cmdata->filter_entry, "activate", G_CALLBACK(cm_filter_entry_changed_cb), cmdata); + + filter_hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(filter_hbox), filter_label, FALSE, FALSE, 3); + gtk_box_pack_start(GTK_BOX(filter_hbox), cmdata->filter_entry, TRUE, TRUE, 3); + gtk_widget_show(filter_hbox); + + paned = gtk_vpaned_new(); + gtk_paned_pack1(GTK_PANED(paned), tree_swin, TRUE, FALSE); + gtk_paned_pack2(GTK_PANED(paned), desc_swin, FALSE, FALSE); + gtk_widget_show(paned); + + cmdata->panel_page = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(cmdata->panel_page), filter_hbox, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(cmdata->panel_page), paned, TRUE, TRUE, 0); + gtk_widget_show(cmdata->panel_page); + + /* setup soup */ + session = webkit_get_default_session(); + cmdata->jar = SOUP_COOKIE_JAR(soup_session_get_feature(session, soup_cookie_jar_get_type())); + g_signal_connect(cmdata->jar, "changed", G_CALLBACK(cm_jar_changed_cb), cmdata); + + cm_refresh_store(cmdata); + + midori_panel_append_widget(MIDORI_PANEL(panel), cmdata->panel_page, + STOCK_COOKIE_MANAGER, _("Cookie Manager"), toolbar); + + g_signal_connect(ext, "deactivate", G_CALLBACK(cm_deactivate_cb), cmdata); + g_signal_connect(browser, "destroy", G_CALLBACK(cm_browser_close_cb), cmdata); + + g_object_unref(panel); +} + + +static void cm_activate_cb(MidoriExtension *extension, MidoriApp *app, gpointer data) +{ + KatzeArray* browsers; + MidoriBrowser* browser; + guint i; + + browsers = katze_object_get_object(app, "browsers"); + i = 0; + while ((browser = katze_array_get_nth_item(browsers, i++))) + cm_app_add_browser_cb(app, browser, extension); + g_object_unref(browsers); + g_signal_connect(app, "add-browser", G_CALLBACK(cm_app_add_browser_cb), extension); +} + + +MidoriExtension *extension_init(void) +{ + MidoriExtension *extension; + GtkIconFactory *factory; + GtkIconSource *icon_source; + GtkIconSet *icon_set; + static GtkStockItem items[] = + { + { STOCK_COOKIE_MANAGER, N_("_Cookie Manager"), 0, 0, NULL } + }; + + factory = gtk_icon_factory_new(); + gtk_stock_add(items, G_N_ELEMENTS(items)); + icon_set = gtk_icon_set_new(); + icon_source = gtk_icon_source_new(); + gtk_icon_source_set_icon_name(icon_source, GTK_STOCK_DIALOG_AUTHENTICATION); + gtk_icon_set_add_source(icon_set, icon_source); + gtk_icon_source_free(icon_source); + gtk_icon_factory_add(factory, STOCK_COOKIE_MANAGER, icon_set); + gtk_icon_set_unref(icon_set); + gtk_icon_factory_add_default(factory); + g_object_unref(factory); + + extension = g_object_new(MIDORI_TYPE_EXTENSION, + "name", _("Cookie Manager"), + "description", _("List, view and delete cookies"), + "version", "0.1", + "authors", "Enrico Tröger ", + NULL); + + g_signal_connect(extension, "activate", G_CALLBACK(cm_activate_cb), NULL); + + return extension; +} diff --git a/extensions/mouse-gestures/main.c b/extensions/mouse-gestures/main.c new file mode 100644 index 00000000..fa73887f --- /dev/null +++ b/extensions/mouse-gestures/main.c @@ -0,0 +1,229 @@ +/* + Copyright (C) 2009 Matthias Kruk + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include +#include "mouse-gestures.h" + +#define MOUSE_GESTURES_VERSION "0.1" +#define DEVIANCE 20 // the deviance to determine if a line is straight or not +#define MINLENGTH 50 // the minimal length of a line to be treated as a gesture + +// #define __MOUSE_GESTURES_DEBUG__ // uncomment for debugging purposes + +MouseGesture *gesture; + +void mouse_gesture_clear(MouseGesture *g) +{ + g->start.x = 0; + g->start.y = 0; + g->middle.x = 0; + g->middle.y = 0; + g->end.x = 0; + g->end.y = 0; + g->last = MOUSE_BUTTON_UNSET; + return; +} + +MouseGesture* mouse_gesture_new(void) +{ + MouseGesture *g = NULL; + if((g = g_new(MouseGesture, 1)) == NULL) + return(NULL); + mouse_gesture_clear(g); + return(g); +} + +static gboolean mouse_gestures_handle_events(GtkWidget *widget, GdkEvent *event, MidoriBrowser *browser) +{ + if(event->type == GDK_BUTTON_PRESS) // a button was pressed + { + if(gesture->last == MOUSE_BUTTON_UNSET) // if the gesture was previously cleaned -> new gesture -> new start coordinates + { + gesture->start.x = event->button.x; + gesture->start.y = event->button.y; + gesture->last = event->button.button; + } + return(TRUE); + } + else if(event->type == GDK_MOTION_NOTIFY) // the mouse was moved + { + if(gesture->last != MOUSE_BUTTON_UNSET) + { + guint x, y; + x = event->motion.x; + y = event->motion.y; + if((gesture->start.x - x < DEVIANCE && gesture->start.x - x > -DEVIANCE) || + (gesture->start.y - y < DEVIANCE && gesture->start.y - y > -DEVIANCE)) + { + gesture->middle.x = x; + gesture->middle.y = y; + } + else if((gesture->middle.x - x < DEVIANCE && gesture->middle.x - x > -DEVIANCE) || + (gesture->middle.y - y < DEVIANCE && gesture->middle.y - y > -DEVIANCE)) + { + gesture->end.x = x; + gesture->end.y = y; + } + } + return(TRUE); + } + else if(event->type == GDK_BUTTON_RELEASE) + { + if(gesture->last == MOUSE_BUTTON_MIDDLE) // all mouse gestures will use the middle mouse button + { + // middle mouse button has been released + if(gesture->middle.x - gesture->start.x < DEVIANCE && gesture->middle.x - gesture->start.x > -DEVIANCE) + { + // StartNode to MiddleNode is a straight vertical line + if(gesture->middle.y > gesture->start.y + MINLENGTH) + { + // StartNode to MiddleNode is drawn downwards + if(gesture->middle.y - gesture->end.y < DEVIANCE && gesture->middle.y - gesture->end.y > -DEVIANCE && gesture->end.x > gesture->middle.x + MINLENGTH) + { + // MiddleNode to EndNode is a straight horizontal line (to the right) -> close tab + midori_browser_activate_action(browser, "TabClose"); + #ifdef __MOUSE_GESTURES_DEBUG__ + g_print("TabClose gesture\n"); + #endif + } + else if(gesture->middle.y - gesture->end.y < DEVIANCE && gesture->middle.y - gesture->end.y > -DEVIANCE && gesture->end.x < gesture->middle.x - MINLENGTH) + { + // MiddleNode to EndNode is a straight horizontal line (to the left) -> reload + midori_browser_activate_action(browser, "Reload"); + #ifdef __MOUSE_GESTURES_DEBUG__ + g_print("Reload gesture\n"); + #endif + } + else if(gesture->end.y == 0 && gesture->end.x == 0) + { + // no EndNode, just a vertical line -> new tab + midori_browser_activate_action(browser, "TabNew"); + #ifdef __MOUSE_GESTURES_DEBUG__ + g_print("TabNew gesture\n"); + #endif + } + } + if(gesture->middle.y < gesture->start.y - MINLENGTH) + { + // StartNode to MiddleNode is drawn upwards + if(gesture->end.y == 0 && gesture->end.x == 0) + { + // no EndNode, just a vertical line -> stop + midori_browser_activate_action(browser, "Stop"); + #ifdef __MOUSE_GESTURES_DEBUG__ + g_print("Stop gesture\n"); + #endif + } + } + } + else if(gesture->middle.y - gesture->start.y < DEVIANCE && gesture->middle.y - gesture->start.y > -DEVIANCE) + { + // Start Node to MiddleNode is a straight horizontal line + if(gesture->middle.x > gesture->start.x + MINLENGTH) + { + // the line was drawn from left to right + if(gesture->end.x == 0 && gesture->end.y == 0) + { + // we only have one horizontal line from left to right -> forward gesture + midori_browser_activate_action(browser, "Forward"); + #ifdef __MOUSE_GESTURES_DEBUG__ + g_print("Forward gesture\n"); + #endif + } + } + else if(gesture->middle.x < gesture->start.x - MINLENGTH) + { + // the line was drawn from right to left + if(gesture->end.x == 0 && gesture->end.y == 0) + { + // we only have one horizontal line from right to left -> backwards gesture + midori_browser_activate_action(browser, "Back"); + #ifdef __MOUSE_GESTURES_DEBUG__ + g_print("Back gesture\n"); + #endif + } + } + } + } + mouse_gesture_clear(gesture); // gesture finished, clear it + return(TRUE); + } + else + return(FALSE); // this event is supposed to be handled again (by someone else's code) since it was irrelevant to us +} + +static void mouse_gestures_tab_cb(MidoriBrowser* browser, GtkWidget *view) // this is performed when a new tab is created +{ + g_signal_connect(view, "event", G_CALLBACK(mouse_gestures_handle_events), browser); // perform the above callback when an event from the view is received + return; +} + +static void mouse_gestures_browser_cb(MidoriApp *app, MidoriBrowser *browser) // this is performed when ever a new window is created +{ + g_signal_connect(browser, "add-tab", G_CALLBACK(mouse_gestures_tab_cb), NULL); // connect the above callback to the "add-tab" signal of browser + return; +} + +/* this is performed when the extension is deactivated. + disconnect all signal handlers, so that mouse gestures are no longer handled */ +static void mouse_gestures_deactivate(MidoriExtension *extension, MidoriApp *app) +{ + gulong signal_id = g_signal_handler_find(app, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, mouse_gestures_browser_cb, NULL); // get the signal handler id + if(signal_id != 0) // if that id is valid + g_signal_handler_disconnect(app, signal_id); // disconnect the signal + KatzeArray *browsers = katze_object_get_object(app, "browsers"); // get the array that contains all browsers + guint i; // our counter variable :) + for(i = 0; i < katze_array_get_length(browsers); i++) // from the first to the last browser + { + MidoriBrowser *browser = katze_array_get_nth_item(browsers, i); // get a pointer on the current browser + signal_id = g_signal_handler_find(browser, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, mouse_gestures_tab_cb, NULL); // search forthe signal handler id + if(signal_id != 0) // and if its not invalid.. + g_signal_handler_disconnect(browser, signal_id); // disconnect it + + GtkWidget *notebook = katze_object_get_object(browser, "notebook"); // get a pointer on the notebook + gint j; // another counter + for(j = 0; j < gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); j++) // from the first to the last tab + { + GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), j); // get a pointer on the tab's view + signal_id = g_signal_handler_find(page, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, mouse_gestures_handle_events, NULL); // find the signal id of the event handler + if(signal_id != 0) // if the id is valid + g_signal_handler_disconnect(page, signal_id); // disconnect the handler + } + } + g_free(gesture); // free the structure that contains the gesture information + return; +} + +static void mouse_gestures_activate(MidoriExtension *extension, MidoriApp *app) // this is performed on extension-activation +{ + g_signal_connect(app, "add-browser", G_CALLBACK(mouse_gestures_browser_cb), NULL); // connect the above callback to the "add-browser" signal of app + g_signal_connect(extension, "deactivate", G_CALLBACK(mouse_gestures_deactivate), app); // connect the deactivate callback to the extension + return; +} + +MidoriExtension* extension_init(void) +{ + MidoriExtension* extension = NULL; + extension = g_object_new(MIDORI_TYPE_EXTENSION, + "name", _("Mouse Gestures"), + "description", _("Control Midori by moving the mouse"), + "version", MOUSE_GESTURES_VERSION, + "authors", "Matthias Kruk ", NULL); + g_signal_connect(extension, "activate", G_CALLBACK(mouse_gestures_activate), NULL); // connect the callback that's executed on activation + gesture = NULL; // initialise gesture pointer; initialising pointers is always a good choice + if((gesture = mouse_gesture_new()) == NULL) // allocate space for the gesture + { + // no space could be allocated + g_free(extension); // free the space used by this extension + return(NULL); + } + return(extension); +} diff --git a/extensions/mouse-gestures/mouse-gestures.h b/extensions/mouse-gestures/mouse-gestures.h new file mode 100644 index 00000000..945c05ab --- /dev/null +++ b/extensions/mouse-gestures/mouse-gestures.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2009 Matthias Kruk + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MOUSE_GESTURES_H__ +#define __MOUSE_GESTURES_H__ + +typedef struct _MouseGesture MouseGesture; +typedef enum _MouseButton MouseButton; + +enum _MouseButton { + MOUSE_BUTTON_LEFT = 1, + MOUSE_BUTTON_RIGHT = 3, + MOUSE_BUTTON_MIDDLE = 2, + MOUSE_BUTTON_UNSET = 0 +}; + +struct MouseGestureNode { + double x; + double y; +} MouseGestureNode_t; + +struct _MouseGesture { + struct MouseGestureNode start; + struct MouseGestureNode middle; + struct MouseGestureNode end; + MouseButton last; +}; + +#endif diff --git a/extensions/page-holder.c b/extensions/page-holder.c new file mode 100644 index 00000000..a5435a71 --- /dev/null +++ b/extensions/page-holder.c @@ -0,0 +1,187 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include + +#define STOCK_PAGE_HOLDER "page-holder" + +static void +page_holder_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension); + +static gint +page_holder_notebook_append_view (GtkWidget* notebook) +{ + GtkWidget* view; + MidoriBrowser* browser; + MidoriWebSettings *settings; + GtkWidget* label; + + view = midori_view_new (NULL); + browser = MIDORI_BROWSER (gtk_widget_get_toplevel (notebook)); + settings = katze_object_get_object (browser, "settings"); + midori_view_set_settings (MIDORI_VIEW (view), settings); + g_object_unref (settings); + gtk_widget_show (view); + label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view)); + return gtk_notebook_append_page (GTK_NOTEBOOK (notebook), view, label); +} + +static void +page_holder_button_jump_to_clicked_cb (GtkWidget* button, + GtkWidget* notebook) +{ + gint n; + MidoriBrowser* browser; + const gchar* uri; + GtkWidget* view; + + n = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook)); + if (n < 0) + n = page_holder_notebook_append_view (notebook); + + browser = MIDORI_BROWSER (gtk_widget_get_toplevel (notebook)); + uri = midori_browser_get_current_uri (browser); + view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), n); + midori_view_set_uri (MIDORI_VIEW (view), uri); +} + +static void +page_holder_button_add_clicked_cb (GtkWidget* button, + GtkWidget* notebook) +{ + gint n; + GtkWidget* view; + MidoriBrowser* browser; + const gchar* uri; + + n = page_holder_notebook_append_view (notebook); + view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), n); + browser = MIDORI_BROWSER (gtk_widget_get_toplevel (notebook)); + uri = midori_browser_get_current_uri (browser); + midori_view_set_uri (MIDORI_VIEW (view), uri); +} + +static void +page_holder_deactivate_cb (MidoriExtension* extension, + GtkWidget* notebook) +{ + MidoriApp* app = midori_extension_get_app (extension); + + gtk_widget_destroy (notebook); + g_signal_handlers_disconnect_by_func ( + extension, page_holder_deactivate_cb, notebook); + g_signal_handlers_disconnect_by_func ( + app, page_holder_app_add_browser_cb, extension); +} + +static void +page_holder_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension) +{ + GtkWidget* panel; + GtkWidget* notebook; + GtkWidget* toolbar; + GtkToolItem* toolitem; + + panel = katze_object_get_object (browser, "panel"); + notebook = gtk_notebook_new (); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_RIGHT); + gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE); + gtk_widget_show (notebook); + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + gtk_widget_show (toolbar); + + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_JUMP_TO); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (page_holder_button_jump_to_clicked_cb), notebook); + gtk_widget_show (GTK_WIDGET (toolitem)); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + + toolitem = gtk_separator_tool_item_new (); + gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), FALSE); + gtk_tool_item_set_expand (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_ADD); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (page_holder_button_add_clicked_cb), notebook); + gtk_widget_show (GTK_WIDGET (toolitem)); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + + midori_panel_append_widget (MIDORI_PANEL (panel), notebook, + /* i18n: A panel showing a user specified web page */ + STOCK_PAGE_HOLDER, _("Pageholder"), toolbar); + g_signal_connect (extension, "deactivate", + G_CALLBACK (page_holder_deactivate_cb), notebook); + + g_object_unref (panel); +} + +static void +page_holder_activate_cb (MidoriExtension* extension, + MidoriApp* app) +{ + KatzeArray* browsers; + MidoriBrowser* browser; + guint i; + + browsers = katze_object_get_object (app, "browsers"); + i = 0; + while ((browser = katze_array_get_nth_item (browsers, i++))) + page_holder_app_add_browser_cb (app, browser, extension); + g_object_unref (browsers); + g_signal_connect (app, "add-browser", + G_CALLBACK (page_holder_app_add_browser_cb), extension); +} + +MidoriExtension* +extension_init (void) +{ + GtkIconFactory* factory; + GtkIconSource* icon_source; + GtkIconSet* icon_set; + static GtkStockItem items[] = + { + { STOCK_PAGE_HOLDER, N_("_Pageholder"), 0, 0, NULL }, + }; + + factory = gtk_icon_factory_new (); + gtk_stock_add (items, G_N_ELEMENTS (items)); + icon_set = gtk_icon_set_new (); + icon_source = gtk_icon_source_new (); + gtk_icon_source_set_icon_name (icon_source, GTK_STOCK_ORIENTATION_PORTRAIT); + gtk_icon_set_add_source (icon_set, icon_source); + gtk_icon_source_free (icon_source); + gtk_icon_factory_add (factory, STOCK_PAGE_HOLDER, icon_set); + gtk_icon_set_unref (icon_set); + gtk_icon_factory_add_default (factory); + g_object_unref (factory); + + MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION, + "name", _("Pageholder"), + "description", "", + "version", "0.1", + "authors", "Christian Dywan ", + NULL); + + g_signal_connect (extension, "activate", + G_CALLBACK (page_holder_activate_cb), NULL); + + return extension; +} diff --git a/extensions/statusbar-features.c b/extensions/statusbar-features.c new file mode 100644 index 00000000..6c37c1af --- /dev/null +++ b/extensions/statusbar-features.c @@ -0,0 +1,114 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include + +static void +statusbar_features_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension); + +static void +statusbar_features_deactivate_cb (MidoriExtension* extension, + GtkWidget* bbox) +{ + MidoriApp* app = midori_extension_get_app (extension); + + gtk_widget_destroy (bbox); + g_signal_handlers_disconnect_by_func ( + extension, statusbar_features_deactivate_cb, bbox); + g_signal_handlers_disconnect_by_func ( + app, statusbar_features_app_add_browser_cb, extension); +} + +static void +statusbar_features_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension) +{ + GtkWidget* statusbar; + GtkWidget* bbox; + MidoriWebSettings* settings; + GtkWidget* button; + GtkWidget* image; + + /* FIXME: Monitor each view and modify its settings individually + instead of merely replicating the global preferences. */ + + statusbar = katze_object_get_object (browser, "statusbar"); + bbox = gtk_hbox_new (FALSE, 0); + settings = katze_object_get_object (browser, "settings"); + button = katze_property_proxy (settings, "auto-load-images", "toggle"); + image = gtk_image_new_from_stock (STOCK_IMAGE, GTK_ICON_SIZE_MENU); + gtk_widget_show (image); + gtk_container_add (GTK_CONTAINER (button), image); + #if GTK_CHECK_VERSION(2, 12, 0) + gtk_widget_set_tooltip_text (button, _("Load images automatically")); + #endif + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2); + gtk_widget_show (button); + button = katze_property_proxy (settings, "enable-scripts", "toggle"); + image = gtk_image_new_from_stock (STOCK_SCRIPTS, GTK_ICON_SIZE_MENU); + gtk_widget_show (image); + gtk_container_add (GTK_CONTAINER (button), image); + #if GTK_CHECK_VERSION(2, 12, 0) + gtk_widget_set_tooltip_text (button, _("Enable scripts")); + #endif + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2); + gtk_widget_show (button); + button = katze_property_proxy (settings, "enable-plugins", "toggle"); + image = gtk_image_new_from_stock (STOCK_PLUGINS, GTK_ICON_SIZE_MENU); + gtk_widget_show (image); + gtk_container_add (GTK_CONTAINER (button), image); + #if GTK_CHECK_VERSION(2, 12, 0) + gtk_widget_set_tooltip_text (button, _("Enable plugins")); + #endif + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2); + gtk_widget_show (button); + gtk_widget_show (bbox); + gtk_box_pack_start (GTK_BOX (statusbar), bbox, FALSE, FALSE, 3); + g_object_unref (settings); + + g_signal_connect (extension, "deactivate", + G_CALLBACK (statusbar_features_deactivate_cb), bbox); +} + +static void +statusbar_features_activate_cb (MidoriExtension* extension, + MidoriApp* app) +{ + KatzeArray* browsers; + MidoriBrowser* browser; + guint i; + + browsers = katze_object_get_object (app, "browsers"); + i = 0; + while ((browser = katze_array_get_nth_item (browsers, i++))) + statusbar_features_app_add_browser_cb (app, browser, extension); + g_signal_connect (app, "add-browser", + G_CALLBACK (statusbar_features_app_add_browser_cb), extension); +} + +MidoriExtension* +extension_init (void) +{ + MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION, + "name", "Statusbar Features", + "description", "", + "version", "0.1", + "authors", "Christian Dywan ", + NULL); + + g_signal_connect (extension, "activate", + G_CALLBACK (statusbar_features_activate_cb), NULL); + + return extension; +} diff --git a/extensions/tab-panel/main.c b/extensions/tab-panel/main.c new file mode 100644 index 00000000..bcaf07d7 --- /dev/null +++ b/extensions/tab-panel/main.c @@ -0,0 +1,77 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "tab-panel-extension.h" + +#include + +#define STOCK_TAB_PANEL "tab-panel" + +static void +tab_panel_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser) +{ + GtkWidget* panel; + GtkWidget* child; + + /* FIXME: Actually provide a tree view listing all views. */ + + panel = katze_object_get_object (browser, "panel"); + child = midori_view_new (NULL); + gtk_widget_show (child); + midori_panel_append_widget (MIDORI_PANEL (panel), child, + STOCK_TAB_PANEL, _("Tab Panel"), NULL); +} + +static void +tab_panel_activate_cb (MidoriExtension* extension, + MidoriApp* app) +{ + g_signal_connect (app, "add-browser", + G_CALLBACK (tab_panel_app_add_browser_cb), NULL); +} + +MidoriExtension* +extension_init (void) +{ + MidoriExtension* extension; + GtkIconFactory* factory; + GtkIconSource* icon_source; + GtkIconSet* icon_set; + static GtkStockItem items[] = + { + { STOCK_TAB_PANEL, N_("T_ab Panel"), 0, 0, NULL }, + }; + + factory = gtk_icon_factory_new (); + gtk_stock_add (items, G_N_ELEMENTS (items)); + icon_set = gtk_icon_set_new (); + icon_source = gtk_icon_source_new (); + gtk_icon_source_set_icon_name (icon_source, GTK_STOCK_INDEX); + gtk_icon_set_add_source (icon_set, icon_source); + gtk_icon_source_free (icon_source); + gtk_icon_factory_add (factory, STOCK_TAB_PANEL, icon_set); + gtk_icon_set_unref (icon_set); + gtk_icon_factory_add_default (factory); + g_object_unref (factory); + + extension = g_object_new (TAB_PANEL_TYPE_EXTENSION, + "name", _("Tab Panel"), + "description", "", + "version", "0.1", + "authors", "Christian Dywan ", + NULL); + + g_signal_connect (extension, "activate", + G_CALLBACK (tab_panel_activate_cb), NULL); + + return extension; +} diff --git a/extensions/tab-panel/tab-panel-extension.c b/extensions/tab-panel/tab-panel-extension.c new file mode 100644 index 00000000..417c1359 --- /dev/null +++ b/extensions/tab-panel/tab-panel-extension.c @@ -0,0 +1,38 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "tab-panel-extension.h" + +#include + +struct _TabPanelExtension +{ + MidoriExtension parent_instance; +}; + +struct _TabPanelExtensionClass +{ + MidoriExtensionClass parent_class; +}; + +G_DEFINE_TYPE (TabPanelExtension, tab_panel_extension, MIDORI_TYPE_EXTENSION); + +static void +tab_panel_extension_class_init (TabPanelExtensionClass* class) +{ + /* Nothing to do. */ +} + +static void +tab_panel_extension_init (TabPanelExtension* extension) +{ + /* Nothing to do. */ +} diff --git a/extensions/tab-panel/tab-panel-extension.h b/extensions/tab-panel/tab-panel-extension.h new file mode 100644 index 00000000..583998b4 --- /dev/null +++ b/extensions/tab-panel/tab-panel-extension.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __TAB_PANEL_EXTENSION_H__ +#define __TAB_PANEL_EXTENSION_H__ + +#include + +G_BEGIN_DECLS + +#define TAB_PANEL_TYPE_EXTENSION \ + (midori_extension_get_type ()) +#define TAB_PANEL_EXTENSION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), TAB_PANEL_TYPE_EXTENSION, TabPanelExtension)) +#define TAB_PANEL_EXTENSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), TAB_PANEL_TYPE_EXTENSION, TabPanelExtensionClass)) +#define TAB_PANEL_IS_EXTENSION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TAB_PANEL_TYPE_EXTENSION)) +#define TAB_PANEL_IS_EXTENSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), TAB_PANEL_TYPE_EXTENSION)) +#define TAB_PANEL_EXTENSION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), TAB_PANEL_TYPE_EXTENSION, TabPanelExtensionClass)) + +typedef struct _TabPanelExtension TabPanelExtension; +typedef struct _TabPanelExtensionClass TabPanelExtensionClass; + +GType +tab_panel_extension_get_type (void); + +/* There is no API for TabPanelExtension. Please use the + available properties and signals. */ + +G_END_DECLS + +#endif /* __TAB_PANEL_EXTENSION_H__ */ diff --git a/extensions/wscript_build b/extensions/wscript_build new file mode 100644 index 00000000..ae26cc50 --- /dev/null +++ b/extensions/wscript_build @@ -0,0 +1,32 @@ +#! /usr/bin/env python +# WAF build script for midori +# This file is licensed under the terms of the expat license, see the file EXPAT. + +extensions = os.listdir ('extensions') +for extension in extensions: + # Tab Panel isn't useful at this point + if extension == 'tab-panel': + continue + folder = 'extensions' + os.sep + extension + if os.path.isdir (folder): + files = os.listdir (folder) + target = extension + source = '' + for fila in files: + if fila[-2:] == '.c': + source += ' ' + extension + os.sep + fila + if not source: + Utils.pprint ('RED', folder + ': No source files found') + continue + else: + if extension[-2:] != '.c': + continue + target = extension[:-2] + source = extension + + obj = bld.new_task_gen ('cc', 'shlib') + obj.target = target + obj.includes = '..' + obj.source = source + obj.uselib = 'UNIQUE LIBSOUP GIO GTK SQLITE WEBKIT LIBXML' + obj.install_path = '${LIBDIR}/midori' diff --git a/icons/16x16/extension.png b/icons/16x16/extension.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcd27e14b0e2acae4602a406734fdf351f3abb1 GIT binary patch literal 780 zcmV+n1M~ceP)RmrMFJDZK5?Ycm6jSr2!TM*`}HIDp4|2W7>2R&(4KmV^GmpT=e(SqpIHGcA;4vr ze4Fg%XJiVkVRdpC$4TT@Hj6UL?WtH5T*Hsq(Z8NxE+%f%3&70WIN^*!N{ctAeC+FZ zRE3 z!TW(Xq<8}u+DZ(Kevt(^#h&5uuljZ8^ZTN<#n&i=*a3KL$F4Y7b2xcAI?P;T21iMh zBauqsNQd&Godo>pd>-s#UG^q!+`Y0O{?tL$IpgfMvZ^!LSs~ZJ$S0IiIF3XrNkM1> z!PF3+`nzOd?j~3Nw{G>S^XUUocgcTGX|+WNW6E(7`Ns|(_fJK}$XppFEjgX(*-1LO zUs9Y`M(e{{kw|p@x;x1_0I0Yf+h;1JwjSDBAF|w@tRyoDspAxdOKE+0bADi`$Gg3} z+Syf6YfVgzptROn>#L6&qNf(OHUNTY8N}5*y(1m;egA-M+YAo(3#C=*i??m229#3& zexsBQYctl770g2z2C-Na!!T?lZm;Ewdo7>dPQm$?BwZ-k&uBBCQo7T0M9X)Be zJukJ^r5cTrQcERs+MD#`Z|MKrSlKL0ARUlEti4G`mdskNoqqwpULEDuZ~rC$0000< KMNUMnLSTYKd~3k~ literal 0 HcmV?d00001 diff --git a/icons/16x16/midori.png b/icons/16x16/midori.png new file mode 100644 index 0000000000000000000000000000000000000000..578f6cb5a00118b1d5bc295d955977c2bb3fd4a2 GIT binary patch literal 937 zcmV;a16KTrP)wK#uy$q&+aG0vC#pC?2<+0MO~{pw@=u;06_om zuq!V2Dw6uX$V=O*X3fKF1`GCxZ8?JvG~{6px(_QGWKlUUQrA<_NR*ByZT}y zyUa$OBlJw9DKdQV^XUu!anKnja&s_pk}$q+N34fNTcQ{|KBSwql}|0xKE`acQBIg} ziAqRuDKh~60d&TR$E!4^SNWd|_rEp(x9mpz$f06YHx8tR*{Kct$g2V`e)rBBZ>v-3 z-}&XgvV8pqopC|~-r!hUOMAF?doQxa9A@s`E0oKXNoM2L#sPX!RXnke`af(~-?|Rz z^fdChV!jS&3at4=7L~SLuk_$v;Wk`?3!y+r;=p%FlIzEvTX)c&?K{=9HUiCRfMJ+e z`ZGHZ0Ce*~!g-a(k6+)jm*mTfFzh1oriK<@yD~iVEeIh}$y`RVa31q|3hO*EOs6wu zwPM@^0J^0;);G6s-_x`zjGC##D}<1$UcgxHEL=qu91);f1pt6RB=C-eg~eqa43hxB zxkR~Hl|2x65tpuA#$@Ua+|&<+`tXdr2kSju^^{a0fZ4fusET_jlVCLf;FtrRFap9+ zj8BfEb5jQv^}BdJ(1)SJC*iRob%0-5jm*p}BuPp>*l}RsR!j>#;b7<{cmZ&jgKCZg z<#|xWssq-zH(_dO8kI`rY8?>th0bKNIcMbhH3&q4Q8VGdLa|VS&)*1>82|vU5QMfw zkWBuvqG^@y>wrVM&n-T;v14HD=kZcavoV)hKv;en&8<&hc6J^r2_xF@GGf6uar*RG zL?Ww?XA*4rp!=-~C?CVGC+6cZp`VI5@d`@@w3;e`H3ZtVp|0tEpYcmOE zKe9~kef`o`zux(6AfGEpB9*Q)#;#CG-(rmYR4!|uWfJWEzx96u5FbvYYfsRx00000 LNkvXXu0mjfOOLK> literal 0 HcmV?d00001 diff --git a/icons/16x16/news-feed.png b/icons/16x16/news-feed.png new file mode 100644 index 0000000000000000000000000000000000000000..05363c5a9a8612b6cba1757decaedfb8d7c28c17 GIT binary patch literal 832 zcmV-G1Hb%_dv{xNPqk>5rYMj%?nsO|;#GuN}hOxr*g~L5vU-qCzaN z=plN-f+y|d^ww(>KJ0R)wlU2d8oKcHG5pYr$l`61g<0J7ab*7Yk|KHt9V~j{+!B?Z zUev$=<-8)KOE-y0igq{9Ejx*|eYoGg#!Y_;MP5=AD_Ca{>=ELsL8;irT|Z0q_YG{* zc0yx}xZ`Pxy)P3t)yY0T1|bKt^%6Bm0L%jnlCIhDz`+3>|F zvLD|=v_l*{jhNytega+HX!FGV1ku2-vh%~w;-5MLH@+j8`UtD`5=KwsralC}i1rNK zN8r{7tY{PV9!0nA!9s`Z%U99iV_4rX6w4%YSFu_X>#ie9w?G6lEHQ|xipUCFJB!R+ zA)UPd8jw3PkX6xvQRL5QSZ<+>LnIIOp=tz0Wa4D@&EWn=5BKk?NpWQgU7BCpjQ>@# zc`I)B|D%A8PbVssZ!)+BKEm69bbHd&2|Vnr$(0?&5OZ z4oAeyIQNnqNV4pMqKG3QYS-%NqE=4&Ke@R|b}7$`H(oh!7ybe76MU%xdKyXq0000< KMNUMnLSTXc=6s6) literal 0 HcmV?d00001 diff --git a/icons/22x22/extension.png b/icons/22x22/extension.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9c45e90e90af159a3e6c3c1632848382931489 GIT binary patch literal 1105 zcmV-X1g`suP)C(gb<|wz!=X8;Ws%+8eb1q0mQ=LXvL9(b`cRll3ewW zL_jz2UgtZxbS7=)&mV}_Jsf4!f$P1HQbI}z29EMT z9bC_w2QUf%x~^NBHpYU3V;50fz8L`S`J^}iK|~CMHK-I4v5E%t{oI?*<+5)($<=GP zu6z8_K!2vVs0>mHfPoc2md&ayoAG~vrId_w1>ryx8rLC7AZQd}A~m4_aPom+RaM)H zBgJ{xTCy#>-VBZy0b@*4wK>aX4TVy;nWc1KYHA9Js>cBaEN9b@QegMay|~bO{GduPMul#zcW1F=-QdPMDlao`%neR`20l;EJgl!#4 zyJ?uO`o3Q)iB!&*zQ6SaEgp|4kzfht{+fkh7?8}z)vkk!{r*m&sQ}R5DY^i3-Bz!L)91dve5C!gVBcUj0;+**ZUwIAf~3gzfv~)i zK~?!C{Jk&>Rng%45{jZO6>5BkI7u4THEkfhxC{;sfFo92kEb5nheT}?gd{wcJYtV)Gbwn==h1xmH>PV0IFrP3RP9d7~`ZW%Fs%7r47K%Kp>EaM50KjO$e$b z_@TEaow_l_TXwew8e+|Aq^K09PJf=gwYbm@AboS@MvLcp7Xh3qG_N!gj?(LgIwFHZ z16I$4v%>((HP%0>X*vhZE9g4$$(-xD$B5|ineLMVhY!At+kVBXPLf6d^sFBc&N-)? zSVmc8RIy)q!<2%|te?U4)DQ-L8BXVNxx-G9zOii9Xqskjc77(fp?u@LW@8P^7-QrM zA0y*eAcTaZ)j>(rJOYI)62OvWGj15>m;0W5&KysT;QxR*1EbRDL)h8ey5?X2Og)6| zbLUk6lK|?Z5cSp*+gW@ej^aq^e}dW8qlhbtGE@`_yX&1qlDVEY@zV#(jR5fUG4m@a z#eRU1lu`ka5K_dPBu(D|CL&lis{~-?6D=su+drKoWeNe7&B6fuf;!2&?>6?p?Yw^g XYeBdwwLjyi00000NkvXXu0mjf7`glx literal 0 HcmV?d00001 diff --git a/icons/22x22/midori.png b/icons/22x22/midori.png new file mode 100644 index 0000000000000000000000000000000000000000..85523e8fdf0d804d2d11ace7d08fc5cc1c9b034e GIT binary patch literal 1400 zcmV-;1&8{HP)U>z7+2+eavV<)&Cb~WB!H1d6WG2pN;{LhKY>Qi}6XTy{1C7pTKmRZ_n*Ldl+6hja2fpZxO8$&aCw;(3?H$FKk@095ciUrs44OC%D%sD8S8 zx`uxa%m&~UQM7Co1bzb{MhXCM92X>nd;;L}nf3n*dmFfAX=$mS3W89vXi-kQsA#c# z?b;1P)AasWOxvaF`VXp~8Xh0xn)!}-RutX_zBE1E{gtL^B^x)c=U1;@i92`h;n1Nk zqK07{h{xj}s(xw!K-p_4`@`Y!cL9{EetP|x9hdKL@3C6Ny|uN~mddK-5G_`mKi5J| zocKAcX~1Y$Jm@s$5};jSA4MdJsx5lVQmxx zw?c{I$A26*45LEz)846C#b%Sv7ZoioYHWN{Ja+6`Sgj)aM8+N;!`f`psnXKoo0^&`*XGSWftWfbCL$ynjRl^7W!ZKlH+Nyh z&bM9{AA~!h>pIeJdo11ChvN0zhyUY_*CXZQs5vWmxZpt`Wo&It(L@p-2yky{njAyWWv47D3L= z&H}+Ct~@x2zaF>4q$U{3KoV>i8w-m7`jW86$5bhbE4Qqygy{|3L_DFRKiZB68G&h1 z+?%+JLiY;9sENJ@t#}yfhG7_>l!BUoB*=(HHJGMpsD2tw!gjmdRA0Z&F&-NQr6wd< zLcX*V*B_mRnMi;bakLFw0Hpvm0Zf6@XP3MHfxs{rhUuO8!&uX#CAql^5t@7qr>r2- z&%=!ZWZDb<0Zc&Rok+FL2Q_K(ZhB{>crh?AI8F%Zng#2+o}G~~4;s;+*t2l-=+}rv zH3TOEFipT=aigxd5xymj$Z+JroCQ;4r+LxVb}I;=V#1hm8?1d9M&C$Mn;Mp3$;5|ZG+>C@*DhGFc-oW-kt8u0j-t%nbP`98<7s};p< zv5PKt`b$OQ<0vfjqPzPpQlIo9mFOAjKuOLD4EB#<-@XGOLP)9Vr~Us4PvKb{ z$K7mbST9ypy=W)Iz<1yOG;-tmO}E#ZH&k6+socHW6K`p`0z$|Z)lZw}qECgV@Di3~ zn^>0J!m{iHA*7j7x(C3^JkPz#FiZy_#zECjA3Y5PfWHBiW_UaJp%(oB00003Ntd+*-8?fZ+XuB)r5S(~M6P{^{S znIs~c+NXpFA&8)Yz%P+SR)~o8QKAS8LnzIpgp9HcGoe;1BQ)7ocUw)v-F4sYIcH{` zKAd~k-7=|xfthE{^Pm6of1Wvy5)lASZc?kX?>}dZYjYwgCop+Ram`e_15sKJiBi9W zdGlDTc@=&my}Jb!b|!5pAn8nT)8+Xr%!Z`8!Ov74w%3+~Y>RK;;-!Z&1hrmV&s7shK2^bsVhQ`S>HW3?F z<~uGuYXf#m}5I`5I4NQn0>H(Vv z6GEJy$hvrGBwI_|zKy7DD=L*u!VgD~kt;|z4B{rfcLIKKt4xHxdXCJ|7ZT=`&Dh#I zu#L;XOCw$i2}*HIZH(71CcWoD$Pe7G{6r=(78~Mn4dhquBwV=@)4U2b&`s*VCcJZ> zqT(??5FJ3KlIYR>kjmW<*a6xVrLYmAG|J?WAd9VAjJfLxqBXnGXFnl*XftZKKM7fT z$Su<`54?I4#>HJxSAG4}iC==`>WNpsiJ7*PVBdNq8cPoSGDYsJdN1nI4+STU%v%0W#sa!n72;yBG3K^M2siF0T=N#{^3V94uRt`MIAp4@ z3pe6-?VhlaE`v + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Nancy Runge + + + + + licenced under LGPL + + + Extensions + + + http://www.twotoasts.de + + + + + + + + + + + diff --git a/icons/scalable/midori.svg b/icons/scalable/midori.svg new file mode 100644 index 00000000..5d1b98b8 --- /dev/null +++ b/icons/scalable/midori.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/scalable/news-feed.svg b/icons/scalable/news-feed.svg new file mode 100644 index 00000000..2a2f6238 --- /dev/null +++ b/icons/scalable/news-feed.svg @@ -0,0 +1,280 @@ + + +image/svg+xml \ No newline at end of file diff --git a/icons/wscript_build b/icons/wscript_build new file mode 100644 index 00000000..0687a70c --- /dev/null +++ b/icons/wscript_build @@ -0,0 +1,39 @@ +#! /usr/bin/env python +# WAF build script for midori +# This file is licensed under the terms of the expat license, see the file EXPAT. + +import Utils + +def add_image (bld, category, name): + + srcdir = os.getcwd () + blddir = bld.bdir + + rsvg_convert = bld.env['RSVG_CONVERT'] + + if rsvg_convert: + Utils.check_dir (blddir + '/icons') + + for size in [16, 22, 32, 48]: + format = str (size) + 'x' + str (size) + if os.access (srcdir + '/icons/' + format + '/' + name + '.png', os.F_OK): + bld.install_files ('${DATADIR}/icons/hicolor/' + format + '/' + category, + srcdir + '/icons/' + format + '/' + name + '.png') + elif not rsvg_convert: + pass + elif os.access (srcdir + '/icons/scalable/' + name + '.svg', os.F_OK): + Utils.check_dir (blddir + '/icons/' + format) + command = rsvg_convert + ' -w ' + str(size) + \ + ' -h ' + str(size) + \ + ' -o ' + blddir + '/icons/' + format + '/' + name + '.png' + \ + ' ' + srcdir + '/icons/scalable/' + name + '.svg' + if not Utils.exec_command (command): + bld.install_files ('${DATADIR}/icons/hicolor/' + format + '/' + category, + blddir + '/icons/' + format + '/' + name + '.png') + else: + Utils.pprint ('BLUE', "Optimized icons could not be created.") + break + +add_image (bld, 'categories', 'extension') +add_image (bld, 'apps', 'midori') +add_image (bld, 'status', 'news-feed') diff --git a/katze/katze-array.c b/katze/katze-array.c new file mode 100644 index 00000000..b9ff9647 --- /dev/null +++ b/katze/katze-array.c @@ -0,0 +1,439 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "katze-array.h" + +#include "katze-utils.h" +#include "marshal.h" + +#include +#include + +/** + * SECTION:katze-array + * @short_description: A type aware item container + * @see_also: #KatzeList + * + * #KatzeArray is a type aware container for items. + */ + +struct _KatzeArray +{ + KatzeItem parent_instance; + + GType type; + GList* items; +}; + +struct _KatzeArrayClass +{ + KatzeItemClass parent_class; + + /* Signals */ + void + (*add_item) (KatzeArray* array, + gpointer item); + void + (*remove_item) (KatzeArray* array, + gpointer item); + void + (*move_item) (KatzeArray* array, + gpointer item, + gint index); + void + (*clear) (KatzeArray* array); +}; + +G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM); + +enum { + ADD_ITEM, + REMOVE_ITEM, + MOVE_ITEM, + CLEAR, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +katze_array_finalize (GObject* object); + +static void +_katze_array_add_item (KatzeArray* array, + gpointer item) +{ + if (katze_array_is_a (array, G_TYPE_OBJECT)) + { + GType type = G_OBJECT_TYPE (item); + + g_return_if_fail (katze_array_is_a (array, type)); + g_object_ref (item); + if (g_type_is_a (type, KATZE_TYPE_ITEM)) + katze_item_set_parent (item, array); + } + + array->items = g_list_append (array->items, item); +} + +static void +_katze_array_remove_item (KatzeArray* array, + gpointer item) +{ + array->items = g_list_remove (array->items, item); + + if (katze_array_is_a (array, G_TYPE_OBJECT)) + { + if (KATZE_IS_ITEM (item)) + katze_item_set_parent (item, NULL); + g_object_unref (item); + } +} + +static void +_katze_array_move_item (KatzeArray* array, + gpointer item, + gint position) +{ + array->items = g_list_remove (array->items, item); + array->items = g_list_insert (array->items, item, position); +} + +static void +_katze_array_clear (KatzeArray* array) +{ + guint n; + guint i; + GObject* item; + + n = g_list_length (array->items); + for (i = 0; i < n; i++) + { + if ((item = g_list_nth_data (array->items, i))) + katze_array_remove_item (array, item); + } + g_list_free (array->items); + array->items = NULL; +} + +static void +katze_array_class_init (KatzeArrayClass* class) +{ + GObjectClass* gobject_class; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = katze_array_finalize; + + signals[ADD_ITEM] = g_signal_new ( + "add-item", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (KatzeArrayClass, add_item), + 0, + NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + signals[REMOVE_ITEM] = g_signal_new ( + "remove-item", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (KatzeArrayClass, remove_item), + 0, + NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + /** + * KatzeArray::move-item: + * @array: the object on which the signal is emitted + * @item: the item being moved + * @position: the new position of the item + * + * An item is moved to a new position. + * + * Since: 0.1.6 + **/ + signals[MOVE_ITEM] = g_signal_new ( + "move-item", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (KatzeArrayClass, move_item), + 0, + NULL, + katze_cclosure_marshal_VOID__POINTER_INT, + G_TYPE_NONE, 2, + G_TYPE_POINTER, + G_TYPE_INT); + + signals[CLEAR] = g_signal_new ( + "clear", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (KatzeArrayClass, clear), + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = katze_array_finalize; + + class->add_item = _katze_array_add_item; + class->remove_item = _katze_array_remove_item; + class->move_item = _katze_array_move_item; + class->clear = _katze_array_clear; +} + +static void +katze_array_init (KatzeArray* array) +{ + array->type = G_TYPE_NONE; + array->items = NULL; +} + +static void +katze_array_finalize (GObject* object) +{ + KatzeArray* array; + guint i; + + array = KATZE_ARRAY (object); + if (katze_array_is_a (array, G_TYPE_OBJECT)) + { + gpointer item; + i = 0; + while ((item = g_list_nth_data (array->items, i++))) + g_object_unref (item); + } + + g_list_free (array->items); + + G_OBJECT_CLASS (katze_array_parent_class)->finalize (object); +} + +/** + * katze_array_new: + * @type: the expected item type + * + * Creates a new #KatzeArray for @type items. + * + * You may only add items of the given type or inherited + * from it to this array *if* @type is an #GObject type. + * The array will keep a reference on each object until + * it is removed from the array. + * + * Return value: a new #KatzeArray + **/ +KatzeArray* +katze_array_new (GType type) +{ + KatzeArray* array = g_object_new (KATZE_TYPE_ARRAY, NULL); + array->type = type; + + return array; +} + +/** + * + * katze_array_is_a: + * @array: a #KatzeArray + * @is_a_type: type to compare with + * + * Checks whether the array is compatible + * with items of the specified type. + * + * Retur value: %TRUE if @array is compatible with @is_a_type + **/ +gboolean +katze_array_is_a (KatzeArray* array, + GType is_a_type) +{ + g_return_val_if_fail (KATZE_IS_ARRAY (array), FALSE); + + return g_type_is_a (array->type, is_a_type); +} + +/** + * katze_array_add_item: + * @array: a #KatzeArray + * @item: an item + * + * Adds an item to the array. + * + * If @item is a #KatzeItem its parent is set accordingly. + **/ +void +katze_array_add_item (KatzeArray* array, + gpointer item) +{ + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_emit (array, signals[ADD_ITEM], 0, item); +} + +/** + * katze_array_remove_item: + * @array: a #KatzeArray + * @item: an item + * + * Removes an item from the array. + * + * If @item is a #KatzeItem its parent is unset accordingly. + **/ +void +katze_array_remove_item (KatzeArray* array, + gpointer item) +{ + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_emit (array, signals[REMOVE_ITEM], 0, item); +} + +/** + * katze_array_get_nth_item: + * @array: a #KatzeArray + * @n: an index in the array + * + * Retrieves the item in @array at the position @n. + * + * Return value: an item, or %NULL + **/ +gpointer +katze_array_get_nth_item (KatzeArray* array, + guint n) +{ + g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL); + + return g_list_nth_data (array->items, n); +} + +/** + * katze_array_is_empty: + * @array: a #KatzeArray + * + * Determines whether @array is empty. + * + * Return value: an item, or %NULL + **/ +gboolean +katze_array_is_empty (KatzeArray* array) +{ + g_return_val_if_fail (KATZE_IS_ARRAY (array), TRUE); + + return !g_list_nth_data (array->items, 0); +} + +/** + * katze_array_get_item_index: + * @array: a #KatzeArray + * @item: an item in the array + * + * Retrieves the index of the item in @array. + * + * Return value: an item, or -1 + **/ +gint +katze_array_get_item_index (KatzeArray* array, + gpointer item) +{ + g_return_val_if_fail (KATZE_IS_ARRAY (array), -1); + + return g_list_index (array->items, item); +} + +/** + * katze_array_find_token: + * @array: a #KatzeArray + * @token: a token string + * + * Looks up an item in the array which has the specified token. + * + * This function will silently fail if the type of the list + * is not based on #GObject and only #KatzeItem children + * are checked for their token, any other objects are skipped. + * + * Note that @token is by definition unique to one item. + * + * Return value: an item, or %NULL + **/ +gpointer +katze_array_find_token (KatzeArray* array, + const gchar* token) +{ + guint i; + gpointer item; + + if (!katze_array_is_a (array, G_TYPE_OBJECT)) + return NULL; + + i = 0; + while ((item = g_list_nth_data (array->items, i++))) + { + const gchar* found_token = katze_item_get_token ((KatzeItem*)item); + if (!g_strcmp0 (found_token, token)) + return item; + } + return NULL; +} + +/** + * katze_array_get_length: + * @array: a #KatzeArray + * + * Retrieves the number of items in @array. + * + * Return value: the length of the list + **/ +guint +katze_array_get_length (KatzeArray* array) +{ + g_return_val_if_fail (KATZE_IS_ARRAY (array), 0); + + return g_list_length (array->items); +} + +/** + * katze_array_move_item: + * @array: a #KatzeArray + * @item: the item being moved + * @position: the new position of the item + * + * Moves @item to the position @position. + * + * Since: 0.1.6 + **/ +void +katze_array_move_item (KatzeArray* array, + gpointer item, + gint position) +{ + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_emit (array, signals[MOVE_ITEM], 0, item, position); +} + +/** + * katze_array_clear: + * @array: a #KatzeArray + * + * Deletes all items currently contained in @array. + **/ +void +katze_array_clear (KatzeArray* array) +{ + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_emit (array, signals[CLEAR], 0); +} diff --git a/katze/katze-array.h b/katze/katze-array.h new file mode 100644 index 00000000..89bfea9c --- /dev/null +++ b/katze/katze-array.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_ARRAY_H__ +#define __KATZE_ARRAY_H__ + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_ARRAY \ + (katze_array_get_type ()) +#define KATZE_ARRAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_ARRAY, KatzeArray)) +#define KATZE_ARRAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_ARRAY, KatzeArrayClass)) +#define KATZE_IS_ARRAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_ARRAY)) +#define KATZE_IS_ARRAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_ARRAY)) +#define KATZE_ARRAY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_ARRAY, KatzeArrayClass)) + +typedef struct _KatzeArray KatzeArray; +typedef struct _KatzeArrayClass KatzeArrayClass; + +GType +katze_array_get_type (void); + +KatzeArray* +katze_array_new (GType type); + +gboolean +katze_array_is_a (KatzeArray* array, + GType is_a_type); + +void +katze_array_add_item (KatzeArray* array, + gpointer item); + +void +katze_array_remove_item (KatzeArray* array, + gpointer item); + +gpointer +katze_array_get_nth_item (KatzeArray* array, + guint n); + +gboolean +katze_array_is_empty (KatzeArray* array); + +gint +katze_array_get_item_index (KatzeArray* array, + gpointer item); + +gpointer +katze_array_find_token (KatzeArray* array, + const gchar* token); + +guint +katze_array_get_length (KatzeArray* array); + +void +katze_array_move_item (KatzeArray* array, + gpointer item, + gint position); + +void +katze_array_clear (KatzeArray* array); + +G_END_DECLS + +#endif /* __KATZE_ARRAY_H__ */ diff --git a/katze/katze-arrayaction.c b/katze/katze-arrayaction.c new file mode 100644 index 00000000..7d704b84 --- /dev/null +++ b/katze/katze-arrayaction.c @@ -0,0 +1,574 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "katze-arrayaction.h" + +#include "katze-net.h" +#include "katze-utils.h" + +#include +#include +#include + +struct _KatzeArrayAction +{ + GtkAction parent_instance; + + KatzeArray* array; + KatzeNet* net; +}; + +struct _KatzeArrayActionClass +{ + GtkActionClass parent_class; +}; + +G_DEFINE_TYPE (KatzeArrayAction, katze_array_action, GTK_TYPE_ACTION); + +enum +{ + PROP_0, + + PROP_ARRAY +}; + +enum +{ + POPULATE_POPUP, + ACTIVATE_ITEM, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +katze_array_action_finalize (GObject* object); + +static void +katze_array_action_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +katze_array_action_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +katze_array_action_activate (GtkAction* object); + +static GtkWidget* +katze_array_action_create_tool_item (GtkAction* action); + +static GtkWidget* +katze_array_action_create_menu_item (GtkAction* action); + +static void +katze_array_action_connect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +katze_array_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +katze_array_action_class_init (KatzeArrayActionClass* class) +{ + GObjectClass* gobject_class; + GtkActionClass* action_class; + + signals[POPULATE_POPUP] = g_signal_new ("populate-popup", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_MENU); + + signals[ACTIVATE_ITEM] = g_signal_new ("activate-item", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + KATZE_TYPE_ITEM); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = katze_array_action_finalize; + gobject_class->set_property = katze_array_action_set_property; + gobject_class->get_property = katze_array_action_get_property; + + action_class = GTK_ACTION_CLASS (class); + action_class->activate = katze_array_action_activate; + action_class->create_menu_item = katze_array_action_create_menu_item; + action_class->create_tool_item = katze_array_action_create_tool_item; + action_class->connect_proxy = katze_array_action_connect_proxy; + action_class->disconnect_proxy = katze_array_action_disconnect_proxy; + + g_object_class_install_property (gobject_class, + PROP_ARRAY, + g_param_spec_object ( + "array", + "Array", + "The array the action represents", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE)); +} + +static void +katze_array_action_init (KatzeArrayAction* array_action) +{ + array_action->array = NULL; + array_action->net = katze_net_new (); +} + +static void +katze_array_action_finalize (GObject* object) +{ + KatzeArrayAction* array_action = KATZE_ARRAY_ACTION (object); + + katze_object_assign (array_action->array, NULL); + katze_object_assign (array_action->net, NULL); + + G_OBJECT_CLASS (katze_array_action_parent_class)->finalize (object); +} + +static void +katze_array_action_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + KatzeArrayAction* array_action = KATZE_ARRAY_ACTION (object); + + switch (prop_id) + { + case PROP_ARRAY: + katze_array_action_set_array (array_action, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +katze_array_action_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + KatzeArrayAction* array_action = KATZE_ARRAY_ACTION (object); + + switch (prop_id) + { + case PROP_ARRAY: + g_value_set_object (value, array_action->array); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +katze_array_action_activate (GtkAction* action) +{ + GSList* proxies; + + proxies = gtk_action_get_proxies (action); + if (!proxies) + return; + + do + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + + } + while ((proxies = g_slist_next (proxies))); + + if (GTK_ACTION_CLASS (katze_array_action_parent_class)->activate) + GTK_ACTION_CLASS (katze_array_action_parent_class)->activate (action); +} + +static void +katze_array_action_menu_item_activate_cb (GtkWidget* proxy, + KatzeArrayAction* array_action) +{ + KatzeItem* item = g_object_get_data (G_OBJECT (proxy), "KatzeItem"); + g_signal_emit (array_action, signals[ACTIVATE_ITEM], 0, item); +} + +static void +katze_array_action_menu_item_select_cb (GtkWidget* proxy, + KatzeArrayAction* array_action); + +static void +katze_array_action_generate_menu (KatzeArrayAction* array_action, + KatzeArray* array, + GtkWidget* menu, + GtkWidget* proxy) +{ + guint i; + KatzeItem* item; + GtkWidget* menuitem; + const gchar* icon_name; + GdkPixbuf* icon; + GtkWidget* image; + GtkWidget* submenu; + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + { + /* FIXME: The menu item should reflect changes to the item */ + if (!KATZE_IS_ARRAY (item) && !katze_item_get_uri (item)) + { + menuitem = gtk_separator_menu_item_new (); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + continue; + } + menuitem = katze_image_menu_item_new_ellipsized ( + katze_item_get_name (item)); + if ((icon_name = katze_item_get_icon (item)) && *icon_name) + image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); + else + { + if (KATZE_IS_ARRAY (item)) + icon = gtk_widget_render_icon (menuitem, + GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU, NULL); + else + icon = katze_net_load_icon (array_action->net, + katze_item_get_uri (item), NULL, proxy, NULL); + image = gtk_image_new_from_pixbuf (icon); + g_object_unref (icon); + } + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item); + if (KATZE_IS_ARRAY (item)) + { + submenu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); + g_signal_connect (menuitem, "select", + G_CALLBACK (katze_array_action_menu_item_select_cb), array_action); + } + else + g_signal_connect (menuitem, "activate", + G_CALLBACK (katze_array_action_menu_item_activate_cb), array_action); + gtk_widget_show (menuitem); + } + if (!i) + { + menuitem = gtk_image_menu_item_new_with_label (_("Empty")); + gtk_widget_set_sensitive (menuitem, FALSE); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + } +} + +static void +katze_array_action_menu_item_select_cb (GtkWidget* proxy, + KatzeArrayAction* array_action) +{ + GtkWidget* menu; + KatzeArray* array; + + menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)); + gtk_container_foreach (GTK_CONTAINER (menu), + (GtkCallback)(gtk_widget_destroy), NULL); + + array = g_object_get_data (G_OBJECT (proxy), "KatzeItem"); + katze_array_action_generate_menu (array_action, array, menu, proxy); +} + +static void +katze_array_action_proxy_clicked_cb (GtkWidget* proxy, + KatzeArrayAction* array_action) +{ + GtkWidget* menu; + KatzeArray* array; + + if (GTK_IS_MENU_ITEM (proxy)) + { + g_object_set_data (G_OBJECT (proxy), "KatzeItem", array_action->array); + katze_array_action_menu_item_select_cb (proxy, array_action); + g_signal_emit (array_action, signals[POPULATE_POPUP], 0, + gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy))); + return; + } + + menu = gtk_menu_new (); + + array = (KatzeArray*)g_object_get_data (G_OBJECT (proxy), "KatzeArray"); + if (!array) + array = array_action->array; + katze_array_action_generate_menu (array_action, array, menu, proxy); + + /* populate-popup should only affect the main proxy */ + if (array == array_action->array) + g_signal_emit (array_action, signals[POPULATE_POPUP], 0, menu); + + katze_widget_popup (GTK_WIDGET (proxy), GTK_MENU (menu), + NULL, KATZE_MENU_POSITION_LEFT); +} + +static GtkWidget* +katze_array_action_create_menu_item (GtkAction* action) +{ + GtkWidget* menuitem; + + menuitem = gtk_menu_item_new (); + return menuitem; +} + +static GtkWidget* +katze_array_action_create_tool_item (GtkAction* action) +{ + GtkWidget* toolitem; + + toolitem = GTK_WIDGET (gtk_tool_button_new (NULL, NULL)); + return toolitem; +} + +static void +katze_array_action_label_notify_cb (GtkToolButton* item, + GParamSpec* pspec, + GtkLabel* label) +{ + const gchar* property; + const gchar* text; + + if (!G_IS_PARAM_SPEC_STRING (pspec)) + return; + + property = g_param_spec_get_name (pspec); + if (!strcmp (property, "label")) + { + text = gtk_tool_button_get_label (item); + gtk_label_set_text (label, text); + } +} + +static void +katze_array_action_item_notify_cb (KatzeItem* item, + GParamSpec* pspec, + GtkToolItem* toolitem) +{ + KatzeArrayAction* array_action; + const gchar* property; + const gchar* title; + const gchar* desc; + GdkPixbuf* icon; + GtkWidget* image; + + if (!G_IS_PARAM_SPEC_STRING (pspec)) + return; + + array_action = (KatzeArrayAction*)g_object_get_data ( + G_OBJECT (toolitem), "KatzeArrayAction"); + property = g_param_spec_get_name (pspec); + if (!strcmp (property, "name")) + { + title = katze_item_get_name (item); + if (title) + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), title); + else + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), + katze_item_get_uri (item)); + } + else if (!strcmp (property, "text")) + { + desc = katze_item_get_text (item); + if (desc && *desc) + gtk_tool_item_set_tooltip_text (toolitem, desc); + else + gtk_tool_item_set_tooltip_text (toolitem, + katze_item_get_uri (item)); + } + else if (!KATZE_IS_ARRAY (item) && !strcmp (property, "uri")) + { + icon = katze_net_load_icon (array_action->net, katze_item_get_uri (item), + NULL, GTK_WIDGET (toolitem), NULL); + image = gtk_image_new_from_pixbuf (icon); + g_object_unref (icon); + gtk_widget_show (image); + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (toolitem), image); + } + else if (!strcmp (property, "icon")) + { + image = gtk_image_new_from_icon_name (katze_item_get_icon (item), + GTK_ICON_SIZE_MENU); + gtk_widget_show (image); + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (toolitem), image); + } +} + +/** + * katze_array_action_create_tool_item_for: + * @array_action: a #KatzeArrayAction + * @item: a #KatzeItem + * + * Creates a tool item for a particular @item, that also + * reflects changes to its properties. In the case of + * an array, the item will create a popup menu with + * the contained items. + * + * Note that the label is reasonably ellipsized for you, + * much like katze_image_menu_item_new_ellipsized(). + * + * Return value: a new tool item + **/ +GtkToolItem* +katze_array_action_create_tool_item_for (KatzeArrayAction* array_action, + KatzeItem* item) +{ + const gchar* title; + const gchar* uri; + const gchar* desc; + GtkToolItem* toolitem; + GdkPixbuf* icon; + GtkWidget* image; + GtkWidget* label; + + title = katze_item_get_name (item); + uri = katze_item_get_uri (item); + desc = katze_item_get_text (item); + + if (!KATZE_IS_ARRAY (item) && !uri) + return gtk_separator_tool_item_new (); + + toolitem = gtk_tool_button_new (NULL, NULL); + if (KATZE_IS_ARRAY (item)) + icon = gtk_widget_render_icon (GTK_WIDGET (toolitem), + GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU, NULL); + else + icon = katze_net_load_icon (array_action->net, uri, + NULL, GTK_WIDGET (toolitem), NULL); + image = gtk_image_new_from_pixbuf (icon); + g_object_unref (icon); + gtk_widget_show (image); + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (toolitem), image); + label = gtk_label_new (NULL); + /* FIXME: Should text direction be respected here? */ + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + gtk_label_set_max_width_chars (GTK_LABEL (label), 25); + gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE); + gtk_widget_show (label); + gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (toolitem), label); + /* GtkToolItem won't update our custom label, so we + apply a little bit of 'magic' to fix that. */ + g_signal_connect (toolitem, "notify", + G_CALLBACK (katze_array_action_label_notify_cb), label); + if (title) + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), title); + else + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), uri); + gtk_tool_item_set_is_important (toolitem, TRUE); + if (desc && *desc) + gtk_tool_item_set_tooltip_text (toolitem, desc); + else + gtk_tool_item_set_tooltip_text (toolitem, uri); + if (KATZE_IS_ARRAY (item)) + { + g_object_set_data (G_OBJECT (toolitem), "KatzeArray", item); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (katze_array_action_proxy_clicked_cb), array_action); + } + + g_object_set_data (G_OBJECT (toolitem), "KatzeArrayAction", array_action); + g_signal_connect (item, "notify", + G_CALLBACK (katze_array_action_item_notify_cb), toolitem); + return toolitem; +} + +static void +katze_array_action_connect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + GTK_ACTION_CLASS (katze_array_action_parent_class)->connect_proxy ( + action, proxy); + + if (GTK_IS_TOOL_ITEM (proxy)) + { + g_signal_connect (proxy, "clicked", + G_CALLBACK (katze_array_action_proxy_clicked_cb), action); + } + else if (GTK_IS_MENU_ITEM (proxy)) + { + gtk_menu_item_set_submenu (GTK_MENU_ITEM (proxy), gtk_menu_new ()); + /* FIXME: 'select' doesn't cover all ways of selection */ + g_signal_connect (proxy, "select", + G_CALLBACK (katze_array_action_proxy_clicked_cb), action); + } + gtk_widget_set_sensitive (proxy, KATZE_ARRAY_ACTION (action)->array != NULL); +} + +static void +katze_array_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + g_signal_handlers_disconnect_by_func (proxy, + G_CALLBACK (katze_array_action_proxy_clicked_cb), action); + + GTK_ACTION_CLASS (katze_array_action_parent_class)->disconnect_proxy + (action, proxy); +} + +KatzeArray* +katze_array_action_get_array (KatzeArrayAction* array_action) +{ + g_return_val_if_fail (KATZE_IS_ARRAY_ACTION (array_action), NULL); + + return array_action->array; +} + +void +katze_array_action_set_array (KatzeArrayAction* array_action, + KatzeArray* array) +{ + GSList* proxies; + + g_return_if_fail (KATZE_IS_ARRAY_ACTION (array_action)); + g_return_if_fail (!array || katze_array_is_a (array, KATZE_TYPE_ITEM)); + + /* FIXME: Disconnect old array */ + + if (array) + g_object_ref (array); + katze_object_assign (array_action->array, array); + + /* FIXME: Add and remove items dynamically */ + /*g_object_connect (array, + "signal-after::add-item", + katze_array_action_engines_add_item_cb, array_action, + "signal-after::remove-item", + katze_array_action_engines_remove_item_cb, array_action, + NULL);*/ + + g_object_notify (G_OBJECT (array_action), "array"); + + proxies = gtk_action_get_proxies (GTK_ACTION (array_action)); + if (!proxies) + return; + + do + { + gtk_widget_set_sensitive (proxies->data, array != NULL); + } + while ((proxies = g_slist_next (proxies))); +} diff --git a/katze/katze-arrayaction.h b/katze/katze-arrayaction.h new file mode 100644 index 00000000..062ffbd0 --- /dev/null +++ b/katze/katze-arrayaction.h @@ -0,0 +1,53 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_ARRAY_ACTION_H__ +#define __KATZE_ARRAY_ACTION_H__ + +#include "katze-array.h" + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_ARRAY_ACTION \ + (katze_array_action_get_type ()) +#define KATZE_ARRAY_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_ARRAY_ACTION, KatzeArrayAction)) +#define KATZE_ARRAY_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_ARRAY_ACTION, KatzeArrayActionClass)) +#define KATZE_IS_ARRAY_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_ARRAY_ACTION)) +#define KATZE_IS_ARRAY_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_ARRAY_ACTION)) +#define KATZE_ARRAY_ACTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_ARRAY_ACTION, KatzeArrayActionClass)) + +typedef struct _KatzeArrayAction KatzeArrayAction; +typedef struct _KatzeArrayActionClass KatzeArrayActionClass; + +GType +katze_array_action_get_type (void); + +KatzeArray* +katze_array_action_get_array (KatzeArrayAction* array_action); + +void +katze_array_action_set_array (KatzeArrayAction* array_action, + KatzeArray* array); + +GtkToolItem* +katze_array_action_create_tool_item_for (KatzeArrayAction* array_action, + KatzeItem* item); + +G_END_DECLS + +#endif /* __KATZE_ARRAY_ACTION_H__ */ diff --git a/katze/katze-http-auth.c b/katze/katze-http-auth.c new file mode 100644 index 00000000..ae7b2382 --- /dev/null +++ b/katze/katze-http-auth.c @@ -0,0 +1,212 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "katze-http-auth.h" + +#include +#include +#include + +struct _KatzeHttpAuth +{ + GObject parent_instance; +}; + +struct _KatzeHttpAuthClass +{ + GObjectClass parent_class; +}; + +static void +katze_http_auth_session_feature_iface_init (SoupSessionFeatureInterface *iface, + gpointer data); + +G_DEFINE_TYPE_WITH_CODE (KatzeHttpAuth, katze_http_auth, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE, + katze_http_auth_session_feature_iface_init)); + +static void +authentication_dialog_response_cb (GtkWidget* dialog, + gint response, + SoupAuth* auth) +{ + GtkWidget* username; + GtkWidget* password; + SoupSession* session; + SoupMessage* msg; + + if (response == GTK_RESPONSE_OK) + { + + username = g_object_get_data (G_OBJECT (dialog), "username"); + password = g_object_get_data (G_OBJECT (dialog), "password"); + + soup_auth_authenticate (auth, + gtk_entry_get_text (GTK_ENTRY (username)), + gtk_entry_get_text (GTK_ENTRY (password))); + } + + session = g_object_get_data (G_OBJECT (dialog), "session"); + msg = g_object_get_data (G_OBJECT (dialog), "msg"); + gtk_widget_destroy (dialog); + if (g_object_get_data (G_OBJECT (msg), "paused")) + soup_session_unpause_message (session, msg); + g_object_unref (auth); +} + +static void +katze_http_auth_session_authenticate_cb (SoupSession* session, + SoupMessage* msg, + SoupAuth* auth, + gboolean retrying) +{ + GtkWidget* dialog; + GtkSizeGroup* sizegroup; + GtkWidget* hbox; + GtkWidget* image; + GtkWidget* label; + GtkWidget* align; + GtkWidget* entry; + + /* We want to ask for authentication exactly once, so we + enforce this with a tag. There might be a better way. */ + if (!retrying && g_object_get_data (G_OBJECT (msg), "katze-session-tag")) + return; + + if (soup_message_is_keepalive (msg)) + { + /* We use another tag to indicate whether a message is paused. + There doesn't seem to be API in libSoup to find that out. */ + soup_session_pause_message (session, msg); + g_object_set_data (G_OBJECT (msg), "paused", (void*)1); + } + g_object_set_data (G_OBJECT (msg), "katze-session-tag", (void*)1); + + dialog = gtk_dialog_new_with_buttons (_("Authentication Required"), + NULL, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_window_set_icon_name (GTK_WINDOW (dialog), + GTK_STOCK_DIALOG_AUTHENTICATION); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5); + + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); + hbox = gtk_hbox_new (FALSE, 6); + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, + GTK_ICON_SIZE_DIALOG); + gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); + label = gtk_label_new (_("A username and a password are required\n" + "to open this location:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + label = gtk_label_new (soup_auth_get_host (auth)); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), label); + /* If the realm is merely the host, omit the realm label */ + if (g_strcmp0 (soup_auth_get_host (auth), soup_auth_get_realm (auth))) + { + label = gtk_label_new (soup_auth_get_realm (auth)); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), label); + } + sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + hbox = gtk_hbox_new (FALSE, 6); + label = gtk_label_new (_("Username")); + align = gtk_alignment_new (0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), label); + gtk_size_group_add_widget (sizegroup, align); + gtk_box_pack_start (GTK_BOX (hbox), align, TRUE, TRUE, 0); + entry = gtk_entry_new (); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + g_object_set_data (G_OBJECT (dialog), "username", entry); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + hbox = gtk_hbox_new (FALSE, 6); + label = gtk_label_new (_("Password")); + align = gtk_alignment_new (0, 0.5, 0, 0); + gtk_container_add (GTK_CONTAINER (align), label); + gtk_size_group_add_widget (sizegroup, align); + gtk_box_pack_start (GTK_BOX (hbox), align, TRUE, TRUE, 0); + entry = gtk_entry_new_with_max_length (32); + gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + g_object_set_data (G_OBJECT (dialog), "password", entry); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + gtk_widget_show_all (GTK_DIALOG (dialog)->vbox); + + g_object_set_data (G_OBJECT (dialog), "session", session); + g_object_set_data (G_OBJECT (dialog), "msg", msg); + g_signal_connect (dialog, "response", + G_CALLBACK (authentication_dialog_response_cb), g_object_ref (auth)); + gtk_widget_show (dialog); +} + +static void +katze_http_auth_session_request_queued_cb (SoupSession* session, + SoupMessage* msg, + gpointer data) +{ + /* WebKit has its own authentication dialog in recent versions. + We want only one, and we choose our own to have localization. */ + GType type = g_type_from_name ("WebKitSoupAuthDialog"); + if (type) + soup_session_remove_feature_by_type (session, type); + + g_signal_connect (session, "authenticate", + G_CALLBACK (katze_http_auth_session_authenticate_cb), NULL); + g_signal_handlers_disconnect_by_func (session, + katze_http_auth_session_request_queued_cb, NULL); +} + +static void +katze_http_auth_attach (SoupSessionFeature* feature, + SoupSession* session) +{ + g_signal_connect (session, "request-queued", + G_CALLBACK (katze_http_auth_session_request_queued_cb), NULL); +} + +static void +katze_http_auth_detach (SoupSessionFeature* feature, + SoupSession* session) +{ + g_signal_handlers_disconnect_by_func (session, + katze_http_auth_session_authenticate_cb, NULL); + g_signal_handlers_disconnect_by_func (session, + katze_http_auth_session_request_queued_cb, NULL); +} + +static void +katze_http_auth_session_feature_iface_init (SoupSessionFeatureInterface *iface, + gpointer data) +{ + iface->attach = katze_http_auth_attach; + iface->detach = katze_http_auth_detach; +} + +static void +katze_http_auth_class_init (KatzeHttpAuthClass* class) +{ + /* Nothing to do. */ +} + +static void +katze_http_auth_init (KatzeHttpAuth* http_auth) +{ + /* Nothing to do. */ +} diff --git a/katze/katze-http-auth.h b/katze/katze-http-auth.h new file mode 100644 index 00000000..908646fd --- /dev/null +++ b/katze/katze-http-auth.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_HTTP_AUTH_H__ +#define __KATZE_HTTP_AUTH_H__ + +#include "katze-utils.h" + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_HTTP_AUTH \ + (katze_http_auth_get_type ()) +#define KATZE_HTTP_AUTH(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_HTTP_AUTH, KatzeHttpAuth)) +#define KATZE_HTTP_AUTH_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_HTTP_AUTH, KatzeHttpAuthClass)) +#define KATZE_IS_HTTP_AUTH(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_HTTP_AUTH)) +#define KATZE_IS_HTTP_AUTH_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_HTTP_AUTH)) +#define KATZE_HTTP_AUTH_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_HTTP_AUTH, KatzeHttpAuthClass)) + +typedef struct _KatzeHttpAuth KatzeHttpAuth; +typedef struct _KatzeHttpAuthClass KatzeHttpAuthClass; + +GType +katze_http_auth_get_type (void); + +G_END_DECLS + +#endif /* __KATZE_HTTP_AUTH_H__ */ diff --git a/katze/katze-http-cookies.c b/katze/katze-http-cookies.c new file mode 100644 index 00000000..c66ee66c --- /dev/null +++ b/katze/katze-http-cookies.c @@ -0,0 +1,300 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "katze-http-cookies.h" + +#include +#include +#include +#include + +struct _KatzeHttpCookies +{ + GObject parent_instance; +}; + +struct _KatzeHttpCookiesClass +{ + GObjectClass parent_class; +}; + +static void +katze_http_cookies_session_feature_iface_init (SoupSessionFeatureInterface *iface, + gpointer data); + +G_DEFINE_TYPE_WITH_CODE (KatzeHttpCookies, katze_http_cookies, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE, + katze_http_cookies_session_feature_iface_init)); + +/* Cookie jar saving to Mozilla format + Copyright (C) 2008 Xan Lopez + Copyright (C) 2008 Dan Winship + Mostly copied from libSoup 2.24, coding style adjusted */ +static SoupCookie* +parse_cookie (gchar* line, + time_t now) +{ + gchar** result; + SoupCookie *cookie = NULL; + gboolean http_only; + time_t max_age; + gchar* host/*, *is_domain*/, *path, *secure, *expires, *name, *value; + + if (g_str_has_prefix (line, "#HttpOnly_")) + { + http_only = TRUE; + line += strlen ("#HttpOnly_"); + } + else if (*line == '#' || g_ascii_isspace (*line)) + return cookie; + else + http_only = FALSE; + + result = g_strsplit (line, "\t", -1); + if (g_strv_length (result) != 7) + goto out; + + /* Check this first */ + expires = result[4]; + max_age = strtoul (expires, NULL, 10) - now; + if (max_age <= 0) + goto out; + + host = result[0]; + /* is_domain = result[1]; */ + path = result[2]; + secure = result[3]; + + name = result[5]; + value = result[6]; + + cookie = soup_cookie_new (name, value, host, path, max_age); + + if (strcmp (secure, "FALSE")) + soup_cookie_set_secure (cookie, TRUE); + if (http_only) + soup_cookie_set_http_only (cookie, TRUE); + + out: + g_strfreev (result); + + return cookie; +} + +/* Cookie jar saving to Mozilla format + Copyright (C) 2008 Xan Lopez + Copyright (C) 2008 Dan Winship + Mostly copied from libSoup 2.24, coding style adjusted */ +static void +parse_line (SoupCookieJar* jar, + gchar* line, + time_t now) +{ + SoupCookie* cookie; + + if ((cookie = parse_cookie (line, now))) + soup_cookie_jar_add_cookie (jar, cookie); +} + +/* Cookie jar saving to Mozilla format + Copyright (C) 2008 Xan Lopez + Copyright (C) 2008 Dan Winship + Mostly copied from libSoup 2.24, coding style adjusted */ +static void +cookie_jar_load (SoupCookieJar* jar, + const gchar* filename) +{ + char* contents = NULL; + gchar* line; + gchar* p; + gsize length = 0; + time_t now = time (NULL); + + if (!g_file_get_contents (filename, &contents, &length, NULL)) + return; + + line = contents; + for (p = contents; *p; p++) + { + /* \r\n comes out as an extra empty line and gets ignored */ + if (*p == '\r' || *p == '\n') + { + *p = '\0'; + parse_line (jar, line, now); + line = p + 1; + } + } + parse_line (jar, line, now); + + g_free (contents); +} + +/* Cookie jar saving to Mozilla format + Copyright (C) 2008 Xan Lopez + Copyright (C) 2008 Dan Winship + Copied from libSoup 2.24, coding style preserved */ +static void +write_cookie (FILE *out, SoupCookie *cookie) +{ + fseek (out, 0, SEEK_END); + + fprintf (out, "%s%s\t%s\t%s\t%s\t%lu\t%s\t%s\n", + cookie->http_only ? "#HttpOnly_" : "", + cookie->domain, + *cookie->domain == '.' ? "TRUE" : "FALSE", + cookie->path, + cookie->secure ? "TRUE" : "FALSE", + (gulong)soup_date_to_time_t (cookie->expires), + cookie->name, + cookie->value); +} + +/* Cookie jar saving to Mozilla format + Copyright (C) 2008 Xan Lopez + Copyright (C) 2008 Dan Winship + Copied from libSoup 2.24, coding style preserved */ +static void +delete_cookie (const char *filename, SoupCookie *cookie) +{ + char *contents = NULL, *line, *p; + gsize length = 0; + FILE *f; + SoupCookie *c; + time_t now = time (NULL); + + if (!g_file_get_contents (filename, &contents, &length, NULL)) + return; + + f = fopen (filename, "w"); + if (!f) { + g_free (contents); + return; + } + + line = contents; + for (p = contents; *p; p++) { + /* \r\n comes out as an extra empty line and gets ignored */ + if (*p == '\r' || *p == '\n') { + *p = '\0'; + c = parse_cookie (line, now); + if (!c) + continue; + if (!soup_cookie_equal (cookie, c)) + write_cookie (f, c); + line = p + 1; + soup_cookie_free (c); + } + } + c = parse_cookie (line, now); + if (c) { + if (!soup_cookie_equal (cookie, c)) + write_cookie (f, c); + soup_cookie_free (c); + } + + g_free (contents); + fclose (f); +} + +/* Cookie jar saving to Mozilla format + Copyright (C) 2008 Xan Lopez + Copyright (C) 2008 Dan Winship + Mostly copied from libSoup 2.24, coding style adjusted */ +static void +cookie_jar_changed_cb (SoupCookieJar* jar, + SoupCookie* old_cookie, + SoupCookie* new_cookie, + gchar* filename) +{ + GObject* settings; + guint accept_cookies; + + if (old_cookie) + delete_cookie (filename, old_cookie); + + if (new_cookie) + { + FILE *out; + + settings = g_object_get_data (G_OBJECT (jar), "midori-settings"); + accept_cookies = katze_object_get_enum (settings, "accept-cookies"); + if (accept_cookies == 2 /* MIDORI_ACCEPT_COOKIES_NONE */) + { + soup_cookie_jar_delete_cookie (jar, new_cookie); + } + else if (accept_cookies == 1 /* MIDORI_ACCEPT_COOKIES_SESSION */ + && new_cookie->expires) + { + soup_cookie_jar_delete_cookie (jar, new_cookie); + } + else if (new_cookie->expires) + { + gint age = katze_object_get_int (settings, "maximum-cookie-age"); + soup_cookie_set_max_age (new_cookie, + age * SOUP_COOKIE_MAX_AGE_ONE_DAY); + + if (!(out = fopen (filename, "a"))) + return; + write_cookie (out, new_cookie); + if (fclose (out) != 0) + return; + } + } +} + +static void +katze_http_cookies_attach (SoupSessionFeature* feature, + SoupSession* session) +{ + SoupSessionFeature* cookie_jar; + gchar* filename; + + cookie_jar = soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR); + g_return_if_fail (cookie_jar != NULL); + filename = g_object_get_data (G_OBJECT (feature), "filename"); + g_return_if_fail (filename != NULL); + cookie_jar_load (SOUP_COOKIE_JAR (cookie_jar), filename); + g_signal_connect_data (cookie_jar, "changed", + G_CALLBACK (cookie_jar_changed_cb), g_strdup (filename), + (GClosureNotify)g_free, 0); + +} + +static void +katze_http_cookies_detach (SoupSessionFeature* feature, + SoupSession* session) +{ + /* Nothing to do. */ +} + +static void +katze_http_cookies_session_feature_iface_init (SoupSessionFeatureInterface *iface, + gpointer data) +{ + iface->attach = katze_http_cookies_attach; + iface->detach = katze_http_cookies_detach; +} + +static void +katze_http_cookies_class_init (KatzeHttpCookiesClass* class) +{ + /* Nothing to do. */ +} + +static void +katze_http_cookies_init (KatzeHttpCookies* http_cookies) +{ + /* Nothing to do. */ +} diff --git a/katze/katze-http-cookies.h b/katze/katze-http-cookies.h new file mode 100644 index 00000000..97caa271 --- /dev/null +++ b/katze/katze-http-cookies.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_HTTP_COOKIES_H__ +#define __KATZE_HTTP_COOKIES_H__ + +#include "katze-utils.h" + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_HTTP_COOKIES \ + (katze_http_cookies_get_type ()) +#define KATZE_HTTP_COOKIES(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_HTTP_COOKIES, KatzeHttpCookies)) +#define KATZE_HTTP_COOKIES_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_HTTP_COOKIES, KatzeHttpCookiesClass)) +#define KATZE_IS_HTTP_COOKIES(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_HTTP_COOKIES)) +#define KATZE_IS_HTTP_COOKIES_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_HTTP_COOKIES)) +#define KATZE_HTTP_COOKIES_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_HTTP_COOKIES, KatzeHttpCookiesClass)) + +typedef struct _KatzeHttpCookies KatzeHttpCookies; +typedef struct _KatzeHttpCookiesClass KatzeHttpCookiesClass; + +GType +katze_http_cookies_get_type (void); + +G_END_DECLS + +#endif /* __KATZE_HTTP_COOKIES_H__ */ diff --git a/katze/katze-item.c b/katze/katze-item.c new file mode 100644 index 00000000..006adc4b --- /dev/null +++ b/katze/katze-item.c @@ -0,0 +1,530 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "katze-item.h" + +#include "katze-utils.h" + +#include + +/** + * SECTION:katze-item + * @short_description: A useful item + * @see_also: #KatzeArray + * + * #KatzeItem is a particularly useful item that provides + * several commonly needed properties. + */ + +G_DEFINE_TYPE (KatzeItem, katze_item, G_TYPE_OBJECT) + +enum +{ + PROP_0, + + PROP_NAME, + PROP_TEXT, + PROP_URI, + PROP_ICON, + PROP_TOKEN, + PROP_ADDED, + PROP_PARENT +}; + +static void +katze_item_finalize (GObject* object); + +static void +katze_item_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +katze_item_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +katze_item_class_init (KatzeItemClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = katze_item_finalize; + gobject_class->set_property = katze_item_set_property; + gobject_class->get_property = katze_item_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ( + "name", + "Name", + "The name of the item", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_TEXT, + g_param_spec_string ( + "text", + "Text", + "The descriptive text of the item", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_URI, + g_param_spec_string ( + "uri", + "URI", + "The URI of the item", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_ICON, + g_param_spec_string ( + "icon", + "Icon", + "The icon of the item", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_TOKEN, + g_param_spec_string ( + "token", + "Token", + "The token of the item", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_ADDED, + g_param_spec_int64 ( + "added", + "Added", + "When the item was added", + G_MININT64, + G_MAXINT64, + 0, + flags)); + + /** + * KatzeItem:parent: + * + * The parent of the item. + * + * Since: 0.1.2 + */ + g_object_class_install_property (gobject_class, + PROP_PARENT, + g_param_spec_object ( + "parent", + "Parent", + "The parent of the item", + G_TYPE_OBJECT, + flags)); + + class->copy = NULL; +} + + + +static void +katze_item_init (KatzeItem* item) +{ + /* Nothing to do here */ +} + +static void +katze_item_finalize (GObject* object) +{ + KatzeItem* item = KATZE_ITEM (object); + + g_free (item->name); + g_free (item->text); + g_free (item->uri); + g_free (item->icon); + g_free (item->token); + + G_OBJECT_CLASS (katze_item_parent_class)->finalize (object); +} + +static void +katze_item_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + KatzeItem* item = KATZE_ITEM (object); + + switch (prop_id) + { + case PROP_NAME: + katze_assign (item->name, g_value_dup_string (value)); + break; + case PROP_TEXT: + katze_assign (item->text, g_value_dup_string (value)); + break; + case PROP_URI: + katze_assign (item->uri, g_value_dup_string (value)); + break; + case PROP_ICON: + katze_assign (item->icon, g_value_dup_string (value)); + break; + case PROP_TOKEN: + katze_assign (item->token, g_value_dup_string (value)); + break; + case PROP_ADDED: + item->added = g_value_get_int64 (value); + break; + case PROP_PARENT: + katze_item_set_parent (item, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +katze_item_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + KatzeItem* item = KATZE_ITEM (object); + + switch (prop_id) + { + case PROP_NAME: + g_value_set_string (value, item->name); + break; + case PROP_TEXT: + g_value_set_string (value, item->text); + break; + case PROP_URI: + g_value_set_string (value, item->uri); + break; + case PROP_ICON: + g_value_set_string (value, item->icon); + break; + case PROP_TOKEN: + g_value_set_string (value, item->token); + break; + case PROP_ADDED: + g_value_set_int64 (value, item->added); + break; + case PROP_PARENT: + g_value_set_object (value, item->parent); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * katze_item_new: + * + * Creates a new #KatzeItem. + * + * Return value: a new #KatzeItem + **/ +KatzeItem* +katze_item_new (void) +{ + KatzeItem* item = g_object_new (KATZE_TYPE_ITEM, NULL); + + return item; +} + +/** + * katze_item_get_name: + * @item: a #KatzeItem + * + * Retrieves the name of @item. + * + * Return value: the name of the item + **/ +const gchar* +katze_item_get_name (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + return item->name; +} + +/** + * katze_item_set_name: + * @item: a #KatzeItem + * @name: a string + * + * Sets the name of @item. + **/ +void +katze_item_set_name (KatzeItem* item, + const gchar* name) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + + katze_assign (item->name, g_strdup (name)); + g_object_notify (G_OBJECT (item), "name"); +} + +/** + * katze_item_get_text: + * @item: a #KatzeItem + * + * Retrieves the descriptive text of @item. + * + * Return value: the text of the item + **/ +const gchar* +katze_item_get_text (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + return item->text; +} + +/** + * katze_item_set_text: + * @item: a #KatzeItem + * @description: a string + * + * Sets the descriptive text of @item. + **/ +void +katze_item_set_text (KatzeItem* item, + const gchar* text) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + + katze_assign (item->text, g_strdup (text)); + g_object_notify (G_OBJECT (item), "text"); +} + +/** + * katze_item_get_uri: + * @item: a #KatzeItem + * + * Retrieves the URI of @item. + * + * Return value: the URI of the item + **/ +const gchar* +katze_item_get_uri (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + return item->uri; +} + +/** + * katze_item_set_uri: + * @item: a #KatzeItem + * @uri: a string + * + * Sets the URI of @item. + **/ +void +katze_item_set_uri (KatzeItem* item, + const gchar* uri) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + + katze_assign (item->uri, g_strdup (uri)); + g_object_notify (G_OBJECT (item), "uri"); +} + +/** + * katze_item_get_icon: + * @item: a #KatzeItem + * + * Retrieves the icon of @item. + * + * Return value: the icon of the item + **/ +const gchar* +katze_item_get_icon (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + return item->icon; +} + +/** + * katze_item_set_icon: + * @item: a #KatzeItem + * @icon: a string + * + * Sets the icon of @item. + **/ +void +katze_item_set_icon (KatzeItem* item, + const gchar* icon) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + + katze_assign (item->icon, g_strdup (icon)); + g_object_notify (G_OBJECT (item), "icon"); +} + +/** + * katze_item_get_token: + * @item: a #KatzeItem + * + * Retrieves the token of @item. + * + * Return value: the token of the item + **/ +const gchar* +katze_item_get_token (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + return item->token; +} + +/** + * katze_item_set_token: + * @item: a #KatzeItem + * @token: a string + * + * Sets the token of @item. + **/ +void +katze_item_set_token (KatzeItem* item, + const gchar* token) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + + katze_assign (item->token, g_strdup (token)); + g_object_notify (G_OBJECT (item), "token"); +} + +/** + * katze_item_get_added: + * @item: a #KatzeItem + * + * Determines when @item was added. + * + * Return value: a timestamp + **/ +gint64 +katze_item_get_added (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), 0); + + return item->added; +} + +/** + * katze_item_set_added: + * @item: a #KatzeItem + * @added: a timestamp + * + * Sets when @item was added. + **/ +void +katze_item_set_added (KatzeItem* item, + gint64 added) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + + item->added = added; + g_object_notify (G_OBJECT (item), "added"); +} + +/** + * katze_item_get_parent: + * @item: a #KatzeItem + * + * Determines the parent of @item. + * + * Since 0.1.2 you can monitor the "parent" property. + * + * Return value: the parent of the item + **/ +gpointer +katze_item_get_parent (KatzeItem* item) +{ + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + return item->parent; +} + +/** + * katze_item_set_parent: + * @item: a #KatzeItem + * @parent: the new parent + * + * Sets the parent of @item. + * + * This is intended for item container implementations. Notably + * the new parent will not be notified of the change. + * + * Since 0.1.2 you can monitor the "parent" property, so unsetting + * the parent is actually safe if the parent supports it. + **/ +void +katze_item_set_parent (KatzeItem* item, + gpointer parent) +{ + g_return_if_fail (KATZE_IS_ITEM (item)); + g_return_if_fail (!parent || G_IS_OBJECT (parent)); + + if (parent) + g_object_ref (parent); + katze_object_assign (item->parent, parent); + g_object_notify (G_OBJECT (item), "parent"); +} + +/** + * katze_item_copy: + * @item: a #KatzeItem + * + * Creates an exact copy of @item. + * + * Note that subclass specific features will only + * be preserved if the class implements it. + * + * Return value: a new #KatzeItem + * + * Since: 0.1.3 + **/ +KatzeItem* +katze_item_copy (KatzeItem* item) +{ + KatzeItem* copy; + KatzeItemClass* class; + + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + copy = g_object_new (G_OBJECT_TYPE (item), + "name", item->name, + "text", item->text, + "uri", item->uri, + "icon", item->icon, + "token", item->token, + "added", item->added, + "parent", item->parent, + NULL); + class = KATZE_ITEM_GET_CLASS (item); + return class->copy ? class->copy (copy) : copy; +} diff --git a/katze/katze-item.h b/katze/katze-item.h new file mode 100644 index 00000000..8e40110a --- /dev/null +++ b/katze/katze-item.h @@ -0,0 +1,117 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_ITEM_H__ +#define __KATZE_ITEM_H__ + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_ITEM \ + (katze_item_get_type ()) +#define KATZE_ITEM(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_ITEM, KatzeItem)) +#define KATZE_ITEM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_ITEM, KatzeItemClass)) +#define KATZE_IS_ITEM(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_ITEM)) +#define KATZE_IS_ITEM_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_ITEM)) +#define KATZE_ITEM_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_ITEM, KatzeItemClass)) + +typedef struct _KatzeItem KatzeItem; +typedef struct _KatzeItemClass KatzeItemClass; + +struct _KatzeItem +{ + GObject parent_instance; + + gchar* name; + gchar* text; + gchar* uri; + gchar* icon; + gchar* token; + gint64 added; + + KatzeItem* parent; +}; + +struct _KatzeItemClass +{ + GObjectClass parent_class; + + gpointer + (*copy) (KatzeItem* item); +}; + +GType +katze_item_get_type (void); + +KatzeItem* +katze_item_new (void); + +const gchar* +katze_item_get_name (KatzeItem* item); + +void +katze_item_set_name (KatzeItem* item, + const gchar* name); + +const gchar* +katze_item_get_text (KatzeItem* item); + +void +katze_item_set_text (KatzeItem* item, + const gchar* text); + +const gchar* +katze_item_get_uri (KatzeItem* item); + +void +katze_item_set_uri (KatzeItem* item, + const gchar* uri); + +const gchar* +katze_item_get_icon (KatzeItem* item); + +void +katze_item_set_icon (KatzeItem* item, + const gchar* icon); + +const gchar* +katze_item_get_token (KatzeItem* item); + +void +katze_item_set_token (KatzeItem* item, + const gchar* token); + +gint64 +katze_item_get_added (KatzeItem* item); + +void +katze_item_set_added (KatzeItem* item, + gint64 added); + +gpointer +katze_item_get_parent (KatzeItem* item); + +void +katze_item_set_parent (KatzeItem* item, + gpointer parent); + +KatzeItem* +katze_item_copy (KatzeItem* item); + +G_END_DECLS + +#endif /* __MIDORI_WEB_ITEM_H__ */ diff --git a/katze/katze-net.c b/katze/katze-net.c new file mode 100644 index 00000000..8a82747b --- /dev/null +++ b/katze/katze-net.c @@ -0,0 +1,598 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "katze-net.h" + +#include +#include + +struct _KatzeNet +{ + GObject parent_instance; + + GHashTable* memory; + gchar* cache_path; + guint cache_size; + + SoupSession* session; +}; + +struct _KatzeNetClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (KatzeNet, katze_net, G_TYPE_OBJECT) + +static void +katze_net_finalize (GObject* object); + +static void +katze_net_class_init (KatzeNetClass* class) +{ + GObjectClass* gobject_class; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = katze_net_finalize; +} + +static void +katze_net_object_maybe_unref (gpointer object) +{ + if (object) + g_object_unref (object); +} + +static void +katze_net_init (KatzeNet* net) +{ + net->memory = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, katze_net_object_maybe_unref); + net->cache_path = g_build_filename (g_get_user_cache_dir (), + PACKAGE_NAME, NULL); + + net->session = webkit_get_default_session (); +} + +static void +katze_net_finalize (GObject* object) +{ + KatzeNet* net = KATZE_NET (object); + + g_hash_table_destroy (net->memory); + katze_assign (net->cache_path, NULL); + + G_OBJECT_CLASS (katze_net_parent_class)->finalize (object); +} + +/** + * katze_net_new: + * + * Instantiates a new #KatzeNet instance. + * + * Return value: a new #KatzeNet + **/ +KatzeNet* +katze_net_new (void) +{ + static KatzeNet* net = NULL; + + if (!net) + { + net = g_object_new (KATZE_TYPE_NET, NULL); + /* Since this is a "singleton", keep an extra reference */ + g_object_ref (net); + } + else + g_object_ref (net); + + return net; +} + +/** + * katze_net_get_session: + * + * Retrieves the session of the net. + * + * Return value: a session, or %NULL + * + * Since: 0.1.3 + **/ +gpointer +katze_net_get_session (KatzeNet* net) +{ + g_return_val_if_fail (KATZE_IS_NET (net), NULL); + + return net->session; +} + +typedef struct +{ + KatzeNet* net; + KatzeNetStatusCb status_cb; + KatzeNetTransferCb transfer_cb; + gpointer user_data; + KatzeNetRequest* request; +} KatzeNetPriv; + +static void +katze_net_priv_free (KatzeNetPriv* priv) +{ + KatzeNetRequest* request; + + request = priv->request; + + g_free (request->uri); + g_free (request->mime_type); + g_free (request->data); + + g_free (request); + g_free (priv); +} + +static gchar* +katze_net_get_cached_path (KatzeNet* net, + const gchar* uri, + const gchar* subfolder) +{ + gchar* cache_path; + gchar* checksum; + gchar* extension; + gchar* cached_filename; + gchar* cached_path; + + if (subfolder) + cache_path = g_build_filename (net->cache_path, subfolder, NULL); + else + cache_path = net->cache_path; + g_mkdir_with_parents (cache_path, 0700); + checksum = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri, -1); + + extension = g_strrstr (uri, "."); + cached_filename = g_strdup_printf ("%s%s", checksum, + extension ? extension : ""); + g_free (checksum); + cached_path = g_build_filename (cache_path, cached_filename, NULL); + g_free (cached_filename); + if (subfolder) + g_free (cache_path); + return cached_path; +} + +static void +katze_net_got_body_cb (SoupMessage* msg, + KatzeNetPriv* priv); + +static void +katze_net_got_headers_cb (SoupMessage* msg, + KatzeNetPriv* priv) +{ + KatzeNetRequest* request; + + request = priv->request; + + switch (msg->status_code) + { + case 200: + request->status = KATZE_NET_VERIFIED; + break; + case 301: + request->status = KATZE_NET_MOVED; + break; + default: + request->status = KATZE_NET_NOT_FOUND; + } + + if (!priv->status_cb (request, priv->user_data)) + { + g_signal_handlers_disconnect_by_func (msg, katze_net_got_headers_cb, priv); + g_signal_handlers_disconnect_by_func (msg, katze_net_got_body_cb, priv); + soup_session_cancel_message (priv->net->session, msg, 1); + } +} + +static void +katze_net_got_body_cb (SoupMessage* msg, + KatzeNetPriv* priv) +{ + KatzeNetRequest* request; + #if 0 + gchar* filename; + FILE* fp; + #endif + + request = priv->request; + + if (msg->response_body->length > 0) + { + #if 0 + /* FIXME: Caching */ + filename = katze_net_get_cached_path (net, request->uri, NULL); + if ((fp = fopen (filename, "wb"))) + { + fwrite (msg->response_body->data, + 1, msg->response_body->length, fp); + fclose (fp); + } + g_free (filename); + #endif + request->data = g_memdup (msg->response_body->data, + msg->response_body->length); + request->length = msg->response_body->length; + } + + priv->transfer_cb (request, priv->user_data); +} + +static void +katze_net_finished_cb (SoupMessage* msg, + KatzeNetPriv* priv) +{ + katze_net_priv_free (priv); +} + +static gboolean +katze_net_local_cb (KatzeNetPriv* priv) +{ + KatzeNetRequest* request; + gchar* filename; + gchar* contents; + gsize length; + + request = priv->request; + filename = g_filename_from_uri (request->uri, NULL, NULL); + + if (!filename || !g_file_test (filename, G_FILE_TEST_EXISTS)) + { + request->status = KATZE_NET_NOT_FOUND; + if (priv->status_cb) + priv->status_cb (request, priv->user_data); + katze_net_priv_free (priv); + return FALSE; + } + request->status = KATZE_NET_VERIFIED; + if (priv->status_cb && !priv->status_cb (request, priv->user_data)) + { + katze_net_priv_free (priv); + return FALSE; + } + + if (!priv->transfer_cb) + { + katze_net_priv_free (priv); + return FALSE; + } + + contents = NULL; + if (!g_file_get_contents (filename, &contents, &length, NULL)) + { + request->status = KATZE_NET_FAILED; + priv->transfer_cb (request, priv->user_data); + katze_net_priv_free (priv); + return FALSE; + } + + request->status = KATZE_NET_DONE; + request->data = contents; + request->length = length; + priv->transfer_cb (request, priv->user_data); + katze_net_priv_free (priv); + return FALSE; +} + +static gboolean +katze_net_default_cb (KatzeNetPriv* priv) +{ + KatzeNetRequest* request; + + request = priv->request; + request->status = KATZE_NET_NOT_FOUND; + if (priv->status_cb) + priv->status_cb (request, priv->user_data); + katze_net_priv_free (priv); + return FALSE; +} + +/** + * katze_net_load_uri: + * @net: a #KatzeNet + * @uri: an URI string + * @status_cb: function to call for status information + * @transfer_cb: function to call upon transfer + * @user_data: data to pass to the callback + * + * Requests a transfer of @uri. + * + * @status_cb will be called when the status of @uri + * is verified. The specified callback may be called + * multiple times unless cancelled. + * + * @transfer_cb will be called when the data @uri is + * pointing to was transferred. Note that even a failed + * transfer may transfer data. + * + * @status_cb will always to be called at least once. + **/ +void +katze_net_load_uri (KatzeNet* net, + const gchar* uri, + KatzeNetStatusCb status_cb, + KatzeNetTransferCb transfer_cb, + gpointer user_data) +{ + KatzeNetRequest* request; + KatzeNetPriv* priv; + SoupMessage* msg; + + g_return_if_fail (KATZE_IS_NET (net)); + g_return_if_fail (uri != NULL); + + if (!status_cb && !transfer_cb) + return; + + request = g_new0 (KatzeNetRequest, 1); + request->uri = g_strdup (uri); + request->mime_type = NULL; + request->data = NULL; + + priv = g_new0 (KatzeNetPriv, 1); + priv->net = net; + priv->status_cb = status_cb; + priv->transfer_cb = transfer_cb; + priv->user_data = user_data; + priv->request = request; + + if (g_str_has_prefix (uri, "http://") || g_str_has_prefix (uri, "https://")) + { + msg = soup_message_new ("GET", uri); + if (status_cb) + g_signal_connect (msg, "got-headers", + G_CALLBACK (katze_net_got_headers_cb), priv); + if (transfer_cb) + g_signal_connect (msg, "got-body", + G_CALLBACK (katze_net_got_body_cb), priv); + g_signal_connect (msg, "finished", + G_CALLBACK (katze_net_finished_cb), priv); + soup_session_queue_message (net->session, msg, NULL, NULL); + return; + } + + if (g_str_has_prefix (uri, "file://")) + { + g_idle_add ((GSourceFunc)katze_net_local_cb, priv); + return; + } + + g_idle_add ((GSourceFunc)katze_net_default_cb, priv); +} + +typedef struct +{ + KatzeNet* net; + gchar* icon_file; + KatzeNetIconCb icon_cb; + GtkWidget* widget; + gpointer user_data; +} KatzeNetIconPriv; + +static void +katze_net_icon_priv_free (KatzeNetIconPriv* priv) +{ + g_free (priv->icon_file); + if (priv->widget) + g_object_unref (priv->widget); + g_free (priv); +} + +static gboolean +katze_net_icon_status_cb (KatzeNetRequest* request, + KatzeNetIconPriv* priv) +{ + switch (request->status) + { + case KATZE_NET_VERIFIED: + if (request->mime_type && + !g_str_has_prefix (request->mime_type, "image/")) + { + katze_net_icon_priv_free (priv); + return FALSE; + } + break; + case KATZE_NET_MOVED: + break; + default: + katze_net_icon_priv_free (priv); + return FALSE; + } + + return TRUE; +} + +static void +katze_net_icon_transfer_cb (KatzeNetRequest* request, + KatzeNetIconPriv* priv) +{ + GdkPixbuf* pixbuf; + FILE* fp; + GdkPixbuf* pixbuf_scaled; + gint icon_width, icon_height; + size_t ret; + + if (request->status == KATZE_NET_MOVED) + return; + + pixbuf = NULL; + if (request->data) + { + if ((fp = fopen (priv->icon_file, "wb"))) + { + ret = fwrite (request->data, 1, request->length, fp); + fclose (fp); + if ((ret - request->length) != 0) + { + g_warning ("Error writing to file %s " + "in katze_net_icon_transfer_cb()", priv->icon_file); + } + pixbuf = gdk_pixbuf_new_from_file (priv->icon_file, NULL); + } + else + pixbuf = katze_pixbuf_new_from_buffer ((guchar*)request->data, + request->length, request->mime_type, NULL); + if (pixbuf) + g_object_ref (pixbuf); + g_hash_table_insert (priv->net->memory, + g_strdup (priv->icon_file), pixbuf); + } + + if (!priv->icon_cb) + { + katze_net_icon_priv_free (priv); + return; + } + + if (!pixbuf) + { + if (priv->widget) + pixbuf = gtk_widget_render_icon (priv->widget, + GTK_STOCK_FILE, GTK_ICON_SIZE_MENU, NULL); + else + { + priv->icon_cb (NULL, priv->user_data); + katze_net_icon_priv_free (priv); + return; + } + } + gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &icon_width, &icon_height); + pixbuf_scaled = gdk_pixbuf_scale_simple (pixbuf, icon_width, icon_height, + GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + + priv->icon_cb (pixbuf_scaled, priv->user_data); + katze_net_icon_priv_free (priv); +} + +/** + * katze_net_load_icon: + * @net: a #KatzeNet + * @uri: an URI string, or %NULL + * @icon_cb: function to call upon completion + * @widget: a related #GtkWidget, or %NULL + * @user_data: data to pass to the callback + * + * Requests a transfer of an icon for @uri. This is + * implemented by looking for a favicon.ico, an + * image according to the file type or even a + * generated icon. The provided icon is intended + * for user interfaces and not guaranteed to be + * the same over multiple requests, plus it may + * be scaled to fit the menu icon size. + * + * Pass a valid #GtkWidget to @widget if you want + * a themed default icon in case of a missing icon, + * otherwise %NULL will be returned in that case. + * + * The caller is expected to use the returned icon + * and update it if @icon_cb is called. + * + * Depending on whether the icon was previously + * cached or @uri is a local resource, the returned + * icon may already be the final one. + * + * Note that both the returned #GdkPixbuf and the + * icon passed to @icon_cb are newly allocated and + * the caller owns the reference. + * + * Since 0.1.2 @widget can be %NULL. + * + * Return value: a #GdkPixbuf, or %NULL + **/ +GdkPixbuf* +katze_net_load_icon (KatzeNet* net, + const gchar* uri, + KatzeNetIconCb icon_cb, + GtkWidget* widget, + gpointer user_data) +{ + guint i; + KatzeNetIconPriv* priv; + gchar* icon_uri; + gchar* icon_file; + GdkPixbuf* pixbuf; + gint icon_width, icon_height; + GdkPixbuf* pixbuf_scaled; + + g_return_val_if_fail (KATZE_IS_NET (net), NULL); + g_return_val_if_fail (!widget || GTK_IS_WIDGET (widget), NULL); + + pixbuf = NULL; + if (uri && (g_str_has_prefix (uri, "http://") || + g_str_has_prefix (uri, "https://"))) + { + i = 8; + while (uri[i] != '\0' && uri[i] != '/') + i++; + if (uri[i] == '/') + { + icon_uri = g_strdup (uri); + icon_uri[i] = '\0'; + icon_uri = g_strdup_printf ("%s/favicon.ico", icon_uri); + } + else + icon_uri = g_strdup_printf ("%s/favicon.ico", uri); + + icon_file = katze_net_get_cached_path (net, icon_uri, "icons"); + + if (g_hash_table_lookup_extended (net->memory, + icon_file, NULL, (gpointer)&pixbuf)) + { + g_free (icon_file); + if (pixbuf) + g_object_ref (pixbuf); + } + else if ((pixbuf = gdk_pixbuf_new_from_file (icon_file, NULL))) + g_free (icon_file); + /* If the called doesn't provide an icon callback, + we assume there is no interest in loading an un-cached icon. */ + else if (icon_cb) + { + priv = g_new0 (KatzeNetIconPriv, 1); + priv->net = net; + priv->icon_file = icon_file; + priv->icon_cb = icon_cb; + priv->widget = widget ? g_object_ref (widget) : NULL; + priv->user_data = user_data; + + katze_net_load_uri (net, icon_uri, + (KatzeNetStatusCb)katze_net_icon_status_cb, + (KatzeNetTransferCb)katze_net_icon_transfer_cb, priv); + } + g_free (icon_uri); + } + + if (!pixbuf) + { + if (widget) + pixbuf = gtk_widget_render_icon (widget, + GTK_STOCK_FILE, GTK_ICON_SIZE_MENU, NULL); + else + return NULL; + } + gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &icon_width, &icon_height); + pixbuf_scaled = gdk_pixbuf_scale_simple (pixbuf, icon_width, icon_height, + GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + + return pixbuf_scaled; +} diff --git a/katze/katze-net.h b/katze/katze-net.h new file mode 100644 index 00000000..13f50266 --- /dev/null +++ b/katze/katze-net.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_NET_H__ +#define __KATZE_NET_H__ + +#include "katze-utils.h" + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_NET \ + (katze_net_get_type ()) +#define KATZE_NET(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_NET, KatzeNet)) +#define KATZE_NET_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_NET, KatzeNetClass)) +#define KATZE_IS_NET(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_NET)) +#define KATZE_IS_NET_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_NET)) +#define KATZE_NET_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_NET, KatzeNetClass)) + +typedef struct _KatzeNet KatzeNet; +typedef struct _KatzeNetClass KatzeNetClass; + +GType +katze_net_get_type (void); + +KatzeNet* +katze_net_new (void); + +gpointer +katze_net_get_session (KatzeNet* net); + +typedef enum +{ + KATZE_NET_VERIFIED, + KATZE_NET_MOVED, + KATZE_NET_NOT_FOUND, + KATZE_NET_FAILED, + KATZE_NET_DONE +} KatzeNetStatus; + +typedef struct +{ + gchar* uri; + KatzeNetStatus status; + gchar* mime_type; + gchar* data; + gint64 length; +} KatzeNetRequest; + +typedef gboolean (*KatzeNetStatusCb) (KatzeNetRequest* request, + gpointer user_data); + +typedef void (*KatzeNetTransferCb) (KatzeNetRequest* request, + gpointer user_data); + +void +katze_net_load_uri (KatzeNet* net, + const gchar* uri, + KatzeNetStatusCb status_cb, + KatzeNetTransferCb transfer_cb, + gpointer user_data); + +typedef void (*KatzeNetIconCb) (GdkPixbuf* icon, + gpointer user_data); + +GdkPixbuf* +katze_net_load_icon (KatzeNet* net, + const gchar* uri, + KatzeNetIconCb icon_cb, + GtkWidget* widget, + gpointer user_data); + +G_END_DECLS + +#endif /* __KATZE_NET_H__ */ diff --git a/katze/katze-separatoraction.c b/katze/katze-separatoraction.c new file mode 100644 index 00000000..1b86a8c2 --- /dev/null +++ b/katze/katze-separatoraction.c @@ -0,0 +1,134 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "katze-separatoraction.h" + +struct _KatzeSeparatorAction +{ + GtkAction parent_instance; +}; + +struct _KatzeSeparatorActionClass +{ + GtkActionClass parent_class; +}; + +G_DEFINE_TYPE (KatzeSeparatorAction, katze_separator_action, GTK_TYPE_ACTION); + +static void +katze_separator_action_finalize (GObject* object); + +static void +katze_separator_action_activate (GtkAction* object); + +static GtkWidget* +katze_separator_action_create_tool_item (GtkAction* action); + +static GtkWidget* +katze_separator_action_create_menu_item (GtkAction* action); + +static void +katze_separator_action_connect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +katze_separator_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +katze_separator_action_class_init (KatzeSeparatorActionClass* class) +{ + GObjectClass* gobject_class; + GtkActionClass* action_class; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = katze_separator_action_finalize; + + action_class = GTK_ACTION_CLASS (class); + action_class->activate = katze_separator_action_activate; + action_class->create_menu_item = katze_separator_action_create_menu_item; + action_class->create_tool_item = katze_separator_action_create_tool_item; + action_class->connect_proxy = katze_separator_action_connect_proxy; + action_class->disconnect_proxy = katze_separator_action_disconnect_proxy; +} + +static void +katze_separator_action_init (KatzeSeparatorAction* separator_action) +{ + /* Nothing to do. */ +} + +static void +katze_separator_action_finalize (GObject* object) +{ + G_OBJECT_CLASS (katze_separator_action_parent_class)->finalize (object); +} + +static void +katze_separator_action_activate (GtkAction* action) +{ + GSList* proxies; + + proxies = gtk_action_get_proxies (action); + if (!proxies) + return; + + do + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + + } + while ((proxies = g_slist_next (proxies))); + + if (GTK_ACTION_CLASS (katze_separator_action_parent_class)->activate) + GTK_ACTION_CLASS (katze_separator_action_parent_class)->activate (action); +} + +static GtkWidget* +katze_separator_action_create_menu_item (GtkAction* action) +{ + GtkWidget* menuitem; + + menuitem = gtk_separator_menu_item_new (); + return menuitem; +} + +static GtkWidget* +katze_separator_action_create_tool_item (GtkAction* action) +{ + GtkWidget* toolitem; + + toolitem = GTK_WIDGET (gtk_separator_tool_item_new ()); + return toolitem; +} + +static void +katze_separator_action_connect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + GTK_ACTION_CLASS (katze_separator_action_parent_class)->connect_proxy ( + action, proxy); + + if (GTK_IS_TOOL_ITEM (proxy)) + { + } + else if (GTK_IS_MENU_ITEM (proxy)) + { + } +} + +static void +katze_separator_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + GTK_ACTION_CLASS (katze_separator_action_parent_class)->disconnect_proxy + (action, proxy); +} diff --git a/katze/katze-separatoraction.h b/katze/katze-separatoraction.h new file mode 100644 index 00000000..396b83d8 --- /dev/null +++ b/katze/katze-separatoraction.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_SEPARATOR_ACTION_H__ +#define __KATZE_SEPARATOR_ACTION_H__ + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_SEPARATOR_ACTION \ + (katze_separator_action_get_type ()) +#define KATZE_SEPARATOR_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_SEPARATOR_ACTION, \ + KatzeSeparatorAction)) +#define KATZE_SEPARATOR_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_SEPARATOR_ACTION, \ + KatzeSeparatorActionClass)) +#define KATZE_IS_SEPARATOR_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_SEPARATOR_ACTION)) +#define KATZE_IS_SEPARATOR_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_SEPARATOR_ACTION)) +#define KATZE_SEPARATOR_ACTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_SEPARATOR_ACTION, \ + KatzeSeparatorActionClass)) + +typedef struct _KatzeSeparatorAction KatzeSeparatorAction; +typedef struct _KatzeSeparatorActionClass KatzeSeparatorActionClass; + +GType +katze_separator_action_get_type (void); + +G_END_DECLS + +#endif /* __KATZE_SEPARATOR_ACTION_H__ */ diff --git a/katze/katze-throbber.c b/katze/katze-throbber.c new file mode 100644 index 00000000..0698ccb0 --- /dev/null +++ b/katze/katze-throbber.c @@ -0,0 +1,919 @@ +/* + Copyright (C) 2007-2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "katze-throbber.h" + +#include "katze-utils.h" + +#include +#include + +struct _KatzeThrobber +{ + GtkMisc parent_instance; + + GtkIconSize icon_size; + gchar* icon_name; + GdkPixbuf* pixbuf; + gchar* stock_id; + gboolean animated; + gchar* static_icon_name; + GdkPixbuf* static_pixbuf; + gchar* static_stock_id; + + gint index; + gint timer_id; + gint width; + gint height; +}; + +G_DEFINE_TYPE (KatzeThrobber, katze_throbber, GTK_TYPE_MISC); + +enum +{ + PROP_0, + + PROP_ICON_SIZE, + PROP_ICON_NAME, + PROP_PIXBUF, + PROP_ANIMATED, + PROP_STATIC_ICON_NAME, + PROP_STATIC_PIXBUF, + PROP_STATIC_STOCK_ID +}; + +static void +katze_throbber_dispose (GObject* object); + +static void +katze_throbber_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +katze_throbber_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +katze_throbber_destroy (GtkObject* object); + +static void +katze_throbber_realize (GtkWidget* widget); + +static void +katze_throbber_unrealize (GtkWidget* widget); + +static void +katze_throbber_map (GtkWidget* widget); + +static void +katze_throbber_unmap (GtkWidget* widget); + +static void +katze_throbber_style_set (GtkWidget* widget, + GtkStyle* style); + +static void +katze_throbber_screen_changed (GtkWidget* widget, + GdkScreen* screen_prev); + +static void +katze_throbber_size_request (GtkWidget* widget, + GtkRequisition* requisition); + +static gboolean +katze_throbber_expose_event (GtkWidget* widget, + GdkEventExpose* event); + +static void +icon_theme_changed (KatzeThrobber* throbber); + +static gboolean +katze_throbber_timeout (KatzeThrobber* throbber); + +static void +katze_throbber_timeout_destroy (KatzeThrobber* throbber); + +static void +katze_throbber_class_init (KatzeThrobberClass* class) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (class); + gobject_class->dispose = katze_throbber_dispose; + gobject_class->set_property = katze_throbber_set_property; + gobject_class->get_property = katze_throbber_get_property; + + GtkObjectClass* object_class = GTK_OBJECT_CLASS (class); + object_class->destroy = katze_throbber_destroy; + + GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (class); + widget_class->realize = katze_throbber_realize; + widget_class->unrealize = katze_throbber_unrealize; + widget_class->map = katze_throbber_map; + widget_class->unmap = katze_throbber_unmap; + widget_class->style_set = katze_throbber_style_set; + widget_class->screen_changed = katze_throbber_screen_changed; + widget_class->size_request = katze_throbber_size_request; + widget_class->expose_event = katze_throbber_expose_event; + + GParamFlags flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_ICON_SIZE, + g_param_spec_int ( + "icon-size", + "Icon size", + "Symbolic size to use for the animation", + 0, G_MAXINT, GTK_ICON_SIZE_MENU, + flags)); + + g_object_class_install_property (gobject_class, + PROP_ICON_NAME, + g_param_spec_string ( + "icon-name", + "Icon Name", + "The name of an icon containing animation frames", + "process-working", + flags)); + + g_object_class_install_property (gobject_class, + PROP_PIXBUF, + g_param_spec_object ( + "pixbuf", + "Pixbuf", + "A GdkPixbuf containing animation frames", + GDK_TYPE_PIXBUF, + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_ANIMATED, + g_param_spec_boolean ( + "animated", + "Animated", + "Whether the throbber should be animated", + FALSE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_STATIC_ICON_NAME, + g_param_spec_string ( + "static-icon-name", + "Static Icon Name", + "The name of an icon to be used as the static image", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_PIXBUF, + g_param_spec_object ( + "static-pixbuf", + "Static Pixbuf", + "A GdkPixbuf to be used as the static image", + GDK_TYPE_PIXBUF, + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_STATIC_STOCK_ID, + g_param_spec_string ( + "static-stock-id", + "Static Stock ID", + "The stock ID of an icon to be used as the static image", + NULL, + flags)); +} + +static void +katze_throbber_init (KatzeThrobber *throbber) +{ + GTK_WIDGET_SET_FLAGS (throbber, GTK_NO_WINDOW); + + throbber->timer_id = -1; +} + +static void +katze_throbber_dispose (GObject* object) +{ + KatzeThrobber* throbber = KATZE_THROBBER (object); + + if (G_UNLIKELY (throbber->timer_id >= 0)) + g_source_remove (throbber->timer_id); + + (*G_OBJECT_CLASS (katze_throbber_parent_class)->dispose) (object); +} + +static void +katze_throbber_destroy (GtkObject* object) +{ + KatzeThrobber* throbber = KATZE_THROBBER (object); + + katze_assign (throbber->icon_name, NULL); + katze_object_assign (throbber->pixbuf, NULL); + katze_assign (throbber->static_icon_name, NULL); + katze_object_assign (throbber->static_pixbuf, NULL); + katze_assign (throbber->static_stock_id, NULL); + + GTK_OBJECT_CLASS (katze_throbber_parent_class)->destroy (object); +} + +static void +katze_throbber_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + KatzeThrobber* throbber = KATZE_THROBBER (object); + + switch (prop_id) + { + case PROP_ICON_SIZE: + katze_throbber_set_icon_size (throbber, g_value_get_int (value)); + break; + case PROP_ICON_NAME: + katze_throbber_set_icon_name (throbber, g_value_get_string (value)); + break; + case PROP_PIXBUF: + katze_throbber_set_pixbuf (throbber, g_value_get_object (value)); + break; + case PROP_ANIMATED: + katze_throbber_set_animated (throbber, g_value_get_boolean (value)); + break; + case PROP_STATIC_ICON_NAME: + katze_throbber_set_static_icon_name (throbber, g_value_get_string (value)); + break; + case PROP_STATIC_PIXBUF: + katze_throbber_set_static_pixbuf (throbber, g_value_get_object (value)); + break; + case PROP_STATIC_STOCK_ID: + katze_throbber_set_static_stock_id (throbber, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +katze_throbber_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + KatzeThrobber* throbber = KATZE_THROBBER (object); + + switch (prop_id) + { + case PROP_ICON_SIZE: + g_value_set_int (value, katze_throbber_get_icon_size (throbber)); + break; + case PROP_ICON_NAME: + g_value_set_string (value, katze_throbber_get_icon_name (throbber)); + break; + case PROP_PIXBUF: + g_value_set_object (value, katze_throbber_get_pixbuf (throbber)); + break; + case PROP_ANIMATED: + g_value_set_boolean (value, katze_throbber_get_animated (throbber)); + break; + case PROP_STATIC_ICON_NAME: + g_value_set_string (value, katze_throbber_get_static_icon_name (throbber)); + break; + case PROP_STATIC_PIXBUF: + g_value_set_object (value, katze_throbber_get_static_pixbuf (throbber)); + break; + case PROP_STATIC_STOCK_ID: + g_value_set_string (value, katze_throbber_get_static_stock_id (throbber)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * katze_throbber_new: + * + * Creates a new throbber widget. + * + * Return value: a new #KatzeThrobber + **/ +GtkWidget* +katze_throbber_new (void) +{ + KatzeThrobber* throbber = g_object_new (KATZE_TYPE_THROBBER, + NULL); + + return GTK_WIDGET (throbber); +} + +/** + * katze_throbber_set_icon_size: + * @throbber: a #KatzeThrobber + * @icon_size: the new icon size + * + * Sets the desired size of the throbber image. The animation and static image + * will be displayed in this size. If a pixbuf is used for the animation every + * single frame is assumed to have this size. + **/ +void +katze_throbber_set_icon_size (KatzeThrobber* throbber, + GtkIconSize icon_size) +{ + GtkSettings* gtk_settings; + + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + gtk_settings = gtk_widget_get_settings (GTK_WIDGET (throbber)); + g_return_if_fail (gtk_icon_size_lookup_for_settings (gtk_settings, + icon_size, + &throbber->width, + &throbber->height)); + + throbber->icon_size = icon_size; + + g_object_notify (G_OBJECT (throbber), "icon-size"); + + gtk_widget_queue_draw (GTK_WIDGET (throbber)); +} + +/** + * katze_throbber_set_icon_name: + * @throbber: a #KatzeThrobber + * @icon_name: an icon name or %NULL + * + * Sets the name of an icon that should provide the animation frames. + * + * The pixbuf is automatically invalidated. + **/ +void +katze_throbber_set_icon_name (KatzeThrobber* throbber, + const gchar* icon_name) +{ + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + + katze_assign (throbber->icon_name, g_strdup (icon_name)); + + if (icon_name) + icon_theme_changed (throbber); + + g_object_notify (G_OBJECT (throbber), "icon-name"); +} + +/** + * katze_throbber_set_pixbuf: + * @throbber: a #KatzeThrobber + * @pixbuf: a #GdkPixbuf or %NULL + * + * Sets the pixbuf that should provide the animation frames. Every frame + * is assumed to have the icon size of the throbber, which can be specified + * with katze_throbber_set_icon_size (). + * + * The icon name is automatically invalidated. + **/ +void +katze_throbber_set_pixbuf (KatzeThrobber* throbber, + GdkPixbuf* pixbuf) +{ + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + g_return_if_fail (!pixbuf || GDK_IS_PIXBUF (pixbuf)); + + katze_object_assign (throbber->pixbuf, pixbuf); + + g_object_freeze_notify (G_OBJECT (throbber)); + + if (pixbuf) + { + g_object_ref (pixbuf); + + katze_assign (throbber->icon_name, NULL); + g_object_notify (G_OBJECT (throbber), "icon-name"); + } + + gtk_widget_queue_draw (GTK_WIDGET (throbber)); + + g_object_notify (G_OBJECT (throbber), "pixbuf"); + g_object_thaw_notify (G_OBJECT (throbber)); +} + +/** + * katze_throbber_set_animated: + * @throbber: a #KatzeThrobber + * @animated: %TRUE to animate the throbber + * + * Sets the animation state of the throbber. + **/ +void +katze_throbber_set_animated (KatzeThrobber* throbber, + gboolean animated) +{ + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + + if (G_UNLIKELY (throbber->animated == animated)) + return; + + throbber->animated = animated; + + if (animated && (throbber->timer_id < 0)) + throbber->timer_id = g_timeout_add_full ( + G_PRIORITY_LOW, 50, + (GSourceFunc)katze_throbber_timeout, + throbber, + (GDestroyNotify)katze_throbber_timeout_destroy); + + gtk_widget_queue_draw (GTK_WIDGET (throbber)); + + g_object_notify (G_OBJECT (throbber), "animated"); +} + +/** + * katze_throbber_set_static_icon_name: + * @throbber: a #KatzeThrobber + * @icon_name: an icon name or %NULL + * + * Sets the name of an icon that should provide the static image. + * + * The static pixbuf and stock ID are automatically invalidated. + **/ +void +katze_throbber_set_static_icon_name (KatzeThrobber* throbber, + const gchar* icon_name) +{ + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + + katze_assign (throbber->static_icon_name, g_strdup (icon_name)); + + g_object_freeze_notify (G_OBJECT (throbber)); + + if (icon_name) + { + katze_assign (throbber->static_stock_id, NULL); + + icon_theme_changed (throbber); + + g_object_notify (G_OBJECT (throbber), "static-pixbuf"); + g_object_notify (G_OBJECT (throbber), "static-stock-id"); + } + + g_object_notify (G_OBJECT (throbber), "static-icon-name"); + g_object_thaw_notify (G_OBJECT (throbber)); +} + +/** + * katze_throbber_set_static_pixbuf: + * @throbber: a #KatzeThrobber + * @pixbuf: a #GdkPixbuf or %NULL + * + * Sets the pixbuf that should provide the static image. The pixbuf is + * assumed to have the icon size of the throbber, which can be specified + * with katze_throbber_set_icon_size (). + * + * The static icon name and stock ID are automatically invalidated. + **/ +void +katze_throbber_set_static_pixbuf (KatzeThrobber* throbber, + GdkPixbuf* pixbuf) +{ + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); + + katze_object_assign (throbber->static_pixbuf, pixbuf); + + g_object_freeze_notify (G_OBJECT (throbber)); + + if (pixbuf) + { + g_object_ref (pixbuf); + + katze_assign (throbber->static_icon_name, NULL); + katze_assign (throbber->static_stock_id, NULL); + + gtk_widget_queue_draw (GTK_WIDGET (throbber)); + + g_object_notify (G_OBJECT (throbber), "static-icon-name"); + g_object_notify (G_OBJECT (throbber), "static-stock-id"); + } + + g_object_notify (G_OBJECT (throbber), "static-pixbuf"); + g_object_thaw_notify (G_OBJECT (throbber)); +} + +/** + * katze_throbber_set_static_stock_id: + * @throbber: a #KatzeThrobber + * @stock_id: a stock ID or %NULL + * + * Sets the stock ID of an icon that should provide the static image. + * + * The static icon name and pixbuf are automatically invalidated. + **/ +void +katze_throbber_set_static_stock_id (KatzeThrobber* throbber, + const gchar* stock_id) +{ + g_return_if_fail (KATZE_IS_THROBBER (throbber)); + + g_object_freeze_notify (G_OBJECT (throbber)); + + if (stock_id) + { + GtkStockItem stock_item; + g_return_if_fail (gtk_stock_lookup (stock_id, &stock_item)); + + g_object_notify (G_OBJECT (throbber), "static-icon-name"); + g_object_notify (G_OBJECT (throbber), "static-pixbuf"); + } + + katze_assign (throbber->static_stock_id, g_strdup (stock_id)); + + if (stock_id) + icon_theme_changed (throbber); + + g_object_notify (G_OBJECT (throbber), "static-stock-id"); + g_object_thaw_notify (G_OBJECT (throbber)); +} + +/** + * katze_throbber_get_icon_size: + * @throbber: a #KatzeThrobber + * + * Retrieves the size of the throbber. + * + * Return value: the size of the throbber + **/ +GtkIconSize +katze_throbber_get_icon_size (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), GTK_ICON_SIZE_INVALID); + + return throbber->icon_size; +} + +/** + * katze_throbber_get_icon_name: + * @throbber: a #KatzeThrobber + * + * Retrieves the name of the icon providing the animation frames. + * + * Return value: the name of the icon providing the animation frames, or %NULL + **/ +const gchar* +katze_throbber_get_icon_name (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); + + return throbber->icon_name; +} + +/** + * katze_throbber_get_pixbuf: + * @throbber: a #KatzeThrobber + * + * Retrieves the #GdkPixbuf providing the animation frames if an icon name + * or pixbuf is available. The caller of this function does not own a + * reference to the returned pixbuf. + * + * Return value: the pixbuf providing the animation frames, or %NULL + **/ +GdkPixbuf* +katze_throbber_get_pixbuf (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); + + return throbber->pixbuf; +} + +/** + * katze_throbber_get_animated: + * @throbber: a #KatzeThrobber + * + * Retrieves the status of the animation, whcih can be animated or static. + * + * Return value: %TRUE if the throbber is animated + **/ +gboolean +katze_throbber_get_animated (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), FALSE); + + return throbber->animated; +} + +/** + * katze_throbber_get_static_icon_name: + * @throbber: a #KatzeThrobber + * + * Retrieves the name of the icon providing the static image, if an icon name + * for the static image was specified. + * + * Return value: the name of the icon providing the static image, or %NULL + **/ +const gchar* +katze_throbber_get_static_icon_name (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); + + return throbber->static_icon_name; +} + +/** + * katze_throbber_get_static pixbuf: + * @throbber: a #KatzeThrobber + * + * Retrieves the #GdkPixbuf providing the static image, if an icon name, a + * pixbuf or a stock ID for the static image was specified. The caller of this + * function does not own a reference to the returned pixbuf. + * + * Return value: the pixbuf providing the static image, or %NULL + **/ +GdkPixbuf* +katze_throbber_get_static_pixbuf (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); + + return throbber->static_pixbuf; +} + +/** + * katze_throbber_get_static_stock_id: + * @throbber: a #KatzeThrobber + * + * Retrieves the stock ID of the icon providing the static image, if a + * stock ID for the static image was specified. + * + * Return value: the stock ID of the icon providing the static image, or %NULL + **/ +const gchar* +katze_throbber_get_static_stock_id (KatzeThrobber* throbber) +{ + g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); + + return throbber->static_stock_id; +} + +static void +katze_throbber_realize (GtkWidget* widget) +{ + (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->realize) (widget); + + icon_theme_changed (KATZE_THROBBER (widget)); +} + +static void +katze_throbber_unrealize (GtkWidget* widget) +{ + if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize) + GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize (widget); +} + +static void +pixbuf_assign_icon (GdkPixbuf** pixbuf, + const gchar* icon_name, + KatzeThrobber* throbber) +{ + GdkScreen* screen; + GtkIconTheme* icon_theme; + + if (*pixbuf) + g_object_unref (*pixbuf); + + screen = gtk_widget_get_screen (GTK_WIDGET (throbber)); + icon_theme = gtk_icon_theme_get_for_screen (screen); + *pixbuf = gtk_icon_theme_load_icon (icon_theme, + icon_name, + MAX (throbber->width, throbber->height), + (GtkIconLookupFlags) 0, + NULL); +} + +static void +icon_theme_changed (KatzeThrobber* throbber) +{ + if (throbber->icon_name) + pixbuf_assign_icon (&throbber->pixbuf, + throbber->icon_name, throbber); + + if (throbber->static_icon_name) + pixbuf_assign_icon (&throbber->static_pixbuf, + throbber->static_icon_name, throbber); + else if (throbber->static_stock_id) + katze_object_assign (throbber->static_pixbuf, + gtk_widget_render_icon (GTK_WIDGET (throbber), + throbber->static_stock_id, + throbber->icon_size, + NULL)); + + g_object_freeze_notify (G_OBJECT (throbber)); + g_object_notify (G_OBJECT (throbber), "pixbuf"); + g_object_notify (G_OBJECT (throbber), "static-pixbuf"); + g_object_thaw_notify (G_OBJECT (throbber)); + + gtk_widget_queue_draw (GTK_WIDGET (throbber)); +} + +static void +katze_throbber_map (GtkWidget* widget) +{ + (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->map) (widget); +} + +static void +katze_throbber_unmap (GtkWidget* widget) +{ + if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap) + GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap (widget); +} + +static gboolean +katze_throbber_timeout (KatzeThrobber* throbber) +{ + throbber->index++; + gtk_widget_queue_draw (GTK_WIDGET (throbber)); + + return throbber->animated; +} + +static void +katze_throbber_timeout_destroy (KatzeThrobber* throbber) +{ + throbber->index = 0; + throbber->timer_id = -1; +} + +static void +katze_throbber_style_set (GtkWidget* widget, + GtkStyle* prev_style) +{ + if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set) + GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set (widget, + prev_style); + + icon_theme_changed (KATZE_THROBBER (widget)); +} + +static void +katze_throbber_screen_changed (GtkWidget* widget, + GdkScreen* prev_screen) +{ + if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed) + GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed ( + widget, + prev_screen); + + icon_theme_changed (KATZE_THROBBER (widget)); +} + +static void +katze_throbber_size_request (GtkWidget* widget, + GtkRequisition* requisition) +{ + KatzeThrobber* throbber = KATZE_THROBBER (widget); + + requisition->width = throbber->width; + requisition->height = throbber->height; + + GTK_WIDGET_CLASS (katze_throbber_parent_class)->size_request (widget, + requisition); +} + +static void +katze_throbber_aligned_coords (GtkWidget* widget, + gint* ax, + gint* ay) +{ + gfloat xalign, yalign; + gint xpad, ypad; + + gtk_misc_get_alignment (GTK_MISC (widget), &xalign, &yalign); + if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) + xalign = 1.0f - xalign; + gtk_misc_get_padding (GTK_MISC (widget), &xpad, &ypad); + + *ax = floor (widget->allocation.x + xpad + + ((widget->allocation.width - widget->requisition.width) * xalign)); + *ay = floor (widget->allocation.y + ypad + + ((widget->allocation.height - widget->requisition.height) * yalign)); +} + +static gboolean +katze_throbber_expose_event (GtkWidget* widget, + GdkEventExpose* event) +{ + gint ax, ay; + KatzeThrobber* throbber = KATZE_THROBBER (widget); + + if (G_UNLIKELY (!throbber->width || !throbber->height)) + return TRUE; + + if (G_UNLIKELY (!throbber->pixbuf && !throbber->static_pixbuf)) + if (throbber->animated && !throbber->pixbuf && !throbber->icon_name) + return TRUE; + + if (!throbber->animated && (throbber->static_pixbuf + || throbber->static_icon_name || throbber->static_stock_id)) + { + if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_icon_name)) + { + icon_theme_changed (KATZE_THROBBER (widget)); + + if (!throbber->static_pixbuf) + { + g_warning (_("Named icon '%s' couldn't be loaded"), + throbber->static_icon_name); + katze_assign (throbber->static_icon_name, NULL); + g_object_notify (G_OBJECT (throbber), "static-icon-name"); + return TRUE; + } + } + else if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_stock_id)) + { + icon_theme_changed (KATZE_THROBBER (widget)); + + if (!throbber->static_pixbuf) + { + g_warning (_("Stock icon '%s' couldn't be loaded"), + throbber->static_stock_id); + katze_assign (throbber->static_stock_id, NULL); + g_object_notify (G_OBJECT (throbber), "static-stock-id"); + return TRUE; + } + } + + katze_throbber_aligned_coords (widget, &ax, &ay); + + gdk_draw_pixbuf (event->window, NULL, throbber->static_pixbuf, + 0, 0, ax, ay, + throbber->width, throbber->height, + GDK_RGB_DITHER_NONE, 0, 0); + } + else + { + if (G_UNLIKELY (throbber->icon_name && !throbber->pixbuf)) + { + icon_theme_changed (KATZE_THROBBER (widget)); + + if (!throbber->pixbuf) + { + /* Fallback to a stock icon */ + katze_assign (throbber->icon_name, g_strdup (GTK_STOCK_EXECUTE)); + g_object_notify (G_OBJECT (throbber), "icon-name"); + return TRUE; + } + } + + gint cols = gdk_pixbuf_get_width (throbber->pixbuf) / throbber->width; + gint rows = gdk_pixbuf_get_height (throbber->pixbuf) / throbber->height; + + if (G_UNLIKELY (cols == 1 && cols == rows)) + { + katze_throbber_aligned_coords (widget, &ax, &ay); + + if (throbber->animated) + gdk_draw_pixbuf (event->window, NULL, throbber->pixbuf, + 0, 0, ax, ay, + throbber->width, throbber->height, + GDK_RGB_DITHER_NONE, 0, 0); + return TRUE; + } + + if (G_LIKELY (cols > 0 && rows > 0)) + { + gint idx; + guint x, y; + + katze_throbber_aligned_coords (widget, &ax, &ay); + + idx = throbber->index % (cols * rows); + if (G_LIKELY (throbber->timer_id >= 0)) + idx = MAX (idx, 1); + + x = (idx % cols) * throbber->width; + y = (idx / cols) * throbber->height; + + gdk_draw_pixbuf (event->window, NULL, throbber->pixbuf, + x, y, ax, ay, + throbber->width, throbber->height, + GDK_RGB_DITHER_NONE, 0, 0); + } + else + { + g_warning (_("Animation frames are broken")); + katze_assign (throbber->icon_name, NULL); + katze_object_assign (throbber->pixbuf, NULL); + + g_object_freeze_notify (G_OBJECT (throbber)); + g_object_notify (G_OBJECT (throbber), "icon-name"); + g_object_notify (G_OBJECT (throbber), "pixbuf"); + g_object_thaw_notify (G_OBJECT (throbber)); + } + } + + return TRUE; +} diff --git a/katze/katze-throbber.h b/katze/katze-throbber.h new file mode 100644 index 00000000..34d00044 --- /dev/null +++ b/katze/katze-throbber.h @@ -0,0 +1,104 @@ +/* + Copyright (C) 2007 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_THROBBER_H__ +#define __KATZE_THROBBER_H__ + +#include + +G_BEGIN_DECLS + +#define KATZE_TYPE_THROBBER \ + (katze_throbber_get_type ()) +#define KATZE_THROBBER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_THROBBER, KatzeThrobber)) +#define KATZE_THROBBER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_THROBBER, KatzeThrobberClass)) +#define KATZE_IS_THROBBER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_THROBBER)) +#define KATZE_IS_THROBBER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_THROBBER)) +#define KATZE_THROBBER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_THROBBER, KatzeThrobberClass)) + +typedef struct _KatzeThrobber KatzeThrobber; +typedef struct _KatzeThrobberPrivate KatzeThrobberPrivate; +typedef struct _KatzeThrobberClass KatzeThrobberClass; + +struct _KatzeThrobberClass +{ + GtkMiscClass parent_class; + + /* Padding for future expansion */ + void (*_katze_reserved1) (void); + void (*_katze_reserved2) (void); + void (*_katze_reserved3) (void); + void (*_katze_reserved4) (void); +}; + +GType +katze_throbber_get_type (void); + +GtkWidget* +katze_throbber_new (void); + +void +katze_throbber_set_icon_size (KatzeThrobber* throbber, + GtkIconSize icon_size); + +void +katze_throbber_set_icon_name (KatzeThrobber* throbber, + const gchar* icon_size); + +void +katze_throbber_set_pixbuf (KatzeThrobber* throbber, + GdkPixbuf* pixbuf); + +void +katze_throbber_set_animated (KatzeThrobber* throbber, + gboolean animated); + +void +katze_throbber_set_static_icon_name (KatzeThrobber* throbber, + const gchar* icon_name); + +void +katze_throbber_set_static_pixbuf (KatzeThrobber* throbber, + GdkPixbuf* pixbuf); + +void +katze_throbber_set_static_stock_id (KatzeThrobber* throbber, + const gchar* stock_id); + +GtkIconSize +katze_throbber_get_icon_size (KatzeThrobber* throbber); + +const gchar* +katze_throbber_get_icon_name (KatzeThrobber* throbber); + +GdkPixbuf* +katze_throbber_get_pixbuf (KatzeThrobber* throbber); + +gboolean +katze_throbber_get_animated (KatzeThrobber* throbber); + +const gchar* +katze_throbber_get_static_icon_name (KatzeThrobber *throbber); + +GdkPixbuf* +katze_throbber_get_static_pixbuf (KatzeThrobber* throbber); + +const gchar* +katze_throbber_get_static_stock_id (KatzeThrobber* throbber); + +G_END_DECLS + +#endif /* __KATZE_THROBBER_H__ */ diff --git a/katze/katze-utils.c b/katze/katze-utils.c new file mode 100644 index 00000000..4bbee3b3 --- /dev/null +++ b/katze/katze-utils.c @@ -0,0 +1,768 @@ +/* + Copyright (C) 2007-2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "katze-utils.h" + +#include + +#include + +static void +proxy_toggle_button_toggled_cb (GtkToggleButton* button, + GObject* object) +{ + gboolean toggled = gtk_toggle_button_get_active (button); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + g_object_set (object, property, toggled, NULL); +} + +static void +proxy_file_file_set_cb (GtkFileChooser* button, + GObject* object) +{ + const gchar* file = gtk_file_chooser_get_filename (button); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + g_object_set (object, property, file, NULL); +} + +static void +proxy_folder_file_set_cb (GtkFileChooser* button, + GObject* object) +{ + const gchar* file = gtk_file_chooser_get_current_folder (button); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + g_object_set (object, property, file, NULL); +} + +static void +proxy_uri_file_set_cb (GtkFileChooser* button, + GObject* object) +{ + const gchar* file = gtk_file_chooser_get_uri (button); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + g_object_set (object, property, file, NULL); +} + +static void +proxy_combo_box_text_changed_cb (GtkComboBox* button, + GObject* object) +{ + gchar* text = gtk_combo_box_get_active_text (button); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + g_object_set (object, property, text, NULL); +} + +static void +proxy_entry_activate_cb (GtkEntry* entry, + GObject* object) +{ + const gchar* text = gtk_entry_get_text (entry); + const gchar* property = g_object_get_data (G_OBJECT (entry), "property"); + g_object_set (object, property, text, NULL); +} + +static gboolean +proxy_entry_focus_out_event_cb (GtkEntry* entry, + GdkEventFocus* event, + GObject* object) +{ + const gchar* text = gtk_entry_get_text (entry); + const gchar* property = g_object_get_data (G_OBJECT (entry), "property"); + g_object_set (object, property, text, NULL); + return FALSE; +} + +static void +proxy_spin_button_changed_cb (GtkSpinButton* button, + GObject* object) +{ + GObjectClass* class = G_OBJECT_GET_CLASS (object); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + GParamSpec* pspec = g_object_class_find_property (class, property); + if (G_PARAM_SPEC_TYPE (pspec) == G_TYPE_PARAM_INT) + { + gint value = gtk_spin_button_get_value_as_int (button); + g_object_set (object, property, value, NULL); + } + else + { + gdouble value = gtk_spin_button_get_value (button); + g_object_set (object, property, value, NULL); + } +} + +static void +proxy_combo_box_changed_cb (GtkComboBox* button, + GObject* object) +{ + gint value = gtk_combo_box_get_active (button); + const gchar* property = g_object_get_data (G_OBJECT (button), "property"); + g_object_set (object, property, value, NULL); +} + +static void +proxy_object_notify_boolean_cb (GObject* object, + GParamSpec* pspec, + GtkWidget* proxy) +{ + const gchar* property = g_object_get_data (G_OBJECT (proxy), "property"); + gboolean value = katze_object_get_boolean (object, property); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (proxy), value); +} + +static void +proxy_object_notify_string_cb (GObject* object, + GParamSpec* pspec, + GtkWidget* proxy) +{ + const gchar* property = g_object_get_data (G_OBJECT (proxy), "property"); + gchar* value = katze_object_get_string (object, property); + gtk_entry_set_text (GTK_ENTRY (proxy), value); + g_free (value); +} + +/** + * katze_property_proxy: + * @object: a #GObject + * @property: the name of a property + * @hint: a special hint + * + * Create a widget of an appropriate type to represent the specified + * object's property. If the property is writable changes of the value + * through the widget will be reflected in the value of the property. + * + * Supported values for @hint are as follows: + * "blurb": the blurb of the property will be used to provide a kind + * of label, instead of the name. + * "file": the widget created will be particularly suitable for + * choosing an existing filename. + * "folder": the widget created will be particularly suitable for + * choosing an existing folder. + * "uri": the widget created will be particularly suitable for + * choosing an existing filename, encoded as an URI. + * "font": the widget created will be particularly suitable for + * choosing a font from installed fonts. + * Since 0.1.6 the following hints are also supported: + * "toggle": the widget created will be an empty toggle button. This + * is only supported with boolean properties. + * + * Any other values for @hint are silently ignored. + * + * Since 0.1.2 strings without hints and booleans are truly synchronous + * including property changes causing the proxy to be updated. + * + * Return value: a new widget + **/ +GtkWidget* +katze_property_proxy (gpointer object, + const gchar* property, + const gchar* hint) +{ + GObjectClass* class; + GParamSpec* pspec; + GType type; + const gchar* nick; + const gchar* _hint; + GtkWidget* widget; + gchar* string; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + + class = G_OBJECT_GET_CLASS (object); + pspec = g_object_class_find_property (class, property); + if (!pspec) + { + g_warning (_("Property '%s' is invalid for %s"), + property, G_OBJECT_CLASS_NAME (class)); + return gtk_label_new (property); + } + + type = G_PARAM_SPEC_TYPE (pspec); + nick = g_param_spec_get_nick (pspec); + _hint = g_intern_string (hint); + if (_hint == g_intern_string ("blurb")) + nick = g_param_spec_get_blurb (pspec); + string = NULL; + if (type == G_TYPE_PARAM_BOOLEAN) + { + gchar* notify_property; + gboolean toggled = katze_object_get_boolean (object, property); + + if (_hint == g_intern_string ("toggle")) + widget = gtk_toggle_button_new (); + else + widget = gtk_check_button_new_with_label (gettext (nick)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), toggled); + g_signal_connect (widget, "toggled", + G_CALLBACK (proxy_toggle_button_toggled_cb), object); + notify_property = g_strdup_printf ("notify::%s", property); + g_signal_connect (object, notify_property, + G_CALLBACK (proxy_object_notify_boolean_cb), widget); + g_free (notify_property); + } + else if (type == G_TYPE_PARAM_STRING && _hint == g_intern_string ("file")) + { + string = katze_object_get_string (object, property); + + widget = gtk_file_chooser_button_new (_("Choose file"), + GTK_FILE_CHOOSER_ACTION_OPEN); + + if (!string) + string = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), + string ? string : ""); + #if GTK_CHECK_VERSION (2, 12, 0) + g_signal_connect (widget, "file-set", + G_CALLBACK (proxy_file_file_set_cb), object); + #else + if (pspec->flags & G_PARAM_WRITABLE) + g_signal_connect (widget, "selection-changed", + G_CALLBACK (proxy_file_file_set_cb), object); + #endif + } + else if (type == G_TYPE_PARAM_STRING && _hint == g_intern_string ("folder")) + { + string = katze_object_get_string (object, property); + + widget = gtk_file_chooser_button_new (_("Choose folder"), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + if (!string) + string = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), + string ? string : ""); + #if GTK_CHECK_VERSION (2, 12, 0) + g_signal_connect (widget, "file-set", + G_CALLBACK (proxy_folder_file_set_cb), object); + #else + if (pspec->flags & G_PARAM_WRITABLE) + g_signal_connect (widget, "selection-changed", + G_CALLBACK (proxy_folder_file_set_cb), object); + #endif + } + else if (type == G_TYPE_PARAM_STRING && _hint == g_intern_string ("uri")) + { + string = katze_object_get_string (object, property); + + widget = gtk_file_chooser_button_new (_("Choose file"), + GTK_FILE_CHOOSER_ACTION_OPEN); + if (!string) + string = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value); + gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (widget), + string ? string : ""); + #if GTK_CHECK_VERSION (2, 12, 0) + g_signal_connect (widget, "file-set", + G_CALLBACK (proxy_uri_file_set_cb), object); + #else + if (pspec->flags & G_PARAM_WRITABLE) + g_signal_connect (widget, "selection-changed", + G_CALLBACK (proxy_uri_file_set_cb), object); + #endif + } + else if (type == G_TYPE_PARAM_STRING && _hint == g_intern_string ("font")) + { + int n_families, i; + PangoContext* context; + PangoFontFamily** families; + string = katze_object_get_string (object, property); + + widget = gtk_combo_box_new_text (); + context = gtk_widget_get_pango_context (widget); + pango_context_list_families (context, &families, &n_families); + if (!string) + string = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value); + for (i = 0; i < n_families; i++) + { + const gchar* font = pango_font_family_get_name (families[i]); + gtk_combo_box_append_text (GTK_COMBO_BOX (widget), font); + if (string && !strcmp (font, string)) + gtk_combo_box_set_active (GTK_COMBO_BOX (widget), i); + } + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE ( + gtk_combo_box_get_model (GTK_COMBO_BOX (widget))), + 0, GTK_SORT_ASCENDING); + g_signal_connect (widget, "changed", + G_CALLBACK (proxy_combo_box_text_changed_cb), object); + g_free (families); + } + else if (type == G_TYPE_PARAM_STRING) + { + gchar* notify_property; + + widget = gtk_entry_new (); + g_object_get (object, property, &string, NULL); + if (!string) + string = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value); + gtk_entry_set_text (GTK_ENTRY (widget), string ? string : ""); + g_signal_connect (widget, "activate", + G_CALLBACK (proxy_entry_activate_cb), object); + g_signal_connect (widget, "focus-out-event", + G_CALLBACK (proxy_entry_focus_out_event_cb), object); + notify_property = g_strdup_printf ("notify::%s", property); + g_signal_connect (object, notify_property, + G_CALLBACK (proxy_object_notify_string_cb), widget); + g_free (notify_property); + } + else if (type == G_TYPE_PARAM_FLOAT) + { + gfloat value = katze_object_get_float (object, property); + + widget = gtk_spin_button_new_with_range ( + G_PARAM_SPEC_FLOAT (pspec)->minimum, + G_PARAM_SPEC_FLOAT (pspec)->maximum, 1); + /* Keep it narrow, 5 + 2 digits are usually fine */ + gtk_entry_set_width_chars (GTK_ENTRY (widget), 5 + 2); + gtk_spin_button_set_digits (GTK_SPIN_BUTTON (widget), 2); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value); + g_signal_connect (widget, "value-changed", + G_CALLBACK (proxy_spin_button_changed_cb), object); + } + else if (type == G_TYPE_PARAM_INT) + { + gint value = katze_object_get_int (object, property); + + widget = gtk_spin_button_new_with_range ( + G_PARAM_SPEC_INT (pspec)->minimum, + G_PARAM_SPEC_INT (pspec)->maximum, 1); + /* Keep it narrow, 5 digits are usually fine */ + gtk_entry_set_width_chars (GTK_ENTRY (widget), 5); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value); + g_signal_connect (widget, "value-changed", + G_CALLBACK (proxy_spin_button_changed_cb), object); + } + else if (type == G_TYPE_PARAM_ENUM) + { + guint i; + GEnumClass* enum_class = G_ENUM_CLASS ( + g_type_class_ref (pspec->value_type)); + gint value = katze_object_get_enum (object, property); + + widget = gtk_combo_box_new_text (); + for (i = 0; i < enum_class->n_values; i++) + { + const gchar* label = gettext (enum_class->values[i].value_nick); + gtk_combo_box_append_text (GTK_COMBO_BOX (widget), label); + } + gtk_combo_box_set_active (GTK_COMBO_BOX (widget), value); + g_signal_connect (widget, "changed", + G_CALLBACK (proxy_combo_box_changed_cb), object); + g_type_class_unref (enum_class); + } + else + widget = gtk_label_new (gettext (nick)); + g_free (string); + + gtk_widget_set_tooltip_text (widget, g_param_spec_get_blurb (pspec)); + gtk_widget_set_sensitive (widget, pspec->flags & G_PARAM_WRITABLE); + + g_object_set_data_full (G_OBJECT (widget), "property", + g_strdup (property), g_free); + + return widget; +} + +/** + * katze_property_label: + * @object: a #GObject + * @property: the name of a property + * + * Create a label widget displaying the name of the specified object's property. + * + * Return value: a new label widget + **/ +GtkWidget* +katze_property_label (gpointer object, + const gchar* property) +{ + GObjectClass* class; + GParamSpec* pspec; + const gchar* nick; + GtkWidget* widget; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + + class = G_OBJECT_GET_CLASS (object); + pspec = g_object_class_find_property (class, property); + if (!pspec) + { + g_warning (_("Property '%s' is invalid for %s"), + property, G_OBJECT_CLASS_NAME (class)); + return gtk_label_new (property); + } + nick = g_param_spec_get_nick (pspec); + widget = gtk_label_new (nick); + + return widget; +} + +typedef struct +{ + GtkWidget* widget; + KatzeMenuPos position; +} KatzePopupInfo; + +static void +katze_widget_popup_position_menu (GtkMenu* menu, + gint* x, + gint* y, + gboolean* push_in, + gpointer user_data) +{ + gint wx, wy; + gint menu_width; + GtkRequisition menu_req; + GtkRequisition widget_req; + KatzePopupInfo* info = user_data; + GtkWidget* widget = info->widget; + gint widget_height; + + /* Retrieve size and position of both widget and menu */ + if (GTK_WIDGET_NO_WINDOW (widget)) + { + gdk_window_get_position (widget->window, &wx, &wy); + wx += widget->allocation.x; + wy += widget->allocation.y; + } + else + gdk_window_get_origin (widget->window, &wx, &wy); + gtk_widget_size_request (GTK_WIDGET (menu), &menu_req); + gtk_widget_size_request (widget, &widget_req); + menu_width = menu_req.width; + widget_height = widget_req.height; /* Better than allocation.height */ + + /* Calculate menu position */ + if (info->position == KATZE_MENU_POSITION_CURSOR) + ; /* Do nothing? */ + else if (info->position == KATZE_MENU_POSITION_RIGHT) + { + *x = wx + widget->allocation.width - menu_width; + *y = wy + widget_height; + } else if (info->position == KATZE_MENU_POSITION_LEFT) + { + *x = wx; + *y = wy + widget_height; + } + + *push_in = TRUE; +} + +/** + * katze_widget_popup: + * @widget: a widget + * @menu: the menu to popup + * @event: a button event, or %NULL + * @pos: the preferred positioning + * + * Pops up the given menu relative to @widget. Use this + * instead of writing custom positioning functions. + * + * Return value: a new label widget + **/ +void +katze_widget_popup (GtkWidget* widget, + GtkMenu* menu, + GdkEventButton* event, + KatzeMenuPos pos) +{ + int button, event_time; + if (event) + { + button = event->button; + event_time = event->time; + } + else + { + button = 0; + event_time = gtk_get_current_event_time (); + } + + if (!gtk_menu_get_attach_widget (menu)) + gtk_menu_attach_to_widget (menu, widget, NULL); + + + if (widget) + { + KatzePopupInfo info = { widget, pos }; + gtk_menu_popup (menu, NULL, NULL, + katze_widget_popup_position_menu, &info, + button, event_time); + } + else + gtk_menu_popup (menu, NULL, NULL, NULL, NULL, button, event_time); +} + +/** + * katze_image_menu_item_new_ellipsized: + * @label: a label or %NULL + * + * Creates an image menu item where the label is + * reasonably ellipsized for you. + * + * Return value: a new label widget + **/ +GtkWidget* +katze_image_menu_item_new_ellipsized (const gchar* label) +{ + GtkWidget* menuitem; + GtkWidget* label_widget; + + menuitem = gtk_image_menu_item_new (); + label_widget = gtk_label_new (label); + /* FIXME: Should text direction be respected here? */ + gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.0); + gtk_label_set_max_width_chars (GTK_LABEL (label_widget), 50); + gtk_label_set_ellipsize (GTK_LABEL (label_widget), PANGO_ELLIPSIZE_MIDDLE); + gtk_widget_show (label_widget); + gtk_container_add (GTK_CONTAINER (menuitem), label_widget); + + return menuitem; +} + +/** + * katze_pixbuf_new_from_buffer: + * @buffer: Buffer with image data + * @length: Length of the buffer + * @mime_type: a MIME type, or %NULL + * @error: return location for a #GError, or %NULL + * + * Creates a new #GdkPixbuf out of the specified buffer. + * + * You can specify a MIME type if looking at the buffer + * is not enough to determine the right type. + * + * Return value: A newly-allocated #GdkPixbuf + **/ +GdkPixbuf* +katze_pixbuf_new_from_buffer (const guchar* buffer, + gsize length, + const gchar* mime_type, + GError** error) +{ + /* Proposed for inclusion in GdkPixbuf + See http://bugzilla.gnome.org/show_bug.cgi?id=74291 */ + GdkPixbufLoader* loader; + GdkPixbuf* pixbuf; + + g_return_val_if_fail (buffer != NULL, NULL); + g_return_val_if_fail (length > 0, NULL); + + if (mime_type) + { + loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error); + if (!loader) + return NULL; + } + else + loader = gdk_pixbuf_loader_new (); + if (!gdk_pixbuf_loader_write (loader, buffer, length, error)) + { + g_object_unref (loader); + return NULL; + } + if (!gdk_pixbuf_loader_close (loader, error)) + { + g_object_unref (loader); + return NULL; + } + + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + g_object_ref (pixbuf); + g_object_unref (loader); + return pixbuf; +} + +/** + * katze_tree_view_get_selected_iter: + * @treeview: a #GtkTreeView + * @model: a pointer to store the model, or %NULL + * @iter: a pointer to store the iter, or %NULL + * + * Determines whether there is a selection in @treeview + * and sets the @iter to the current selection. + * + * If there is a selection and @model is not %NULL, it is + * set to the model, mainly for convenience. + * + * Either @model or @iter or both can be %NULL in which case + * no value will be assigned in any case. + * + * Return value: %TRUE if there is a selection + * + * Since: 0.1.3 + **/ +gboolean +katze_tree_view_get_selected_iter (GtkTreeView* treeview, + GtkTreeModel** model, + GtkTreeIter* iter) +{ + GtkTreeSelection* selection; + + g_return_val_if_fail (GTK_IS_TREE_VIEW (treeview), FALSE); + + if ((selection = gtk_tree_view_get_selection (treeview))) + if (gtk_tree_selection_get_selected (selection, model, iter)) + return TRUE; + return FALSE; +} + +/** + * katze_object_has_property: + * @object: a #GObject + * @property: the name of the property + * + * Determine if @object has a property with the specified name. + * + * Return value: a boolean + * + * Since: 0.1.2 + **/ +gboolean +katze_object_has_property (gpointer object, + const gchar* property) +{ + GObjectClass* class; + + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + + class = G_OBJECT_GET_CLASS (object); + return g_object_class_find_property (class, property) != NULL; +} + +/** + * katze_object_get_boolean: + * @object: a #GObject + * @property: the name of the property to get + * + * Retrieve the boolean value of the specified property. + * + * Return value: a boolean + **/ +gboolean +katze_object_get_boolean (gpointer object, + const gchar* property) +{ + gboolean value = FALSE; + + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + /* FIXME: Check value type */ + + g_object_get (object, property, &value, NULL); + return value; +} + +/** + * katze_object_get_int: + * @object: a #GObject + * @property: the name of the property to get + * + * Retrieve the integer value of the specified property. + * + * Return value: an integer + **/ +gint +katze_object_get_int (gpointer object, + const gchar* property) +{ + gint value = -1; + + g_return_val_if_fail (G_IS_OBJECT (object), -1); + /* FIXME: Check value type */ + + g_object_get (object, property, &value, NULL); + return value; +} + +/** + * katze_object_get_float: + * @object: a #GObject + * @property: the name of the property to get + * + * Retrieve the float value of the specified property. + * + * Return value: a float + **/ +gfloat +katze_object_get_float (gpointer object, + const gchar* property) +{ + gfloat value = -1.0f; + + g_return_val_if_fail (G_IS_OBJECT (object), -1.0f); + /* FIXME: Check value type */ + + g_object_get (object, property, &value, NULL); + return value; +} + +/** + * katze_object_get_enum: + * @object: a #GObject + * @property: the name of the property to get + * + * Retrieve the enum value of the specified property. + * + * Return value: an enumeration + **/ +gint +katze_object_get_enum (gpointer object, + const gchar* property) +{ + gint value = -1; + + g_return_val_if_fail (G_IS_OBJECT (object), -1); + /* FIXME: Check value type */ + + g_object_get (object, property, &value, NULL); + return value; +} + +/** + * katze_object_get_string: + * @object: a #GObject + * @property: the name of the property to get + * + * Retrieve the string value of the specified property. + * + * Return value: a newly allocated string + **/ +gchar* +katze_object_get_string (gpointer object, + const gchar* property) +{ + gchar* value = NULL; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + /* FIXME: Check value type */ + + g_object_get (object, property, &value, NULL); + return value; +} + +/** + * katze_object_get_object: + * @object: a #GObject + * @property: the name of the property to get + * + * Retrieve the object value of the specified property. + * + * Return value: an object + **/ +gpointer +katze_object_get_object (gpointer object, + const gchar* property) +{ + GObject* value = NULL; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + /* FIXME: Check value type */ + + g_object_get (object, property, &value, NULL); + return value; +} diff --git a/katze/katze-utils.h b/katze/katze-utils.h new file mode 100644 index 00000000..f5f73b6c --- /dev/null +++ b/katze/katze-utils.h @@ -0,0 +1,122 @@ +/* + Copyright (C) 2007-2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_UTILS_H__ +#define __KATZE_UTILS_H__ + +#include + +G_BEGIN_DECLS + +/** + * KATZE_OBJECT_NAME: + * @object: an object + * + * Return the name of an object's class structure's type. + **/ +#define KATZE_OBJECT_NAME(object) \ + G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (object)) + +/** + * katze_assign: + * @lvalue: a pointer + * @rvalue: the new value + * + * Frees @lvalue if needed and assigns it the value of @rvalue. + **/ +#define katze_assign(lvalue, rvalue) \ + if (1) \ + { \ + g_free (lvalue); \ + lvalue = rvalue; \ + } + +/** + * katze_object_assign: + * @lvalue: a gobject + * @rvalue: the new value + * + * Unrefs @lvalue if needed and assigns it the value of @rvalue. + **/ +#define katze_object_assign(lvalue, rvalue) \ + if (1) \ + { \ + if (lvalue) \ + g_object_unref (lvalue); \ + lvalue = rvalue; \ + } + +GtkWidget* +katze_property_proxy (gpointer object, + const gchar* property, + const gchar* hint); + +GtkWidget* +katze_property_label (gpointer object, + const gchar* property); + +typedef enum { + KATZE_MENU_POSITION_CURSOR = 0, + KATZE_MENU_POSITION_LEFT, + KATZE_MENU_POSITION_RIGHT +} KatzeMenuPos; + +void +katze_widget_popup (GtkWidget* widget, + GtkMenu* menu, + GdkEventButton* event, + KatzeMenuPos pos); + +GtkWidget* +katze_image_menu_item_new_ellipsized (const gchar* label); + +GdkPixbuf* +katze_pixbuf_new_from_buffer (const guchar* buffer, + gsize length, + const gchar* mime_type, + GError** error); + +gboolean +katze_tree_view_get_selected_iter (GtkTreeView* treeview, + GtkTreeModel** model, + GtkTreeIter* iter); + +gboolean +katze_object_has_property (gpointer object, + const gchar* property); + +gint +katze_object_get_boolean (gpointer object, + const gchar* property); + +gint +katze_object_get_int (gpointer object, + const gchar* property); + +gfloat +katze_object_get_float (gpointer object, + const gchar* property); + +gint +katze_object_get_enum (gpointer object, + const gchar* property); + +gchar* +katze_object_get_string (gpointer object, + const gchar* property); + +gpointer +katze_object_get_object (gpointer object, + const gchar* property); + +G_END_DECLS + +#endif /* __KATZE_UTILS_H__ */ diff --git a/katze/katze.h b/katze/katze.h new file mode 100644 index 00000000..8dd286bf --- /dev/null +++ b/katze/katze.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __KATZE_H__ +#define __KATZE_H__ + +#include "katze-http-auth.h" +#include "katze-http-cookies.h" +#include "katze-throbber.h" +#include "katze-utils.h" +#include "katze-item.h" +#include "katze-array.h" +#include "katze-arrayaction.h" +#include "katze-separatoraction.h" +#include "katze-net.h" + +#endif /* __KATZE_H__ */ diff --git a/katze/marshal.list b/katze/marshal.list new file mode 100644 index 00000000..ce752891 --- /dev/null +++ b/katze/marshal.list @@ -0,0 +1 @@ +VOID:POINTER,INT diff --git a/katze/wscript_build b/katze/wscript_build new file mode 100644 index 00000000..9dbf09e3 --- /dev/null +++ b/katze/wscript_build @@ -0,0 +1,14 @@ +#! /usr/bin/env python +# WAF build script for midori +# This file is licensed under the terms of the expat license, see the file EXPAT. + +import platform + +obj = bld.new_task_gen ('cc', 'staticlib') +obj.name = 'katze' +obj.target = 'katze' +obj.includes = '. ../.' +obj.find_sources_in_dirs ('.') +obj.add_marshal_file ('marshal.list', 'katze_cclosure_marshal') +obj.uselib = 'M GMODULE LIBSOUP GTK LIBXML WEBKIT' +obj.install_path = None diff --git a/midori/compat.c b/midori/compat.c new file mode 100644 index 00000000..273935e4 --- /dev/null +++ b/midori/compat.c @@ -0,0 +1,67 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "compat.h" + +#include + +#if !GTK_CHECK_VERSION (2, 14, 0) + +gboolean +gtk_show_uri (GdkScreen* screen, + const gchar* uri, + guint32 timestamp, + GError** error) +{ + g_return_val_if_fail (uri != NULL, FALSE); + + return g_app_info_launch_default_for_uri (uri, NULL, NULL); +} + +#endif + +#if !GTK_CHECK_VERSION(2, 12, 0) + +void +gtk_widget_set_has_tooltip (GtkWidget* widget, + gboolean has_tooltip) +{ + /* Do nothing */ +} + +void +gtk_widget_set_tooltip_text (GtkWidget* widget, + const gchar* text) +{ + if (text && *text) + { + static GtkTooltips* tooltips = NULL; + if (G_UNLIKELY (!tooltips)) + tooltips = gtk_tooltips_new (); + gtk_tooltips_set_tip (tooltips, widget, text, NULL); + } +} + +void +gtk_tool_item_set_tooltip_text (GtkToolItem* toolitem, + const gchar* text) +{ + if (text && *text) + { + static GtkTooltips* tooltips = NULL; + if (G_UNLIKELY (!tooltips)) + tooltips = gtk_tooltips_new (); + + gtk_tool_item_set_tooltip (toolitem, tooltips, text, NULL); + } +} + +#endif diff --git a/midori/compat.h b/midori/compat.h new file mode 100644 index 00000000..b7df7047 --- /dev/null +++ b/midori/compat.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __COMPAT_H__ +#define __COMPAT_H__ + +#if HAVE_CONFIG_H + #include +#endif + +#include + +G_BEGIN_DECLS + +#if !GLIB_CHECK_VERSION (2, 14, 0) + #define G_PARAM_STATIC_STRINGS \ + (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB) +#endif + +#if !GTK_CHECK_VERSION (2, 14, 0) + +gboolean +gtk_show_uri (GdkScreen* screen, + const gchar* uri, + guint32 timestamp, + GError** error); + +#endif + +#if !GTK_CHECK_VERSION(2, 12, 0) + +void +gtk_widget_set_has_tooltip (GtkWidget* widget, + gboolean has_tooltip); + +void +gtk_widget_set_tooltip_text (GtkWidget* widget, + const gchar* text); + +void +gtk_tool_item_set_tooltip_text (GtkToolItem* toolitem, + const gchar* text); + +#endif + +G_END_DECLS + +#endif /* __COMPAT_H__ */ diff --git a/midori/gtkiconentry.c b/midori/gtkiconentry.c new file mode 100644 index 00000000..51740ab0 --- /dev/null +++ b/midori/gtkiconentry.c @@ -0,0 +1,1608 @@ +/* + * Copyright (C) 2004-2006 Christian Hammond. + * Copyright (C) 2008 Cody Russell + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "gtkiconentry.h" + +#if GTK_CHECK_VERSION (2, 16, 0) + +void +gtk_icon_entry_set_icon_from_pixbuf (GtkEntry* entry, + GtkEntryIconPosition position, + GdkPixbuf* pixbuf) +{ + /* Without this ugly hack pixbuf icons don't work */ + if (pixbuf) + { + gtk_widget_hide (GTK_WIDGET (entry)); + gtk_entry_set_icon_from_pixbuf (entry, position, pixbuf); + gtk_widget_show (GTK_WIDGET (entry)); + } +} + +#else + +#include + +#if GTK_CHECK_VERSION (2, 14, 0) +#define _GTK_IMAGE_GICON GTK_IMAGE_GICON +#else +#define _GTK_IMAGE_GICON 8 +#endif + +#ifndef GTK_PARAM_READABLE +#define GTK_PARAM_READABLE G_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB +#endif + +#ifndef GTK_PARAM_WRITABLE +#define GTK_PARAM_WRITABLE G_PARAM_WRITABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB +#endif + +#ifndef GTK_PARAM_READWRITE +#define GTK_PARAM_READWRITE G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB +#endif + +#define P_(s) (s) + +#define ICON_MARGIN 2 +#define MAX_ICONS 2 + +#define IS_VALID_ICON_ENTRY_POSITION(pos) \ + ((pos) == GTK_ICON_ENTRY_PRIMARY || \ + (pos) == GTK_ICON_ENTRY_SECONDARY) + +#define GTK_ICON_ENTRY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_ICON_ENTRY, GtkIconEntryPrivate)) + +typedef struct +{ + GdkPixbuf *pixbuf; + gboolean highlight; + gboolean hovered; + GdkWindow *window; + gchar *tooltip_text; + GdkCursorType cursor_type; + gboolean custom_cursor; + GtkImageType storage_type; + GIcon *gicon; + gchar *icon_name; + gboolean insensitive; +} EntryIconInfo; + +typedef struct _GtkIconEntryPrivate +{ + EntryIconInfo icons[MAX_ICONS]; + + gulong icon_released_id; +} GtkIconEntryPrivate; + +enum +{ + ICON_PRESSED, + ICON_RELEASED, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_PIXBUF_PRIMARY, + PROP_PIXBUF_SECONDARY, + PROP_STOCK_PRIMARY, + PROP_STOCK_SECONDARY, + PROP_ICON_NAME_PRIMARY, + PROP_ICON_NAME_SECONDARY, + PROP_GICON_PRIMARY, + PROP_GICON_SECONDARY, + PROP_SENSITIVITY_PRIMARY, + PROP_SENSITIVITY_SECONDARY +}; + +static void gtk_icon_entry_editable_init (GtkEditableClass *iface); +static void gtk_icon_entry_finalize (GObject *obj); +static void gtk_icon_entry_dispose (GObject *obj); +static void gtk_icon_entry_map (GtkWidget *widget); +static void gtk_icon_entry_unmap (GtkWidget *widget); +static void gtk_icon_entry_realize (GtkWidget *widget); +static void gtk_icon_entry_unrealize (GtkWidget *widget); +static void gtk_icon_entry_size_request (GtkWidget *widget, + GtkRequisition *requisition); +static void gtk_icon_entry_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); +static gint gtk_icon_entry_expose (GtkWidget *widget, + GdkEventExpose *event); +static gint gtk_icon_entry_enter_notify (GtkWidget *widget, + GdkEventCrossing *event); +static gint gtk_icon_entry_leave_notify (GtkWidget *widget, + GdkEventCrossing *event); +static gint gtk_icon_entry_button_press (GtkWidget *widget, + GdkEventButton *event); +static gint gtk_icon_entry_button_release (GtkWidget *widget, + GdkEventButton *event); +static void gtk_icon_entry_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gtk_icon_entry_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void gtk_icon_entry_style_set (GtkWidget *widget, + GtkStyle *prev_style); +static void gtk_icon_entry_set_icon_internal (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GdkPixbuf *pixbuf); +static void icon_theme_changed (GtkIconEntry *entry); + + +static GtkEntryClass *parent_class = NULL; +static guint signals[LAST_SIGNAL] = {0}; + +G_DEFINE_TYPE_EXTENDED (GtkIconEntry, gtk_icon_entry, GTK_TYPE_ENTRY, + 0, + G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, + gtk_icon_entry_editable_init)); + +static void +gtk_icon_entry_class_init (GtkIconEntryClass *klass) +{ + GObjectClass *gobject_class; + GtkObjectClass *object_class; + GtkWidgetClass *widget_class; + GtkEntryClass *entry_class; + + parent_class = g_type_class_peek_parent(klass); + + gobject_class = G_OBJECT_CLASS(klass); + object_class = GTK_OBJECT_CLASS(klass); + widget_class = GTK_WIDGET_CLASS(klass); + entry_class = GTK_ENTRY_CLASS(klass); + + gobject_class->finalize = gtk_icon_entry_finalize; + gobject_class->dispose = gtk_icon_entry_dispose; + gobject_class->set_property = gtk_icon_entry_set_property; + gobject_class->get_property = gtk_icon_entry_get_property; + + widget_class->map = gtk_icon_entry_map; + widget_class->unmap = gtk_icon_entry_unmap; + widget_class->realize = gtk_icon_entry_realize; + widget_class->unrealize = gtk_icon_entry_unrealize; + widget_class->size_request = gtk_icon_entry_size_request; + widget_class->size_allocate = gtk_icon_entry_size_allocate; + widget_class->expose_event = gtk_icon_entry_expose; + widget_class->enter_notify_event = gtk_icon_entry_enter_notify; + widget_class->leave_notify_event = gtk_icon_entry_leave_notify; + widget_class->button_press_event = gtk_icon_entry_button_press; + widget_class->button_release_event = gtk_icon_entry_button_release; + widget_class->style_set = gtk_icon_entry_style_set; + + /** + * GtkIconEntry::icon-pressed: + * @entry: The entry on which the signal is emitted. + * @icon_pos: The position of the clicked icon. + * @button: The mouse button clicked. + * + * The ::icon-pressed signal is emitted when an icon is clicked. + */ + if (!(signals[ICON_PRESSED] = g_signal_lookup ("icon-pressed", GTK_TYPE_ENTRY))) + signals[ICON_PRESSED] = + g_signal_new ("icon-pressed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GtkIconEntryClass, icon_pressed), + NULL, NULL, + gtk_marshal_VOID__INT_INT, + G_TYPE_NONE, 2, + G_TYPE_INT, + G_TYPE_INT); + + /** + * GtkIconEntry::icon-release: + * @entry: The entry on which the signal is emitted. + * @icon_pos: The position of the clicked icon. + * @button: The mouse button clicked. + * + * The ::icon-release signal is emitted on the button release from a + * mouse click. + */ + if (!(signals[ICON_RELEASED] = g_signal_lookup ("icon-release", GTK_TYPE_ENTRY))) + signals[ICON_RELEASED] = + g_signal_new ("icon-release", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GtkIconEntryClass, icon_released), + NULL, NULL, + gtk_marshal_VOID__INT_INT, + G_TYPE_NONE, 2, + G_TYPE_INT, + G_TYPE_INT); + + /** + * GtkIconEntry:pixbuf-primary: + * + * An image to use as the primary icon for the entry. + */ + g_object_class_install_property (gobject_class, + PROP_PIXBUF_PRIMARY, + g_param_spec_object ("pixbuf-primary", + P_("Primary pixbuf"), + P_("Primary pixbuf for the entry"), + GDK_TYPE_PIXBUF, + GTK_PARAM_READWRITE)); + + /** + * GtkIconEntry:pixbuf-secondary: + * + * An image to use as the secondary icon for the entry. + */ + g_object_class_install_property (gobject_class, + PROP_PIXBUF_SECONDARY, + g_param_spec_object ("pixbuf-secondary", + P_("Secondary pixbuf"), + P_("Secondary pixbuf for the entry"), + GDK_TYPE_PIXBUF, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_STOCK_PRIMARY, + g_param_spec_string ("stock-primary", + P_("Primary stock ID"), + P_("Stock ID for primary icon"), + NULL, + GTK_PARAM_WRITABLE)); + + g_object_class_install_property (gobject_class, + PROP_STOCK_SECONDARY, + g_param_spec_string ("stock-secondary", + P_("Secondary stock ID"), + P_("Stock ID for secondary icon"), + NULL, + GTK_PARAM_WRITABLE)); + + g_object_class_install_property (gobject_class, + PROP_ICON_NAME_PRIMARY, + g_param_spec_string ("icon-name-primary", + P_("Primary icon name"), + P_("Icon name for primary icon"), + NULL, + GTK_PARAM_WRITABLE)); + + g_object_class_install_property (gobject_class, + PROP_ICON_NAME_SECONDARY, + g_param_spec_string ("icon-name-secondary", + P_("Secondary icon name"), + P_("Icon name for secondary icon"), + NULL, + GTK_PARAM_WRITABLE)); + + g_object_class_install_property (gobject_class, + PROP_GICON_PRIMARY, + g_param_spec_object ("gicon-primary", + P_("Primary GIcon"), + P_("GIcon for primary icon"), + G_TYPE_ICON, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_GICON_SECONDARY, + g_param_spec_object ("gicon-secondary", + P_("Secondary GIcon"), + P_("GIcon for secondary icon"), + G_TYPE_ICON, + GTK_PARAM_READWRITE)); + + g_type_class_add_private (klass, sizeof (GtkIconEntryPrivate)); +} + +static void +gtk_icon_entry_editable_init (GtkEditableClass *iface) +{ +}; + +static void +gtk_icon_entry_init (GtkIconEntry *entry) +{ +} + +static void +gtk_icon_entry_finalize (GObject *obj) +{ + GtkIconEntry *entry; + + g_return_if_fail (obj != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY(obj)); + + entry = GTK_ICON_ENTRY (obj); + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +gtk_icon_entry_dispose (GObject *obj) +{ + GtkIconEntry *entry; + + entry = GTK_ICON_ENTRY (obj); + + gtk_icon_entry_set_icon_from_pixbuf (entry, GTK_ICON_ENTRY_PRIMARY, NULL); + gtk_icon_entry_set_icon_from_pixbuf (entry, GTK_ICON_ENTRY_SECONDARY, NULL); + + G_OBJECT_CLASS (parent_class)->dispose (obj); +} + +static void +gtk_icon_entry_map (GtkWidget *widget) +{ + GtkIconEntryPrivate *priv; + GdkCursor *cursor; + + if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget)) + { + int i; + + GTK_WIDGET_CLASS (parent_class)->map (widget); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (widget); + + for (i = 0; i < MAX_ICONS; i++) + { + if (priv->icons[i].pixbuf != NULL) + gdk_window_show (priv->icons[i].window); + + if (priv->icons[i].custom_cursor == TRUE && !priv->icons[i].insensitive) + { + cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), + priv->icons[i].cursor_type); + + gdk_window_set_cursor (priv->icons[i].window, cursor); + gdk_cursor_unref (cursor); + } + } + + GTK_WIDGET_CLASS (parent_class)->map (widget); + } +} + +static void +gtk_icon_entry_unmap (GtkWidget *widget) +{ + GtkIconEntryPrivate *priv; + + if (GTK_WIDGET_MAPPED (widget)) + { + int i; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (widget); + + for (i = 0; i < MAX_ICONS; i++) + { + if (priv->icons[i].pixbuf != NULL) + { + gdk_window_hide (priv->icons[i].window); + } + } + + GTK_WIDGET_CLASS (parent_class)->unmap (widget); + } +} + +static void +gtk_icon_entry_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkIconEntry *entry = GTK_ICON_ENTRY (object); + + switch (prop_id) + { + case PROP_PIXBUF_PRIMARY: + gtk_icon_entry_set_icon_from_pixbuf (entry, + GTK_ICON_ENTRY_PRIMARY, + g_value_get_object (value)); + break; + + case PROP_PIXBUF_SECONDARY: + gtk_icon_entry_set_icon_from_pixbuf (entry, + GTK_ICON_ENTRY_SECONDARY, + g_value_get_object (value)); + break; + + case PROP_STOCK_PRIMARY: + gtk_icon_entry_set_icon_from_stock (entry, + GTK_ICON_ENTRY_PRIMARY, + g_value_get_string (value)); + break; + + case PROP_STOCK_SECONDARY: + gtk_icon_entry_set_icon_from_stock (entry, + GTK_ICON_ENTRY_SECONDARY, + g_value_get_string (value)); + break; + + case PROP_ICON_NAME_PRIMARY: + gtk_icon_entry_set_icon_from_icon_name (entry, + GTK_ICON_ENTRY_PRIMARY, + g_value_get_string (value)); + break; + + case PROP_ICON_NAME_SECONDARY: + gtk_icon_entry_set_icon_from_icon_name (entry, + GTK_ICON_ENTRY_SECONDARY, + g_value_get_string (value)); + break; + + case PROP_GICON_PRIMARY: + gtk_icon_entry_set_icon_from_gicon (entry, + GTK_ICON_ENTRY_PRIMARY, + g_value_get_object (value)); + break; + + case PROP_GICON_SECONDARY: + gtk_icon_entry_set_icon_from_gicon (entry, + GTK_ICON_ENTRY_SECONDARY, + g_value_get_object (value)); + break; + } +} + +static void +gtk_icon_entry_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkIconEntry *entry = GTK_ICON_ENTRY (object); + + switch (prop_id) + { + case PROP_PIXBUF_PRIMARY: + g_value_set_object (value, + gtk_icon_entry_get_pixbuf (entry, + GTK_ICON_ENTRY_PRIMARY)); + break; + + case PROP_PIXBUF_SECONDARY: + g_value_set_object (value, + gtk_icon_entry_get_pixbuf (entry, + GTK_ICON_ENTRY_SECONDARY)); + break; + + case PROP_GICON_PRIMARY: + g_value_set_object (value, + gtk_icon_entry_get_gicon (entry, + GTK_ICON_ENTRY_PRIMARY)); + break; + + case PROP_GICON_SECONDARY: + g_value_set_object (value, + gtk_icon_entry_get_gicon (entry, + GTK_ICON_ENTRY_SECONDARY)); + } +} + +static gint +get_icon_width (GtkIconEntry *entry, GtkIconEntryPosition icon_pos) +{ + gint menu_icon_width; + gint width; + GtkIconEntryPrivate *priv; + EntryIconInfo *icon_info; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + if (icon_info->pixbuf == NULL) + return 0; + + gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &menu_icon_width, NULL); + + width = MAX (gdk_pixbuf_get_width (icon_info->pixbuf), menu_icon_width); + + return width; +} + +static void +get_borders (GtkIconEntry *entry, gint *xborder, gint *yborder) +{ + GtkWidget *widget = GTK_WIDGET (entry); + gint focus_width; + gboolean interior_focus; + + gtk_widget_style_get (widget, + "interior-focus", &interior_focus, + "focus-line-width", &focus_width, + NULL); + + if (gtk_entry_get_has_frame (GTK_ENTRY (entry))) + { + *xborder = widget->style->xthickness; + *yborder = widget->style->ythickness; + } + else + { + *xborder = 0; + *yborder = 0; + } + + if (!interior_focus) + { + *xborder += focus_width; + *yborder += focus_width; + } +} + +static void +get_text_area_size (GtkIconEntry *entry, GtkAllocation *alloc) +{ + GtkWidget *widget = GTK_WIDGET (entry); + GtkRequisition requisition; + gint xborder, yborder; + + gtk_widget_get_child_requisition (widget, &requisition); + get_borders (entry, &xborder, &yborder); + + alloc->x = xborder; + alloc->y = yborder; + alloc->width = widget->allocation.width - xborder * 2; + alloc->height = requisition.height - yborder * 2; +} + +static void +get_icon_allocation (GtkIconEntry *icon_entry, + gboolean left, + GtkAllocation *widget_alloc, + GtkAllocation *text_area_alloc, + GtkAllocation *allocation, + GtkIconEntryPosition *icon_pos) +{ + gboolean rtl; + + rtl = (gtk_widget_get_direction (GTK_WIDGET (icon_entry)) == + GTK_TEXT_DIR_RTL); + + if (left) + *icon_pos = (rtl ? GTK_ICON_ENTRY_SECONDARY : GTK_ICON_ENTRY_PRIMARY); + else + *icon_pos = (rtl ? GTK_ICON_ENTRY_PRIMARY : GTK_ICON_ENTRY_SECONDARY); + + allocation->y = text_area_alloc->y; + allocation->width = get_icon_width(icon_entry, *icon_pos); + allocation->height = text_area_alloc->height; + + if (left) + { + allocation->x = text_area_alloc->x + ICON_MARGIN; + } + else + { + allocation->x = text_area_alloc->x + text_area_alloc->width - + allocation->width - ICON_MARGIN; + } +} + +static void +gtk_icon_entry_realize (GtkWidget *widget) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + GdkWindowAttr attributes; + gint attributes_mask; + int i; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + GTK_WIDGET_CLASS (parent_class)->realize (widget); + + attributes.x = 0; + attributes.y = 0; + attributes.width = 1; + attributes.height = 1; + attributes.window_type = GDK_WINDOW_CHILD; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget); + attributes.event_mask |= + (GDK_EXPOSURE_MASK + | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + + for (i = 0; i < MAX_ICONS; i++) + { + EntryIconInfo *icon_info; + + icon_info = &priv->icons[i]; + icon_info->window = gdk_window_new (widget->window, &attributes, + attributes_mask); + gdk_window_set_user_data (icon_info->window, widget); + + gdk_window_set_background (icon_info->window, + &widget->style->base[GTK_WIDGET_STATE(widget)]); + } + + gtk_widget_queue_resize (widget); +} + +static void +gtk_icon_entry_unrealize (GtkWidget *widget) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + int i; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); + + for (i = 0; i < MAX_ICONS; i++) + { + EntryIconInfo *icon_info = &priv->icons[i]; + + gdk_window_destroy (icon_info->window); + icon_info->window = NULL; + } +} + +static void +gtk_icon_entry_size_request (GtkWidget *widget, GtkRequisition *requisition) +{ + GtkEntry *gtkentry; + GtkIconEntry *entry; + gint icon_widths = 0; + int i; + + gtkentry = GTK_ENTRY(widget); + entry = GTK_ICON_ENTRY(widget); + + for (i = 0; i < MAX_ICONS; i++) + { + int icon_width = get_icon_width (entry, i); + + if (icon_width > 0) + { + icon_widths += icon_width + ICON_MARGIN; + } + } + + GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition); + + if (icon_widths > requisition->width) + requisition->width += icon_widths; +} + +static void +place_windows (GtkIconEntry *icon_entry, GtkAllocation *widget_alloc) +{ + GtkIconEntryPosition left_icon_pos; + GtkIconEntryPosition right_icon_pos; + GtkAllocation left_icon_alloc; + GtkAllocation right_icon_alloc; + GtkAllocation text_area_alloc; + GtkIconEntryPrivate *priv; + gint y; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (icon_entry); + + get_text_area_size (icon_entry, &text_area_alloc); + + /* DJW center text/icon + * TODO flicker needs to be eliminated + */ + gdk_window_get_geometry (GTK_ENTRY (icon_entry)->text_area, NULL, &y, NULL, NULL, NULL); + text_area_alloc.y = y; + + get_icon_allocation (icon_entry, TRUE, widget_alloc, &text_area_alloc, + &left_icon_alloc, &left_icon_pos); + get_icon_allocation (icon_entry, FALSE, widget_alloc, &text_area_alloc, + &right_icon_alloc, &right_icon_pos); + + if (left_icon_alloc.width > 0) + { + text_area_alloc.x = left_icon_alloc.x + left_icon_alloc.width + ICON_MARGIN; + } + + if (right_icon_alloc.width > 0) + { + text_area_alloc.width -= right_icon_alloc.width + ICON_MARGIN; + } + + text_area_alloc.width -= text_area_alloc.x; + + gdk_window_move_resize (priv->icons[left_icon_pos].window, + left_icon_alloc.x, left_icon_alloc.y, + left_icon_alloc.width, left_icon_alloc.height); + + gdk_window_move_resize (priv->icons[right_icon_pos].window, + right_icon_alloc.x, right_icon_alloc.y, + right_icon_alloc.width, right_icon_alloc.height); + + gdk_window_move_resize (GTK_ENTRY (icon_entry)->text_area, + text_area_alloc.x, text_area_alloc.y, + text_area_alloc.width, text_area_alloc.height); +} + +static void +gtk_icon_entry_size_allocate (GtkWidget *widget, GtkAllocation *allocation) +{ + g_return_if_fail (GTK_IS_ICON_ENTRY(widget)); + g_return_if_fail (allocation != NULL); + + widget->allocation = *allocation; + + GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation); + + if (GTK_WIDGET_REALIZED (widget)) + place_windows (GTK_ICON_ENTRY (widget), allocation); +} + +static GdkPixbuf * +get_pixbuf_from_icon (GtkIconEntry *entry, GtkIconEntryPosition icon_pos) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + g_object_ref (icon_info->pixbuf); + + return icon_info->pixbuf; +} + +/* Kudos to the gnome-panel guys. */ +static void +colorshift_pixbuf (GdkPixbuf *dest, GdkPixbuf *src, int shift) +{ + gint i, j; + gint width, height, has_alpha, src_rowstride, dest_rowstride; + guchar *target_pixels; + guchar *original_pixels; + guchar *pix_src; + guchar *pix_dest; + int val; + guchar r, g, b; + + has_alpha = gdk_pixbuf_get_has_alpha (src); + width = gdk_pixbuf_get_width (src); + height = gdk_pixbuf_get_height (src); + src_rowstride = gdk_pixbuf_get_rowstride (src); + dest_rowstride = gdk_pixbuf_get_rowstride (dest); + original_pixels = gdk_pixbuf_get_pixels (src); + target_pixels = gdk_pixbuf_get_pixels (dest); + + for (i = 0; i < height; i++) + { + pix_dest = target_pixels + i * dest_rowstride; + pix_src = original_pixels + i * src_rowstride; + + for (j = 0; j < width; j++) + { + r = *(pix_src++); + g = *(pix_src++); + b = *(pix_src++); + + val = r + shift; + *(pix_dest++) = CLAMP(val, 0, 255); + + val = g + shift; + *(pix_dest++) = CLAMP(val, 0, 255); + + val = b + shift; + *(pix_dest++) = CLAMP(val, 0, 255); + + if (has_alpha) + *(pix_dest++) = *(pix_src++); + } + } +} + +static void +draw_icon (GtkWidget *widget, GtkIconEntryPosition icon_pos) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + EntryIconInfo *icon_info; + GdkPixbuf *pixbuf; + gint x, y, width, height; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + if (icon_info->pixbuf == NULL || !GTK_WIDGET_REALIZED (widget)) + return; + + if ((pixbuf = get_pixbuf_from_icon (entry, icon_pos)) == NULL) + return; + + gdk_drawable_get_size (icon_info->window, &width, &height); + + if (width == 1 || height == 1) + { + /* + * size_allocate hasn't been called yet. These are the default values. + */ + return; + } + + if (gdk_pixbuf_get_height (pixbuf) > height) + { + GdkPixbuf *temp_pixbuf; + int scale; + + scale = height - (2 * ICON_MARGIN); + + temp_pixbuf = gdk_pixbuf_scale_simple (pixbuf, scale, scale, + GDK_INTERP_BILINEAR); + + g_object_unref (pixbuf); + + pixbuf = temp_pixbuf; + } + + x = (width - gdk_pixbuf_get_width(pixbuf)) / 2; + y = (height - gdk_pixbuf_get_height(pixbuf)) / 2; + + if (icon_info->insensitive) + { + GdkPixbuf *temp_pixbuf; + + temp_pixbuf = gdk_pixbuf_copy (pixbuf); + + gdk_pixbuf_saturate_and_pixelate (pixbuf, + temp_pixbuf, + 0.8f, + TRUE); + g_object_unref (pixbuf); + pixbuf = temp_pixbuf; + } + else if (icon_info->hovered) + { + GdkPixbuf *temp_pixbuf; + + temp_pixbuf = gdk_pixbuf_copy (pixbuf); + + colorshift_pixbuf (temp_pixbuf, pixbuf, 30); + + g_object_unref (pixbuf); + + pixbuf = temp_pixbuf; + } + + gdk_draw_pixbuf (icon_info->window, widget->style->black_gc, pixbuf, + 0, 0, x, y, -1, -1, + GDK_RGB_DITHER_NORMAL, 0, 0); + + g_object_unref (pixbuf); +} + +static gint +gtk_icon_entry_expose (GtkWidget *widget, GdkEventExpose *event) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + + g_return_val_if_fail (GTK_IS_ICON_ENTRY (widget), FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + if (GTK_WIDGET_DRAWABLE (widget)) + { + gboolean found = FALSE; + int i; + + for (i = 0; i < MAX_ICONS && !found; i++) + { + EntryIconInfo *icon_info = &priv->icons[i]; + + if (event->window == icon_info->window) + { + gint width; + GtkAllocation text_area_alloc; + + get_text_area_size (entry, &text_area_alloc); + gdk_drawable_get_size (icon_info->window, &width, NULL); + + gtk_paint_flat_box (widget->style, icon_info->window, + GTK_WIDGET_STATE (widget), GTK_SHADOW_NONE, + NULL, widget, "entry_bg", + 0, 0, width, text_area_alloc.height); + + draw_icon (widget, i); + + found = TRUE; + } + } + + if (!found) + GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); + } + + return FALSE; +} + +static gint +gtk_icon_entry_enter_notify (GtkWidget *widget, GdkEventCrossing *event) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + int i; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + for (i = 0; i < MAX_ICONS; i++) + { + if (event->window == priv->icons[i].window) + { + if (gtk_icon_entry_get_icon_highlight (entry, i)) + { + priv->icons[i].hovered = TRUE; + + if (priv->icons[i].tooltip_text != NULL) + { + gtk_widget_set_tooltip_text (widget, + priv->icons[i].tooltip_text); + gtk_widget_set_has_tooltip (widget, TRUE); + } else { + gtk_widget_set_has_tooltip (widget, FALSE); + } + + gtk_widget_queue_draw (widget); + + break; + } + } + } + + return FALSE; +} + +static gint +gtk_icon_entry_leave_notify (GtkWidget *widget, GdkEventCrossing *event) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + int i; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + for (i = 0; i < MAX_ICONS; i++) + { + if (event->window == priv->icons[i].window) + { + if (gtk_icon_entry_get_icon_highlight (entry, i)) + { + priv->icons[i].hovered = FALSE; + + gtk_widget_set_has_tooltip (widget, FALSE); + gtk_widget_queue_draw (widget); + + break; + } + } + } + + return FALSE; +} + +static gint +gtk_icon_entry_button_press (GtkWidget *widget, GdkEventButton *event) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + int i; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + for (i = 0; i < MAX_ICONS; i++) + { + if (event->window == priv->icons[i].window) + { + if (event->button == 1 && gtk_icon_entry_get_icon_highlight (entry, i)) + { + priv->icons[i].hovered = FALSE; + + gtk_widget_queue_draw (widget); + } + + g_signal_emit (entry, signals[ICON_PRESSED], 0, i, event->button); + + return TRUE; + } + } + + if (GTK_WIDGET_CLASS (parent_class)->button_press_event) + return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event); + + return FALSE; +} + +static gint +gtk_icon_entry_button_release (GtkWidget *widget, GdkEventButton *event) +{ + GtkIconEntry *entry; + GtkIconEntryPrivate *priv; + int i; + + entry = GTK_ICON_ENTRY (widget); + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + for (i = 0; i < MAX_ICONS; i++) + { + GdkWindow *icon_window = priv->icons[i].window; + + if (event->window == icon_window) + { + int width, height; + gdk_drawable_get_size (icon_window, &width, &height); + + if (event->button == 1 && + gtk_icon_entry_get_icon_highlight (entry, i) && + event->x >= 0 && event->y >= 0 && + event->x <= width && event->y <= height) + { + priv->icons[i].hovered = TRUE; + + gtk_widget_queue_draw (widget); + } + + g_signal_emit (entry, signals[ICON_RELEASED], 0, i, event->button); + + return TRUE; + } + } + + if (GTK_WIDGET_CLASS (parent_class)->button_release_event) + return GTK_WIDGET_CLASS (parent_class)->button_release_event (widget, event); + + return FALSE; +} + +static void +gtk_icon_entry_style_set (GtkWidget *widget, GtkStyle *prev_style) +{ + GtkIconEntry *icon_entry; + + icon_entry = GTK_ICON_ENTRY (widget); + + if (GTK_WIDGET_CLASS (gtk_icon_entry_parent_class)->style_set) + GTK_WIDGET_CLASS (gtk_icon_entry_parent_class)->style_set (widget, prev_style); + + icon_theme_changed (icon_entry); +} + +static void +icon_theme_changed (GtkIconEntry *entry) +{ + GtkIconEntryPrivate *priv; + int i; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + for (i = 0; i < MAX_ICONS; i++) + { + if (priv->icons[i].storage_type == GTK_IMAGE_ICON_NAME) + { + g_object_unref (priv->icons[i].pixbuf); + priv->icons[i].pixbuf = NULL; + + gtk_icon_entry_set_icon_from_icon_name (entry, i, priv->icons[i].icon_name); + } + + #if GLIB_CHECK_VERSION (2, 16, 0) + else if (priv->icons[i].storage_type == _GTK_IMAGE_GICON) + { + g_object_unref (priv->icons[i].pixbuf); + priv->icons[i].pixbuf = NULL; + + gtk_icon_entry_set_icon_from_gicon (entry, i, priv->icons[i].gicon); + } + #endif + } + + gtk_widget_queue_draw (GTK_WIDGET (entry)); +} + +static void +gtk_icon_entry_set_icon_internal (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GdkPixbuf *pixbuf) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + + g_return_if_fail (entry != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY (entry)); + g_return_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos)); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + if (pixbuf == icon_info->pixbuf) + return; + + if (icon_pos == GTK_ICON_ENTRY_SECONDARY && + priv->icon_released_id != 0) + { + g_signal_handler_disconnect (entry, priv->icon_released_id); + priv->icon_released_id = 0; + } + + if (pixbuf == NULL) + { + if (icon_info->pixbuf != NULL) + { + g_object_unref (icon_info->pixbuf); + icon_info->pixbuf = NULL; + + /* Explicitly check, as the pointer may become invalidated + * during destruction. + */ + if (icon_info->window != NULL && GDK_IS_WINDOW (icon_info->window)) + gdk_window_hide (icon_info->window); + } + } + else + { + if (icon_info->window != NULL && icon_info->pixbuf == NULL) + gdk_window_show (icon_info->window); + + icon_info->pixbuf = pixbuf; + g_object_ref (pixbuf); + } + + gtk_widget_queue_draw (GTK_WIDGET (entry)); +} + +/** + * gtk_icon_entry_new + * + * Creates a new GtkIconEntry widget. + * + * Returns a new #GtkIconEntry. + */ +GtkWidget * +gtk_icon_entry_new (void) +{ + return GTK_WIDGET (g_object_new (GTK_TYPE_ICON_ENTRY, NULL)); +} + +/** + * gtk_icon_entry_set_icon_from_pixbuf + * @entry: A #GtkIconEntry. + * @position: Icon position. + * @pixbuf: A #GdkPixbuf. + * + * Sets the icon shown in the specified position using a pixbuf. + */ +void +gtk_icon_entry_set_icon_from_pixbuf (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GdkPixbuf *pixbuf) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + + g_return_if_fail (entry != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY (entry)); + g_return_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos)); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + if (pixbuf == icon_info->pixbuf) + return; + + if (icon_pos == GTK_ICON_ENTRY_SECONDARY && + priv->icon_released_id != 0) + { + g_signal_handler_disconnect (entry, priv->icon_released_id); + priv->icon_released_id = 0; + } + + if (pixbuf == NULL) + { + if (icon_info->pixbuf != NULL) + { + g_object_unref (icon_info->pixbuf); + icon_info->pixbuf = NULL; + + /* Explicitly check, as the pointer may become invalidated + * during destruction. + */ + if (icon_info->window != NULL && GDK_IS_WINDOW (icon_info->window)) + gdk_window_hide (icon_info->window); + } + } + else + { + if (icon_info->window != NULL && icon_info->pixbuf == NULL) + gdk_window_show (icon_info->window); + + icon_info->pixbuf = pixbuf; + g_object_ref (pixbuf); + } + + gtk_widget_queue_draw (GTK_WIDGET (entry)); +} + +/** + * gtk_icon_entry_set_icon_from_stock + * @entry: A #GtkIconEntry. + * @position: Icon position. + * @stock_id: The name of the stock item. + * + * Sets the icon shown in the entry at the specified position from a stock image. + */ +void +gtk_icon_entry_set_icon_from_stock (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + const gchar *stock_id) +{ + GdkPixbuf *pixbuf; + + pixbuf = gtk_widget_render_icon (GTK_WIDGET (entry), + stock_id, + GTK_ICON_SIZE_MENU, + NULL); + + gtk_icon_entry_set_icon_internal (entry, + icon_pos, + pixbuf); +} + +/** + * gtk_icon_entry_set_icon_from_icon_name + * @entry: A #GtkIconEntry; + * @icon_pos: The position at which to set the icon + * @icon_name: An icon name + * + * Sets the icon shown in the entry at the specified position from the current + * icon theme. If the icon name isn't known, a "broken image" icon will be + * displayed instead. If the current icon theme is changed, the icon will be + * updated appropriately. + */ +void +gtk_icon_entry_set_icon_from_icon_name (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + const gchar *icon_name) +{ + GdkPixbuf *pixbuf = NULL; + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + GdkScreen *screen; + GtkIconTheme *icon_theme; + GtkSettings *settings; + gint width, height; + GError *error = NULL; + + g_return_if_fail (entry != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY (entry)); + g_return_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos)); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + screen = gtk_widget_get_screen (GTK_WIDGET (entry)); + icon_theme = gtk_icon_theme_get_for_screen (screen); + settings = gtk_settings_get_for_screen (screen); + + if (icon_name != NULL) + { + gtk_icon_size_lookup_for_settings (settings, + GTK_ICON_SIZE_MENU, + &width, &height); + + pixbuf = gtk_icon_theme_load_icon (icon_theme, + icon_name, + MIN (width, height), 0, &error); + + if (pixbuf == NULL) + { + g_error_free (error); + pixbuf = gtk_widget_render_icon (GTK_WIDGET (entry), + GTK_STOCK_MISSING_IMAGE, + GTK_ICON_SIZE_MENU, + NULL); + } + } + + gtk_icon_entry_set_icon_internal (entry, + icon_pos, + pixbuf); +} + +/** + * gtk_icon_entry_set_icon_from_gicon + * @entry: A #GtkIconEntry; + * @icon_pos: The position at which to set the icon + * @icon: The icon to set + * + * Sets the icon shown in the entry at the specified position from the current + * icon theme. If the icon isn't known, a "broken image" icon will be displayed + * instead. If the current icon theme is changed, the icon will be updated + * appropriately. + */ +void +gtk_icon_entry_set_icon_from_gicon (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GIcon *icon) +{ + GdkPixbuf *pixbuf = NULL; + GtkIconEntryPrivate *priv; + EntryIconInfo *icon_info; + GdkScreen *screen; + GtkIconTheme *icon_theme; + GtkSettings *settings; + gint width, height; + GError *error = NULL; + GtkIconInfo *info; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + screen = gtk_widget_get_screen (GTK_WIDGET (entry)); + icon_theme = gtk_icon_theme_get_for_screen (screen); + settings = gtk_settings_get_for_screen (screen); + + if (icon != NULL) + { + gtk_icon_size_lookup_for_settings (settings, + GTK_ICON_SIZE_MENU, + &width, &height); + + #if #GTK_CHECK_VERSION (2, 14, 0) + info = gtk_icon_theme_lookup_by_gicon (icon_theme, + icon, + MIN (width, height), 0); + #else + info = NULL; + #endif + pixbuf = gtk_icon_info_load_icon (info, &error); + if (pixbuf == NULL) + { + g_error_free (error); + pixbuf = gtk_widget_render_icon (GTK_WIDGET (entry), + GTK_STOCK_MISSING_IMAGE, + GTK_ICON_SIZE_MENU, + NULL); + } + } + + gtk_icon_entry_set_icon_internal ((GtkIconEntry*)entry, + icon_pos, + pixbuf); +} + +/** + * gtk_icon_entry_set_cursor + * @entry: A #GtkIconEntry; + * @icon_pos: The position at which to set the cursor + * @cursor_type: A #GdkCursorType; describing the cursor to set + * + * Sets an alternate mouse cursor used for the specified icon. + */ +void +gtk_icon_entry_set_cursor (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GdkCursorType cursor_type) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + GdkCursor *cursor; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + icon_info->cursor_type = cursor_type; + icon_info->custom_cursor = TRUE; + + if (GTK_WIDGET_REALIZED (GTK_WIDGET (entry))) + { + cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (entry)), + cursor_type); + + gdk_window_set_cursor (icon_info->window, cursor); + gdk_cursor_unref (cursor); + } +} + +/** + * gtk_icon_entry_set_icon_highlight + * @entry: A #GtkIconEntry; + * @position: Icon position. + * @highlight: TRUE if the icon should highlight on mouse-over + * + * Determines whether the icon will highlight on mouse-over. + */ +void +gtk_icon_entry_set_icon_highlight (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + gboolean highlight) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + g_return_if_fail (entry != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY (entry)); + g_return_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos)); + + icon_info = &priv->icons[icon_pos]; + + if (icon_info->highlight == highlight) + return; + + icon_info->highlight = highlight; +} + +/** + * gtk_icon_entry_get_pixbuf + * @entry: A #GtkIconEntry. + * @position: Icon position. + * + * Retrieves the image used for the icon. Unlike the other methods of setting + * and getting icon data, this method will work regardless of whether the icon + * was set using a #GdkPixbuf, a #GIcon, a stock item, or an icon name. + * + * Returns: A #GdkPixbuf, or NULL if no icon is set for this position. + */ +GdkPixbuf * +gtk_icon_entry_get_pixbuf (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos) +{ + GtkIconEntryPrivate *priv; + + g_return_val_if_fail (entry != NULL, NULL); + g_return_val_if_fail (GTK_IS_ICON_ENTRY (entry), NULL); + g_return_val_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos), NULL); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + return priv->icons[icon_pos].pixbuf; +} + +/** + * gtk_icon_entry_get_gicon + * @entry: A #GtkIconEntry + * @position: Icon position. + * + * Retrieves the GIcon used for the icon, or NULL if there is no icon or if + * the icon was set by some other method (e.g., by stock, pixbuf, or icon name). + * + * Returns: A #GIcon, or NULL if no icon is set or if the icon is not a GIcon. + */ +GIcon * +gtk_icon_entry_get_gicon (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos) +{ + GtkIconEntryPrivate *priv; + EntryIconInfo *icon_info; + + g_return_val_if_fail (entry != NULL, NULL); + g_return_val_if_fail (GTK_IS_ICON_ENTRY (entry), NULL); + g_return_val_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos), NULL); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + icon_info = &priv->icons[icon_pos]; + + return icon_info->storage_type == _GTK_IMAGE_GICON ? icon_info->gicon : NULL; +} + +/** + * gtk_icon_entry_get_icon_highlight + * @entry: A #GtkIconEntry. + * @position: Icon position. + * + * Retrieves whether entry will highlight the icon on mouseover. + * + * Returns: TRUE if icon highlights. + */ +gboolean +gtk_icon_entry_get_icon_highlight (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos) +{ + GtkIconEntryPrivate *priv; + + g_return_val_if_fail (entry != NULL, FALSE); + g_return_val_if_fail (GTK_IS_ICON_ENTRY (entry), FALSE); + g_return_val_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos), FALSE); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + return priv->icons[icon_pos].highlight; +} + +/** + * gtk_icon_entry_set_tooltip + * @entry: A #GtkIconEntry. + * @position: Icon position. + * @text: The text to be used for the tooltip. + * + * Sets the tooltip text used for the specified icon. + */ +void +gtk_icon_entry_set_tooltip (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + const gchar *text) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + gchar *new_tooltip; + + g_return_if_fail (entry != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY (entry)); + g_return_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos)); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (entry); + + icon_info = &priv->icons[icon_pos]; + + new_tooltip = g_strdup (text); + if (icon_info->tooltip_text != NULL) + g_free (icon_info->tooltip_text); + icon_info->tooltip_text = new_tooltip; +} + +/** + * gtk_icon_entry_set_icon_sensitive + * @entry: A #GtkIconEntry. + * @position: Icon position. + * @sensitive: Specifies whether the icon should appear sensitive or insensitive. + * + * Sets the sensitivity for the specified icon. + */ +void +gtk_icon_entry_set_icon_sensitive (const GtkIconEntry *icon_entry, + GtkIconEntryPosition icon_pos, + gboolean sensitive) +{ + EntryIconInfo *icon_info; + GtkIconEntryPrivate *priv; + + g_return_if_fail (icon_entry != NULL); + g_return_if_fail (GTK_IS_ICON_ENTRY (icon_entry)); + g_return_if_fail (IS_VALID_ICON_ENTRY_POSITION (icon_pos)); + + priv = GTK_ICON_ENTRY_GET_PRIVATE (icon_entry); + + icon_info = &priv->icons[icon_pos]; + + icon_info->insensitive = !sensitive; + + if (icon_info->custom_cursor == TRUE && GTK_WIDGET_REALIZED (GTK_WIDGET (icon_entry))) + { + GdkCursor *cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (icon_entry)), + sensitive ? icon_info->cursor_type : GDK_ARROW); + gdk_window_set_cursor (icon_info->window, cursor); + gdk_cursor_unref (cursor); + } +} + +#endif diff --git a/midori/gtkiconentry.h b/midori/gtkiconentry.h new file mode 100644 index 00000000..61f8075b --- /dev/null +++ b/midori/gtkiconentry.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2004-2006 Christian Hammond. + * Copyright (C) 2008 Cody Russell + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_ICON_ENTRY_H__ +#define __GTK_ICON_ENTRY_H__ + +#if HAVE_CONFIG_H + #include +#endif + +#include +#include + +G_BEGIN_DECLS + +#if GTK_CHECK_VERSION (2, 16, 0) + #define GtkIconEntry GtkEntry + #define GtkIconEntryPosition GtkEntryIconPosition + #define GTK_ICON_ENTRY_PRIMARY GTK_ENTRY_ICON_PRIMARY + #define GTK_ICON_ENTRY_SECONDARY GTK_ENTRY_ICON_SECONDARY + #define GTK_ICON_ENTRY GTK_ENTRY + #define GTK_TYPE_ICON_ENTRY GTK_TYPE_ENTRY + #define gtk_icon_entry_new gtk_entry_new + #define gtk_icon_entry_set_icon_from_stock gtk_entry_set_icon_from_stock + void + gtk_icon_entry_set_icon_from_pixbuf (GtkEntry* entry, + GtkEntryIconPosition position, + GdkPixbuf* pixbuf); + #define gtk_icon_entry_set_icon_highlight gtk_entry_set_icon_activatable +#else + +#define GTK_TYPE_ICON_ENTRY (gtk_icon_entry_get_type()) +#define GTK_ICON_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_ICON_ENTRY, GtkIconEntry)) +#define GTK_ICON_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_ICON_ENTRY, GtkIconEntryClass)) +#define GTK_IS_ICON_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_ICON_ENTRY)) +#define GTK_IS_ICON_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_ICON_ENTRY)) +#define GTK_ICON_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ICON_ENTRY, GtkIconEntryClass)) + +typedef enum +{ + GTK_ICON_ENTRY_PRIMARY, + GTK_ICON_ENTRY_SECONDARY +} GtkIconEntryPosition; + +typedef struct _GtkIconEntry GtkIconEntry; +typedef struct _GtkIconEntryClass GtkIconEntryClass; + +struct _GtkIconEntry +{ + GtkEntry parent_object; +}; + +struct _GtkIconEntryClass +{ + GtkEntryClass parent_class; + + /* Signals */ + void (*icon_pressed) (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + int button); + void (*icon_released) (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + int button); + + void (*gtk_reserved1) (void); + void (*gtk_reserved2) (void); + void (*gtk_reserved3) (void); + void (*gtk_reserved4) (void); +}; + +GType gtk_icon_entry_get_type (void) G_GNUC_CONST; + +GtkWidget* gtk_icon_entry_new (void); + +void gtk_icon_entry_set_icon_from_pixbuf (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GdkPixbuf *pixbuf); +void gtk_icon_entry_set_icon_from_stock (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + const gchar *stock_id); +void gtk_icon_entry_set_icon_from_icon_name (GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + const gchar *icon_name); + +void gtk_icon_entry_set_icon_from_gicon (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + GIcon *icon); + +GdkPixbuf* gtk_icon_entry_get_pixbuf (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos); + +GIcon* gtk_icon_entry_get_gicon (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos); + +void gtk_icon_entry_set_icon_highlight (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos, + gboolean highlight); + +gboolean gtk_icon_entry_get_icon_highlight (const GtkIconEntry *entry, + GtkIconEntryPosition icon_pos); + +void gtk_icon_entry_set_cursor (const GtkIconEntry *icon_entry, + GtkIconEntryPosition icon_pos, + GdkCursorType cursor_type); + +void gtk_icon_entry_set_tooltip (const GtkIconEntry *icon_entry, + GtkIconEntryPosition icon_pos, + const gchar *text); + +void gtk_icon_entry_set_icon_sensitive (const GtkIconEntry *icon_entry, + GtkIconEntryPosition icon_pos, + gboolean sensitive); + +#endif + +G_END_DECLS + +#endif /* __GTK_ICON_ENTRY_H__ */ diff --git a/midori/main.c b/midori/main.c new file mode 100644 index 00000000..cab8d0af --- /dev/null +++ b/midori/main.c @@ -0,0 +1,1768 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + Copyright (C) 2008 Dale Whittaker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori.h" +#include "midori-addons.h" +#include "midori-array.h" +#include "midori-bookmarks.h" +#include "midori-console.h" +#include "midori-extensions.h" +#include "midori-history.h" +#include "midori-plugins.h" +#include "midori-transfers.h" + +#include "sokoke.h" +#include "compat.h" + +#if HAVE_UNISTD_H + #include + #define is_writable(_cfg_filename) \ + !g_access (_cfg_filename, W_OK) || \ + !g_file_test (_cfg_filename, G_FILE_TEST_EXISTS) +#else + #define is_writable(_cfg_filename) 1 +#endif +#include +#include +#include +#include + +#if HAVE_SQLITE + #include +#endif + +#if ENABLE_NLS + #include + #include +#endif + +#if HAVE_HILDON + #include +#endif + +#define MIDORI_HISTORY_ERROR g_quark_from_string("MIDORI_HISTORY_ERROR") + +typedef enum +{ + MIDORI_HISTORY_ERROR_DB_OPEN, /* Error opening the database file */ + MIDORI_HISTORY_ERROR_EXEC_SQL, /* Error executing SQL statement */ + +} MidoriHistoryError; + +static gchar* +build_config_filename (const gchar* filename) +{ + const gchar* path = sokoke_set_config_dir (NULL); + g_mkdir_with_parents (path, 0700); + return g_build_filename (path, filename, NULL); +} + +static MidoriWebSettings* +settings_new_from_file (const gchar* filename) +{ + MidoriWebSettings* settings = midori_web_settings_new (); + GKeyFile* key_file = g_key_file_new (); + GError* error = NULL; + GObjectClass* class; + guint i, n_properties; + GParamSpec** pspecs; + GParamSpec* pspec; + GType type; + const gchar* property; + gchar* str; + gint integer; + gfloat number; + gboolean boolean; + + if (!g_key_file_load_from_file (key_file, filename, + G_KEY_FILE_KEEP_COMMENTS, &error)) + { + if (error->code != G_FILE_ERROR_NOENT) + printf (_("The configuration couldn't be loaded: %s\n"), + error->message); + g_error_free (error); + } + class = G_OBJECT_GET_CLASS (settings); + pspecs = g_object_class_list_properties (class, &n_properties); + for (i = 0; i < n_properties; i++) + { + pspec = pspecs[i]; + if (!(pspec->flags & G_PARAM_WRITABLE)) + continue; + type = G_PARAM_SPEC_TYPE (pspec); + property = g_param_spec_get_name (pspec); + if (type == G_TYPE_PARAM_STRING) + { + str = sokoke_key_file_get_string_default (key_file, + "settings", property, + G_PARAM_SPEC_STRING (pspec)->default_value, NULL); + g_object_set (settings, property, str, NULL); + g_free (str); + } + else if (type == G_TYPE_PARAM_INT) + { + integer = sokoke_key_file_get_integer_default (key_file, + "settings", property, + G_PARAM_SPEC_INT (pspec)->default_value, NULL); + g_object_set (settings, property, integer, NULL); + } + else if (type == G_TYPE_PARAM_FLOAT) + { + number = sokoke_key_file_get_double_default (key_file, + "settings", property, + G_PARAM_SPEC_FLOAT (pspec)->default_value, NULL); + g_object_set (settings, property, number, NULL); + } + else if (type == G_TYPE_PARAM_BOOLEAN) + { + boolean = sokoke_key_file_get_boolean_default (key_file, + "settings", property, + G_PARAM_SPEC_BOOLEAN (pspec)->default_value, NULL); + g_object_set (settings, property, boolean, NULL); + } + else if (type == G_TYPE_PARAM_ENUM) + { + GEnumClass* enum_class = G_ENUM_CLASS ( + g_type_class_ref (pspec->value_type)); + GEnumValue* enum_value = g_enum_get_value (enum_class, + G_PARAM_SPEC_ENUM (pspec)->default_value); + str = sokoke_key_file_get_string_default (key_file, + "settings", property, + enum_value->value_name, NULL); + enum_value = g_enum_get_value_by_name (enum_class, str); + if (enum_value) + g_object_set (settings, property, enum_value->value, NULL); + else + g_warning (_("Value '%s' is invalid for %s"), + str, property); + + g_free (str); + g_type_class_unref (enum_class); + } + else + g_warning (_("Invalid configuration value '%s'"), property); + } + g_free (pspecs); + return settings; +} + +static gboolean +settings_save_to_file (MidoriWebSettings* settings, + const gchar* filename, + GError** error) +{ + GKeyFile* key_file; + GObjectClass* class; + guint i, n_properties; + GParamSpec** pspecs; + GParamSpec* pspec; + GType type; + const gchar* property; + gboolean saved; + + key_file = g_key_file_new (); + class = G_OBJECT_GET_CLASS (settings); + pspecs = g_object_class_list_properties (class, &n_properties); + for (i = 0; i < n_properties; i++) + { + pspec = pspecs[i]; + type = G_PARAM_SPEC_TYPE (pspec); + property = g_param_spec_get_name (pspec); + if (!(pspec->flags & G_PARAM_WRITABLE)) + { + gchar* prop_comment = g_strdup_printf ("# %s", property); + g_key_file_set_string (key_file, "settings", prop_comment, ""); + g_free (prop_comment); + continue; + } + if (type == G_TYPE_PARAM_STRING) + { + gchar* string; + g_object_get (settings, property, &string, NULL); + g_key_file_set_string (key_file, "settings", property, + string ? string : ""); + g_free (string); + } + else if (type == G_TYPE_PARAM_INT) + { + gint integer; + g_object_get (settings, property, &integer, NULL); + g_key_file_set_integer (key_file, "settings", property, integer); + } + else if (type == G_TYPE_PARAM_FLOAT) + { + gfloat number; + g_object_get (settings, property, &number, NULL); + g_key_file_set_double (key_file, "settings", property, number); + } + else if (type == G_TYPE_PARAM_BOOLEAN) + { + gboolean boolean; + g_object_get (settings, property, &boolean, NULL); + g_key_file_set_boolean (key_file, "settings", property, boolean); + } + else if (type == G_TYPE_PARAM_ENUM) + { + GEnumClass* enum_class = G_ENUM_CLASS ( + g_type_class_ref (pspec->value_type)); + gint integer; + g_object_get (settings, property, &integer, NULL); + GEnumValue* enum_value = g_enum_get_value (enum_class, integer); + g_key_file_set_string (key_file, "settings", property, + enum_value->value_name); + } + else + g_warning (_("Invalid configuration value '%s'"), property); + } + g_free (pspecs); + saved = sokoke_key_file_save_to_file (key_file, filename, error); + g_key_file_free (key_file); + return saved; +} + +static KatzeArray* +search_engines_new_from_file (const gchar* filename, + GError** error) +{ + KatzeArray* search_engines; + GKeyFile* key_file; + gchar** engines; + guint i, j, n_properties; + KatzeItem* item; + GParamSpec** pspecs; + const gchar* property; + gchar* value; + + search_engines = katze_array_new (KATZE_TYPE_ITEM); + key_file = g_key_file_new (); + g_key_file_load_from_file (key_file, filename, + G_KEY_FILE_KEEP_COMMENTS, error); + /*g_key_file_load_from_data_dirs(keyFile, sFilename, NULL + , G_KEY_FILE_KEEP_COMMENTS, error);*/ + engines = g_key_file_get_groups (key_file, NULL); + pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (search_engines), + &n_properties); + for (i = 0; engines[i] != NULL; i++) + { + item = katze_item_new (); + for (j = 0; j < n_properties; j++) + { + if (!G_IS_PARAM_SPEC_STRING (pspecs[j])) + continue; + property = g_param_spec_get_name (pspecs[j]); + value = g_key_file_get_string (key_file, engines[i], + property, NULL); + g_object_set (item, property, value, NULL); + g_free (value); + } + katze_array_add_item (search_engines, item); + } + g_free (pspecs); + g_strfreev (engines); + g_key_file_free (key_file); + return search_engines; +} + +static gboolean +search_engines_save_to_file (KatzeArray* search_engines, + const gchar* filename, + GError** error) +{ + GKeyFile* key_file; + guint i, j, n_properties; + KatzeItem* item; + const gchar* name; + GParamSpec** pspecs; + const gchar* property; + gchar* value; + gboolean saved; + + key_file = g_key_file_new (); + pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (search_engines), + &n_properties); + i = 0; + while ((item = katze_array_get_nth_item (search_engines, i++))) + { + name = katze_item_get_name (item); + for (j = 0; j < n_properties; j++) + { + if (!G_IS_PARAM_SPEC_STRING (pspecs[j])) + continue; + property = g_param_spec_get_name (pspecs[j]); + g_object_get (item, property, &value, NULL); + if (value) + g_key_file_set_string (key_file, name, property, value); + g_free (value); + } + } + g_free (pspecs); + saved = sokoke_key_file_save_to_file (key_file, filename, error); + g_key_file_free (key_file); + + return saved; +} + +#if HAVE_SQLITE +/* Open database 'dbname' */ +static sqlite3* +db_open (const char* dbname, + GError** error) +{ + sqlite3* db; + + if (sqlite3_open (dbname, &db)) + { + if (error) + { + *error = g_error_new (MIDORI_HISTORY_ERROR, + MIDORI_HISTORY_ERROR_DB_OPEN, + _("Failed to open database: %s\n"), + sqlite3_errmsg (db)); + } + sqlite3_close (db); + return NULL; + } + return (db); +} + +/* Close database 'db' */ +static void +db_close (sqlite3* db) +{ + sqlite3_close (db); +} + +/* Execute an SQL statement and run 'callback' on the result data */ +static gboolean +db_exec_callback (sqlite3* db, + const char* sqlcmd, + int (*callback)(void*, int, char**, char**), + void* cbarg, + GError** error) +{ + char* errmsg; + + if (sqlite3_exec (db, sqlcmd, callback, cbarg, &errmsg) != SQLITE_OK) + { + if (error) + { + *error = g_error_new (MIDORI_HISTORY_ERROR, + MIDORI_HISTORY_ERROR_EXEC_SQL, + _("Failed to execute database statement: %s\n"), + errmsg); + } + sqlite3_free (errmsg); + return FALSE; + } + return TRUE; +} + +/* Execute a SQL statement */ +static gboolean +db_exec (sqlite3* db, + const char* sqlcmd, + GError** error) +{ + return (db_exec_callback (db, sqlcmd, NULL, NULL, error)); +} + +/* sqlite method for retrieving the date/ time */ +static int +gettimestr (void* data, + int argc, + char** argv, + char** colname) +{ + KatzeItem* item = KATZE_ITEM (data); + (void) colname; + + g_return_val_if_fail (argc == 1, 1); + + katze_item_set_added (item, g_ascii_strtoull (argv[0], NULL, 10)); + return 0; +} + +static void +midori_history_remove_item_cb (KatzeArray* history, + KatzeItem* item, + sqlite3* db) +{ + gchar* sqlcmd; + gboolean success = TRUE; + GError* error = NULL; + + g_return_if_fail (KATZE_IS_ITEM (item)); + + sqlcmd = sqlite3_mprintf ( + "DELETE FROM history WHERE uri = '%q' AND" + " title = '%q' AND date = %" G_GINT64_FORMAT, + katze_item_get_uri (item), + katze_item_get_name (item), + katze_item_get_added (item)); + success = db_exec (db, sqlcmd, &error); + if (!success) + { + g_printerr (_("Failed to remove history item: %s\n"), error->message); + g_error_free (error); + return ; + } + sqlite3_free (sqlcmd); +} + +static void +midori_history_clear_before_cb (KatzeArray* item, + sqlite3* db) +{ + g_signal_handlers_block_by_func (item, midori_history_remove_item_cb, db); +} + +static void +midori_history_clear_cb (KatzeArray* history, + sqlite3* db) +{ + GError* error = NULL; + + g_return_if_fail (KATZE_IS_ARRAY (history)); + + if (!db_exec (db, "DELETE FROM history", &error)) + { + g_printerr (_("Failed to clear history: %s\n"), error->message); + g_error_free (error); + } +} + +static void +midori_history_notify_item_cb (KatzeItem* item, + GParamSpec* pspec, + sqlite3* db) +{ + gchar* sqlcmd; + gboolean success = TRUE; + GError* error = NULL; + + sqlcmd = sqlite3_mprintf ("UPDATE history SET title='%q' WHERE " + "uri='%q' AND date=%" G_GUINT64_FORMAT, + katze_item_get_name (item), + katze_item_get_uri (item), + katze_item_get_added (item)); + success = db_exec (db, sqlcmd, &error); + sqlite3_free (sqlcmd); + if (!success) + { + g_printerr (_("Failed to add history item: %s\n"), error->message); + g_error_free (error); + return ; + } +} + +static void +midori_history_add_item_cb (KatzeArray* array, + KatzeItem* item, + sqlite3* db) +{ + gchar* sqlcmd; + gboolean success = TRUE; + GError* error = NULL; + + g_return_if_fail (KATZE_IS_ITEM (item)); + + if (KATZE_IS_ARRAY (item)) + { + g_signal_connect_after (item, "add-item", + G_CALLBACK (midori_history_add_item_cb), db); + g_signal_connect (item, "remove-item", + G_CALLBACK (midori_history_remove_item_cb), db); + g_signal_connect (item, "clear", + G_CALLBACK (midori_history_clear_before_cb), db); + return; + } + + /* New item, set added to the current date/ time */ + if (!katze_item_get_added (item)) + { + if (!db_exec_callback (db, "SELECT date('now')", + gettimestr, item, &error)) + { + g_printerr (_("Failed to add history item: %s\n"), error->message); + g_error_free (error); + return; + } + } + sqlcmd = sqlite3_mprintf ("INSERT INTO history VALUES" + "('%q', '%q', %" G_GUINT64_FORMAT "," + " %" G_GUINT64_FORMAT ")", + katze_item_get_uri (item), + katze_item_get_name (item), + katze_item_get_added (item), + katze_item_get_added (KATZE_ITEM (array))); + success = db_exec (db, sqlcmd, &error); + sqlite3_free (sqlcmd); + if (!success) + { + g_printerr (_("Failed to add history item: %s\n"), error->message); + g_error_free (error); + return ; + } + + /* The title is set after the item is added */ + g_signal_connect_after (item, "notify::name", + G_CALLBACK (midori_history_notify_item_cb), db); +} + +static int +midori_history_add_items (void* data, + int argc, + char** argv, + char** colname) +{ + KatzeItem* item; + KatzeArray* parent; + KatzeArray* array; + gint64 date; + gint64 day; + gint i; + gint j; + gint n; + gint ncols = 4; + gchar token[50]; + + array = KATZE_ARRAY (data); + g_return_val_if_fail (KATZE_IS_ARRAY (array), 1); + + /* Test whether have the right number of columns */ + g_return_val_if_fail (argc % ncols == 0, 1); + + for (i = 0; i < (argc - ncols) + 1; i++) + { + if (argv[i]) + { + if (colname[i] && !g_ascii_strcasecmp (colname[i], "uri") && + colname[i + 1] && !g_ascii_strcasecmp (colname[i + 1], "title") && + colname[i + 2] && !g_ascii_strcasecmp (colname[i + 2], "date") && + colname[i + 3] && !g_ascii_strcasecmp (colname[i + 3], "day")) + { + item = katze_item_new (); + katze_item_set_uri (item, argv[i]); + katze_item_set_name (item, argv[i + 1]); + date = g_ascii_strtoull (argv[i + 2], NULL, 10); + day = g_ascii_strtoull (argv[i + 3], NULL, 10); + katze_item_set_added (item, date); + + n = katze_array_get_length (array); + for (j = n - 1; j >= 0; j--) + { + parent = katze_array_get_nth_item (array, j); + if (day == katze_item_get_added (KATZE_ITEM (parent))) + break; + } + if (j < 0) + { + parent = katze_array_new (KATZE_TYPE_ARRAY); + katze_item_set_added (KATZE_ITEM (parent), day); + strftime (token, sizeof (token), "%x", + localtime ((time_t *)&date)); + katze_item_set_name (KATZE_ITEM (parent), token); + katze_array_add_item (array, parent); + } + katze_array_add_item (parent, item); + } + } + } + return 0; +} + +static int +midori_history_test_day_column (void* data, + int argc, + char** argv, + char** colname) +{ + gint i; + gboolean* has_day; + + has_day = (gboolean*)data; + + for (i = 0; i < argc; i++) + { + if (argv[i] && + !g_ascii_strcasecmp (colname[i], "name") && + !g_ascii_strcasecmp (argv[i], "day")) + { + *has_day = TRUE; + break; + } + } + + return 0; +} + +static sqlite3* +midori_history_initialize (KatzeArray* array, + const gchar* filename, + GError** error) +{ + sqlite3* db; + KatzeItem* item; + gint i; + gboolean has_day; + + has_day = FALSE; + + if ((db = db_open (filename, error)) == NULL) + return db; + + if (!db_exec (db, + "CREATE TABLE IF NOT EXISTS " + "history(uri text, title text, date integer, day integer)", + error)) + return NULL; + + if (!db_exec_callback (db, + "PRAGMA table_info(history)", + midori_history_test_day_column, + &has_day, error)) + return NULL; + + if (!has_day) + { + if (!db_exec (db, + "BEGIN TRANSACTION;" + "CREATE TEMPORARY TABLE backup (uri text, title text, date integer);" + "INSERT INTO backup SELECT uri,title,date FROM history;" + "DROP TABLE history;" + "CREATE TABLE history (uri text, title text, date integer, day integer);" + "INSERT INTO history SELECT uri,title,date," + "julianday(date(date,'unixepoch','start of day','+1 day'))" + " - julianday('0001-01-01','start of day')" + "FROM backup;" + "DROP TABLE backup;" + "COMMIT;", + error)) + return NULL; + } + + if (!db_exec_callback (db, + "SELECT uri, title, date, day FROM history " + "ORDER BY date ASC", + midori_history_add_items, + array, + error)) + return NULL; + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + { + g_signal_connect_after (item, "add-item", + G_CALLBACK (midori_history_add_item_cb), db); + g_signal_connect (item, "remove-item", + G_CALLBACK (midori_history_remove_item_cb), db); + g_signal_connect (item, "clear", + G_CALLBACK (midori_history_clear_before_cb), db); + } + return db; +} + +static void +midori_history_terminate (sqlite3* db, + gint max_history_age) +{ + gchar* sqlcmd; + gboolean success = TRUE; + GError* error = NULL; + + sqlcmd = g_strdup_printf ( + "DELETE FROM history WHERE " + "(julianday(date('now')) - julianday(date(date,'unixepoch')))" + " >= %d", max_history_age); + db_exec (db, sqlcmd, &error); + if (!success) + { + /* i18n: Couldn't remove items that are older than n days */ + g_printerr (_("Failed to remove old history items: %s\n"), error->message); + g_error_free (error); + return ; + } + g_free (sqlcmd); + db_close (db); +} +#endif + +static void +midori_app_quit_cb (MidoriApp* app) +{ + gchar* config_file = build_config_filename ("running"); + g_unlink (config_file); + g_free (config_file); +} + +static void +settings_notify_cb (MidoriWebSettings* settings, + GParamSpec* pspec) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("config"); + error = NULL; + if (!settings_save_to_file (settings, config_file, &error)) + { + g_warning (_("The configuration couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); +} + +static void +accel_map_changed_cb (GtkAccelMap* accel_map, + gchar* accel_path, + guint accel_key, + GdkModifierType accel_mods) +{ + gchar* config_file = build_config_filename ("accels"); + gtk_accel_map_save (config_file); + g_free (config_file); +} + +static void +midori_search_engines_modify_cb (KatzeArray* array, + gpointer item, + KatzeArray* search_engines) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("search"); + error = NULL; + if (!search_engines_save_to_file (search_engines, config_file, &error)) + { + g_warning (_("The search engines couldn't be saved. %s"), + error->message); + g_error_free (error); + } + g_free (config_file); +} + +static void +midori_bookmarks_notify_item_cb (KatzeArray* folder, + GParamSpec* pspec, + KatzeArray* bookmarks) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("bookmarks.xbel"); + error = NULL; + if (!midori_array_to_file (bookmarks, config_file, "xbel", &error)) + { + g_warning (_("The bookmarks couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); +} + +static void +midori_bookmarks_add_item_cb (KatzeArray* folder, + GObject* item, + KatzeArray* bookmarks); + +static void +midori_bookmarks_remove_item_cb (KatzeArray* folder, + GObject* item, + KatzeArray* bookmarks); + +static void +midori_bookmarks_add_item_cb (KatzeArray* folder, + GObject* item, + KatzeArray* bookmarks) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("bookmarks.xbel"); + error = NULL; + if (!midori_array_to_file (bookmarks, config_file, "xbel", &error)) + { + g_warning (_("The bookmarks couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); + + if (folder == bookmarks && KATZE_IS_ARRAY (item)) + { + g_signal_connect_after (item, "add-item", + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); + g_signal_connect_after (item, "remove-item", + G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); + } + + g_signal_connect_after (item, "notify", + G_CALLBACK (midori_bookmarks_notify_item_cb), bookmarks); +} + +static void +midori_bookmarks_remove_item_cb (KatzeArray* folder, + GObject* item, + KatzeArray* bookmarks) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("bookmarks.xbel"); + error = NULL; + if (!midori_array_to_file (bookmarks, config_file, "xbel", &error)) + { + g_warning (_("The bookmarks couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); + + if (KATZE_IS_ARRAY (item)) + g_signal_handlers_disconnect_by_func (item, + midori_bookmarks_add_item_cb, bookmarks); +} + +static void +midori_trash_add_item_cb (KatzeArray* trash, + GObject* item) +{ + gchar* config_file; + GError* error; + GObject* obsolete_item; + + config_file = build_config_filename ("tabtrash.xbel"); + error = NULL; + if (!midori_array_to_file (trash, config_file, "xbel", &error)) + { + /* i18n: Trash, or wastebin, containing closed tabs */ + g_warning (_("The trash couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); + + if (katze_array_get_nth_item (trash, 10)) + { + obsolete_item = katze_array_get_nth_item (trash, 0); + katze_array_remove_item (trash, obsolete_item); + } +} + +static void +midori_trash_remove_item_cb (KatzeArray* trash, + GObject* item) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("tabtrash.xbel"); + error = NULL; + if (!midori_array_to_file (trash, config_file, "xbel", &error)) + { + g_warning (_("The trash couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); +} + +static void +midori_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + KatzeNet* net) +{ + GtkWidget* panel; + GtkWidget* addon; + + panel = katze_object_get_object (browser, "panel"); + + /* Bookmarks */ + addon = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, NULL); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + /* History */ + addon = g_object_new (MIDORI_TYPE_HISTORY, "app", app, NULL); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + /* Transfers */ + #if WEBKIT_CHECK_VERSION (1, 1, 3) + addon = g_object_new (MIDORI_TYPE_TRANSFERS, "app", app, NULL); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + #endif + + /* Console */ + addon = g_object_new (MIDORI_TYPE_CONSOLE, "app", app, NULL); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + /* Userscripts */ + addon = midori_addons_new (MIDORI_ADDON_USER_SCRIPTS, GTK_WIDGET (browser)); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + /* Userstyles */ + addon = midori_addons_new (MIDORI_ADDON_USER_STYLES, GTK_WIDGET (browser)); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + /* Plugins */ + addon = g_object_new (MIDORI_TYPE_PLUGINS, "app", app, NULL); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + /* Extensions */ + addon = g_object_new (MIDORI_TYPE_EXTENSIONS, "app", app, NULL); + gtk_widget_show (addon); + midori_panel_append_page (MIDORI_PANEL (panel), MIDORI_VIEWABLE (addon)); + + g_object_unref (panel); +} + +static void +midori_browser_session_cb (MidoriBrowser* browser, + gpointer pspec, + KatzeArray* session) +{ + gchar* config_file; + GError* error; + + config_file = build_config_filename ("session.xbel"); + error = NULL; + if (!midori_array_to_file (session, config_file, "xbel", &error)) + { + g_warning (_("The session couldn't be saved. %s"), error->message); + g_error_free (error); + } + g_free (config_file); +} + +static void +midori_browser_weak_notify_cb (MidoriBrowser* browser, + KatzeArray* session) +{ + g_object_disconnect (browser, "any-signal", + G_CALLBACK (midori_browser_session_cb), session, NULL); +} + +static void +soup_session_settings_notify_http_proxy_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + SoupSession* session) +{ + gboolean auto_detect_proxy; + gchar* http_proxy; + SoupURI* proxy_uri; + + auto_detect_proxy = katze_object_get_boolean (settings, "auto-detect-proxy"); + if (auto_detect_proxy) + http_proxy = g_strdup (g_getenv ("http_proxy")); + else + http_proxy = katze_object_get_string (settings, "http-proxy"); + /* soup_uri_new expects a non-NULL string with a protocol */ + if (http_proxy && g_str_has_prefix (http_proxy, "http://")) + proxy_uri = soup_uri_new (http_proxy); + else if (http_proxy && *http_proxy) + { + gchar* fixed_http_proxy = g_strconcat ("http://", http_proxy, NULL); + proxy_uri = soup_uri_new (fixed_http_proxy); + g_free (fixed_http_proxy); + } + else + proxy_uri = NULL; + g_free (http_proxy); + g_object_set (session, "proxy-uri", proxy_uri, NULL); + if (proxy_uri) + soup_uri_free (proxy_uri); +} + +static void +soup_session_settings_notify_ident_string_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + SoupSession* session) +{ + gchar* ident_string = katze_object_get_string (settings, "ident-string"); + g_object_set (session, "user-agent", ident_string, NULL); + g_free (ident_string); +} + +static void +midori_soup_session_debug (SoupSession* session) +{ + const char* soup_debug = g_getenv ("MIDORI_SOUP_DEBUG"); + + if (soup_debug) + { + gint soup_debug_level = atoi (soup_debug); + SoupLogger* logger = soup_logger_new (soup_debug_level, -1); + soup_logger_attach (logger, session); + g_object_unref (logger); + } +} + +static void +midori_soup_session_prepare (SoupSession* session, + SoupCookieJar* cookie_jar, + MidoriWebSettings* settings) +{ + SoupSessionFeature* feature; + gchar* config_file; + + soup_session_settings_notify_http_proxy_cb (settings, NULL, session); + soup_session_settings_notify_ident_string_cb (settings, NULL, session); + g_signal_connect (settings, "notify::http-proxy", + G_CALLBACK (soup_session_settings_notify_http_proxy_cb), session); + g_signal_connect (settings, "notify::auto-detect-proxy", + G_CALLBACK (soup_session_settings_notify_http_proxy_cb), session); + g_signal_connect (settings, "notify::ident-string", + G_CALLBACK (soup_session_settings_notify_ident_string_cb), session); + + soup_session_add_feature_by_type (session, KATZE_TYPE_HTTP_AUTH); + midori_soup_session_debug (session); + + feature = g_object_new (KATZE_TYPE_HTTP_COOKIES, NULL); + config_file = build_config_filename ("cookies.txt"); + g_object_set_data_full (G_OBJECT (feature), "filename", + config_file, (GDestroyNotify)g_free); + soup_session_add_feature (session, SOUP_SESSION_FEATURE (cookie_jar)); + soup_session_add_feature (session, feature); +} + +static void +button_modify_preferences_clicked_cb (GtkWidget* button, + MidoriWebSettings* settings) +{ + GtkWidget* dialog = midori_preferences_new ( + GTK_WINDOW (gtk_widget_get_toplevel (button)), settings); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_DELETE_EVENT) + gtk_widget_destroy (dialog); +} + +static void +button_reset_session_clicked_cb (GtkWidget* button, + KatzeArray* session) +{ + katze_array_clear (session); + gtk_widget_set_sensitive (button, FALSE); +} + +static GtkWidget* +midori_create_diagnostic_dialog (MidoriWebSettings* settings, + KatzeArray* _session) +{ + GtkWidget* dialog; + GdkScreen* screen; + GtkIconTheme* icon_theme; + GtkWidget* box; + GtkWidget* button; + + dialog = gtk_message_dialog_new ( + NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, + _("Midori seems to have crashed the last time it was opened. " + "If this happened repeatedly, try one of the following options " + "to solve the problem.")); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE); + gtk_window_set_title (GTK_WINDOW (dialog), g_get_application_name ()); + screen = gtk_widget_get_screen (dialog); + if (screen) + { + icon_theme = gtk_icon_theme_get_for_screen (screen); + if (gtk_icon_theme_has_icon (icon_theme, "midori")) + gtk_window_set_icon_name (GTK_WINDOW (dialog), "midori"); + else + gtk_window_set_icon_name (GTK_WINDOW (dialog), "web-browser"); + } + box = gtk_hbox_new (FALSE, 0); + button = gtk_button_new_with_mnemonic (_("Modify _preferences")); + g_signal_connect (button, "clicked", + G_CALLBACK (button_modify_preferences_clicked_cb), settings); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 4); + button = gtk_button_new_with_mnemonic (_("Reset the last _session")); + g_signal_connect (button, "clicked", + G_CALLBACK (button_reset_session_clicked_cb), _session); + gtk_widget_set_sensitive (button, !katze_array_is_empty (_session)); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 4); + button = gtk_button_new_with_mnemonic (_("Disable all _extensions")); + gtk_widget_set_sensitive (button, FALSE); + /* FIXME: Disable all extensions */ + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 4); + gtk_widget_show_all (box); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), box); + if (1) + { + /* GtkLabel can't wrap the text properly. Until some day + this works, we implement this hack to do it ourselves. */ + GtkWidget* content_area; + GtkWidget* hbox; + GtkWidget* vbox; + GtkWidget* label; + GList* ch; + GtkRequisition req; + + content_area = GTK_DIALOG (dialog)->vbox; + ch = gtk_container_get_children (GTK_CONTAINER (content_area)); + hbox = (GtkWidget*)g_list_nth_data (ch, 0); + g_list_free (ch); + ch = gtk_container_get_children (GTK_CONTAINER (hbox)); + vbox = (GtkWidget*)g_list_nth_data (ch, 1); + g_list_free (ch); + ch = gtk_container_get_children (GTK_CONTAINER (vbox)); + label = (GtkWidget*)g_list_nth_data (ch, 0); + g_list_free (ch); + gtk_widget_size_request (content_area, &req); + gtk_widget_set_size_request (label, req.width * 0.9, -1); + } + return dialog; +} + +static gboolean +midori_load_cookie_jar (gpointer data) +{ + MidoriWebSettings* settings = MIDORI_WEB_SETTINGS (data); + SoupSession* webkit_session; + SoupCookieJar* jar; + + webkit_session = webkit_get_default_session (); + jar = soup_cookie_jar_new (); + g_object_set_data (G_OBJECT (jar), "midori-settings", settings); + midori_soup_session_prepare (webkit_session, jar, settings); + g_object_unref (jar); + + return FALSE; +} + +static gboolean +midori_load_extensions (gpointer data) +{ + MidoriApp* app = MIDORI_APP (data); + KatzeArray* extensions; + const gchar* filename; + MidoriExtension* extension; + guint i; + + /* Load extensions */ + extensions = katze_array_new (MIDORI_TYPE_EXTENSION); + if (g_module_supported ()) + { + /* FIXME: Read extensions from system data dirs */ + gchar* extension_path; + GDir* extension_dir; + + if (!(extension_path = g_strdup (g_getenv ("MIDORI_EXTENSION_PATH")))) + extension_path = g_build_filename (LIBDIR, PACKAGE_NAME, NULL); + extension_dir = g_dir_open (extension_path, 0, NULL); + if (extension_dir != NULL) + { + while ((filename = g_dir_read_name (extension_dir))) + { + gchar* fullname; + GModule* module; + typedef MidoriExtension* (*extension_init_func)(void); + extension_init_func extension_init; + + /* Ignore files which don't have the correct suffix */ + if (!g_str_has_suffix (filename, G_MODULE_SUFFIX)) + continue; + + fullname = g_build_filename (extension_path, filename, NULL); + module = g_module_open (fullname, G_MODULE_BIND_LOCAL); + g_free (fullname); + + if (module && g_module_symbol (module, "extension_init", + (gpointer) &extension_init)) + { + extension = extension_init (); + /* FIXME: Validate the extension */ + /* Signal that we want the extension to load and save */ + midori_extension_get_config_dir (extension); + } + else + { + extension = g_object_new (MIDORI_TYPE_EXTENSION, + "name", filename, + "description", g_module_error (), + NULL); + g_warning ("%s", g_module_error ()); + } + katze_array_add_item (extensions, extension); + g_object_unref (extension); + } + g_dir_close (extension_dir); + } + g_free (extension_path); + } + + g_object_set (app, "extensions", extensions, NULL); + + i = 0; + while ((extension = katze_array_get_nth_item (extensions, i++))) + g_signal_emit_by_name (extension, "activate", app); + + return FALSE; +} + +static gboolean +midori_load_session (gpointer data) +{ + KatzeArray* _session = KATZE_ARRAY (data); + MidoriBrowser* browser; + MidoriApp* app = katze_item_get_parent (KATZE_ITEM (_session)); + gchar* config_file; + KatzeArray* session; + KatzeItem* item; + guint i; + + browser = midori_app_create_browser (app); + midori_app_add_browser (app, browser); + gtk_widget_show (GTK_WIDGET (browser)); + + config_file = build_config_filename ("accels"); + if (is_writable (config_file)) + g_signal_connect_after (gtk_accel_map_get (), "changed", + G_CALLBACK (accel_map_changed_cb), NULL); + + if (katze_array_is_empty (_session)) + { + MidoriWebSettings* settings = katze_object_get_object (app, "settings"); + MidoriStartup load_on_startup; + gchar* homepage; + item = katze_item_new (); + + g_object_get (settings, "load-on-startup", &load_on_startup, NULL); + if (load_on_startup == MIDORI_STARTUP_BLANK_PAGE) + katze_item_set_uri (item, ""); + else + { + g_object_get (settings, "homepage", &homepage, NULL); + katze_item_set_uri (item, homepage); + g_free (homepage); + } + g_object_unref (settings); + katze_array_add_item (_session, item); + g_object_unref (item); + } + + session = midori_browser_get_proxy_array (browser); + i = 0; + while ((item = katze_array_get_nth_item (_session, i++))) + midori_browser_add_item (browser, item); + /* FIXME: Switch to the last active page */ + item = katze_array_get_nth_item (_session, 0); + if (!strcmp (katze_item_get_uri (item), "")) + midori_browser_activate_action (browser, "Location"); + g_object_unref (_session); + + katze_assign (config_file, build_config_filename ("session.xbel")); + if (is_writable (config_file)) + { + g_signal_connect_after (browser, "notify::uri", + G_CALLBACK (midori_browser_session_cb), session); + g_signal_connect_after (browser, "add-tab", + G_CALLBACK (midori_browser_session_cb), session); + g_signal_connect_after (browser, "remove-tab", + G_CALLBACK (midori_browser_session_cb), session); + g_object_weak_ref (G_OBJECT (session), + (GWeakNotify)(midori_browser_weak_notify_cb), browser); + } + + return FALSE; +} + +static gint +midori_run_script (const gchar* filename) +{ + if (!(filename)) + { + g_print ("%s - %s\n", _("Midori"), _("No filename specified")); + return 1; + } + + JSGlobalContextRef js_context; + gchar* exception; + gchar* script; + GError* error = NULL; + + js_context = JSGlobalContextCreateInGroup (NULL, NULL); + + if (g_file_get_contents (filename, &script, NULL, &error)) + { + if (sokoke_js_script_eval (js_context, script, &exception)) + exception = NULL; + g_free (script); + } + else if (error) + { + exception = g_strdup (error->message); + g_error_free (error); + } + else + exception = g_strdup (_("An unknown error occured.")); + + JSGlobalContextRelease (js_context); + if (!exception) + return 0; + + g_print ("%s - Exception: %s\n", filename, exception); + return 1; +} + +int +main (int argc, + char** argv) +{ + gchar* webapp; + gchar* config; + gboolean run; + gboolean version; + gchar** uris; + MidoriApp* app; + gboolean result; + GError* error; + GOptionEntry entries[] = + { + { "app", 'a', 0, G_OPTION_ARG_STRING, &webapp, + N_("Run ADDRESS as a web application"), N_("ADDRESS") }, + { "config", 'c', 0, G_OPTION_ARG_FILENAME, &config, + N_("Use FOLDER as configuration folder"), N_("FOLDER") }, + { "run", 'r', 0, G_OPTION_ARG_NONE, &run, + N_("Run the specified filename as javascript"), NULL }, + { "version", 'V', 0, G_OPTION_ARG_NONE, &version, + N_("Display program version"), NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &uris, + N_("Addresses"), NULL }, + { NULL } + }; + GString* error_messages; + MidoriWebSettings* settings; + gchar* config_file; + MidoriStartup load_on_startup; + KatzeArray* search_engines; + KatzeArray* bookmarks; + KatzeArray* history; + KatzeArray* _session; + KatzeArray* trash; + guint i; + gchar* uri; + KatzeItem* item; + gchar* uri_ready; + #if HAVE_SQLITE + sqlite3* db; + gint max_history_age; + #endif + #if HAVE_HILDON + osso_context_t* osso_context; + #endif + + #if ENABLE_NLS + setlocale (LC_ALL, ""); + if (g_getenv ("NLSPATH")) + bindtextdomain (GETTEXT_PACKAGE, g_getenv ("NLSPATH")); + else + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + #endif + + /* Parse cli options */ + webapp = NULL; + config = NULL; + run = FALSE; + version = FALSE; + uris = NULL; + error = NULL; + if (!gtk_init_with_args (&argc, &argv, _("[Addresses]"), entries, + GETTEXT_PACKAGE, &error)) + { + g_print ("%s - %s\n", _("Midori"), error->message); + g_error_free (error); + return 1; + } + + /* libSoup uses threads, so we need to initialize threads. */ + if (!g_thread_supported ()) g_thread_init (NULL); + sokoke_register_stock_items (); + g_set_application_name (_("Midori")); + + if (version) + { + g_print ( + "%s %s\n\n" + "Copyright (c) 2007-2009 Christian Dywan\n\n" + "%s\n" + "\t%s\n\n" + "%s\n" + "\thttp://www.twotoasts.de\n", + _("Midori"), PACKAGE_VERSION, + _("Please report comments, suggestions and bugs to:"), + PACKAGE_BUGREPORT, + _("Check for new versions at:") + ); + return 0; + } + + /* Web Application support */ + if (webapp) + { + MidoriBrowser* browser = midori_browser_new (); + settings = katze_object_get_object (browser, "settings"); + g_object_set (settings, + "show-menubar", FALSE, + "show-navigationbar", TRUE, + "toolbar-items", "Back,Forward,ReloadStop,Location", + "show-statusbar", TRUE, + NULL); + g_object_unref (settings); + g_object_set (browser, "settings", settings, NULL); + midori_browser_add_uri (browser, webapp); + g_object_set_data (G_OBJECT (browser), "locked", (void*)1); + g_signal_connect (browser, "destroy", + G_CALLBACK (gtk_main_quit), NULL); + gtk_widget_show (GTK_WIDGET (browser)); + midori_browser_activate_action (browser, "Location"); + gtk_main (); + return 0; + } + + /* Standalone javascript support */ + if (run) + return midori_run_script (uris ? *uris : NULL); + + #if HAVE_HILDON + osso_context = osso_initialize (PACKAGE_NAME, PACKAGE_VERSION, FALSE, NULL); + + if (!osso_context) + { + g_critical ("Error initializing OSSO D-Bus context - Midori"); + return 1; + } + #endif + + if (config && !g_path_is_absolute (config)) + { + g_critical (_("The specified configuration folder is invalid.")); + return 1; + } + sokoke_set_config_dir (config); + if (config) + { + gchar* name_hash; + gchar* app_name; + name_hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, config, -1); + app_name = g_strconcat ("midori", "_", name_hash, NULL); + g_free (name_hash); + app = g_object_new (MIDORI_TYPE_APP, "name", app_name, NULL); + g_free (app_name); + } + else + app = midori_app_new (); + g_free (config); + + /* FIXME: The app might be 'running' but actually showing a dialog + after a crash, so running a new window isn't a good idea. */ + if (midori_app_instance_is_running (app)) + { + GtkWidget* dialog; + + /* TODO: Open as many tabs as we have uris, seperated by pipes */ + if (uris) + result = midori_app_instance_send_uris (app, uris); + else + result = midori_app_instance_send_new_browser (app); + + if (result) + return 0; + + dialog = gtk_message_dialog_new (NULL, + 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", + _("An instance of Midori is already running but not responding.\n")); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_DELETE_EVENT) + gtk_widget_destroy (dialog); + /* FIXME: Allow killing the existing instance */ + return 1; + } + + /* Load configuration files */ + error_messages = g_string_new (NULL); + config_file = build_config_filename ("config"); + error = NULL; + settings = settings_new_from_file (config_file); + katze_assign (config_file, build_config_filename ("accels")); + gtk_accel_map_load (config_file); + katze_assign (config_file, build_config_filename ("search")); + error = NULL; + search_engines = search_engines_new_from_file (config_file, &error); + /* We ignore for instance empty files */ + if (error && (error->code == G_KEY_FILE_ERROR_PARSE + || error->code == G_FILE_ERROR_NOENT)) + { + g_error_free (error); + error = NULL; + } + if (!error && katze_array_is_empty (search_engines)) + { + const gchar* const * config_dirs = g_get_system_config_dirs (); + i = 0; + while (config_dirs[i]) + { + g_object_unref (search_engines); + katze_assign (config_file, + g_build_filename (config_dirs[i], PACKAGE_NAME, "search", NULL)); + search_engines = search_engines_new_from_file (config_file, NULL); + if (!katze_array_is_empty (search_engines)) + break; + i++; + } + if (katze_array_is_empty (search_engines)) + { + g_object_unref (search_engines); + katze_assign (config_file, + g_build_filename (SYSCONFDIR, "xdg", PACKAGE_NAME, "search", NULL)); + search_engines = search_engines_new_from_file (config_file, NULL); + } + } + else if (error) + { + if (error->code != G_FILE_ERROR_NOENT) + g_string_append_printf (error_messages, + _("The search engines couldn't be loaded. %s\n"), + error->message); + g_error_free (error); + } + bookmarks = katze_array_new (KATZE_TYPE_ARRAY); + #if HAVE_LIBXML + katze_assign (config_file, build_config_filename ("bookmarks.xbel")); + error = NULL; + if (!midori_array_from_file (bookmarks, config_file, "xbel", &error)) + { + if (error->code != G_FILE_ERROR_NOENT) + g_string_append_printf (error_messages, + _("The bookmarks couldn't be loaded: %s\n"), error->message); + g_error_free (error); + } + #endif + _session = katze_array_new (KATZE_TYPE_ITEM); + #if HAVE_LIBXML + g_object_get (settings, "load-on-startup", &load_on_startup, NULL); + if (load_on_startup == MIDORI_STARTUP_LAST_OPEN_PAGES) + { + katze_assign (config_file, build_config_filename ("session.xbel")); + error = NULL; + if (!midori_array_from_file (_session, config_file, "xbel", &error)) + { + if (error->code != G_FILE_ERROR_NOENT) + g_string_append_printf (error_messages, + _("The session couldn't be loaded: %s\n"), error->message); + g_error_free (error); + } + } + #endif + trash = katze_array_new (KATZE_TYPE_ITEM); + #if HAVE_LIBXML + katze_assign (config_file, build_config_filename ("tabtrash.xbel")); + error = NULL; + if (!midori_array_from_file (trash, config_file, "xbel", &error)) + { + if (error->code != G_FILE_ERROR_NOENT) + g_string_append_printf (error_messages, + _("The trash couldn't be loaded: %s\n"), error->message); + g_error_free (error); + } + #endif + #if HAVE_SQLITE + katze_assign (config_file, build_config_filename ("history.db")); + #endif + history = katze_array_new (KATZE_TYPE_ARRAY); + #if HAVE_SQLITE + error = NULL; + if ((db = midori_history_initialize (history, config_file, &error)) == NULL) + { + g_string_append_printf (error_messages, + _("The history couldn't be loaded: %s\n"), error->message); + g_error_free (error); + } + #endif + + /* In case of errors */ + if (error_messages->len) + { + GdkScreen* screen; + GtkIconTheme* icon_theme; + GtkWidget* dialog = gtk_message_dialog_new ( + NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE, + _("The following errors occured:")); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE); + gtk_window_set_title (GTK_WINDOW (dialog), g_get_application_name ()); + screen = gtk_widget_get_screen (dialog); + if (screen) + { + icon_theme = gtk_icon_theme_get_for_screen (screen); + if (gtk_icon_theme_has_icon (icon_theme, "midori")) + gtk_window_set_icon_name (GTK_WINDOW (dialog), "midori"); + else + gtk_window_set_icon_name (GTK_WINDOW (dialog), "web-browser"); + } + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), "%s", error_messages->str); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + _("_Ignore"), GTK_RESPONSE_ACCEPT, + NULL); + if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT) + { + g_object_unref (settings); + g_object_unref (search_engines); + g_object_unref (bookmarks); + g_object_unref (_session); + g_object_unref (trash); + g_object_unref (history); + g_string_free (error_messages, TRUE); + return 0; + } + gtk_widget_destroy (dialog); + /* FIXME: Since we will overwrite files that could not be loaded + , would we want to make backups? */ + } + g_string_free (error_messages, TRUE); + + /* Open as many tabs as we have uris, seperated by pipes */ + i = 0; + while (uris && uris[i]) + { + uri = strtok (g_strdup (uris[i]), "|"); + while (uri != NULL) + { + item = katze_item_new (); + uri_ready = sokoke_magic_uri (uri, NULL); + katze_item_set_uri (item, uri_ready); + g_free (uri_ready); + katze_array_add_item (_session, item); + uri = strtok (NULL, "|"); + } + g_free (uri); + i++; + } + + katze_assign (config_file, build_config_filename ("config")); + if (is_writable (config_file)) + g_signal_connect_after (settings, "notify", + G_CALLBACK (settings_notify_cb), NULL); + + katze_assign (config_file, build_config_filename ("search")); + if (is_writable (config_file)) + { + g_signal_connect_after (search_engines, "add-item", + G_CALLBACK (midori_search_engines_modify_cb), search_engines); + g_signal_connect_after (search_engines, "remove-item", + G_CALLBACK (midori_search_engines_modify_cb), search_engines); + if (!katze_array_is_empty (search_engines)) + { + i = 0; + while ((item = katze_array_get_nth_item (search_engines, i++))) + g_signal_connect_after (item, "notify", + G_CALLBACK (midori_search_engines_modify_cb), search_engines); + } + } + katze_assign (config_file, build_config_filename ("bookmarks.xbel")); + if (is_writable (config_file)) + { + g_signal_connect_after (bookmarks, "add-item", + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); + g_signal_connect_after (bookmarks, "remove-item", + G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); + if (!katze_array_is_empty (bookmarks)) + { + i = 0; + while ((item = katze_array_get_nth_item (bookmarks, i++))) + { + if (KATZE_IS_ARRAY (item)) + { + g_signal_connect_after (item, "add-item", + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); + g_signal_connect_after (item, "remove-item", + G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); + } + g_signal_connect_after (item, "notify", + G_CALLBACK (midori_bookmarks_notify_item_cb), bookmarks); + } + } + } + katze_assign (config_file, build_config_filename ("tabtrash.xbel")); + if (is_writable (config_file)) + { + g_signal_connect_after (trash, "add-item", + G_CALLBACK (midori_trash_add_item_cb), NULL); + g_signal_connect_after (trash, "remove-item", + G_CALLBACK (midori_trash_remove_item_cb), NULL); + } + #if HAVE_SQLITE + katze_assign (config_file, build_config_filename ("history.db")); + if (is_writable (config_file)) + { + g_signal_connect_after (history, "add-item", + G_CALLBACK (midori_history_add_item_cb), db); + g_signal_connect_after (history, "clear", + G_CALLBACK (midori_history_clear_cb), db); + } + #endif + + /* We test for the presence of a dummy file which is created once + and deleted during normal runtime, but persists in case of a crash. */ + katze_assign (config_file, build_config_filename ("running")); + if (katze_object_get_boolean (settings, "show-crash-dialog") + && g_file_test (config_file, G_FILE_TEST_EXISTS)) + { + GtkWidget* dialog = midori_create_diagnostic_dialog (settings, _session); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } + else + g_file_set_contents (config_file, "RUNNING", -1, NULL); + g_signal_connect (app, "quit", G_CALLBACK (midori_app_quit_cb), NULL); + + g_object_set (app, "settings", settings, + "bookmarks", bookmarks, + "trash", trash, + "search-engines", search_engines, + "history", history, + NULL); + g_object_unref (history); + g_object_unref (search_engines); + g_object_unref (bookmarks); + g_object_unref (trash); + g_object_unref (settings); + g_signal_connect (app, "add-browser", + G_CALLBACK (midori_app_add_browser_cb), NULL); + + g_idle_add (midori_load_cookie_jar, settings); + g_idle_add (midori_load_extensions, app); + katze_item_set_parent (KATZE_ITEM (_session), app); + g_idle_add (midori_load_session, _session); + + gtk_main (); + + #if HAVE_HILDON + osso_deinitialize (osso_context); + #endif + + #if HAVE_SQLITE + settings = katze_object_get_object (app, "settings"); + g_object_get (settings, "maximum-history-age", &max_history_age, NULL); + g_object_unref (settings); + midori_history_terminate (db, max_history_age); + #endif + g_object_unref (app); + g_free (config_file); + return 0; +} diff --git a/midori/marshal.list b/midori/marshal.list new file mode 100644 index 00000000..825f9730 --- /dev/null +++ b/midori/marshal.list @@ -0,0 +1,6 @@ +BOOLEAN:OBJECT +BOOLEAN:VOID +VOID:BOOLEAN,STRING +VOID:OBJECT,ENUM +VOID:STRING,BOOLEAN +VOID:STRING,INT,STRING diff --git a/midori/midori-app.c b/midori/midori-app.c new file mode 100644 index 00000000..b753a64f --- /dev/null +++ b/midori/midori-app.c @@ -0,0 +1,785 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori-app.h" +#include "sokoke.h" + +#include +#include +#include + +#if HAVE_UNIQUE + #include +#endif + +struct _MidoriApp +{ + GObject parent_instance; + + MidoriBrowser* browser; + GtkAccelGroup* accel_group; + + gchar* name; + MidoriWebSettings* settings; + KatzeArray* bookmarks; + KatzeArray* trash; + KatzeArray* search_engines; + KatzeArray* history; + KatzeArray* extensions; + KatzeArray* browsers; + + gpointer instance; +}; + +struct _MidoriAppClass +{ + GObjectClass parent_class; + + /* Signals */ + void + (*add_browser) (MidoriApp* app, + MidoriBrowser* browser); + void + (*quit) (MidoriApp* app); +}; + +G_DEFINE_TYPE (MidoriApp, midori_app, G_TYPE_OBJECT) + +enum +{ + PROP_0, + + PROP_NAME, + PROP_SETTINGS, + PROP_BOOKMARKS, + PROP_TRASH, + PROP_SEARCH_ENGINES, + PROP_HISTORY, + PROP_EXTENSIONS, + PROP_BROWSERS, + PROP_BROWSER, + PROP_BROWSER_COUNT +}; + +enum { + ADD_BROWSER, + QUIT, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +midori_app_finalize (GObject* object); + +static void +midori_app_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_app_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static gboolean +midori_browser_focus_in_event_cb (MidoriBrowser* browser, + GdkEventFocus* event, + MidoriApp* app) +{ + app->browser = browser; + g_object_notify (G_OBJECT (app), "browser"); + return FALSE; +} + +static void +midori_browser_new_window_cb (MidoriBrowser* browser, + const gchar* uri, + MidoriApp* app) +{ + MidoriBrowser* new_browser = midori_app_create_browser (app); + midori_app_add_browser (app, new_browser); + + midori_browser_add_uri (new_browser, uri); + gtk_widget_show (GTK_WIDGET (new_browser)); +} + +static gboolean +midori_browser_delete_event_cb (MidoriBrowser* browser, + GdkEvent* event, + MidoriApp* app) +{ + return FALSE; +} + +static gboolean +midori_browser_destroy_cb (MidoriBrowser* browser, + MidoriApp* app) +{ + katze_array_remove_item (app->browsers, browser); + if (!katze_array_is_empty (app->browsers)) + return FALSE; + midori_app_quit (app); + return TRUE; +} + +static void +midori_browser_quit_cb (MidoriBrowser* browser, + MidoriApp* app) +{ + midori_app_quit (app); +} + +static void +_midori_app_add_browser (MidoriApp* app, + MidoriBrowser* browser) +{ + g_return_if_fail (MIDORI_IS_APP (app)); + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + + gtk_window_add_accel_group (GTK_WINDOW (browser), app->accel_group); + g_object_connect (browser, + "signal::focus-in-event", midori_browser_focus_in_event_cb, app, + "signal::new-window", midori_browser_new_window_cb, app, + "signal::delete-event", midori_browser_delete_event_cb, app, + "signal::destroy", midori_browser_destroy_cb, app, + "signal::quit", midori_browser_quit_cb, app, + NULL); + + katze_array_add_item (app->browsers, browser); + + #if HAVE_UNIQUE + if (app->instance) + unique_app_watch_window (app->instance, GTK_WINDOW (browser)); + #endif +} + +static void +_midori_app_quit (MidoriApp* app) +{ + gtk_main_quit (); +} + +static void +midori_app_class_init (MidoriAppClass* class) +{ + GObjectClass* gobject_class; + + signals[ADD_BROWSER] = g_signal_new ( + "add-browser", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriAppClass, add_browser), + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + MIDORI_TYPE_BROWSER); + + signals[QUIT] = g_signal_new ( + "quit", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriAppClass, quit), + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_app_finalize; + gobject_class->set_property = midori_app_set_property; + gobject_class->get_property = midori_app_get_property; + + class->add_browser = _midori_app_add_browser; + class->quit = _midori_app_quit; + + /** + * MidoriApp:name: + * + * The name of the instance. + * + * Since: 0.1.6 + */ + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ( + "name", + "Name", + "The name of the instance", + "midori", + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_SETTINGS, + g_param_spec_object ( + "settings", + "Settings", + "The associated settings", + MIDORI_TYPE_WEB_SETTINGS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_BOOKMARKS, + g_param_spec_object ( + "bookmarks", + "Bookmarks", + "The bookmarks folder, containing all bookmarks", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_TRASH, + g_param_spec_object ( + "trash", + "Trash", + "The trash, collecting recently closed tabs and windows", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_SEARCH_ENGINES, + g_param_spec_object ( + "search-engines", + "Search Engines", + "The list of search engines", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_HISTORY, + g_param_spec_object ( + "history", + "History", + "The list of history items", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_EXTENSIONS, + g_param_spec_object ( + "extensions", + "Extensions", + "The list of extensions", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriApp:browsers: + * + * The list of browsers. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_BROWSERS, + g_param_spec_object ( + "browsers", + "Browsers", + "The list of browsers", + KATZE_TYPE_ARRAY, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriApp:browser: + * + * The current browser, that is the one that was last used. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_BROWSER, + g_param_spec_object ( + "browser", + "Browser", + "The current browser", + MIDORI_TYPE_BROWSER, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriApp:browser-count: + * + * The number of browsers. + * + * Deprecated: 0.1.3 Use MidoriApp:browsers instead. + */ + g_object_class_install_property (gobject_class, + PROP_BROWSER_COUNT, + g_param_spec_uint ( + "browser-count", + "Browser Count", + "The current number of browsers", + 0, G_MAXUINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +#if HAVE_UNIQUE +static UniqueResponse +midori_browser_message_received_cb (UniqueApp* instance, + UniqueCommand command, + UniqueMessageData* message, + guint timestamp, + MidoriApp* app) +{ + UniqueResponse response; + MidoriBrowser* browser; + gchar** uris; + MidoriNewPage open_external_pages_in; + gboolean first; + + switch (command) + { + case UNIQUE_ACTIVATE: + gtk_window_set_screen (GTK_WINDOW (app->browser), + unique_message_data_get_screen (message)); + gtk_window_present (GTK_WINDOW (app->browser)); + response = UNIQUE_RESPONSE_OK; + break; + case UNIQUE_NEW: + browser = midori_app_create_browser (app); + midori_app_add_browser (app, browser); + /* FIXME: Should open the homepage according to settings */ + midori_browser_add_uri (browser, ""); + midori_browser_activate_action (browser, "Location"); + gtk_window_set_screen (GTK_WINDOW (app->browser), + unique_message_data_get_screen (message)); + gtk_widget_show (GTK_WIDGET (browser)); + response = UNIQUE_RESPONSE_OK; + break; + case UNIQUE_OPEN: + gtk_window_set_screen (GTK_WINDOW (app->browser), + unique_message_data_get_screen (message)); + gtk_window_present (GTK_WINDOW (app->browser)); + uris = unique_message_data_get_uris (message); + if (!uris) + response = UNIQUE_RESPONSE_FAIL; + else + { + g_object_get (app->settings, "open-external-pages-in", + &open_external_pages_in, NULL); + if (open_external_pages_in == MIDORI_NEW_PAGE_WINDOW) + { + browser = midori_app_create_browser (app); + midori_app_add_browser (app, browser); + gtk_window_set_screen (GTK_WINDOW (app->browser), + unique_message_data_get_screen (message)); + gtk_widget_show (GTK_WIDGET (browser)); + } + else + browser = app->browser; + first = (open_external_pages_in == MIDORI_NEW_PAGE_CURRENT); + while (*uris) + { + gchar* fixed_uri = sokoke_magic_uri (*uris, NULL); + if (first) + { + midori_browser_set_current_uri (browser, fixed_uri); + first = FALSE; + } + else + midori_browser_set_current_page (browser, + midori_browser_add_uri (browser, fixed_uri)); + g_free (fixed_uri); + uris++; + } + /* g_strfreev (uris); */ + response = UNIQUE_RESPONSE_OK; + } + break; + default: + response = UNIQUE_RESPONSE_FAIL; + break; + } + + return response; +} +#endif + +static gpointer +midori_app_create_instance (MidoriApp* app, + const gchar* name) +{ + #if HAVE_UNIQUE + gpointer instance; + GdkDisplay* display; + gchar* display_name; + gchar* instance_name; + guint i, n; + #endif + + if (!name) + name = "midori"; + + #if HAVE_UNIQUE + if (!(display = gdk_display_get_default ())) + return NULL; + + display_name = g_strdup (gdk_display_get_name (display)); + n = strlen (display_name); + for (i = 0; i < n; i++) + if (display_name[i] == ':' || display_name[i] == '.') + display_name[i] = '_'; + instance_name = g_strdup_printf ("de.twotoasts.%s_%s", name, display_name); + instance = unique_app_new (instance_name, NULL); + g_free (instance_name); + g_free (display_name); + g_signal_connect (instance, "message-received", + G_CALLBACK (midori_browser_message_received_cb), app); + return instance; + #else + return NULL; + #endif +} + +static void +midori_app_init (MidoriApp* app) +{ + app->accel_group = gtk_accel_group_new (); + + app->settings = NULL; + app->bookmarks = NULL; + app->trash = NULL; + app->search_engines = NULL; + app->history = NULL; + app->extensions = NULL; + app->browsers = katze_array_new (MIDORI_TYPE_BROWSER); + + app->instance = NULL; +} + +static void +midori_app_finalize (GObject* object) +{ + MidoriApp* app = MIDORI_APP (object); + + g_object_unref (app->accel_group); + + katze_assign (app->name, NULL); + katze_object_assign (app->settings, NULL); + katze_object_assign (app->bookmarks, NULL); + katze_object_assign (app->trash, NULL); + katze_object_assign (app->search_engines, NULL); + katze_object_assign (app->history, NULL); + katze_object_assign (app->extensions, NULL); + katze_object_assign (app->browsers, NULL); + + katze_object_assign (app->instance, NULL); + + G_OBJECT_CLASS (midori_app_parent_class)->finalize (object); +} + +static void +midori_app_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriApp* app = MIDORI_APP (object); + + switch (prop_id) + { + case PROP_NAME: + katze_assign (app->name, g_value_dup_string (value)); + break; + case PROP_SETTINGS: + katze_object_assign (app->settings, g_value_dup_object (value)); + /* FIXME: Propagate settings to all browsers */ + break; + case PROP_BOOKMARKS: + katze_object_assign (app->bookmarks, g_value_dup_object (value)); + /* FIXME: Propagate bookmarks to all browsers */ + break; + case PROP_TRASH: + katze_object_assign (app->trash, g_value_dup_object (value)); + /* FIXME: Propagate trash to all browsers */ + break; + case PROP_SEARCH_ENGINES: + katze_object_assign (app->search_engines, g_value_dup_object (value)); + /* FIXME: Propagate search engines to all browsers */ + break; + case PROP_HISTORY: + katze_object_assign (app->history, g_value_dup_object (value)); + /* FIXME: Propagate history to all browsers */ + break; + case PROP_EXTENSIONS: + katze_object_assign (app->extensions, g_value_dup_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_app_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriApp* app = MIDORI_APP (object); + + switch (prop_id) + { + case PROP_NAME: + g_value_set_string (value, app->name); + break; + case PROP_SETTINGS: + g_value_set_object (value, app->settings); + break; + case PROP_BOOKMARKS: + g_value_set_object (value, app->bookmarks); + break; + case PROP_TRASH: + g_value_set_object (value, app->trash); + break; + case PROP_SEARCH_ENGINES: + g_value_set_object (value, app->search_engines); + break; + case PROP_HISTORY: + g_value_set_object (value, app->history); + break; + case PROP_EXTENSIONS: + g_value_set_object (value, app->extensions); + break; + case PROP_BROWSERS: + g_value_set_object (value, app->browsers); + break; + case PROP_BROWSER: + g_value_set_object (value, app->browser); + break; + case PROP_BROWSER_COUNT: + g_value_set_uint (value, katze_array_get_length (app->browsers)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_app_new: + * + * Instantiates a new #MidoriApp singleton. + * + * Subsequent calls will ref the initial instance. + * + * Return value: a new #MidoriApp + **/ +MidoriApp* +midori_app_new (void) +{ + MidoriApp* app = g_object_new (MIDORI_TYPE_APP, + NULL); + + return app; +} + +/** + * midori_app_instance_is_running: + * @app: a #MidoriApp + * + * Determines whether an instance of Midori is + * already running on the default display. + * + * Use the "name" property if you want to run more + * than one instance. + * + * If Midori was built without single instance support + * this function will always return %FALSE. + * + * Return value: %TRUE if an instance is already running + **/ +gboolean +midori_app_instance_is_running (MidoriApp* app) +{ + g_return_val_if_fail (MIDORI_IS_APP (app), FALSE); + + #if HAVE_UNIQUE + if (!app->instance) + app->instance = midori_app_create_instance (app, app->name); + if (app->instance) + return unique_app_is_running (app->instance); + #endif + return FALSE; +} + +/** + * midori_app_instance_send_activate: + * @app: a #MidoriApp + * + * Sends a message to an instance of Midori already + * running on the default display, asking to activate it. + * + * Practically the current browser will be focussed. + * + * Return value: %TRUE if the message was sent successfully + **/ +gboolean +midori_app_instance_send_activate (MidoriApp* app) +{ + #if HAVE_UNIQUE + UniqueResponse response; + #endif + + /* g_return_val_if_fail (MIDORI_IS_APP (app), FALSE); */ + g_return_val_if_fail (midori_app_instance_is_running (app), FALSE); + + #if HAVE_UNIQUE + if (app->instance) + { + response = unique_app_send_message (app->instance, UNIQUE_ACTIVATE, NULL); + if (response == UNIQUE_RESPONSE_OK) + return TRUE; + } + #endif + return FALSE; +} + +/** + * midori_app_instance_send_new_browser: + * @app: a #MidoriApp + * + * Sends a message to an instance of Midori already + * running on the default display, asking to open a new browser. + * + * Return value: %TRUE if the message was sent successfully + **/ +gboolean +midori_app_instance_send_new_browser (MidoriApp* app) +{ + #if HAVE_UNIQUE + UniqueResponse response; + #endif + + /* g_return_val_if_fail (MIDORI_IS_APP (app), FALSE); */ + g_return_val_if_fail (midori_app_instance_is_running (app), FALSE); + + #if HAVE_UNIQUE + if (app->instance) + { + response = unique_app_send_message (app->instance, UNIQUE_NEW, NULL); + if (response == UNIQUE_RESPONSE_OK) + return TRUE; + } + #endif + return FALSE; +} + +/** + * midori_app_instance_send_uris: + * @app: a #MidoriApp + * @uris: a string vector of URIs + * + * Sends a message to an instance of Midori already + * running on the default display, asking to open @uris. + * + * The strings in @uris will each be opened in a new tab. + * + * Return value: %TRUE if the message was sent successfully + **/ +gboolean +midori_app_instance_send_uris (MidoriApp* app, + gchar** uris) +{ + #if HAVE_UNIQUE + UniqueMessageData* message; + UniqueResponse response; + #endif + + /* g_return_val_if_fail (MIDORI_IS_APP (app), FALSE); */ + g_return_val_if_fail (midori_app_instance_is_running (app), FALSE); + g_return_val_if_fail (uris != NULL, FALSE); + + #if HAVE_UNIQUE + if (app->instance) + { + message = unique_message_data_new (); + unique_message_data_set_uris (message, uris); + response = unique_app_send_message (app->instance, UNIQUE_OPEN, message); + unique_message_data_free (message); + if (response == UNIQUE_RESPONSE_OK) + return TRUE; + } + #endif + return FALSE; +} + +/** + * midori_app_add_browser: + * @app: a #MidoriApp + * @browser: a #MidoriBrowser + * + * Adds a #MidoriBrowser to the #MidoriApp. + * + * The app will take care of the browser's new-window and quit signals, as well + * as watch window closing so that the last closed window quits the app. + * Also the app watches focus changes to indicate the 'current' browser. + * + * Return value: a new #MidoriApp + **/ +void +midori_app_add_browser (MidoriApp* app, + MidoriBrowser* browser) +{ + g_return_if_fail (MIDORI_IS_APP (app)); + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + + g_signal_emit (app, signals[ADD_BROWSER], 0, browser); +} + +/** + * midori_app_create_browser: + * @app: a #MidoriApp + * + * Creates a #MidoriBrowser which inherits its settings, + * bookmarks, trash, search engines and history from @app. + * + * Return value: a new #MidoriBrowser + * + * Since: 1.0.2 + **/ +MidoriBrowser* +midori_app_create_browser (MidoriApp* app) +{ + g_return_val_if_fail (MIDORI_IS_APP (app), NULL); + + return g_object_new (MIDORI_TYPE_BROWSER, + "settings", app->settings, + "bookmarks", app->bookmarks, + "trash", app->trash, + "search-engines", app->search_engines, + "history", app->history, + NULL); +} + +/** + * midori_app_quit: + * @app: a #MidoriApp + * + * Quits the #MidoriApp singleton. + * + * Since 0.1.2 the "quit" signal is always emitted before quitting. + **/ +void +midori_app_quit (MidoriApp* app) +{ + g_return_if_fail (MIDORI_IS_APP (app)); + + g_signal_emit (app, signals[QUIT], 0); +} diff --git a/midori/midori-app.h b/midori/midori-app.h new file mode 100644 index 00000000..a2f197e9 --- /dev/null +++ b/midori/midori-app.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_APP_H__ +#define __MIDORI_APP_H__ + +#include + +#include "midori-browser.h" +#include "midori-websettings.h" + +G_BEGIN_DECLS + +#define MIDORI_TYPE_APP \ + (midori_app_get_type ()) +#define MIDORI_APP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_APP, MidoriApp)) +#define MIDORI_APP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_APP, MidoriAppClass)) +#define MIDORI_IS_APP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_APP)) +#define MIDORI_IS_APP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_APP)) +#define MIDORI_APP_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_APP, MidoriAppClass)) + +typedef struct _MidoriApp MidoriApp; +typedef struct _MidoriAppClass MidoriAppClass; + +GType +midori_app_get_type (void); + +MidoriApp* +midori_app_new (void); + +gboolean +midori_app_instance_is_running (MidoriApp* app); + +gboolean +midori_app_instance_send_activate (MidoriApp* app); + +gboolean +midori_app_instance_send_new_browser (MidoriApp* app); + +gboolean +midori_app_instance_send_uris (MidoriApp* app, + gchar** uris); + +void +midori_app_add_browser (MidoriApp* app, + MidoriBrowser* browser); + +MidoriBrowser* +midori_app_create_browser (MidoriApp* app); + +void +midori_app_quit (MidoriApp* app); + +G_END_DECLS + +#endif /* __MIDORI_APP_H__ */ diff --git a/midori/midori-array.c b/midori/midori-array.c new file mode 100644 index 00000000..af53f003 --- /dev/null +++ b/midori/midori-array.c @@ -0,0 +1,374 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include + +#if HAVE_CONFIG_H + #include +#endif + +#include + +#if HAVE_LIBXML + #include + #include +#endif + +#if HAVE_LIBXML +static KatzeItem* +katze_item_from_xmlNodePtr (xmlNodePtr cur) +{ + KatzeItem* item; + xmlChar* key; + + item = katze_item_new (); + key = xmlGetProp (cur, (xmlChar*)"href"); + katze_item_set_uri (item, (gchar*)key); + g_free (key); + + cur = cur->xmlChildrenNode; + while (cur) + { + if (!xmlStrcmp (cur->name, (const xmlChar*)"title")) + { + key = xmlNodeGetContent (cur); + katze_item_set_name (item, g_strstrip ((gchar*)key)); + g_free (key); + } + else if (!xmlStrcmp (cur->name, (const xmlChar*)"desc")) + { + key = xmlNodeGetContent (cur); + katze_item_set_text (item, g_strstrip ((gchar*)key)); + g_free (key); + } + cur = cur->next; + } + return item; +} + +/* Create an array from an xmlNodePtr */ +static KatzeArray* +katze_array_from_xmlNodePtr (xmlNodePtr cur) +{ + KatzeArray* array; + xmlChar* key; + KatzeItem* item; + + array = katze_array_new (KATZE_TYPE_ARRAY); + + key = xmlGetProp (cur, (xmlChar*)"folded"); + if (key) + { + /* if (!g_ascii_strncasecmp ((gchar*)key, "yes", 3)) + folder->folded = TRUE; + else if (!g_ascii_strncasecmp ((gchar*)key, "no", 2)) + folder->folded = FALSE; + else + g_warning ("XBEL: Unknown value for folded."); */ + xmlFree (key); + } + + cur = cur->xmlChildrenNode; + while (cur) + { + if (!xmlStrcmp (cur->name, (const xmlChar*)"title")) + { + key = xmlNodeGetContent (cur); + katze_item_set_name (KATZE_ITEM (array), g_strstrip ((gchar*)key)); + } + else if (!xmlStrcmp (cur->name, (const xmlChar*)"desc")) + { + key = xmlNodeGetContent (cur); + katze_item_set_text (KATZE_ITEM (array), g_strstrip ((gchar*)key)); + } + else if (!xmlStrcmp (cur->name, (const xmlChar*)"folder")) + { + item = (KatzeItem*)katze_array_from_xmlNodePtr (cur); + katze_array_add_item (array, item); + } + else if (!xmlStrcmp (cur->name, (const xmlChar*)"bookmark")) + { + item = katze_item_from_xmlNodePtr (cur); + katze_array_add_item (array, item); + } + else if (!xmlStrcmp (cur->name, (const xmlChar*)"separator")) + { + item = katze_item_new (); + katze_array_add_item (array, item); + } + cur = cur->next; + } + return array; +} + +/* Loads the contents from an xmlNodePtr into an array. */ +static gboolean +katze_array_from_xmlDocPtr (KatzeArray* array, + xmlDocPtr doc) +{ + xmlNodePtr cur; + xmlChar* version; + gchar* value; + KatzeItem* item; + + cur = xmlDocGetRootElement (doc); + version = xmlGetProp (cur, (xmlChar*)"version"); + if (xmlStrcmp (version, (xmlChar*)"1.0")) + g_warning ("XBEL version is not 1.0."); + xmlFree (version); + + value = (gchar*)xmlGetProp (cur, (xmlChar*)"title"); + katze_item_set_name (KATZE_ITEM (array), value); + g_free (value); + + value = (gchar*)xmlGetProp (cur, (xmlChar*)"desc"); + katze_item_set_text (KATZE_ITEM (array), value); + g_free (value); + + if ((cur = xmlDocGetRootElement (doc)) == NULL) + { + /* Empty document */ + return FALSE; + } + if (xmlStrcmp (cur->name, (const xmlChar*)"xbel")) + { + /* Wrong document kind */ + return FALSE; + } + cur = cur->xmlChildrenNode; + while (cur) + { + item = NULL; + if (!xmlStrcmp (cur->name, (const xmlChar*)"folder")) + item = (KatzeItem*)katze_array_from_xmlNodePtr (cur); + else if (!xmlStrcmp (cur->name, (const xmlChar*)"bookmark")) + item = katze_item_from_xmlNodePtr (cur); + else if (!xmlStrcmp (cur->name, (const xmlChar*)"separator")) + item = katze_item_new (); + /*else if (!xmlStrcmp (cur->name, (const xmlChar*)"info")) + item = katze_xbel_parse_info (xbel, cur);*/ + if (item) + katze_array_add_item (array, item); + cur = cur->next; + } + return TRUE; +} + +/** + * midori_array_from_file: + * @array: a #KatzeArray + * @filename: a filename to load from + * @format: the desired format + * @error: a #GError or %NULL + * + * Loads the contents of a file in the specified format. + * + * Return value: %TRUE on success, %FALSE otherwise + * + * Since: 0.1.6 + **/ +gboolean +midori_array_from_file (KatzeArray* array, + const gchar* filename, + const gchar* format, + GError** error) +{ + xmlDocPtr doc; + + g_return_val_if_fail (katze_array_is_a (array, KATZE_TYPE_ITEM), FALSE); + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (!g_strcmp0 (format, "xbel"), FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) + { + /* File doesn't exist */ + *error = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_NOENT, + _("File not found.")); + return FALSE; + } + + if ((doc = xmlParseFile (filename)) == NULL) + { + /* No valid xml or broken encoding */ + *error = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_FAILED, + _("Malformed document.")); + return FALSE; + } + + if (!katze_array_from_xmlDocPtr (array, doc)) + { + /* Parsing failed */ + xmlFreeDoc (doc); + *error = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_FAILED, + _("Malformed document.")); + return FALSE; + } + xmlFreeDoc (doc); + return TRUE; +} +#endif + +static gchar* +_simple_xml_element (const gchar* name, + const gchar* value) +{ + gchar* value_escaped; + gchar* markup; + + if (!value) + return g_strdup (""); + value_escaped = g_markup_escape_text (value, -1); + markup = g_strdup_printf ("<%s>%s\n", name, value_escaped, name); + g_free (value_escaped); + return markup; +} + +static gchar* +katze_item_to_data (KatzeItem* item) +{ + gchar* markup; + + g_return_val_if_fail (KATZE_IS_ITEM (item), NULL); + + markup = NULL; + if (KATZE_IS_ARRAY (item)) + { + GString* _markup = g_string_new (NULL); + guint i = 0; + KatzeItem* _item; + while ((_item = katze_array_get_nth_item (KATZE_ARRAY (item), i++))) + { + gchar* item_markup = katze_item_to_data (_item); + g_string_append (_markup, item_markup); + g_free (item_markup); + } + /* gchar* folded = item->folded ? NULL : g_strdup_printf (" folded=\"no\""); */ + gchar* title = _simple_xml_element ("title", katze_item_get_name (item)); + gchar* desc = _simple_xml_element ("desc", katze_item_get_text (item)); + markup = g_strdup_printf ("\n%s%s%s\n", + "" /* folded ? folded : "" */, + title, desc, + _markup->str); + g_string_free (_markup, TRUE); + /* g_free (folded); */ + g_free (title); + g_free (desc); + } + else if (katze_item_get_uri (item)) + { + gchar* href_escaped = g_markup_escape_text (katze_item_get_uri (item), -1); + gchar* href = g_strdup_printf (" href=\"%s\"", href_escaped); + g_free (href_escaped); + gchar* title = _simple_xml_element ("title", katze_item_get_name (item)); + gchar* desc = _simple_xml_element ("desc", katze_item_get_text (item)); + markup = g_strdup_printf ("\n%s%s%s\n", + href, + title, desc, + ""); + g_free (href); + g_free (title); + g_free (desc); + } + else + markup = g_strdup ("\n"); + return markup; +} + +static gchar* +katze_array_to_xbel (KatzeArray* array, + GError** error) +{ + GString* inner_markup; + guint i; + KatzeItem* item; + gchar* item_xml; + gchar* title; + gchar* desc; + gchar* outer_markup; + + inner_markup = g_string_new (NULL); + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + { + item_xml = katze_item_to_data (item); + g_string_append (inner_markup, item_xml); + g_free (item_xml); + } + + title = _simple_xml_element ("title", katze_item_get_name (KATZE_ITEM (array))); + desc = _simple_xml_element ("desc", katze_item_get_text (KATZE_ITEM (array))); + outer_markup = g_strdup_printf ( + "%s%s\n%s%s%s\n", + "\n", + "\n", + title, + desc, + inner_markup->str); + g_string_free (inner_markup, TRUE); + g_free (title); + g_free (desc); + + return outer_markup; +} + +static gboolean +midori_array_to_file_xbel (KatzeArray* array, + const gchar* filename, + GError** error) +{ + gchar* data; + FILE* fp; + + if (!(data = katze_array_to_xbel (array, error))) + return FALSE; + if (!(fp = fopen (filename, "w"))) + { + *error = g_error_new_literal (G_FILE_ERROR, G_FILE_ERROR_ACCES, + _("Writing failed.")); + return FALSE; + } + fputs (data, fp); + fclose (fp); + g_free (data); + return TRUE; +} + +/** + * midori_array_to_file: + * @array: a #KatzeArray + * @filename: a filename to load from + * @format: the desired format + * @error: a #GError or %NULL + * + * Saves the contents to a file in the specified format. + * + * Return value: %TRUE on success, %FALSE otherwise + * + * Since: 0.1.6 + **/ +gboolean +midori_array_to_file (KatzeArray* array, + const gchar* filename, + const gchar* format, + GError** error) +{ + g_return_val_if_fail (katze_array_is_a (array, KATZE_TYPE_ITEM), FALSE); + g_return_val_if_fail (filename, FALSE); + g_return_val_if_fail (!error || !*error, FALSE); + + if (!g_strcmp0 (format, "xbel")) + return midori_array_to_file_xbel (array, filename, error); + g_critical ("Cannot write KatzeArray to unknown format '%s'.", format); + return FALSE; +} diff --git a/midori/midori-array.h b/midori/midori-array.h new file mode 100644 index 00000000..a41936a3 --- /dev/null +++ b/midori/midori-array.h @@ -0,0 +1,29 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_ARRAY_H__ +#define __MIDORI_ARRAY_H__ 1 + +#include + +gboolean +midori_array_from_file (KatzeArray* array, + const gchar* filename, + const gchar* format, + GError** error); + +gboolean +midori_array_to_file (KatzeArray* array, + const gchar* filename, + const gchar* format, + GError** error); + +#endif /* !__MIDORI_ARRAY_H__ */ diff --git a/midori/midori-browser.c b/midori/midori-browser.c new file mode 100644 index 00000000..32fd16ec --- /dev/null +++ b/midori/midori-browser.c @@ -0,0 +1,5234 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + Copyright (C) 2008 Dale Whittaker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori-browser.h" + +#include "midori-view.h" +#include "midori-preferences.h" +#include "midori-panel.h" +#include "midori-locationaction.h" +#include "midori-searchaction.h" +#include "midori-stock.h" + +#include "gtkiconentry.h" +#include "compat.h" +#include "sokoke.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H + #include +#endif + +struct _MidoriBrowser +{ + #if HAVE_HILDON + HildonWindow parent_instance; + #else + GtkWindow parent_instance; + #endif + + GtkActionGroup* action_group; + GtkWidget* menubar; + GtkWidget* menu_tools; + GtkWidget* throbber; + GtkWidget* navigationbar; + GtkWidget* button_fullscreen; + GtkWidget* bookmarkbar; + + GtkWidget* panel; + GtkWidget* notebook; + + GtkWidget* inspector; + GtkWidget* inspector_view; + + GtkWidget* find; + GtkWidget* find_text; + GtkToolItem* find_case; + GtkToolItem* find_highlight; + GtkToolItem* find_close; + gboolean find_typing; + + GtkWidget* statusbar; + GtkWidget* transferbar; + GtkWidget* transferbar_clear; + GtkWidget* progressbar; + gchar* statusbar_text; + + guint alloc_timeout; + guint panel_timeout; + + MidoriWebSettings* settings; + KatzeArray* proxy_array; + KatzeArray* bookmarks; + KatzeArray* trash; + KatzeArray* search_engines; + KatzeArray* history; + + KatzeNet* net; + + gboolean show_navigationbar; + gboolean show_statusbar; + gboolean progress_in_location; + gboolean remember_last_visited_pages; + gchar* location_entry_search; + gchar* news_aggregator; +}; + +#if HAVE_HILDON +G_DEFINE_TYPE (MidoriBrowser, midori_browser, HILDON_TYPE_WINDOW) +#else +G_DEFINE_TYPE (MidoriBrowser, midori_browser, GTK_TYPE_WINDOW) +#endif + +enum +{ + PROP_0, + + PROP_MENUBAR, + PROP_NAVIGATIONBAR, + PROP_NOTEBOOK, + PROP_PANEL, + PROP_URI, + PROP_TAB, + PROP_LOAD_STATUS, + PROP_STATUSBAR, + PROP_STATUSBAR_TEXT, + PROP_SETTINGS, + PROP_BOOKMARKS, + PROP_TRASH, + PROP_SEARCH_ENGINES, + PROP_HISTORY +}; + +enum +{ + NEW_WINDOW, + ADD_TAB, + REMOVE_TAB, + ACTIVATE_ACTION, + CONTEXT_READY, + ADD_DOWNLOAD, + QUIT, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +midori_browser_dispose (GObject* object); + +static void +midori_browser_finalize (GObject* object); + +static void +midori_browser_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_browser_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_browser_new_history_item (MidoriBrowser* browser, + KatzeItem* item); + +static GtkAction* +_action_by_name (MidoriBrowser* browser, + const gchar* name) +{ + return gtk_action_group_get_action (browser->action_group, name); +} + +static void +_action_set_sensitive (MidoriBrowser* browser, + const gchar* name, + gboolean sensitive) +{ + gtk_action_set_sensitive (_action_by_name (browser, name), sensitive); +} + +static void +_action_set_active (MidoriBrowser* browser, + const gchar* name, + gboolean active) +{ + GtkAction* action = _action_by_name (browser, name); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active); +} + +static void +_toggle_tabbar_smartly (MidoriBrowser* browser) +{ + guint n; + gboolean always_show_tabbar; + + n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)); + if (n < 2 && browser->settings) + { + g_object_get (browser->settings, "always-show-tabbar", + &always_show_tabbar, NULL); + if (always_show_tabbar) + n++; + } + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), n > 1); +} + +static void +_midori_browser_update_actions (MidoriBrowser* browser) +{ + guint n; + gboolean trash_empty; + + _toggle_tabbar_smartly (browser); + n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)); + _action_set_sensitive (browser, "TabClose", n > 1); + _action_set_sensitive (browser, "TabPrevious", n > 1); + _action_set_sensitive (browser, "TabNext", n > 1); + + if (browser->trash) + { + trash_empty = katze_array_is_empty (browser->trash); + _action_set_sensitive (browser, "UndoTabClose", !trash_empty); + _action_set_sensitive (browser, "Trash", !trash_empty); + } +} + +static gboolean +midori_browser_view_can_set_encoding (MidoriView* view) +{ + static GParamSpec* pspec = NULL; + if (G_UNLIKELY (!pspec)) + pspec = g_object_class_find_property ( + g_type_class_peek (WEBKIT_TYPE_WEB_VIEW), "custom-encoding"); + /* Web views and zoom, source views can't, so zoom means encoding */ + return pspec && midori_view_can_zoom_in (view); +} + +static void +_midori_browser_update_interface (MidoriBrowser* browser) +{ + GtkWidget* view; + gboolean loading; + gboolean can_reload; + GtkAction* action; + + view = midori_browser_get_current_tab (browser); + loading = midori_view_get_load_status (MIDORI_VIEW (view)) + != MIDORI_LOAD_FINISHED; + can_reload = midori_view_can_reload (MIDORI_VIEW (view)); + + _action_set_sensitive (browser, "Reload", can_reload && !loading); + _action_set_sensitive (browser, "Stop", can_reload && loading); + _action_set_sensitive (browser, "Back", + midori_view_can_go_back (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "Forward", + midori_view_can_go_forward (MIDORI_VIEW (view))); + + /* Currently views that don't support source, don't support + saving either. If that changes, we need to think of something. */ + _action_set_sensitive (browser, "SaveAs", + midori_view_can_view_source (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "Print", + midori_view_can_print (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "ZoomIn", + midori_view_can_zoom_in (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "ZoomOut", + midori_view_can_zoom_out (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "ZoomNormal", + midori_view_get_zoom_level (MIDORI_VIEW (view)) != 1.0f); + _action_set_sensitive (browser, "Encoding", + midori_browser_view_can_set_encoding (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "SourceView", + midori_view_can_view_source (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "Find", + midori_view_can_find (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "FindNext", + midori_view_can_find (MIDORI_VIEW (view))); + _action_set_sensitive (browser, "FindPrevious", + midori_view_can_find (MIDORI_VIEW (view))); + /* _action_set_sensitive (browser, "FindQuick", + midori_view_can_find (MIDORI_VIEW (view))); */ + gtk_widget_set_sensitive (GTK_WIDGET (browser->find_highlight), + midori_view_can_find (MIDORI_VIEW (view))); + + action = gtk_action_group_get_action (browser->action_group, "ReloadStop"); + if (!loading) + { + gtk_widget_set_sensitive (browser->throbber, FALSE); + g_object_set (action, + "stock-id", GTK_STOCK_REFRESH, + "tooltip", _("Reload the current page"), + "sensitive", can_reload, NULL); + gtk_widget_hide (browser->progressbar); + if (!browser->show_navigationbar && !browser->show_statusbar) + gtk_widget_hide (browser->navigationbar); + } + else + { + gtk_widget_set_sensitive (browser->throbber, TRUE); + g_object_set (action, + "stock-id", GTK_STOCK_STOP, + "tooltip", _("Stop loading the current page"), NULL); + if (!browser->progress_in_location || !GTK_WIDGET_VISIBLE (browser->navigationbar)) + gtk_widget_show (browser->progressbar); + if (!GTK_WIDGET_VISIBLE (browser->statusbar) && + !GTK_WIDGET_VISIBLE (browser->navigationbar) && + browser->progress_in_location) + gtk_widget_show (browser->navigationbar); + if (browser->progress_in_location) + { + action = _action_by_name (browser, "Location"); + midori_location_action_set_progress (MIDORI_LOCATION_ACTION (action), + midori_view_get_progress (MIDORI_VIEW (view))); + } + } + katze_throbber_set_animated (KATZE_THROBBER (browser->throbber), loading); + + action = _action_by_name (browser, "Location"); + if (browser->news_aggregator && *browser->news_aggregator + && g_object_get_data (G_OBJECT (view), "news-feeds")) + midori_location_action_set_secondary_icon ( + MIDORI_LOCATION_ACTION (action), STOCK_NEWS_FEED); + else + midori_location_action_set_secondary_icon ( + MIDORI_LOCATION_ACTION (action), GTK_STOCK_INFO); +} + +static void +_midori_browser_set_statusbar_text (MidoriBrowser* browser, + const gchar* text) +{ + katze_assign (browser->statusbar_text, g_strdup (text)); + gtk_statusbar_pop (GTK_STATUSBAR (browser->statusbar), 1); + gtk_statusbar_push (GTK_STATUSBAR (browser->statusbar), 1, + browser->statusbar_text ? browser->statusbar_text : ""); +} + +static void +_midori_browser_set_current_page_smartly (MidoriBrowser* browser, + gint n) +{ + if (!katze_object_get_boolean (browser->settings, + "open-tabs-in-the-background")) + midori_browser_set_current_page (browser, n); +} + +static void +_midori_browser_update_progress (MidoriBrowser* browser, + MidoriView* view) +{ + MidoriLocationAction* action; + gdouble progress; + gchar* message; + + action = MIDORI_LOCATION_ACTION (_action_by_name (browser, "Location")); + progress = midori_view_get_progress (view); + /* When we are finished, we don't want to *see* progress anymore */ + if (midori_view_get_load_status (view) == MIDORI_LOAD_FINISHED) + progress = 0.0; + if (progress > 0.0) + { + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (browser->progressbar), + progress); + message = g_strdup_printf (_("%d%% loaded"), (gint)(progress * 100)); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (browser->progressbar), + message); + g_free (message); + if (!browser->progress_in_location) + progress = 0.0; + midori_location_action_set_progress (action, progress); + } + else + { + gtk_progress_bar_pulse (GTK_PROGRESS_BAR (browser->progressbar)); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (browser->progressbar), + NULL); + midori_location_action_set_progress (action, 0.0); + } +} + +static void +_midori_browser_activate_action (MidoriBrowser* browser, + const gchar* name) +{ + GtkAction* action = _action_by_name (browser, name); + if (action) + gtk_action_activate (action); + else + g_warning (_("Unexpected action '%s'."), name); +} + +static void +midori_view_notify_icon_cb (MidoriView* view, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + const gchar* uri; + GtkAction* action; + + uri = midori_view_get_display_uri (MIDORI_VIEW (view)); + action = _action_by_name (browser, "Location"); + if (browser->remember_last_visited_pages) + midori_location_action_set_icon_for_uri ( + MIDORI_LOCATION_ACTION (action), midori_view_get_icon (view), uri); +} + +static void +midori_view_notify_load_status_cb (GtkWidget* view, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + const gchar* uri; + GtkAction* action; + + uri = midori_view_get_display_uri (MIDORI_VIEW (view)); + action = _action_by_name (browser, "Location"); + + if (midori_view_get_load_status (MIDORI_VIEW (view)) + == MIDORI_LOAD_COMMITTED) + { + if (browser->remember_last_visited_pages) + midori_location_action_add_uri (MIDORI_LOCATION_ACTION (action), uri); + } + + if (view == midori_browser_get_current_tab (browser)) + { + if (midori_view_get_load_status (MIDORI_VIEW (view)) + == MIDORI_LOAD_COMMITTED) + { + midori_location_action_set_uri ( + MIDORI_LOCATION_ACTION (action), uri); + midori_location_action_set_secondary_icon ( + MIDORI_LOCATION_ACTION (action), GTK_STOCK_INFO); + g_object_notify (G_OBJECT (browser), "uri"); + } + + _midori_browser_update_interface (browser); + _midori_browser_set_statusbar_text (browser, NULL); + } + + g_object_notify (G_OBJECT (browser), "load-status"); +} + +static void +midori_view_notify_progress_cb (GtkWidget* view, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + if (view == midori_browser_get_current_tab (browser)) + _midori_browser_update_progress (browser, MIDORI_VIEW (view)); +} + +static void +midori_view_context_ready_cb (GtkWidget* view, + JSContextRef js_context, + MidoriBrowser* browser) +{ + g_signal_emit (browser, signals[CONTEXT_READY], 0, js_context); +} + +static void +midori_view_notify_title_cb (GtkWidget* view, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + const gchar* uri; + const gchar* title; + GtkAction* action; + gchar* window_title; + + uri = midori_view_get_display_uri (MIDORI_VIEW (view)); + title = midori_view_get_display_title (MIDORI_VIEW (view)); + action = _action_by_name (browser, "Location"); + if (browser->remember_last_visited_pages) + midori_location_action_set_title_for_uri ( + MIDORI_LOCATION_ACTION (action), title, uri); + if (midori_view_get_load_status (MIDORI_VIEW (view)) == MIDORI_LOAD_COMMITTED) + { + KatzeItem* item; + KatzeItem* proxy; + + if (browser->history && browser->remember_last_visited_pages) + { + item = g_object_get_data (G_OBJECT (view), "history-item-added"); + proxy = midori_view_get_proxy_item (MIDORI_VIEW (view)); + if (item && katze_item_get_added (item) == katze_item_get_added (proxy)) + katze_item_set_name (item, katze_item_get_name (proxy)); + else + { + katze_object_assign (item, katze_item_copy (proxy)); + midori_browser_new_history_item (browser, g_object_ref (item)); + g_object_set_data_full (G_OBJECT (view), "history-item-added", + item, (GDestroyNotify)g_object_unref); + } + } + } + + if (view == midori_browser_get_current_tab (browser)) + { + window_title = g_strconcat (title, " - ", + g_get_application_name (), NULL); + gtk_window_set_title (GTK_WINDOW (browser), window_title); + g_free (window_title); + } +} + +static void +midori_view_notify_zoom_level_cb (GtkWidget* view, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + if (view == midori_browser_get_current_tab (browser)) + _action_set_sensitive (browser, "ZoomNormal", + midori_view_get_zoom_level (MIDORI_VIEW (view)) != 1.0f); +} + +static void +midori_view_notify_statusbar_text_cb (MidoriView* view, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + gchar* text; + + g_object_get (view, "statusbar-text", &text, NULL); + _midori_browser_set_statusbar_text (browser, text); + g_free (text); +} + +/* Private function, used by MidoriBookmarks and MidoriHistory */ +/* static */ void +midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser, + KatzeItem* bookmark, + gboolean new_bookmark, + gboolean is_folder) +{ + const gchar* title; + GtkWidget* dialog; + GtkSizeGroup* sizegroup; + GtkWidget* view; + GtkWidget* hbox; + GtkWidget* label; + const gchar* value; + GtkWidget* entry_title; + GtkWidget* entry_desc; + GtkWidget* entry_uri; + GtkWidget* combo_folder; + + if (!browser->bookmarks || !GTK_WIDGET_VISIBLE (browser)) + return; + + if (is_folder) + title = new_bookmark ? _("New folder") : _("Edit folder"); + else + title = new_bookmark ? _("New bookmark") : _("Edit bookmark"); + dialog = gtk_dialog_new_with_buttons ( + title, GTK_WINDOW (browser), + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + new_bookmark ? GTK_STOCK_ADD : GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_icon_name (GTK_WINDOW (dialog), + new_bookmark ? GTK_STOCK_ADD : GTK_STOCK_REMOVE); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5); + sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + if (!bookmark) + { + view = midori_browser_get_current_tab (browser); + if (is_folder) + { + bookmark = (KatzeItem*)katze_array_new (KATZE_TYPE_ARRAY); + katze_item_set_name (bookmark, + midori_view_get_display_title (MIDORI_VIEW (view))); + } + else + bookmark = g_object_new (KATZE_TYPE_ITEM, + "uri", midori_view_get_display_uri (MIDORI_VIEW (view)), + "name", midori_view_get_display_title (MIDORI_VIEW (view)), NULL); + } + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Title:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_title = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_title), TRUE); + value = katze_item_get_name (bookmark); + gtk_entry_set_text (GTK_ENTRY (entry_title), value ? value : ""); + gtk_box_pack_start (GTK_BOX (hbox), entry_title, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Description:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_desc = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_desc), TRUE); + if (bookmark) + { + value = katze_item_get_text (bookmark); + gtk_entry_set_text (GTK_ENTRY (entry_desc), value ? value : ""); + } + gtk_box_pack_start (GTK_BOX (hbox), entry_desc, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + entry_uri = NULL; + if (!KATZE_IS_ARRAY (bookmark)) + { + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Address:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_uri = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_uri), TRUE); + gtk_entry_set_text (GTK_ENTRY (entry_uri), katze_item_get_uri (bookmark)); + gtk_box_pack_start (GTK_BOX (hbox), entry_uri, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + } + + combo_folder = NULL; + if (1) + { + KatzeItem* item; + guint i, n; + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Folder:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + combo_folder = gtk_combo_box_new_text (); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_folder), + _("Toplevel folder")); + gtk_combo_box_set_active (GTK_COMBO_BOX (combo_folder), 0); + + i = 0; + n = 1; + while ((item = katze_array_get_nth_item (browser->bookmarks, i++))) + { + if (KATZE_IS_ARRAY (item)) + { + const gchar* name = katze_item_get_name (item); + gtk_combo_box_append_text (GTK_COMBO_BOX (combo_folder), name); + if (katze_item_get_parent (bookmark) == item) + gtk_combo_box_set_active (GTK_COMBO_BOX (combo_folder), n); + n++; + } + } + if (!i) + gtk_widget_set_sensitive (combo_folder, FALSE); + gtk_box_pack_start (GTK_BOX (hbox), combo_folder, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + } + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + gchar* selected; + KatzeArray* folder; + + katze_item_set_name (bookmark, + gtk_entry_get_text (GTK_ENTRY (entry_title))); + katze_item_set_text (bookmark, + gtk_entry_get_text (GTK_ENTRY (entry_desc))); + if (!KATZE_IS_ARRAY (bookmark)) + katze_item_set_uri (bookmark, + gtk_entry_get_text (GTK_ENTRY (entry_uri))); + + folder = browser->bookmarks; + if (1) + { + selected = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo_folder)); + if (g_strcmp0 (selected, _("Toplevel folder"))) + { + guint i = 0; + KatzeItem* item; + while ((item = katze_array_get_nth_item (browser->bookmarks, i++))) + if (KATZE_IS_ARRAY (item)) + if (!g_strcmp0 (katze_item_get_name (item), selected)) + { + folder = KATZE_ARRAY (item); + break; + } + } + g_free (selected); + if (!new_bookmark) + katze_array_remove_item (katze_item_get_parent (bookmark), bookmark); + katze_array_add_item (folder, bookmark); + } + } + gtk_widget_destroy (dialog); +} + +static void +midori_view_add_bookmark_cb (GtkWidget* menuitem, + const gchar* uri, + GtkWidget* view) +{ + KatzeItem* item; + MidoriBrowser* browser; + + item = katze_item_new (); + katze_item_set_uri (item, uri); + browser = (MidoriBrowser*)gtk_widget_get_toplevel (menuitem); + midori_browser_edit_bookmark_dialog_new (browser, item, FALSE, FALSE); +} + +static void +midori_browser_save_transfer_cb (KatzeNetRequest* request, + gchar* filename) +{ + FILE* fp; + size_t ret; + + if (request->data) + { + if ((fp = fopen (filename, "wb"))) + { + ret = fwrite (request->data, 1, request->length, fp); + fclose (fp); + if ((ret - request->length) != 0) + { + /* Once we have a download interface this should be + indicated graphically. */ + g_warning ("Error writing to file %s " + "in midori_browser_save_transfer_cb", filename); + } + } + } + g_free (filename); +} + +static void +midori_browser_save_uri (MidoriBrowser* browser, + const gchar* uri) +{ + static gchar* last_dir = NULL; + gboolean folder_set = FALSE; + GtkWidget* dialog; + gchar* filename; + gchar* dirname; + gchar* last_slash; + gchar* folder; + + if (!GTK_WIDGET_VISIBLE (browser)) + return; + + dialog = gtk_file_chooser_dialog_new ( + _("Save file as"), GTK_WINDOW (browser), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_SAVE); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (browser)); + + if (uri) + { + /* Base the start folder on the current view's uri if it is local */ + filename = g_filename_from_uri (uri, NULL, NULL); + if (filename) + { + dirname = g_path_get_dirname (filename); + if (dirname && g_file_test (dirname, G_FILE_TEST_IS_DIR)) + { + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), dirname); + folder_set = TRUE; + } + + g_free (dirname); + g_free (filename); + } + + /* Try to provide a good default filename */ + filename = g_filename_from_uri (uri, NULL, NULL); + if (!filename && (last_slash = g_strrstr (uri, "/"))) + { + if (last_slash[0] == '/') + last_slash++; + filename = g_strdup (last_slash); + } + else + filename = g_strdup (uri); + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), filename); + g_free (filename); + } + + if (!folder_set && last_dir && *last_dir) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), last_dir); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)); + katze_net_load_uri (browser->net, uri, NULL, + (KatzeNetTransferCb)midori_browser_save_transfer_cb, filename); + + g_free (last_dir); + last_dir = folder; + } + gtk_widget_destroy (dialog); +} + +static void +midori_view_save_as_cb (GtkWidget* menuitem, + const gchar* uri, + GtkWidget* view) +{ + MidoriBrowser* browser; + + browser = (MidoriBrowser*)gtk_widget_get_toplevel (menuitem); + midori_browser_save_uri (browser, uri); +} + +static gboolean +midori_browser_tab_leave_notify_event_cb (GtkWidget* widget, + GdkEventCrossing* event, + MidoriBrowser* browser) +{ + _midori_browser_set_statusbar_text (browser, NULL); + return TRUE; +} + +static void +midori_view_activate_action_cb (GtkWidget* view, + const gchar* action, + MidoriBrowser* browser) +{ + _midori_browser_activate_action (browser, action); +} + +static void +midori_view_attach_inspector_cb (GtkWidget* view, + GtkWidget* inspector_view, + MidoriBrowser* browser) +{ + GtkWidget* scrolled = gtk_widget_get_parent (browser->inspector_view); + gtk_container_remove (GTK_CONTAINER (scrolled), browser->inspector_view); + gtk_container_add (GTK_CONTAINER (scrolled), inspector_view); + browser->inspector_view = inspector_view; +} + +static void +midori_view_new_tab_cb (GtkWidget* view, + const gchar* uri, + gboolean background, + MidoriBrowser* browser) +{ + gint n = midori_browser_add_uri (browser, uri); + if (!background) + midori_browser_set_current_page (browser, n); +} + +static void +midori_view_new_window_cb (GtkWidget* view, + const gchar* uri, + MidoriBrowser* browser) +{ + g_signal_emit (browser, signals[NEW_WINDOW], 0, uri); +} + +static void +midori_view_new_view_cb (GtkWidget* view, + GtkWidget* new_view, + MidoriNewView where, + MidoriBrowser* browser) +{ + if (where == MIDORI_NEW_VIEW_WINDOW) + { + /* MidoriBrowser* new_browser = g_object_new (MIDORI_TYPE_BROWSER, + NULL); + g_signal_emit (browser, signals[NEW_BROWSER], 0, new_browser); */ + g_debug ("Opening all pages in new windows not implemented"); + midori_browser_set_current_page (browser, + midori_browser_add_tab (browser, new_view)); + } + else + { + gint n = midori_browser_add_tab (browser, new_view); + if (where != MIDORI_NEW_VIEW_BACKGROUND) + midori_browser_set_current_page (browser, n); + } +} + +#if WEBKIT_CHECK_VERSION (1, 1, 3) +static void +midori_browser_download_notify_progress_cb (WebKitDownload* download, + GParamSpec* pspec, + GtkWidget* progress) +{ + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), + webkit_download_get_progress (download)); +} + +static void +midori_browser_download_notify_status_cb (WebKitDownload* download, + GParamSpec* pspec, + GtkWidget* button) +{ + GtkWidget* icon; + + switch (webkit_download_get_status (download)) + { + case WEBKIT_DOWNLOAD_STATUS_FINISHED: + icon = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); + gtk_button_set_image (GTK_BUTTON (button), icon); + if (g_object_get_data (G_OBJECT (download), "open-download")) + gtk_button_clicked (GTK_BUTTON (button)); + else + g_object_set_data (G_OBJECT (gtk_widget_get_parent (button)), + "done", (void*)1); + break; + case WEBKIT_DOWNLOAD_STATUS_CANCELLED: + case WEBKIT_DOWNLOAD_STATUS_ERROR: + icon = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU); + gtk_button_set_image (GTK_BUTTON (button), icon); + g_object_set_data (G_OBJECT (gtk_widget_get_parent (button)), + "done", (void*)1); + break; + default: + break; + } +} + +static void +midori_browser_download_button_clicked_cb (GtkWidget* button, + WebKitDownload* download) +{ + MidoriBrowser* browser; + GList* buttons; + + browser = MIDORI_BROWSER (gtk_widget_get_toplevel (button)); + + switch (webkit_download_get_status (download)) + { + case WEBKIT_DOWNLOAD_STATUS_STARTED: + webkit_download_cancel (download); + g_object_set_data (G_OBJECT (gtk_widget_get_parent (button)), + "done", (void*)1); + break; + case WEBKIT_DOWNLOAD_STATUS_FINISHED: + { + const gchar* uri = webkit_download_get_destination_uri (download); + gboolean success = gtk_show_uri (gtk_widget_get_screen (button), + uri, gtk_get_current_event_time (), NULL); + if (!success) + { + gchar* command = g_strconcat ("exo-open ", uri, NULL); + success = g_spawn_command_line_async (command, NULL); + g_free (command); + } + if (success) + gtk_widget_destroy (gtk_widget_get_parent (button)); + break; + } + case WEBKIT_DOWNLOAD_STATUS_CANCELLED: + gtk_widget_destroy (gtk_widget_get_parent (button)); + default: + break; + } + + buttons = gtk_container_get_children (GTK_CONTAINER (browser->transferbar)); + if (g_list_length (buttons) == 1) + gtk_widget_hide (browser->transferbar_clear); + g_list_free (buttons); +} + +static void +midori_browser_add_download_item (MidoriBrowser* browser, + WebKitDownload* download) +{ + GtkWidget* box; + GtkWidget* icon; + GtkWidget* button; + GtkWidget* progress; + gint width; + + box = gtk_hbox_new (FALSE, 0); + /* icon = gtk_image_new_from_stock (STOCK_TRANSFER, GTK_ICON_SIZE_MENU); + gtk_box_pack_start (GTK_BOX (box), icon, FALSE, FALSE, 0); */ + progress = gtk_progress_bar_new (); + gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (progress), + PANGO_ELLIPSIZE_MIDDLE); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress), + webkit_download_get_suggested_filename (download)); + sokoke_widget_get_text_size (progress, "M", &width, NULL); + gtk_widget_set_size_request (progress, width * 10, -1); + /* Avoid a bug in WebKit */ + if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_CREATED) + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), + webkit_download_get_progress (download)); + gtk_box_pack_start (GTK_BOX (box), progress, FALSE, FALSE, 0); + icon = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU); + button = gtk_button_new (); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); + gtk_container_add (GTK_CONTAINER (button), icon); + gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); + gtk_widget_show_all (box); + gtk_box_pack_start (GTK_BOX (browser->transferbar), box, FALSE, FALSE, 0); + gtk_widget_show (browser->transferbar_clear); + + g_signal_connect (download, "notify::progress", + G_CALLBACK (midori_browser_download_notify_progress_cb), progress); + g_signal_connect (download, "notify::status", + G_CALLBACK (midori_browser_download_notify_status_cb), button); + g_signal_connect (button, "clicked", + G_CALLBACK (midori_browser_download_button_clicked_cb), download); +} + +static gboolean +midori_view_download_requested_cb (GtkWidget* view, + WebKitDownload* download, + MidoriBrowser* browser) +{ + g_signal_emit (browser, signals[ADD_DOWNLOAD], 0, download); + if (!webkit_download_get_destination_uri (download)) + { + gchar* folder; + gchar* filename; + gchar* uri; + + if (g_object_get_data (G_OBJECT (download), "open-download")) + folder = g_strdup (g_get_tmp_dir ()); + else + folder = katze_object_get_string (browser->settings, "download-folder"); + filename = g_build_filename (folder, + webkit_download_get_suggested_filename (download), NULL); + g_free (folder); + uri = g_filename_to_uri (filename, NULL, NULL); + g_free (filename); + webkit_download_set_destination_uri (download, uri); + g_free (uri); + } + midori_browser_add_download_item (browser, download); + return TRUE; +} +#endif + +static void +midori_browser_transferbar_clear_clicked_cb (GtkWidget* button, + MidoriBrowser* browser) +{ + GList* buttons; + guint i; + GtkWidget* item; + + buttons = gtk_container_get_children (GTK_CONTAINER (browser->transferbar)); + i = 0; + while ((item = g_list_nth_data (buttons, i++))) + if (g_object_get_data (G_OBJECT (item), "done")) + gtk_widget_destroy (item); + g_list_free (buttons); + buttons = gtk_container_get_children (GTK_CONTAINER (browser->transferbar)); + if (g_list_length (buttons) == 1) + gtk_widget_hide (browser->transferbar_clear); + g_list_free (buttons); +} + +static void +midori_view_search_text_cb (GtkWidget* view, + gboolean found, + gchar* typing, + MidoriBrowser* browser) +{ + const gchar* text; + gboolean case_sensitive; + gboolean highlight; + + if (typing) + { + gint position = -1; + + browser->find_typing = TRUE; + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON ( + browser->find_highlight), TRUE); + gtk_widget_hide (GTK_WIDGET (browser->find_case)); + gtk_widget_hide (GTK_WIDGET (browser->find_highlight)); + gtk_widget_hide (GTK_WIDGET (browser->find_close)); + if (!GTK_WIDGET_VISIBLE (browser->find)) + gtk_entry_set_text (GTK_ENTRY (browser->find_text), ""); + gtk_widget_show (browser->find); + gtk_window_set_focus (GTK_WINDOW (browser), browser->find_text); + gtk_editable_insert_text (GTK_EDITABLE (browser->find_text), typing, -1, &position); + gtk_editable_set_position (GTK_EDITABLE (browser->find_text), -1); + } + if (GTK_WIDGET_VISIBLE (browser->find) && !typing) + { + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (browser->find_text), + GTK_ICON_ENTRY_PRIMARY, (found) ? GTK_STOCK_FIND : GTK_STOCK_STOP); + text = gtk_entry_get_text (GTK_ENTRY (browser->find_text)); + case_sensitive = gtk_toggle_tool_button_get_active ( + GTK_TOGGLE_TOOL_BUTTON (browser->find_case)); + midori_view_mark_text_matches (MIDORI_VIEW (view), text, case_sensitive); + highlight = gtk_toggle_tool_button_get_active ( + GTK_TOGGLE_TOOL_BUTTON (browser->find_highlight)); + midori_view_set_highlight_text_matches (MIDORI_VIEW (view), highlight); + } +} + +static gboolean +midori_browser_tab_destroy_cb (GtkWidget* widget, + MidoriBrowser* browser) +{ + KatzeItem* item; + const gchar* uri; + + if (browser->proxy_array && MIDORI_IS_VIEW (widget)) + { + item = midori_view_get_proxy_item (MIDORI_VIEW (widget)); + uri = katze_item_get_uri (item); + if (browser->trash && !midori_view_is_blank (MIDORI_VIEW (widget))) + katze_array_add_item (browser->trash, item); + katze_array_remove_item (browser->proxy_array, item); + g_object_unref (item); + } + + _midori_browser_update_actions (browser); + + /* This callback must only be called once, but we need to ensure + that "remove-tab" is emitted in any case */ + g_signal_handlers_disconnect_by_func (widget, + midori_browser_tab_destroy_cb, browser); + + g_signal_emit (browser, signals[REMOVE_TAB], 0, widget); + + /* We don't ever want to be in a situation with no tabs, + so just create an empty one if the last one is closed. + The only exception is when we are closing the window, + which is indicated by the proxy array having been unset. */ + if (browser->proxy_array && !midori_browser_get_current_tab (browser)) + midori_browser_add_uri (browser, ""); + return FALSE; +} + +static void +_midori_browser_add_tab (MidoriBrowser* browser, + GtkWidget* view) +{ + GtkWidget* tab_label; + KatzeItem* item; + guint n; + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (view), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (view), + GTK_SHADOW_ETCHED_IN); + + tab_label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view)); + + item = midori_view_get_proxy_item (MIDORI_VIEW (view)); + g_object_ref (item); + katze_array_add_item (browser->proxy_array, item); + + g_object_connect (view, + "signal::notify::icon", + midori_view_notify_icon_cb, browser, + "signal::notify::load-status", + midori_view_notify_load_status_cb, browser, + "signal::notify::progress", + midori_view_notify_progress_cb, browser, + "signal::context-ready", + midori_view_context_ready_cb, browser, + "signal::notify::title", + midori_view_notify_title_cb, browser, + "signal::notify::zoom-level", + midori_view_notify_zoom_level_cb, browser, + "signal::notify::statusbar-text", + midori_view_notify_statusbar_text_cb, browser, + "signal::activate-action", + midori_view_activate_action_cb, browser, + "signal::attach-inspector", + midori_view_attach_inspector_cb, browser, + "signal::new-tab", + midori_view_new_tab_cb, browser, + "signal::new-window", + midori_view_new_window_cb, browser, + "signal::new-view", + midori_view_new_view_cb, browser, + #if WEBKIT_CHECK_VERSION (1, 1, 3) + "signal::download-requested", + midori_view_download_requested_cb, browser, + #endif + "signal::search-text", + midori_view_search_text_cb, browser, + "signal::add-bookmark", + midori_view_add_bookmark_cb, browser, + "signal::save-as", + midori_view_save_as_cb, browser, + "signal::leave-notify-event", + midori_browser_tab_leave_notify_event_cb, browser, + NULL); + + if (browser->settings && + katze_object_get_boolean (browser->settings, "open-tabs-next-to-current")) + { + n = gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); + gtk_notebook_insert_page (GTK_NOTEBOOK (browser->notebook), view, + tab_label, n + 1); + } + else + gtk_notebook_append_page (GTK_NOTEBOOK (browser->notebook), view, + tab_label); + + gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (browser->notebook), + view, TRUE); + gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (browser->notebook), + view, TRUE); + + /* We want the tab to be removed if the widget is destroyed */ + g_signal_connect (view, "destroy", + G_CALLBACK (midori_browser_tab_destroy_cb), browser); + + _midori_browser_update_actions (browser); +} + +static void +_midori_browser_remove_tab (MidoriBrowser* browser, + GtkWidget* view) +{ + gtk_widget_destroy (view); +} + +static void +_midori_browser_quit (MidoriBrowser* browser) +{ + /* Nothing to do */ +} + +static void +midori_browser_class_init (MidoriBrowserClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + signals[NEW_WINDOW] = g_signal_new ( + "new-window", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + G_STRUCT_OFFSET (MidoriBrowserClass, new_window), + 0, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + signals[ADD_TAB] = g_signal_new ( + "add-tab", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriBrowserClass, add_tab), + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_WIDGET); + + signals[REMOVE_TAB] = g_signal_new ( + "remove-tab", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriBrowserClass, remove_tab), + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_WIDGET); + + signals[ACTIVATE_ACTION] = g_signal_new ( + "activate-action", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriBrowserClass, activate_action), + 0, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + signals[CONTEXT_READY] = g_signal_new ( + "context-ready", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + /** + * MidoriView::add-download: + * @view: the object on which the signal is emitted + * @download: a new download + * + * Emitted when a new download was accepted and is + * about to start, before the browser adds items + * to the transferbar. + * + * Emitting this signal manually is equal to a + * user initiating and confirming a download + * + * Note: This requires WebKitGTK 1.1.3. + * + * Since: 0.1.5 + */ + signals[ADD_DOWNLOAD] = g_signal_new ( + "add-download", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_OBJECT); + + signals[QUIT] = g_signal_new ( + "quit", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriBrowserClass, quit), + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + class->add_tab = _midori_browser_add_tab; + class->remove_tab = _midori_browser_remove_tab; + class->activate_action = _midori_browser_activate_action; + class->quit = _midori_browser_quit; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->dispose = midori_browser_dispose; + gobject_class->finalize = midori_browser_finalize; + gobject_class->set_property = midori_browser_set_property; + gobject_class->get_property = midori_browser_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS; + + g_object_class_install_property (gobject_class, + PROP_MENUBAR, + g_param_spec_object ( + "menubar", + "Menubar", + "The menubar", + GTK_TYPE_MENU_BAR, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_NAVIGATIONBAR, + g_param_spec_object ( + "navigationbar", + "Navigationbar", + "The navigationbar", + GTK_TYPE_TOOLBAR, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_NOTEBOOK, + g_param_spec_object ( + "notebook", + "Notebook", + "The notebook containing the views", + GTK_TYPE_NOTEBOOK, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_PANEL, + g_param_spec_object ( + "panel", + "Panel", + "The side panel embedded in the browser", + MIDORI_TYPE_PANEL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_URI, + g_param_spec_string ( + "uri", + "URI", + "The current URI", + "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_TAB, + g_param_spec_object ( + "tab", + "Tab", + "The current tab", + GTK_TYPE_WIDGET, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_LOAD_STATUS, + g_param_spec_enum ( + "load-status", + "Load Status", + "The current load status", + MIDORI_TYPE_LOAD_STATUS, + MIDORI_LOAD_FINISHED, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_STATUSBAR, + g_param_spec_object ( + "statusbar", + "Statusbar", + "The statusbar", + GTK_TYPE_STATUSBAR, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriBrowser:statusbar-text: + * + * The text that is displayed in the statusbar. + * + * This value reflects changes to the text visible in the statusbar, such + * as the uri of a hyperlink the mouse hovers over or the description of + * a menuitem. + * + * Setting this value changes the displayed text until the next change. + */ + g_object_class_install_property (gobject_class, + PROP_STATUSBAR_TEXT, + g_param_spec_string ( + "statusbar-text", + "Statusbar Text", + "The text that is displayed in the statusbar", + "", + flags)); + + /** + * MidoriBrowser:settings: + * + * An associated settings instance that is shared among all web views. + * + * Setting this value is propagated to every present web view. Also + * every newly created web view will use this instance automatically. + * + * If no settings are specified a default will be used. + */ + g_object_class_install_property (gobject_class, + PROP_SETTINGS, + g_param_spec_object ( + "settings", + "Settings", + "The associated settings", + MIDORI_TYPE_WEB_SETTINGS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriBrowser:bookmarks: + * + * The bookmarks folder, containing all bookmarks. + * + * This is actually a reference to a bookmarks instance, + * so if bookmarks should be used it must be initially set. + */ + g_object_class_install_property (gobject_class, + PROP_BOOKMARKS, + g_param_spec_object ( + "bookmarks", + "Bookmarks", + "The bookmarks folder, containing all bookmarks", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriBrowser:trash: + * + * The trash, that collects all closed tabs and windows. + * + * This is actually a reference to a trash instance, so if a trash should + * be used it must be initially set. + * + * Note: In the future the trash might collect other types of items. + */ + g_object_class_install_property (gobject_class, + PROP_TRASH, + g_param_spec_object ( + "trash", + "Trash", + "The trash, collecting recently closed tabs and windows", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriBrowser:search-engines: + * + * The list of search engines to be used for web search. + * + * This is actually a reference to a search engines instance, + * so if search engines should be used it must be initially set. + */ + g_object_class_install_property (gobject_class, + PROP_SEARCH_ENGINES, + g_param_spec_object ( + "search-engines", + "Search Engines", + "The list of search engines to be used for web search", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriBrowser:history: + * + * The list of history items. + * + * This is actually a reference to a history instance, + * so if history should be used it must be initially set. + */ + g_object_class_install_property (gobject_class, + PROP_HISTORY, + g_param_spec_object ( + "history", + "History", + "The list of history items", + KATZE_TYPE_ARRAY, + flags)); + + /* Add 2px space between tool buttons */ + gtk_rc_parse_string ( + "style \"tool-button-style\"\n {\n" + "GtkToolButton::icon-spacing = 2\n }\n" + "widget \"MidoriBrowser.*.MidoriBookmarkbar.Gtk*ToolButton\" " + "style \"tool-button-style\"\n" + "widget \"MidoriBrowser.*.MidoriFindbar.Gtk*ToolButton\" " + "style \"tool-button-style\"\n"); +} + +static void +_action_window_new_activate (GtkAction* action, + MidoriBrowser* browser) +{ + g_signal_emit (browser, signals[NEW_WINDOW], 0, ""); +} + +static void +_action_tab_new_activate (GtkAction* action, + MidoriBrowser* browser) +{ + gint n = midori_browser_add_uri (browser, ""); + midori_browser_set_current_page (browser, n); + gtk_action_activate (_action_by_name (browser, "Location")); +} + +static void +_action_open_activate (GtkAction* action, + MidoriBrowser* browser) +{ + static gchar* last_dir = NULL; + gchar* uri = NULL; + gboolean folder_set = FALSE; + GtkWidget* dialog; + + if (!GTK_WIDGET_VISIBLE (browser)) + return; + + dialog = gtk_file_chooser_dialog_new ( + _("Open file"), GTK_WINDOW (browser), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_OPEN); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (browser)); + + /* base the start folder on the current view's uri if it is local */ + GtkWidget* view = midori_browser_get_current_tab (browser); + if ((uri = (gchar*)midori_view_get_display_uri (MIDORI_VIEW (view)))) + { + gchar* filename = g_filename_from_uri (uri, NULL, NULL); + if (filename) + { + gchar* dirname = g_path_get_dirname (filename); + if (dirname && g_file_test (dirname, G_FILE_TEST_IS_DIR)) + { + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), dirname); + folder_set = TRUE; + } + + g_free (dirname); + g_free (filename); + } + } + + if (!folder_set && last_dir && *last_dir) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), last_dir); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + gchar* folder; + + folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)); + uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); + midori_browser_set_current_uri (browser, uri); + + g_free (last_dir); + last_dir = folder; + g_free (uri); + } + gtk_widget_destroy (dialog); +} + +static void +_action_save_as_activate (GtkAction* action, + MidoriBrowser* browser) +{ + midori_browser_save_uri (browser, midori_browser_get_current_uri (browser)); +} + +static void +_action_tab_close_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = midori_browser_get_current_tab (browser); + gtk_widget_destroy (widget); +} + +static void +_action_window_close_activate (GtkAction* action, + MidoriBrowser* browser) +{ + gtk_widget_destroy (GTK_WIDGET (browser)); +} + +static void +_action_print_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view; + + if (!GTK_WIDGET_VISIBLE (browser)) + return; + + if ((view = midori_browser_get_current_tab (browser))) + midori_view_print (MIDORI_VIEW (view)); +} + +static void +_action_quit_activate (GtkAction* action, + MidoriBrowser* browser) +{ + g_signal_emit (browser, signals[QUIT], 0); +} + +static void +_action_edit_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser)); + gboolean can_cut = FALSE, can_copy = FALSE, can_paste = FALSE; + gboolean has_selection, can_select_all = FALSE; + + if (WEBKIT_IS_WEB_VIEW (widget)) + { + WebKitWebView* view = WEBKIT_WEB_VIEW (widget); + can_cut = webkit_web_view_can_cut_clipboard (view); + can_copy = webkit_web_view_can_copy_clipboard (view); + can_paste = webkit_web_view_can_paste_clipboard (view); + can_select_all = TRUE; + } + else if (GTK_IS_EDITABLE (widget)) + { + GtkEditable* editable = GTK_EDITABLE (widget); + has_selection = gtk_editable_get_selection_bounds (editable, NULL, NULL); + can_cut = has_selection && gtk_editable_get_editable (editable); + can_copy = has_selection; + can_paste = gtk_editable_get_editable (editable); + can_select_all = TRUE; + } + else if (GTK_IS_TEXT_VIEW (widget)) + { + GtkTextView* text_view = GTK_TEXT_VIEW (widget); + GtkTextBuffer* buffer = gtk_text_view_get_buffer (text_view); + has_selection = gtk_text_buffer_get_has_selection (buffer); + can_cut = gtk_text_view_get_editable (text_view); + can_copy = has_selection; + can_paste = gtk_text_view_get_editable (text_view) && has_selection; + can_select_all = TRUE; + } + + _action_set_sensitive (browser, "Cut", can_cut); + _action_set_sensitive (browser, "Copy", can_copy); + _action_set_sensitive (browser, "Paste", can_paste); + _action_set_sensitive (browser, "Delete", can_cut); + _action_set_sensitive (browser, "SelectAll", can_select_all); +} + +static void +_action_cut_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser)); + if (G_LIKELY (widget) && g_signal_lookup ("cut-clipboard", G_OBJECT_TYPE (widget))) + g_signal_emit_by_name (widget, "cut-clipboard"); +} + +static void +_action_copy_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser)); + if (G_LIKELY (widget) && g_signal_lookup ("copy-clipboard", G_OBJECT_TYPE (widget))) + g_signal_emit_by_name (widget, "copy-clipboard"); +} + +static void +_action_paste_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser)); + if (G_LIKELY (widget) && g_signal_lookup ("paste-clipboard", G_OBJECT_TYPE (widget))) + g_signal_emit_by_name (widget, "paste-clipboard"); +} + +static void +_action_delete_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser)); + if (G_LIKELY (widget)) + { + if (WEBKIT_IS_WEB_VIEW (widget)) + webkit_web_view_delete_selection (WEBKIT_WEB_VIEW (widget)); + else if (GTK_IS_EDITABLE (widget)) + gtk_editable_delete_selection (GTK_EDITABLE (widget)); + else if (GTK_IS_TEXT_VIEW (widget)) + gtk_text_buffer_delete_selection ( + gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)), TRUE, FALSE); + } +} + +static void +_action_select_all_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* widget = gtk_window_get_focus (GTK_WINDOW (browser)); + if (G_LIKELY (widget)) + { + if (GTK_IS_EDITABLE (widget)) + gtk_editable_select_region (GTK_EDITABLE (widget), 0, -1); + else if (g_signal_lookup ("select-all", G_OBJECT_TYPE (widget))) + g_signal_emit_by_name (widget, "select-all", TRUE); + } +} + +static void +_action_find_activate (GtkAction* action, + MidoriBrowser* browser) +{ + if (!GTK_WIDGET_VISIBLE (browser->find)) + { + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (browser->find_text), + GTK_ICON_ENTRY_PRIMARY, GTK_STOCK_FIND); + gtk_entry_set_text (GTK_ENTRY (browser->find_text), ""); + gtk_widget_show (GTK_WIDGET (browser->find_case)); + gtk_widget_show (GTK_WIDGET (browser->find_highlight)); + gtk_widget_show (GTK_WIDGET (browser->find_close)); + gtk_widget_show (browser->find); + } + + gtk_widget_grab_focus (GTK_WIDGET (browser->find_text)); +} + +static void +_midori_browser_find (MidoriBrowser* browser, + gboolean forward) +{ + const gchar* text; + gboolean case_sensitive; + GtkWidget* view; + + if (!(view = midori_browser_get_current_tab (browser))) + return; + + text = gtk_entry_get_text (GTK_ENTRY (browser->find_text)); + case_sensitive = gtk_toggle_tool_button_get_active ( + GTK_TOGGLE_TOOL_BUTTON (browser->find_case)); + midori_view_search_text (MIDORI_VIEW (view), text, case_sensitive, forward); +} + +static void +_midori_browser_find_done (MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + midori_view_unmark_text_matches (MIDORI_VIEW (view)); + gtk_widget_hide (browser->find); + browser->find_typing = FALSE; + gtk_window_set_focus (GTK_WINDOW (browser), + gtk_bin_get_child (GTK_BIN (view)) ? + gtk_bin_get_child (GTK_BIN (view)) : view); +} + +static void +_action_find_next_activate (GtkAction* action, + MidoriBrowser* browser) +{ + _midori_browser_find (browser, TRUE); +} + +static void +midori_browser_find_text_changed_cb (GtkWidget* entry, + MidoriBrowser* browser) +{ + if (browser->find_typing) + { + GtkWidget* view = midori_browser_get_current_tab (browser); + const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry)); + midori_view_unmark_text_matches (MIDORI_VIEW (view)); + if (g_utf8_strlen (text, -1) > 2) + _midori_browser_find (browser, TRUE); + } +} + +static gboolean +midori_browser_find_text_focus_out_event_cb (GtkWidget* entry, + GdkEventFocus* event, + MidoriBrowser* browser) +{ + if (browser->find_typing) + _midori_browser_find_done (browser); + return FALSE; +} + +static void +_action_find_previous_activate (GtkAction* action, + MidoriBrowser* browser) +{ + _midori_browser_find (browser, FALSE); +} + +static void +_find_highlight_toggled (GtkToggleToolButton* toolitem, + MidoriBrowser* browser) +{ + GtkWidget* view; + gboolean highlight; + + view = midori_browser_get_current_tab (browser); + highlight = gtk_toggle_tool_button_get_active (toolitem); + midori_view_set_highlight_text_matches (MIDORI_VIEW (view), highlight); +} + +static gboolean +midori_browser_find_key_press_event_cb (GtkWidget* toolbar, + GdkEventKey* event, + MidoriBrowser* browser) +{ + if (event->keyval == GDK_Escape) + { + _midori_browser_find_done (browser); + return TRUE; + } + + return FALSE; +} + +static void +midori_browser_find_button_close_clicked_cb (GtkWidget* widget, + MidoriBrowser* browser) +{ + _midori_browser_find_done (browser); +} + +static void +midori_browser_navigationbar_notify_style_cb (GObject* object, + GParamSpec* arg1, + MidoriBrowser* browser) +{ + MidoriToolbarStyle toolbar_style; + GtkToolbarStyle gtk_toolbar_style; + + g_object_get (browser->settings, "toolbar-style", &toolbar_style, NULL); + if (toolbar_style == MIDORI_TOOLBAR_DEFAULT) + { + g_object_get (browser->settings, + "gtk-toolbar-style", >k_toolbar_style, NULL); + gtk_toolbar_set_style (GTK_TOOLBAR (browser->navigationbar), + gtk_toolbar_style); + } +} + +static gboolean +midori_browser_toolbar_item_button_press_event_cb (GtkWidget* toolitem, + GdkEventButton* event, + MidoriBrowser* browser); + +#if !HAVE_HILDON +static void +_midori_browser_save_toolbar_items (MidoriBrowser* browser) +{ + GString* toolbar_items; + GList* children; + gchar* items; + + toolbar_items = g_string_new (NULL); + children = gtk_container_get_children (GTK_CONTAINER (browser->navigationbar)); + for (; children != NULL; children = g_list_next (children)) + { + GtkAction* action = gtk_widget_get_action (GTK_WIDGET (children->data)); + /* If a widget has no action that is actually a bug, so warn about it */ + g_warn_if_fail (action != NULL); + if (action && strcmp (gtk_action_get_name (action), "Fullscreen")) + { + g_string_append (toolbar_items, gtk_action_get_name (action)); + g_string_append (toolbar_items, ","); + } + } + items = g_string_free (toolbar_items, FALSE); + g_object_set (browser->settings, "toolbar-items", items, NULL); + g_free (items); +} + +static void +midori_browser_toolbar_add_item_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + GtkWidget* widget = g_object_get_data (G_OBJECT (menuitem), "widget"); + GtkAction* widget_action = g_object_get_data (G_OBJECT (menuitem), "action"); + GtkWidget* toolitem = gtk_action_create_tool_item (widget_action); + if (widget) + { + gint i = gtk_toolbar_get_item_index (GTK_TOOLBAR (browser->navigationbar), + GTK_TOOL_ITEM (widget)); + gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), + GTK_TOOL_ITEM (toolitem), i ? i : 0); + } + else + gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), + GTK_TOOL_ITEM (toolitem), 0); + if (gtk_bin_get_child (GTK_BIN (toolitem))) + g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), + "button-press-event", + G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), + browser); + else + { + gtk_tool_item_set_use_drag_window (GTK_TOOL_ITEM (toolitem), TRUE); + g_signal_connect (toolitem, + "button-press-event", + G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), + browser); + } + _midori_browser_save_toolbar_items (browser); +} + +static void +midori_browser_toolbar_remove_item_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + GtkWidget* widget = g_object_get_data (G_OBJECT (menuitem), "widget"); + gtk_container_remove (GTK_CONTAINER (browser->navigationbar), widget); + _midori_browser_save_toolbar_items (browser); +} +#endif + +static gboolean +midori_browser_toolbar_popup_context_menu_cb (GtkWidget* widget, + gint x, + gint y, + gint button, + MidoriBrowser* browser) +{ + GtkWidget* menu; + GtkWidget* menuitem; + + /* Unsupported trick used for web app mode */ + if (g_object_get_data (G_OBJECT (browser), "locked")) + return FALSE; + + menu = gtk_menu_new (); + menuitem = sokoke_action_create_popup_menu_item ( + _action_by_name (browser, "Menubar")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + menuitem = sokoke_action_create_popup_menu_item ( + _action_by_name (browser, "Navigationbar")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + menuitem = sokoke_action_create_popup_menu_item ( + _action_by_name (browser, "Bookmarkbar")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + menuitem = sokoke_action_create_popup_menu_item ( + _action_by_name (browser, "Transferbar")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + menuitem = sokoke_action_create_popup_menu_item ( + _action_by_name (browser, "Statusbar")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + + #if !HAVE_HILDON + if (widget == browser->navigationbar || + gtk_widget_is_ancestor (widget, browser->navigationbar)) + { + GtkAction* widget_action = gtk_widget_get_action (widget); + const gchar* actions[] = { "TabNew", "Open", "SaveAs", "Print", "Find", + "Preferences", "Window", "Bookmarks", "RecentlyVisited", + "ReloadStop", "ZoomIn", "Separator", "ZoomOut", "Back", "Forward", + "Homepage", "Panel", "Trash", "Search" }; + GtkWidget* submenu; + gsize i; + + menuitem = gtk_separator_menu_item_new (); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + submenu = gtk_menu_new (); + menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_ADD, NULL); + gtk_widget_show (menuitem); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_REMOVE, NULL); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + if (widget_action && + strcmp (gtk_action_get_name (widget_action), "Location")) + { + g_object_set_data (G_OBJECT (menuitem), "widget", widget); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_browser_toolbar_remove_item_cb), browser); + } + else + gtk_widget_set_sensitive (menuitem, FALSE); + + for (i = 0; i < G_N_ELEMENTS (actions); i++) + { + GtkAction* action = _action_by_name (browser, actions[i]); + gchar* stock_id = katze_object_get_string (action, "stock-id"); + gchar* label = katze_object_get_string (action, "label"); + + if (stock_id && label) + { + GtkWidget* icon; + + menuitem = gtk_image_menu_item_new_with_mnemonic (label); + icon = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + } + else if (stock_id) + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + else + menuitem = gtk_image_menu_item_new_with_mnemonic (label); + gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); + if (widget_action) + g_object_set_data (G_OBJECT (menuitem), "widget", widget); + g_object_set_data (G_OBJECT (menuitem), "action", action); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_browser_toolbar_add_item_cb), browser); + } + sokoke_container_show_children (GTK_CONTAINER (submenu)); + } + #endif + + katze_widget_popup (widget, GTK_MENU (menu), NULL, + button == -1 ? KATZE_MENU_POSITION_LEFT : KATZE_MENU_POSITION_CURSOR); + return TRUE; +} + +static void +_action_trash_populate_popup (GtkAction* action, + GtkMenu* menu, + MidoriBrowser* browser) +{ + GtkWidget* menuitem; + + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + menuitem = gtk_action_create_menu_item ( + _action_by_name (browser, "TrashEmpty")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); +} + +static void +_action_trash_activate_item (GtkAction* action, + KatzeItem* item, + MidoriBrowser* browser) +{ + gint n = midori_browser_add_item (browser, item); + midori_browser_set_current_page (browser, n); + katze_array_remove_item (browser->trash, item); + _midori_browser_update_actions (browser); +} + +static void +_action_history_populate_popup (GtkAction* action, + GtkMenu* menu, + MidoriBrowser* browser) +{ + /* Nothing to do */ +} + +static void +_action_history_activate_item (GtkAction* action, + KatzeItem* item, + MidoriBrowser* browser) +{ + midori_browser_set_current_uri (browser, katze_item_get_uri (item)); +} + +static void +_action_bookmarks_populate_popup (GtkAction* action, + GtkMenu* menu, + MidoriBrowser* browser) +{ + GtkWidget* menuitem; + + if (katze_array_get_nth_item (browser->bookmarks, 0)) + { + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + } + menuitem = gtk_action_create_menu_item ( + _action_by_name (browser, "BookmarkFolderAdd")); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + menuitem = gtk_action_create_menu_item ( + _action_by_name (browser, "BookmarkAdd")); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); +} + +static void +_action_bookmarks_activate_item (GtkAction* action, + KatzeItem* item, + MidoriBrowser* browser) +{ + midori_browser_set_current_uri (browser, katze_item_get_uri (item)); + gtk_widget_grab_focus (midori_browser_get_current_tab (browser)); +} + +static void +_action_window_populate_popup (GtkAction* action, + GtkMenu* menu, + MidoriBrowser* browser) +{ + GtkWidget* menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + menuitem = gtk_action_create_menu_item ( + _action_by_name (browser, "TabPrevious")); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + menuitem = gtk_action_create_menu_item ( + _action_by_name (browser, "TabNext")); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); +} + +static void +_action_window_activate_item (GtkAction* action, + KatzeItem* item, + MidoriBrowser* browser) +{ + guint i, n; + GtkWidget* view; + + n = katze_array_get_length (browser->proxy_array); + for (i = 0; i < n; i++) + { + view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), i); + if (midori_view_get_proxy_item (MIDORI_VIEW (view)) == item) + gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), i); + } +} + +static void +midori_preferences_response_help_cb (GtkWidget* preferences, + gint response, + MidoriBrowser* browser) +{ + if (response == GTK_RESPONSE_HELP) + gtk_action_activate (_action_by_name (browser, "HelpContents")); +} + +static void +_action_preferences_activate (GtkAction* action, + MidoriBrowser* browser) +{ + static GtkWidget* dialog = NULL; + + if (!browser->settings || !GTK_WIDGET_VISIBLE (browser)) + return; + + if (!dialog) + { + dialog = midori_preferences_new (GTK_WINDOW (browser), + browser->settings); + g_signal_connect (dialog, "response", + G_CALLBACK (midori_preferences_response_help_cb), browser); + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), &dialog); + gtk_widget_show (dialog); + } + else + gtk_window_present (GTK_WINDOW (dialog)); +} + +static void +_action_menubar_activate (GtkToggleAction* action, + MidoriBrowser* browser) +{ + gboolean active = gtk_toggle_action_get_active (action); + if (browser->settings) + g_object_set (browser->settings, "show-menubar", active, NULL); + #if !HAVE_HILDON + sokoke_widget_set_visible (browser->menubar, active); + #endif +} + +static void +_action_navigationbar_activate (GtkToggleAction* action, + MidoriBrowser* browser) +{ + gboolean active = gtk_toggle_action_get_active (action); + if (browser->settings) + g_object_set (browser->settings, "show-navigationbar", active, NULL); + sokoke_widget_set_visible (browser->navigationbar, active); +} + +static void +_action_bookmarkbar_activate (GtkToggleAction* action, + MidoriBrowser* browser) +{ + gboolean active = gtk_toggle_action_get_active (action); + if (browser->settings) + g_object_set (browser->settings, "show-bookmarkbar", active, NULL); + sokoke_widget_set_visible (browser->bookmarkbar, active); +} + +static void +_action_transferbar_activate (GtkToggleAction* action, + MidoriBrowser* browser) +{ + gboolean active = gtk_toggle_action_get_active (action); + if (browser->settings) + g_object_set (browser->settings, "show-transferbar", active, NULL); + sokoke_widget_set_visible (browser->transferbar, active); +} + +static void +_action_statusbar_activate (GtkToggleAction* action, + MidoriBrowser* browser) +{ + gboolean active = gtk_toggle_action_get_active (action); + if (browser->settings) + g_object_set (browser->settings, "show-statusbar", active, NULL); + #if !HAVE_HILDON + sokoke_widget_set_visible (browser->statusbar, active); + #endif +} + +static void +_action_reload_stop_activate (GtkAction* action, + MidoriBrowser* browser) +{ + gchar* stock_id; + GtkWidget* view; + GdkModifierType state = (GdkModifierType)0; + gint x, y; + gboolean from_cache; + + if (!(view = midori_browser_get_current_tab (browser))) + return; + + g_object_get (action, "stock-id", &stock_id, NULL); + + /* Refresh or stop, depending on the stock id */ + if (!strcmp (stock_id, GTK_STOCK_REFRESH)) + { + gdk_window_get_pointer (NULL, &x, &y, &state); + from_cache = state & GDK_SHIFT_MASK; + midori_view_reload (MIDORI_VIEW (view), !from_cache); + } + else + midori_view_stop_loading (MIDORI_VIEW (view)); + g_free (stock_id); +} + +static void +_action_zoom_in_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view) + midori_view_set_zoom_level (MIDORI_VIEW (view), + midori_view_get_zoom_level (MIDORI_VIEW (view)) + 0.25f); +} + +static void +_action_zoom_out_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view) + midori_view_set_zoom_level (MIDORI_VIEW (view), + midori_view_get_zoom_level (MIDORI_VIEW (view)) - 0.25f); +} + +static void +_action_zoom_normal_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view) + midori_view_set_zoom_level (MIDORI_VIEW (view), 1.0f); +} + +static void +_action_view_encoding_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view && midori_browser_view_can_set_encoding (MIDORI_VIEW (view))) + { + const gchar* name; + GtkWidget* web_view; + + name = gtk_action_get_name (action); + web_view = gtk_bin_get_child (GTK_BIN (view)); + if (!strcmp (name, "EncodingAutomatic")) + g_object_set (web_view, "custom-encoding", NULL, NULL); + else + { + const gchar* encoding; + if (!strcmp (name, "EncodingChinese")) + encoding = "BIG5"; + else if (!strcmp (name, "EncodingJapanese")) + encoding = "SHIFT_JIS"; + else if (!strcmp (name, "EncodingRussian")) + encoding = "KOI8-R"; + else if (!strcmp (name, "EncodingUnicode")) + encoding = "UTF-8"; + else if (!strcmp (name, "EncodingWestern")) + encoding = "ISO-8859-1"; + else + g_assert_not_reached (); + g_object_set (web_view, "custom-encoding", encoding, NULL); + } + } +} + +static gchar* +midori_browser_get_uri_extension (const gchar* uri) +{ + gchar* extension; + gchar* slash; + gchar* period; + gchar* ext_end; + gchar* tmp = g_strdup (uri); + + /* Find the last slash in the URI and search for the last period + *after* the last slash. This is not completely accurate + but should cover most (simple) URIs */ + slash = strrchr (tmp, '/'); + /* Huh, URI without slashes? */ + if (!slash) + return g_strdup (""); + + ext_end = period = strrchr (slash, '.'); + if (!period) + return g_strdup (""); + + /* Skip the period */ + ext_end++; + /* If *ext_end is 0 here, the URI ended with a period, so skip */ + if (!*ext_end) + return g_strdup (""); + + /* Find the end of the extension */ + while (*ext_end && g_ascii_isalnum (*ext_end)) + ext_end++; + + *ext_end = 0; + extension = g_strdup (period); + + g_free (tmp); + + return extension; +} + +static void +midori_browser_source_transfer_cb (KatzeNetRequest* request, + MidoriBrowser* browser) +{ + gchar* filename; + gchar* extension; + gchar* unique_filename; + gchar* text_editor; + gint fd; + FILE* fp; + size_t ret; + + if (request->data) + { + extension = midori_browser_get_uri_extension (request->uri); + filename = g_strdup_printf ("%uXXXXXX%s", + g_str_hash (request->uri), extension); + g_free (extension); + if (((fd = g_file_open_tmp (filename, &unique_filename, NULL)) != -1)) + { + if ((fp = fdopen (fd, "w"))) + { + gboolean success; + + ret = fwrite (request->data, 1, request->length, fp); + fclose (fp); + if ((ret - request->length) != 0) + { + /* FIXME: Show an error in the graphical interface */ + g_warning ("Error writing to file %s " + "in midori_browser_source_transfer_cb()", filename); + } + g_object_get (browser->settings, + "text-editor", &text_editor, NULL); + if (text_editor && *text_editor) + success = sokoke_spawn_program (text_editor, unique_filename); + else + { + gchar* command = g_strconcat ("exo-open ", unique_filename, NULL); + success = g_spawn_command_line_async (command, NULL); + g_free (command); + } + + g_free (unique_filename); + g_free (text_editor); + } + close (fd); + } + g_free (filename); + } +} + +static void +_action_source_view_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view; + gchar* text_editor; + const gchar* uri; + + if (!(view = midori_browser_get_current_tab (browser))) + return; + + if (browser->settings) + g_object_get (browser->settings, "text-editor", &text_editor, NULL); + else + text_editor = NULL; + uri = midori_view_get_display_uri (MIDORI_VIEW (view)); + + if (!g_strcmp0 (text_editor, "")) + { + GFile* file = g_file_new_for_uri (uri); + + gchar* content_type; + GAppInfo* app_info; + GList* files; + gpointer context; + + #if GLIB_CHECK_VERSION (2, 18, 0) + content_type = g_content_type_from_mime_type ("text/plain"); + #else + content_type = g_strdup ("text/plain"); + #endif + + app_info = g_app_info_get_default_for_type (content_type, + !g_str_has_prefix (uri, "file://")); + g_free (content_type); + files = g_list_prepend (NULL, file); + #if GTK_CHECK_VERSION (2, 14, 0) + context = gdk_app_launch_context_new (); + gdk_app_launch_context_set_screen (context, gtk_widget_get_screen (view)); + gdk_app_launch_context_set_timestamp (context, gtk_get_current_event_time ()); + #else + context = g_app_launch_context_new (); + #endif + if (g_app_info_launch (app_info, files, context, NULL)) + { + g_object_unref (app_info); + g_list_free (files); + g_object_unref (file); + g_free (text_editor); + return; + } + } + + katze_net_load_uri (browser->net, uri, NULL, + (KatzeNetTransferCb)midori_browser_source_transfer_cb, browser); + g_free (text_editor); +} + +static void +_action_fullscreen_activate (GtkAction* action, + MidoriBrowser* browser) +{ + if (!GTK_WIDGET (browser)->window) + return; + + GdkWindowState state = gdk_window_get_state (GTK_WIDGET (browser)->window); + if (state & GDK_WINDOW_STATE_FULLSCREEN) + gtk_window_unfullscreen (GTK_WINDOW (browser)); + else + gtk_window_fullscreen (GTK_WINDOW (browser)); +} + +static void +_action_back_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view) + midori_view_go_back (MIDORI_VIEW (view)); +} + +static void +_action_forward_activate (GtkAction* action, + MidoriBrowser* browser) +{ + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view) + midori_view_go_forward (MIDORI_VIEW (view)); +} + +static void +_action_homepage_activate (GtkAction* action, + MidoriBrowser* browser) +{ + gchar* homepage; + + if (!browser->settings) + return; + + g_object_get (browser->settings, "homepage", &homepage, NULL); + midori_browser_set_current_uri (browser, homepage); + g_free (homepage); +} + +static void +_action_location_activate (GtkAction* action, + MidoriBrowser* browser) +{ + if (!browser->show_navigationbar) + gtk_widget_show (browser->navigationbar); +} + +static void +_action_location_active_changed (GtkAction* action, + gint idx, + MidoriBrowser* browser) +{ + const gchar* uri; + + if (idx > -1) + { + uri = midori_location_action_get_uri (MIDORI_LOCATION_ACTION (action)); + midori_browser_set_current_uri (browser, uri); + } +} + +static void +_action_location_focus_out (GtkAction* action, + MidoriBrowser* browser) +{ + if (!browser->show_navigationbar) + gtk_widget_hide (browser->navigationbar); +} + +static void +_action_location_reset_uri (GtkAction* action, + MidoriBrowser* browser) +{ + const gchar* uri; + + uri = midori_browser_get_current_uri (browser); + midori_location_action_set_uri (MIDORI_LOCATION_ACTION (action), uri); +} + +static void +_action_location_submit_uri (GtkAction* action, + const gchar* uri, + gboolean new_tab, + MidoriBrowser* browser) +{ + gchar* new_uri; + gint n; + + new_uri = sokoke_magic_uri (uri, browser->search_engines); + if (!new_uri) + { + gchar* uri_ = g_uri_escape_string (uri, " :/", TRUE); + if (strstr (browser->location_entry_search, "%s")) + new_uri = g_strdup_printf (browser->location_entry_search, uri_); + else if (!new_uri) + new_uri = g_strconcat (browser->location_entry_search, uri_, NULL); + g_free (uri_); + } + + if (new_tab) + { + n = midori_browser_add_uri (browser, new_uri); + midori_browser_set_current_page (browser, n); + } + else + midori_browser_set_current_uri (browser, new_uri); + g_free (new_uri); + gtk_widget_grab_focus (midori_browser_get_current_tab (browser)); +} + +static void +_action_location_secondary_icon_released (GtkAction* action, + GtkWidget* widget, + MidoriBrowser* browser) +{ + GtkWidget* view; + + if ((view = midori_browser_get_current_tab (browser))) + { + const gchar* uri = midori_view_get_display_uri (MIDORI_VIEW (view)); + if (browser->news_aggregator && *browser->news_aggregator) + sokoke_spawn_program (browser->news_aggregator, uri); + } +} + +static void +_action_search_activate (GtkAction* action, + MidoriBrowser* browser) +{ + if (!GTK_WIDGET_VISIBLE (browser->navigationbar)) + gtk_widget_show (browser->navigationbar); +} + +static void +_action_search_submit (GtkAction* action, + const gchar* keywords, + gboolean new_tab, + MidoriBrowser* browser) +{ + guint last_web_search; + KatzeItem* item; + const gchar* url; + gchar* search; + + g_object_get (browser->settings, "last-web-search", &last_web_search, NULL); + item = katze_array_get_nth_item (browser->search_engines, last_web_search); + if (item) + url = katze_item_get_uri (item); + else /* The location entry search is our fallback */ + url = browser->location_entry_search; + + if (strstr (url, "%s")) + search = g_strdup_printf (url, keywords); + else + search = g_strconcat (url, " ", keywords, NULL); + + if (new_tab) + midori_browser_add_uri (browser, search); + else + midori_browser_set_current_uri (browser, search); + + g_free (search); +} + +static void +_action_search_notify_current_item (GtkAction* action, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + MidoriSearchAction* search_action; + KatzeItem* item; + guint idx; + + search_action = MIDORI_SEARCH_ACTION (action); + item = midori_search_action_get_current_item (search_action); + if (item) + idx = katze_array_get_item_index (browser->search_engines, item); + else + idx = 0; + + g_object_set (browser->settings, "last-web-search", idx, NULL); +} + +static void +_action_search_notify_default_item (GtkAction* action, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + MidoriSearchAction* search_action; + KatzeItem* item; + + search_action = MIDORI_SEARCH_ACTION (action); + item = midori_search_action_get_default_item (search_action); + if (item) + g_object_set (browser->settings, "location-entry-search", + katze_item_get_uri (item), NULL); +} + +static void +_action_search_focus_out (GtkAction* action, + MidoriBrowser* browser) +{ + if (GTK_WIDGET_VISIBLE (browser->statusbar) && !browser->show_navigationbar) + gtk_widget_hide (browser->navigationbar); +} + +static void +midori_browser_bookmark_popup_item (GtkWidget* menu, + const gchar* stock_id, + const gchar* label, + KatzeItem* item, + gpointer callback, + MidoriBrowser* browser) +{ + const gchar* uri; + GtkWidget* menuitem; + + uri = katze_item_get_uri (item); + + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + if (label) + gtk_label_set_text_with_mnemonic (GTK_LABEL (gtk_bin_get_child ( + GTK_BIN (menuitem))), label); + if (!strcmp (stock_id, GTK_STOCK_EDIT)) + gtk_widget_set_sensitive (menuitem, + KATZE_IS_ARRAY (item) || uri != NULL); + else if (!KATZE_IS_ARRAY (item) && strcmp (stock_id, GTK_STOCK_DELETE)) + gtk_widget_set_sensitive (menuitem, uri != NULL); + g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item); + g_signal_connect (menuitem, "activate", G_CALLBACK (callback), browser); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); +} + +static void +midori_browser_bookmark_open_activate_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + midori_browser_set_current_uri (browser, uri); +} + +static void +midori_browser_bookmark_open_in_tab_activate_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + KatzeItem* item; + const gchar* uri; + guint n; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + if (KATZE_IS_ARRAY (item)) + { + KatzeItem* child; + guint i = 0; + + while ((child = katze_array_get_nth_item (KATZE_ARRAY (item), i))) + { + if ((uri = katze_item_get_uri (child)) && *uri) + { + n = midori_browser_add_item (browser, child); + _midori_browser_set_current_page_smartly (browser, n); + } + i++; + } + } + else + { + if ((uri = katze_item_get_uri (item)) && *uri) + { + n = midori_browser_add_item (browser, item); + _midori_browser_set_current_page_smartly (browser, n); + } + } +} + +static void +midori_browser_bookmark_open_in_window_activate_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + g_signal_emit (browser, signals[NEW_WINDOW], 0, uri); +} + +static void +midori_browser_bookmark_edit_activate_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (KATZE_IS_ARRAY (item)) + midori_browser_edit_bookmark_dialog_new (browser, item, FALSE, TRUE); + else if (uri && *uri) + midori_browser_edit_bookmark_dialog_new (browser, item, FALSE, FALSE); +} + +static void +midori_browser_bookmark_delete_activate_cb (GtkWidget* menuitem, + MidoriBrowser* browser) +{ + KatzeItem* item; + const gchar* uri; + KatzeItem* parent; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + /* FIXME: Even toplevel items should technically have a parent */ + g_return_if_fail (katze_item_get_parent (item)); + + parent = katze_item_get_parent (item); + katze_array_remove_item (KATZE_ARRAY (parent), item); +} + +static void +midori_browser_bookmark_popup (GtkWidget* widget, + GdkEventButton* event, + KatzeItem* item, + MidoriBrowser* browser) +{ + GtkWidget* menu; + GtkWidget* menuitem; + + menu = gtk_menu_new (); + if (KATZE_IS_ARRAY (item)) + midori_browser_bookmark_popup_item (menu, + STOCK_TAB_NEW, _("Open all in _Tabs"), + item, midori_browser_bookmark_open_in_tab_activate_cb, browser); + else + { + midori_browser_bookmark_popup_item (menu, GTK_STOCK_OPEN, NULL, + item, midori_browser_bookmark_open_activate_cb, browser); + midori_browser_bookmark_popup_item (menu, + STOCK_TAB_NEW, _("Open in New _Tab"), + item, midori_browser_bookmark_open_in_tab_activate_cb, browser); + midori_browser_bookmark_popup_item (menu, + STOCK_WINDOW_NEW, _("Open in New _Window"), + item, midori_browser_bookmark_open_in_window_activate_cb, browser); + } + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + midori_browser_bookmark_popup_item (menu, GTK_STOCK_EDIT, NULL, + item, midori_browser_bookmark_edit_activate_cb, browser); + midori_browser_bookmark_popup_item (menu, GTK_STOCK_DELETE, NULL, + item, midori_browser_bookmark_delete_activate_cb, browser); + + sokoke_widget_popup (widget, GTK_MENU (menu), + event, SOKOKE_MENU_POSITION_CURSOR); +} + +static void +midori_browser_menu_bookmarks_item_activate_cb (GtkWidget* widget, + MidoriBrowser* browser) +{ + KatzeItem* item; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (widget), "KatzeItem"); + midori_browser_set_current_uri (browser, katze_item_get_uri (item)); + gtk_widget_grab_focus (midori_browser_get_current_tab (browser)); +} + +static gboolean +midori_browser_bookmarkbar_item_button_press_event_cb (GtkWidget* toolitem, + GdkEventButton* event, + MidoriBrowser* browser) +{ + KatzeItem* item; + gint n; + gboolean open_in_background; + + if (event->button == 2) + { + item = (KatzeItem*)g_object_get_data (G_OBJECT (toolitem), "KatzeItem"); + if (katze_item_get_uri (item)) + { + g_object_get (browser->settings, "open-tabs-in-the-background", + &open_in_background, NULL); + n = midori_browser_add_uri (browser, katze_item_get_uri (item)); + if (!open_in_background) + midori_browser_set_current_page (browser, n); + return TRUE; + } + } + else if (event->button == 3) + { + item = (KatzeItem*)g_object_get_data (G_OBJECT (toolitem), "KatzeItem"); + midori_browser_bookmark_popup (toolitem, NULL, item, browser); + return TRUE; + } + return FALSE; +} + +static void +_action_bookmark_add_activate (GtkAction* action, + MidoriBrowser* browser) +{ + midori_browser_edit_bookmark_dialog_new (browser, NULL, TRUE, FALSE); +} + +static void +_action_bookmark_folder_add_activate (GtkAction* action, + MidoriBrowser* browser) +{ + midori_browser_edit_bookmark_dialog_new (browser, NULL, TRUE, TRUE); +} + +static void +_action_manage_search_engines_activate (GtkAction* action, + MidoriBrowser* browser) +{ + static GtkWidget* dialog = NULL; + + if (!GTK_WIDGET_VISIBLE (browser)) + return; + + if (!dialog) + { + dialog = midori_search_action_get_dialog ( + MIDORI_SEARCH_ACTION (_action_by_name (browser, "Search"))); + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), &dialog); + gtk_widget_show (dialog); + } + else + gtk_window_present (GTK_WINDOW (dialog)); +} + +static void +midori_browser_clear_private_data_response_cb (GtkWidget* dialog, + gint response_id, + MidoriBrowser* browser) +{ + if (response_id == GTK_RESPONSE_ACCEPT) + { + GtkToggleButton* button; + + button = g_object_get_data (G_OBJECT (dialog), "history"); + if (gtk_toggle_button_get_active (button)) + katze_array_clear (browser->history); + button = g_object_get_data (G_OBJECT (dialog), "cookies"); + if (gtk_toggle_button_get_active (button)) + { + SoupSession* session = katze_net_get_session (browser->net); + SoupSessionFeature* jar = soup_session_get_feature (session, + SOUP_TYPE_COOKIE_JAR); + GSList* cookies = soup_cookie_jar_all_cookies (SOUP_COOKIE_JAR (jar)); + SoupCookie* cookie; + gsize i = 0; + while ((cookie = g_slist_nth_data (cookies, i++))) + { + soup_cookie_jar_delete_cookie (SOUP_COOKIE_JAR (jar), cookie); + soup_cookie_free (cookie); + } + g_slist_free (cookies); + } + button = g_object_get_data (G_OBJECT (dialog), "flash-cookies"); + if (gtk_toggle_button_get_active (button)) + { + gchar* cache = g_build_filename (g_get_home_dir (), ".macromedia", + "Flash_Player", NULL); + sokoke_remove_path (cache, TRUE); + g_free (cache); + } + button = g_object_get_data (G_OBJECT (dialog), "website-icons"); + if (gtk_toggle_button_get_active (button)) + { + gchar* cache = g_build_filename (g_get_user_cache_dir (), + PACKAGE_NAME, "icons", NULL); + sokoke_remove_path (cache, TRUE); + g_free (cache); + } + } + if (response_id != GTK_RESPONSE_DELETE_EVENT) + gtk_widget_destroy (dialog); +} + +static void +_action_clear_private_data_activate (GtkAction* action, + MidoriBrowser* browser) +{ + static GtkWidget* dialog = NULL; + + if (!GTK_WIDGET_VISIBLE (browser)) + return; + + if (!dialog) + { + GdkScreen* screen; + GtkIconTheme* icon_theme; + GtkSizeGroup* sizegroup; + GtkWidget* hbox; + GtkWidget* vbox; + GtkWidget* icon; + GtkWidget* label; + GtkWidget* button; + + dialog = gtk_dialog_new_with_buttons (_("Clear Private Data"), + GTK_WINDOW (browser), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + _("_Clear private data"), GTK_RESPONSE_ACCEPT, NULL); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE); + screen = gtk_widget_get_screen (GTK_WIDGET (browser)); + if (screen) + { + icon_theme = gtk_icon_theme_get_for_screen (screen); + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_CLEAR); + } + sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + hbox = gtk_hbox_new (FALSE, 4); + icon = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_DIALOG); + gtk_size_group_add_widget (sizegroup, icon); + gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); + label = gtk_label_new (_("Clear the following data:")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 8); + hbox = gtk_hbox_new (FALSE, 4); + icon = gtk_image_new (); + gtk_size_group_add_widget (sizegroup, icon); + gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); + vbox = gtk_vbox_new (TRUE, 4); + button = gtk_check_button_new_with_mnemonic (_("History")); + g_object_set_data (G_OBJECT (dialog), "history", button); + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); + button = gtk_check_button_new_with_mnemonic (_("Cookies")); + g_object_set_data (G_OBJECT (dialog), "cookies", button); + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); + button = gtk_check_button_new_with_mnemonic (_("'Flash' Cookies")); + g_object_set_data (G_OBJECT (dialog), "flash-cookies", button); + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); + button = gtk_check_button_new_with_mnemonic (_("Website icons")); + g_object_set_data (G_OBJECT (dialog), "website-icons", button); + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 8); + gtk_widget_show_all (GTK_DIALOG (dialog)->vbox); + + g_signal_connect (dialog, "response", + G_CALLBACK (midori_browser_clear_private_data_response_cb), browser); + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), &dialog); + gtk_widget_show (dialog); + } + else + gtk_window_present (GTK_WINDOW (dialog)); +} + +static void +_action_tab_previous_activate (GtkAction* action, + MidoriBrowser* browser) +{ + gint n = gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); + gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n - 1); +} + +static void +_action_tab_next_activate (GtkAction* action, + MidoriBrowser* browser) +{ + /* Advance one tab or jump to the first one if we are at the last one */ + gint n = gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); + if (n == gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)) - 1) + n = -1; + gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n + 1); +} + +static const gchar* credits_authors[] = { + "Christian Dywan ", NULL }; +static const gchar* credits_documenters[] = { + "Christian Dywan ", NULL }; +static const gchar* credits_artists[] = { + "Nancy Runge ", NULL }; + +static const gchar* license = + "This library is free software; you can redistribute it and/or\n" + "modify it under the terms of the GNU Lesser General Public\n" + "License as published by the Free Software Foundation; either\n" + "version 2.1 of the License, or (at your option) any later version.\n"; + +static void +_action_about_activate_link (GtkAboutDialog* about, + const gchar* uri, + gpointer user_data) +{ + MidoriBrowser* browser; + gint n; + + browser = MIDORI_BROWSER (user_data); + n = midori_browser_add_uri (browser, uri); + midori_browser_set_current_page (browser, n); +} + +static void +_action_about_activate_email (GtkAboutDialog* about, + const gchar* uri, + gpointer user_data) +{ + if (!gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, NULL)) + { + /* Fallback to Exo for example if GConf isn't setup */ + gchar* command = g_strconcat ("exo-open ", uri, NULL); + g_spawn_command_line_async (command, NULL); + g_free (command); + } +} + +static void +_action_about_activate (GtkAction* action, + MidoriBrowser* browser) +{ + gtk_about_dialog_set_email_hook (_action_about_activate_email, NULL, NULL); + gtk_about_dialog_set_url_hook (_action_about_activate_link, browser, NULL); + gtk_show_about_dialog (GTK_WINDOW (browser), + "logo-icon-name", gtk_window_get_icon_name (GTK_WINDOW (browser)), + "name", PACKAGE_NAME, + "version", PACKAGE_VERSION, + "comments", _("A lightweight web browser."), + "copyright", "Copyright © 2007-2009 Christian Dywan", + "website", "http://www.twotoasts.de", + "authors", credits_authors, + "documenters", credits_documenters, + "artists", credits_artists, + "license", license, + "wrap-license", TRUE, + "translator-credits", _("translator-credits"), + NULL); +} + +static void +_action_help_link_activate (GtkAction* action, + MidoriBrowser* browser) +{ + const gchar* action_name; + const gchar* uri; + gint n; + + action_name = gtk_action_get_name (action); + if (!strncmp ("HelpContents", action_name, 12)) + { + #ifdef DOCDIR + uri = "file://" DOCDIR "/midori/user/midori.html"; + if (!g_file_test (DOCDIR "/midori/user/midori.html", G_FILE_TEST_EXISTS)) + #endif + uri = "error:nodocs " DOCDIR "/midori/user/midori.html"; + } + else if (!strncmp ("HelpFAQ", action_name, 7)) + uri = "http://wiki.xfce.org/_export/xhtml/midori_faq"; + else if (!strncmp ("HelpBugs", action_name, 8)) + uri = "http://www.twotoasts.de/bugs/"; + else + uri = NULL; + + if (uri) + { + n = midori_browser_add_uri (browser, uri); + midori_browser_set_current_page (browser, n); + } + +} + +static void +_action_panel_activate (GtkToggleAction* action, + MidoriBrowser* browser) +{ + gboolean active = gtk_toggle_action_get_active (action); + if (browser->settings) + g_object_set (browser->settings, "show-panel", active, NULL); + sokoke_widget_set_visible (browser->panel, active); +} + +static gboolean +midori_browser_panel_timeout (GtkWidget* hpaned) +{ + gboolean position = gtk_paned_get_position (GTK_PANED (hpaned)); + MidoriBrowser* browser = MIDORI_BROWSER (gtk_widget_get_toplevel (hpaned)); + if (browser->settings) + g_object_set (browser->settings, "last-panel-position", position, NULL); + browser->panel_timeout = 0; + return FALSE; +} + +static void +midori_panel_notify_position_cb (GObject* hpaned, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + if (!browser->panel_timeout) + browser->panel_timeout = g_timeout_add_full (G_PRIORITY_LOW, 5000, + (GSourceFunc)midori_browser_panel_timeout, hpaned, NULL); +} + +static void +midori_panel_notify_right_aligned_cb (MidoriPanel* panel, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + gboolean right_aligned = katze_object_get_boolean (panel, "right-aligned"); + GtkWidget* hpaned = gtk_widget_get_parent (browser->panel); + GtkWidget* vpaned = gtk_widget_get_parent (browser->notebook); + + if (browser->settings) + g_object_set (browser->settings, "right-align-sidepanel", + right_aligned, NULL); + + g_object_ref (browser->panel); + g_object_ref (vpaned); + gtk_container_remove (GTK_CONTAINER (hpaned), browser->panel); + gtk_container_remove (GTK_CONTAINER (hpaned), vpaned); + if (right_aligned) + { + gtk_paned_pack1 (GTK_PANED (hpaned), vpaned, FALSE, FALSE); + gtk_paned_pack2 (GTK_PANED (hpaned), browser->panel, FALSE, FALSE); + } + else + { + gtk_paned_pack1 (GTK_PANED (hpaned), browser->panel, FALSE, FALSE); + gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, FALSE, FALSE); + } + g_object_unref (browser->panel); + g_object_unref (vpaned); +} + +static gboolean +midori_panel_close_cb (MidoriPanel* panel, + MidoriBrowser* browser) +{ + _action_set_active (browser, "Panel", FALSE); + return FALSE; +} + +static void +gtk_notebook_switch_page_cb (GtkWidget* notebook, + GtkNotebookPage* page, + guint page_num, + MidoriBrowser* browser) +{ + GtkWidget* view; + const gchar* uri; + GtkAction* action; + const gchar* title; + gchar* window_title; + + if (!(view = midori_browser_get_current_tab (browser))) + return; + + uri = midori_view_get_display_uri (MIDORI_VIEW (view)); + action = _action_by_name (browser, "Location"); + midori_location_action_set_uri (MIDORI_LOCATION_ACTION (action), uri); + midori_location_action_set_icon (MIDORI_LOCATION_ACTION (action), + midori_view_get_icon (MIDORI_VIEW (view))); + + title = midori_view_get_display_title (MIDORI_VIEW (view)); + window_title = g_strconcat (title, " - ", g_get_application_name (), NULL); + gtk_window_set_title (GTK_WINDOW (browser), window_title); + g_free (window_title); + + g_object_notify (G_OBJECT (browser), "uri"); + + _midori_browser_set_statusbar_text (browser, NULL); + _midori_browser_update_interface (browser); + _midori_browser_update_progress (browser, MIDORI_VIEW (view)); +} + +static void +midori_browser_notebook_page_reordered_cb (GtkNotebook* notebook, + MidoriView* view, + guint page_num, + MidoriBrowser* browser) +{ + KatzeItem* item = midori_view_get_proxy_item (view); + katze_array_move_item (browser->proxy_array, item, page_num); + + g_object_notify (G_OBJECT (browser), "uri"); +} + +static gboolean +gtk_notebook_button_press_event_cb (GtkNotebook* notebook, + GdkEventButton* event, + MidoriBrowser* browser) +{ + /* Open a new tab on double click or middle mouse click */ + if (event->window == notebook->event_window + && ((event->type == GDK_2BUTTON_PRESS && event->button == 1) + || (event->type == GDK_BUTTON_PRESS && event->button == 2))) + { + gtk_action_activate (_action_by_name (browser, "TabNew")); + + return TRUE; + } + + return FALSE; +} + +static void +_action_undo_tab_close_activate (GtkAction* action, + MidoriBrowser* browser) +{ + guint last; + KatzeItem* item; + guint n; + + if (!browser->trash) + return; + + /* Reopen the most recent trash item */ + last = katze_array_get_length (browser->trash) - 1; + item = katze_array_get_nth_item (browser->trash, last); + n = midori_browser_add_item (browser, item); + midori_browser_set_current_page (browser, n); + katze_array_remove_item (browser->trash, item); + _midori_browser_update_actions (browser); +} + +static void +_action_trash_empty_activate (GtkAction* action, + MidoriBrowser* browser) +{ + if (browser->trash) + { + katze_array_clear (browser->trash); + _midori_browser_update_actions (browser); + } +} + +static const GtkActionEntry entries[] = { + { "File", NULL, N_("_File") }, + { "WindowNew", STOCK_WINDOW_NEW, + NULL, "n", + N_("Open a new window"), G_CALLBACK (_action_window_new_activate) }, + { "TabNew", STOCK_TAB_NEW, + NULL, "t", + N_("Open a new tab"), G_CALLBACK (_action_tab_new_activate) }, + { "Open", GTK_STOCK_OPEN, + NULL, "o", + N_("Open a file"), G_CALLBACK (_action_open_activate) }, + { "SaveAs", GTK_STOCK_SAVE_AS, + NULL, "s", + N_("Save to a file"), G_CALLBACK (_action_save_as_activate) }, + { "TabClose", NULL, + N_("_Close Tab"), "w", + N_("Close the current tab"), G_CALLBACK (_action_tab_close_activate) }, + { "WindowClose", NULL, + N_("C_lose Window"), "w", + N_("Close this window"), G_CALLBACK (_action_window_close_activate) }, + { "Print", GTK_STOCK_PRINT, + NULL, "p", + N_("Print the current page"), G_CALLBACK (_action_print_activate) }, + { "Quit", GTK_STOCK_QUIT, + NULL, "q", + N_("Quit the application"), G_CALLBACK (_action_quit_activate) }, + + { "Edit", NULL, N_("_Edit"), NULL, NULL, G_CALLBACK (_action_edit_activate) }, + { "Cut", GTK_STOCK_CUT, + NULL, "x", + N_("Cut the selected text"), G_CALLBACK (_action_cut_activate) }, + { "Copy", GTK_STOCK_COPY, + NULL, "c", + N_("Copy the selected text"), G_CALLBACK (_action_copy_activate) }, + { "Copy_", GTK_STOCK_COPY, + NULL, "c", + N_("Copy the selected text"), G_CALLBACK (_action_copy_activate) }, + { "Paste", GTK_STOCK_PASTE, + NULL, "v", + N_("Paste text from the clipboard"), G_CALLBACK (_action_paste_activate) }, + { "Delete", GTK_STOCK_DELETE, + NULL, NULL, + N_("Delete the selected text"), G_CALLBACK (_action_delete_activate) }, + { "SelectAll", GTK_STOCK_SELECT_ALL, + NULL, "a", + N_("Select all text"), G_CALLBACK (_action_select_all_activate) }, + { "Find", GTK_STOCK_FIND, + NULL, "f", + N_("Find a word or phrase in the page"), G_CALLBACK (_action_find_activate) }, + { "FindNext", GTK_STOCK_GO_FORWARD, + N_("Find _Next"), "g", + N_("Find the next occurrence of a word or phrase"), G_CALLBACK (_action_find_next_activate) }, + { "FindPrevious", GTK_STOCK_GO_BACK, + N_("Find _Previous"), "g", + N_("Find the previous occurrence of a word or phrase"), + G_CALLBACK (_action_find_previous_activate) }, + { "FindQuick", GTK_STOCK_FIND, + N_("_Quick Find"), "period", + N_("Quickly jump to a word or phrase"), NULL/*G_CALLBACK (_action_find_quick_activate)*/ }, + { "Preferences", GTK_STOCK_PREFERENCES, + NULL, "p", + N_("Configure the application preferences"), G_CALLBACK (_action_preferences_activate) }, + + { "View", NULL, N_("_View") }, + { "Toolbars", NULL, N_("_Toolbars") }, + { "Reload", GTK_STOCK_REFRESH, + NULL, "r", + N_("Reload the current page"), G_CALLBACK (_action_reload_stop_activate) }, + { "Stop", GTK_STOCK_STOP, + NULL, "Escape", + N_("Stop loading the current page"), G_CALLBACK (_action_reload_stop_activate) }, + { "ReloadStop", GTK_STOCK_STOP, + NULL, "r", + N_("Reload the current page"), G_CALLBACK (_action_reload_stop_activate) }, + { "ZoomIn", GTK_STOCK_ZOOM_IN, + NULL, "plus", + N_("Increase the zoom level"), G_CALLBACK (_action_zoom_in_activate) }, + { "ZoomOut", GTK_STOCK_ZOOM_OUT, + NULL, "minus", + N_("Decrease the zoom level"), G_CALLBACK (_action_zoom_out_activate) }, + { "ZoomNormal", GTK_STOCK_ZOOM_100, + NULL, "0", + N_("Reset the zoom level"), G_CALLBACK (_action_zoom_normal_activate) }, + { "Encoding", NULL, N_("_Encoding") }, + { "EncodingAutomatic", NULL, + N_("_Automatic"), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "EncodingChinese", NULL, + N_("Chinese (BIG5)"), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "EncodingJapanese", NULL, + N_("Japanese (SHIFT_JIS)"), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "EncodingRussian", NULL, + N_("Russian (KOI8-R)"), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "EncodingUnicode", NULL, + N_("Unicode (UTF-8)"), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "EncodingWestern", NULL, + N_("Western (ISO-8859-1)"), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "EncodingCustom", NULL, + N_("Custom..."), "", + NULL, G_CALLBACK (_action_view_encoding_activate) }, + { "SourceView", NULL, + N_("View _Source"), "", + N_("View the source code of the page"), G_CALLBACK (_action_source_view_activate) }, + { "SelectionSourceView", NULL, + N_("View Selection Source"), "", + N_("View the source code of the selection"), + NULL/*G_CALLBACK (_action_selection_source_view_activate)*/ }, + { "Fullscreen", GTK_STOCK_FULLSCREEN, + NULL, "F11", + N_("Toggle fullscreen view"), G_CALLBACK (_action_fullscreen_activate) }, + + { "Go", NULL, N_("_Go") }, + { "Back", GTK_STOCK_GO_BACK, + NULL, "Left", + N_("Go back to the previous page"), G_CALLBACK (_action_back_activate) }, + { "Forward", GTK_STOCK_GO_FORWARD, + NULL, "Right", + N_("Go forward to the next page"), G_CALLBACK (_action_forward_activate) }, + { "Homepage", STOCK_HOMEPAGE, + NULL, "Home", + N_("Go to your homepage"), G_CALLBACK (_action_homepage_activate) }, + { "TrashEmpty", GTK_STOCK_CLEAR, + N_("Empty Trash"), "", + N_("Delete the contents of the trash"), G_CALLBACK (_action_trash_empty_activate) }, + { "UndoTabClose", GTK_STOCK_UNDELETE, + N_("Undo Close Tab"), "t", + N_("Open the last closed tab"), G_CALLBACK (_action_undo_tab_close_activate) }, + + { "BookmarkAdd", STOCK_BOOKMARK_ADD, + NULL, "d", + N_("Add a new bookmark"), G_CALLBACK (_action_bookmark_add_activate) }, + { "BookmarkFolderAdd", GTK_STOCK_DIRECTORY, + N_("Add a new folder"), "", + N_("Add a new bookmark folder"), G_CALLBACK (_action_bookmark_folder_add_activate) }, + { "Tools", NULL, N_("_Tools") }, + { "ManageSearchEngines", GTK_STOCK_PROPERTIES, + N_("_Manage Search Engines"), "s", + N_("Add, edit and remove search engines..."), + G_CALLBACK (_action_manage_search_engines_activate) }, + { "ClearPrivateData", GTK_STOCK_CLEAR, + N_("_Clear Private Data"), "Delete", + N_("Clear private data..."), + G_CALLBACK (_action_clear_private_data_activate) }, + + { "TabPrevious", GTK_STOCK_GO_BACK, + N_("_Previous Tab"), "Page_Up", + N_("Switch to the previous tab"), G_CALLBACK (_action_tab_previous_activate) }, + { "TabNext", GTK_STOCK_GO_FORWARD, + N_("_Next Tab"), "Page_Down", + N_("Switch to the next tab"), G_CALLBACK (_action_tab_next_activate) }, + + { "Help", NULL, N_("_Help") }, + { "HelpContents", GTK_STOCK_HELP, + N_("_Contents"), "F1", + N_("Show the documentation"), G_CALLBACK (_action_help_link_activate) }, + { "HelpFAQ", NULL, + N_("_Frequent Questions"), NULL, + N_("Show the Frequently Asked Questions"), G_CALLBACK (_action_help_link_activate) }, + { "HelpBugs", NULL, + N_("_Report a Bug"), NULL, + N_("Open Midori's bug tracker"), G_CALLBACK (_action_help_link_activate) }, + { "About", GTK_STOCK_ABOUT, + NULL, "", + N_("Show information about the program"), G_CALLBACK (_action_about_activate) }, + { "Dummy", NULL, "Dummy" }, + }; + static const guint entries_n = G_N_ELEMENTS (entries); + +static const GtkToggleActionEntry toggle_entries[] = { + { "PrivateBrowsing", NULL, + N_("P_rivate Browsing"), "", + N_("Don't save any private data while browsing"), + NULL/*G_CALLBACK (_action_private_browsing_activate)*/, + FALSE }, + + { "Menubar", NULL, + N_("_Menubar"), "", + N_("Show menubar"), G_CALLBACK (_action_menubar_activate), + FALSE }, + { "Navigationbar", NULL, + N_("_Navigationbar"), "", + N_("Show navigationbar"), G_CALLBACK (_action_navigationbar_activate), + FALSE }, + { "Panel", GTK_STOCK_INDENT, + N_("Side_panel"), "F9", + N_("Show sidepanel"), G_CALLBACK (_action_panel_activate), + FALSE }, + { "Bookmarkbar", NULL, + N_("_Bookmarkbar"), "", + N_("Show bookmarkbar"), G_CALLBACK (_action_bookmarkbar_activate), + FALSE }, + { "Transferbar", NULL, + N_("_Transferbar"), "", + N_("Show transferbar"), G_CALLBACK (_action_transferbar_activate), + FALSE }, + { "Statusbar", NULL, + N_("_Statusbar"), "", + N_("Show statusbar"), G_CALLBACK (_action_statusbar_activate), + FALSE }, + }; + static const guint toggle_entries_n = G_N_ELEMENTS (toggle_entries); + +static void +midori_browser_window_state_event_cb (MidoriBrowser* browser, + GdkEventWindowState* event) +{ + MidoriWindowState window_state = MIDORI_WINDOW_NORMAL; + if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) + window_state = MIDORI_WINDOW_MINIMIZED; + else if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) + window_state = MIDORI_WINDOW_MAXIMIZED; + else if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) + window_state = MIDORI_WINDOW_FULLSCREEN; + g_object_set (browser->settings, "last-window-state", window_state, NULL); + + if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) + { + if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) + { + gtk_widget_hide (browser->menubar); + g_object_set (browser->button_fullscreen, + "stock-id", GTK_STOCK_LEAVE_FULLSCREEN, NULL); + gtk_widget_show (browser->button_fullscreen); + } + else + { + if (katze_object_get_boolean (browser->settings, "show-menubar")) + gtk_widget_show (browser->menubar); + gtk_widget_hide (browser->button_fullscreen); + g_object_set (browser->button_fullscreen, + "stock-id", GTK_STOCK_FULLSCREEN, NULL); + } + } +} + +static gboolean +midori_browser_alloc_timeout (MidoriBrowser* browser) +{ + GtkWidget* widget = GTK_WIDGET (browser); + GdkWindowState state = gdk_window_get_state (widget->window); + + if (!(state & + (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN))) + g_object_set (browser->settings, + "last-window-width", widget->allocation.width, + "last-window-height", widget->allocation.height, NULL); + + browser->alloc_timeout = 0; + return FALSE; +} + +static void +midori_browser_size_allocate_cb (MidoriBrowser* browser, + GtkAllocation* allocation) +{ + GtkWidget* widget = GTK_WIDGET (browser); + + if (GTK_WIDGET_REALIZED (widget)) + { + GdkWindowState state = gdk_window_get_state (widget->window); + if (!(state & + (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)) + && !browser->alloc_timeout) + { + browser->alloc_timeout = g_timeout_add_full (G_PRIORITY_LOW, 5000, + (GSourceFunc)midori_browser_alloc_timeout, browser, NULL); + } + } +} + +static void +midori_browser_destroy_cb (MidoriBrowser* browser) +{ + if (G_UNLIKELY (browser->panel_timeout)) + g_source_remove (browser->panel_timeout); + if (G_UNLIKELY (browser->alloc_timeout)) + g_source_remove (browser->alloc_timeout); + + /* Destroy panel first, so panels don't need special care */ + gtk_widget_destroy (browser->panel); + /* Destroy tabs second, so child widgets don't need special care */ + gtk_container_foreach (GTK_CONTAINER (browser->notebook), + (GtkCallback) gtk_widget_destroy, NULL); +} + +static const gchar* ui_markup = + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + /* Panel items shall be appended here */ + "" + "" + "" + "" + "" + "" + "" + "" + "" + /* For accelerators to work all actions need to be used + *somewhere* in the UI definition */ + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static void +midori_browser_realize_cb (GtkStyle* style, + MidoriBrowser* browser) +{ + GdkScreen* screen; + GtkIconTheme* icon_theme; + + screen = gtk_widget_get_screen (GTK_WIDGET (browser)); + if (screen) + { + icon_theme = gtk_icon_theme_get_for_screen (screen); + if (gtk_icon_theme_has_icon (icon_theme, "midori")) + gtk_window_set_icon_name (GTK_WINDOW (browser), "midori"); + else + gtk_window_set_icon_name (GTK_WINDOW (browser), "web-browser"); + } +} + +static void +midori_browser_entry_clear_icon_released_cb (GtkIconEntry* entry, + gint icon_pos, + gint button, + gpointer user_data) +{ + if (icon_pos == GTK_ICON_ENTRY_SECONDARY) + gtk_entry_set_text (GTK_ENTRY (entry), ""); +} + +static void +midori_browser_new_history_item (MidoriBrowser* browser, + KatzeItem* item) +{ + KatzeArray* parent; + gint i; + gboolean found; + time_t now; + gint64 day; + gint64 pday; + gint64 age; + gint64 newage; + gchar token[50]; + + now = time (NULL); + katze_item_set_added (item, now); + day = sokoke_time_t_to_julian (&now); + + found = FALSE; + i = 0; + while ((parent = katze_array_get_nth_item (browser->history, i++))) + { + pday = katze_item_get_added (KATZE_ITEM (parent)); + age = katze_item_get_added (item); + newage = day - pday; + if (newage == 0) + { + found = TRUE; + katze_array_add_item (parent, item); + } + if (age != newage) + katze_item_set_added (item, newage); + } + if (!found) + { + strftime (token, sizeof (token), "%x", localtime (&now)); + parent = katze_array_new (KATZE_TYPE_ARRAY); + katze_item_set_added (KATZE_ITEM (parent), day); + katze_item_set_name (KATZE_ITEM (parent), token); + katze_array_add_item (browser->history, parent); + katze_array_add_item (parent, item); + } +} + +static void +midori_browser_history_remove_item_cb (KatzeArray* folder, + KatzeItem* item, + MidoriBrowser* browser) +{ + GtkAction* action; + + action = _action_by_name (browser, "Location"); + midori_location_action_delete_item_from_uri ( + MIDORI_LOCATION_ACTION (action), katze_item_get_uri (item)); + g_signal_handlers_disconnect_by_func (folder, + midori_browser_history_remove_item_cb, + browser); + + action = _action_by_name (browser, "RecentlyVisited"); + if ((KatzeArray*)item == katze_array_action_get_array (KATZE_ARRAY_ACTION (action))) + g_object_set (action, "array", NULL, NULL); +} + +static void +_location_action_insert_history_item (MidoriLocationAction* action, + MidoriBrowser* browser, + KatzeItem* item) +{ + KatzeItem* child; + guint i; + const gchar* uri; + GdkPixbuf* pixbuf = NULL; + + if (KATZE_IS_ARRAY (item)) + { + for (i = katze_array_get_length (KATZE_ARRAY (item)); i > 0; i--) + { + child = katze_array_get_nth_item (KATZE_ARRAY (item), i - 1); + _location_action_insert_history_item (action, browser, child); + } + } + else + { + uri = katze_item_get_uri (item); + pixbuf = katze_net_load_icon (browser->net, katze_item_get_uri (item), + NULL, GTK_WIDGET (browser), NULL); + midori_location_action_add_item (action, uri, + pixbuf, katze_item_get_name (item)); + g_object_unref (pixbuf); + g_signal_connect (katze_item_get_parent (item), "remove-item", + G_CALLBACK (midori_browser_history_remove_item_cb), browser); + } +} + +static void +midori_browser_history_clear_cb (KatzeArray* history, + MidoriBrowser* browser) +{ + GtkAction* location_action = _action_by_name (browser, "Location"); + midori_location_action_clear (MIDORI_LOCATION_ACTION (location_action)); + g_object_set (_action_by_name (browser, "RecentlyVisited"), + "array", NULL, NULL); +} + +static void +midori_browser_set_history (MidoriBrowser* browser, + KatzeArray* history) +{ + KatzeItem* recently_visited; + GtkAction* action; + time_t now; + gint64 day; + + if (browser->history == history) + return; + + if (browser->history) + g_signal_handlers_disconnect_by_func (browser->history, + midori_browser_history_clear_cb, + browser); + if (history) + g_object_ref (history); + katze_object_assign (browser->history, history); + + midori_browser_history_clear_cb (history, browser); + + if (history && ((recently_visited = katze_array_get_nth_item (history, + katze_array_get_length (KATZE_ARRAY (history)) - 1)))) + g_object_set (_action_by_name (browser, "RecentlyVisited"), + "array", recently_visited, NULL); + else + g_object_set (_action_by_name (browser, "RecentlyVisited"), + "array", NULL, NULL); + + if (!history) + return; + + g_signal_connect (browser->history, "clear", + G_CALLBACK (midori_browser_history_clear_cb), browser); + + now = time (NULL); + day = sokoke_time_t_to_julian (&now); + + action = _action_by_name (browser, "Location"); + midori_location_action_freeze (MIDORI_LOCATION_ACTION (action)); + _location_action_insert_history_item (MIDORI_LOCATION_ACTION (action), + browser, KATZE_ITEM (browser->history)); + midori_location_action_thaw (MIDORI_LOCATION_ACTION (action)); +} + +static void +midori_browser_init (MidoriBrowser* browser) +{ + GtkWidget* vbox; + GtkUIManager* ui_manager; + GError* error; + GtkAction* action; + GtkWidget* menuitem; + #if HAVE_HILDON + GtkWidget* menu; + GList* children; + #endif + GtkSettings* gtk_settings; + GtkWidget* hbox; + GtkWidget* hpaned; + GtkWidget* vpaned; + GtkToolItem* toolitem; + GtkRcStyle* rcstyle; + GtkWidget* scrolled; + GtkWidget* icon; + + browser->net = katze_net_new (); + + browser->settings = midori_web_settings_new (); + browser->proxy_array = katze_array_new (KATZE_TYPE_ARRAY); + browser->bookmarks = NULL; + browser->trash = NULL; + browser->search_engines = NULL; + + /* Setup the window metrics */ + g_signal_connect (browser, "realize", + G_CALLBACK (midori_browser_realize_cb), browser); + g_signal_connect (browser, "window-state-event", + G_CALLBACK (midori_browser_window_state_event_cb), NULL); + g_signal_connect (browser, "size-allocate", + G_CALLBACK (midori_browser_size_allocate_cb), NULL); + g_signal_connect (browser, "destroy", + G_CALLBACK (midori_browser_destroy_cb), NULL); + gtk_window_set_icon_name (GTK_WINDOW (browser), "web-browser"); + gtk_window_set_title (GTK_WINDOW (browser), g_get_application_name ()); + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (browser), vbox); + gtk_widget_show (vbox); + + /* Let us see some ui manager magic */ + browser->action_group = gtk_action_group_new ("Browser"); + gtk_action_group_set_translation_domain (browser->action_group, GETTEXT_PACKAGE); + gtk_action_group_add_actions (browser->action_group, + entries, entries_n, browser); + gtk_action_group_add_toggle_actions (browser->action_group, + toggle_entries, toggle_entries_n, browser); + ui_manager = gtk_ui_manager_new (); + gtk_ui_manager_insert_action_group (ui_manager, browser->action_group, 0); + gtk_window_add_accel_group (GTK_WINDOW (browser), + gtk_ui_manager_get_accel_group (ui_manager)); + + error = NULL; + if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_markup, -1, &error)) + { + /* TODO: Should this be a message dialog? When does this happen? */ + g_message ("User interface couldn't be created: %s", error->message); + g_error_free (error); + } + + /* Hide the 'Dummy' which only holds otherwise unused actions */ + g_object_set (_action_by_name (browser, "Dummy"), "visible", FALSE, NULL); + + action = g_object_new (KATZE_TYPE_SEPARATOR_ACTION, + "name", "Separator", + "label", _("_Separator"), + NULL); + gtk_action_group_add_action (browser->action_group, action); + g_object_unref (action); + + action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, + "name", "Location", + "label", _("_Location..."), + "stock-id", GTK_STOCK_JUMP_TO, + "tooltip", _("Open a particular location"), + /* FIXME: Due to a bug in GtkIconEntry we need to set an initial icon */ + "secondary-icon", STOCK_NEWS_FEED, + NULL); + g_object_connect (action, + "signal::activate", + _action_location_activate, browser, + "signal::active-changed", + _action_location_active_changed, browser, + "signal::focus-out", + _action_location_focus_out, browser, + "signal::reset-uri", + _action_location_reset_uri, browser, + "signal::submit-uri", + _action_location_submit_uri, browser, + "signal::secondary-icon-released", + _action_location_secondary_icon_released, browser, + NULL); + gtk_action_group_add_action_with_accel (browser->action_group, + action, "L"); + g_object_unref (action); + + action = g_object_new (MIDORI_TYPE_SEARCH_ACTION, + "name", "Search", + "label", _("_Web Search..."), + "stock-id", GTK_STOCK_FIND, + "tooltip", _("Run a web search"), + NULL); + g_object_connect (action, + "signal::activate", + _action_search_activate, browser, + "signal::submit", + _action_search_submit, browser, + "signal::focus-out", + _action_search_focus_out, browser, + "signal::notify::current-item", + _action_search_notify_current_item, browser, + "signal::notify::default-item", + _action_search_notify_default_item, browser, + NULL); + gtk_action_group_add_action_with_accel (browser->action_group, + action, "K"); + g_object_unref (action); + + action = g_object_new (KATZE_TYPE_ARRAY_ACTION, + "name", "Trash", + "stock-id", STOCK_USER_TRASH, + "tooltip", _("Reopen a previously closed tab or window"), + NULL); + g_object_connect (action, + "signal::populate-popup", + _action_trash_populate_popup, browser, + "signal::activate-item", + _action_trash_activate_item, browser, + NULL); + gtk_action_group_add_action_with_accel (browser->action_group, action, ""); + g_object_unref (action); + + action = g_object_new (KATZE_TYPE_ARRAY_ACTION, + "name", "RecentlyVisited", + "label", _("_Recently visited pages"), + "stock-id", STOCK_HISTORY, + "tooltip", _("Reopen pages that you visited earlier"), + NULL); + g_object_connect (action, + "signal::populate-popup", + _action_history_populate_popup, browser, + "signal::activate-item", + _action_history_activate_item, browser, + NULL); + gtk_action_group_add_action_with_accel (browser->action_group, action, ""); + g_object_unref (action); + + action = g_object_new (KATZE_TYPE_ARRAY_ACTION, + "name", "Bookmarks", + "label", _("_Bookmarks"), + "stock-id", STOCK_BOOKMARKS, + "tooltip", _("Show the saved bookmarks"), + NULL); + g_object_connect (action, + "signal::populate-popup", + _action_bookmarks_populate_popup, browser, + "signal::activate-item", + _action_bookmarks_activate_item, browser, + NULL); + gtk_action_group_add_action_with_accel (browser->action_group, action, ""); + g_object_unref (action); + + action = g_object_new (KATZE_TYPE_ARRAY_ACTION, + "name", "Window", + "label", _("_Window"), + "stock-id", GTK_STOCK_INDEX, + "tooltip", _("Show a list of all open tabs"), + "array", browser->proxy_array, + NULL); + g_object_connect (action, + "signal::populate-popup", + _action_window_populate_popup, browser, + "signal::activate-item", + _action_window_activate_item, browser, + NULL); + gtk_action_group_add_action_with_accel (browser->action_group, action, ""); + g_object_unref (action); + + /* Create the menubar */ + browser->menubar = gtk_ui_manager_get_widget (ui_manager, "/menubar"); + #if HAVE_HILDON + menu = gtk_menu_new (); + children = gtk_container_get_children (GTK_CONTAINER (browser->menubar)); + while (children) + { + menuitem = GTK_WIDGET (children->data); + gtk_widget_reparent (menuitem, menu); + children = g_list_next (children); + } + browser->menubar = menu; + hildon_window_set_menu (HILDON_WINDOW (browser), GTK_MENU (browser->menubar)); + hildon_program_add_window (hildon_program_get_instance (), + HILDON_WINDOW (browser)); + #else + gtk_box_pack_start (GTK_BOX (vbox), browser->menubar, FALSE, FALSE, 0); + gtk_widget_hide (browser->menubar); + g_signal_connect (browser->menubar, "button-press-event", + G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), browser); + #endif + menuitem = gtk_menu_item_new (); + #if !HAVE_HILDON + gtk_widget_show (menuitem); + #endif + browser->throbber = katze_throbber_new (); + gtk_widget_show (browser->throbber); + gtk_container_add (GTK_CONTAINER (menuitem), browser->throbber); + gtk_widget_set_sensitive (menuitem, FALSE); + gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE); + gtk_menu_shell_append (GTK_MENU_SHELL (browser->menubar), menuitem); + browser->menu_tools = gtk_menu_item_get_submenu (GTK_MENU_ITEM ( + gtk_ui_manager_get_widget (ui_manager, "/menubar/Tools"))); + menuitem = gtk_separator_menu_item_new (); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (browser->menu_tools), menuitem); + + _action_set_sensitive (browser, "PrivateBrowsing", FALSE); + _action_set_sensitive (browser, "FindQuick", FALSE); + #if HAVE_HILDON + g_object_set (_action_by_name (browser, "Menubar"), "visible", FALSE, NULL); + g_object_set (_action_by_name (browser, "Statusbar"), "visible", FALSE, NULL); + #endif + #if !WEBKIT_CHECK_VERSION (1, 1, 3) + _action_set_sensitive (browser, "Transferbar", FALSE); + #endif + _action_set_sensitive (browser, "EncodingCustom", FALSE); + _action_set_sensitive (browser, "SelectionSourceView", FALSE); + + /* Create the navigationbar */ + browser->navigationbar = gtk_ui_manager_get_widget ( + ui_manager, "/toolbar_navigation"); + /* FIXME: Settings should be connected with screen changes */ + gtk_settings = gtk_widget_get_settings (GTK_WIDGET (browser)); + if (gtk_settings) + g_signal_connect (gtk_settings, "notify::gtk-toolbar-style", + G_CALLBACK (midori_browser_navigationbar_notify_style_cb), browser); + gtk_toolbar_set_show_arrow (GTK_TOOLBAR (browser->navigationbar), TRUE); + g_object_set (_action_by_name (browser, "Back"), "is-important", TRUE, NULL); + gtk_widget_hide (browser->navigationbar); + g_signal_connect (browser->navigationbar, "popup-context-menu", + G_CALLBACK (midori_browser_toolbar_popup_context_menu_cb), browser); + #if HAVE_HILDON + hildon_window_add_toolbar (HILDON_WINDOW (browser), + GTK_TOOLBAR (browser->navigationbar)); + #else + gtk_box_pack_start (GTK_BOX (vbox), browser->navigationbar, FALSE, FALSE, 0); + #endif + + /* Bookmarkbar */ + browser->bookmarkbar = gtk_toolbar_new (); + gtk_widget_set_name (browser->bookmarkbar, "MidoriBookmarkbar"); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (browser->bookmarkbar), + GTK_ICON_SIZE_MENU); + gtk_toolbar_set_style (GTK_TOOLBAR (browser->bookmarkbar), + GTK_TOOLBAR_BOTH_HORIZ); + #if HAVE_HILDON + hildon_window_add_toolbar (HILDON_WINDOW (browser), + GTK_TOOLBAR (browser->bookmarkbar)); + #else + gtk_box_pack_start (GTK_BOX (vbox), browser->bookmarkbar, FALSE, FALSE, 0); + #endif + g_signal_connect (browser->bookmarkbar, "popup-context-menu", + G_CALLBACK (midori_browser_toolbar_popup_context_menu_cb), browser); + + /* Superuser warning */ + if ((hbox = sokoke_superuser_warning_new ())) + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + /* Create the panel */ + hpaned = gtk_hpaned_new (); + g_signal_connect (hpaned, "notify::position", + G_CALLBACK (midori_panel_notify_position_cb), + browser); + gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); + gtk_widget_show (hpaned); + browser->panel = g_object_new (MIDORI_TYPE_PANEL, + "menu", browser->menu_tools, + NULL); + g_signal_connect (browser->panel, "notify::right-aligned", + G_CALLBACK (midori_panel_notify_right_aligned_cb), browser); + g_signal_connect (browser->panel, "close", + G_CALLBACK (midori_panel_close_cb), browser); + gtk_paned_pack1 (GTK_PANED (hpaned), browser->panel, FALSE, FALSE); + + /* Notebook, containing all views */ + vpaned = gtk_vpaned_new (); + gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, FALSE, FALSE); + gtk_widget_show (vpaned); + browser->notebook = gtk_notebook_new (); + /* Remove the inner border between scrollbars and the window border */ + rcstyle = gtk_rc_style_new (); + rcstyle->xthickness = 0; + gtk_widget_modify_style (browser->notebook, rcstyle); + g_object_unref (rcstyle); + gtk_notebook_set_scrollable (GTK_NOTEBOOK (browser->notebook), TRUE); + gtk_paned_pack2 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE); + g_signal_connect_after (browser->notebook, "switch-page", + G_CALLBACK (gtk_notebook_switch_page_cb), + browser); + g_signal_connect (browser->notebook, "page-reordered", + G_CALLBACK (midori_browser_notebook_page_reordered_cb), + browser); + g_signal_connect (browser->notebook, "button-press-event", + G_CALLBACK (gtk_notebook_button_press_event_cb), + browser); + gtk_widget_show (browser->notebook); + + /* Inspector container */ + browser->inspector = gtk_vbox_new (FALSE, 0); + gtk_paned_pack2 (GTK_PANED (vpaned), browser->inspector, TRUE, TRUE); + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + GTK_WIDGET_SET_FLAGS (scrolled, GTK_CAN_FOCUS); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), + GTK_SHADOW_ETCHED_IN); + gtk_box_pack_start (GTK_BOX (browser->inspector), + scrolled, TRUE, TRUE, 0); + browser->inspector_view = webkit_web_view_new (); + gtk_container_add (GTK_CONTAINER (scrolled), browser->inspector_view); + gtk_widget_show_all (browser->inspector); + + /* Incremental findbar */ + browser->find = gtk_toolbar_new (); + gtk_widget_set_name (browser->find, "MidoriFindbar"); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (browser->find), GTK_ICON_SIZE_MENU); + gtk_toolbar_set_style (GTK_TOOLBAR (browser->find), GTK_TOOLBAR_BOTH_HORIZ); + g_signal_connect (browser->find, "key-press-event", + G_CALLBACK (midori_browser_find_key_press_event_cb), browser); + toolitem = gtk_tool_item_new (); + gtk_container_set_border_width (GTK_CONTAINER (toolitem), 6); + gtk_container_add (GTK_CONTAINER (toolitem), + /* i18n: A panel at the bottom, to search text in pages */ + gtk_label_new_with_mnemonic (_("_Inline Find:"))); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), toolitem, -1); + browser->find_text = gtk_icon_entry_new (); + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (browser->find_text), + GTK_ICON_ENTRY_PRIMARY, + GTK_STOCK_FIND); + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (browser->find_text), + GTK_ICON_ENTRY_SECONDARY, + GTK_STOCK_CLEAR); + gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (browser->find_text), + GTK_ICON_ENTRY_SECONDARY, TRUE); + g_signal_connect (browser->find_text, "icon-release", + G_CALLBACK (midori_browser_entry_clear_icon_released_cb), NULL); + g_signal_connect (browser->find_text, "activate", + G_CALLBACK (_action_find_next_activate), browser); + g_signal_connect (browser->find_text, "changed", + G_CALLBACK (midori_browser_find_text_changed_cb), browser); + g_signal_connect (browser->find_text, "focus-out-event", + G_CALLBACK (midori_browser_find_text_focus_out_event_cb), browser); + toolitem = gtk_tool_item_new (); + gtk_container_add (GTK_CONTAINER (toolitem), browser->find_text); + gtk_tool_item_set_expand (GTK_TOOL_ITEM (toolitem), TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), toolitem, -1); + toolitem = (GtkToolItem*)gtk_action_create_tool_item + (_action_by_name (browser, "FindPrevious")); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("Previous")); + gtk_tool_item_set_is_important (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), toolitem, -1); + toolitem = (GtkToolItem*)gtk_action_create_tool_item + (_action_by_name (browser, "FindNext")); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("Next")); + gtk_tool_item_set_is_important (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), toolitem, -1); + browser->find_case = gtk_toggle_tool_button_new_from_stock ( + GTK_STOCK_SPELL_CHECK); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (browser->find_case), _("Match Case")); + gtk_tool_item_set_is_important (GTK_TOOL_ITEM (browser->find_case), TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), browser->find_case, -1); + browser->find_highlight = gtk_toggle_tool_button_new_from_stock ( + GTK_STOCK_SELECT_ALL); + g_signal_connect (browser->find_highlight, "toggled", + G_CALLBACK (_find_highlight_toggled), browser); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (browser->find_highlight), + _("Highlight Matches")); + gtk_tool_item_set_is_important (GTK_TOOL_ITEM (browser->find_highlight), TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), browser->find_highlight, -1); + toolitem = gtk_separator_tool_item_new (); + gtk_separator_tool_item_set_draw ( + GTK_SEPARATOR_TOOL_ITEM (toolitem), FALSE); + gtk_tool_item_set_expand (GTK_TOOL_ITEM (toolitem), TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), toolitem, -1); + browser->find_close = gtk_tool_button_new_from_stock (GTK_STOCK_CLOSE); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (browser->find_close), + _("Close Findbar")); + g_signal_connect (browser->find_close, "clicked", + G_CALLBACK (midori_browser_find_button_close_clicked_cb), browser); + #if HAVE_OSX + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), browser->find_close, 0); + #else + gtk_toolbar_insert (GTK_TOOLBAR (browser->find), browser->find_close, -1); + #endif + sokoke_container_show_children (GTK_CONTAINER (browser->find)); + #if HAVE_HILDON + hildon_window_add_toolbar (HILDON_WINDOW (browser), + GTK_TOOLBAR (browser->find)); + #else + gtk_box_pack_start (GTK_BOX (vbox), browser->find, FALSE, FALSE, 0); + #endif + + /* Statusbar */ + browser->statusbar = gtk_statusbar_new (); + /* Adjust the statusbar's padding to avoid child overlapping */ + rcstyle = gtk_rc_style_new (); + rcstyle->xthickness = rcstyle->ythickness = -4; + gtk_widget_modify_style (browser->statusbar, rcstyle); + g_object_unref (rcstyle); + gtk_box_pack_start (GTK_BOX (vbox), browser->statusbar, FALSE, FALSE, 0); + + browser->progressbar = gtk_progress_bar_new (); + /* Set the progressbar's height to 1 to fit it in the statusbar */ + gtk_widget_set_size_request (browser->progressbar, -1, 1); + gtk_box_pack_start (GTK_BOX (browser->statusbar), browser->progressbar, + FALSE, FALSE, 3); + + browser->transferbar = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (browser->statusbar), browser->transferbar, + FALSE, FALSE, 3); + gtk_widget_show (browser->transferbar); + browser->transferbar_clear = gtk_button_new_with_label (_("Delete All")); + icon = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU); + gtk_button_set_image (GTK_BUTTON (browser->transferbar_clear), icon); + g_signal_connect (browser->transferbar_clear, "clicked", + G_CALLBACK (midori_browser_transferbar_clear_clicked_cb), browser); + gtk_box_pack_end (GTK_BOX (browser->transferbar), browser->transferbar_clear, + FALSE, FALSE, 0); + g_signal_connect (browser->statusbar, "button-press-event", + G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), browser); + + g_object_unref (ui_manager); +} + +static void +midori_browser_dispose (GObject* object) +{ + MidoriBrowser* browser = MIDORI_BROWSER (object); + + /* We are done, the session mustn't change anymore */ + katze_object_assign (browser->proxy_array, NULL); + + G_OBJECT_CLASS (midori_browser_parent_class)->dispose (object); +} + +static void +midori_browser_finalize (GObject* object) +{ + MidoriBrowser* browser = MIDORI_BROWSER (object); + + katze_assign (browser->statusbar_text, NULL); + + katze_object_assign (browser->settings, NULL); + katze_object_assign (browser->bookmarks, NULL); + katze_object_assign (browser->trash, NULL); + katze_object_assign (browser->search_engines, NULL); + katze_object_assign (browser->history, NULL); + + katze_object_assign (browser->net, NULL); + + katze_assign (browser->news_aggregator, NULL); + + G_OBJECT_CLASS (midori_browser_parent_class)->finalize (object); +} + +static void +_midori_browser_set_toolbar_style (MidoriBrowser* browser, + MidoriToolbarStyle toolbar_style) +{ + #if HAVE_HILDON + GtkToolbarStyle gtk_toolbar_style = GTK_TOOLBAR_ICONS; + #else + GtkToolbarStyle gtk_toolbar_style; + GtkSettings* gtk_settings = gtk_widget_get_settings (GTK_WIDGET (browser)); + if (toolbar_style == MIDORI_TOOLBAR_DEFAULT && gtk_settings) + g_object_get (gtk_settings, "gtk-toolbar-style", >k_toolbar_style, NULL); + else + { + switch (toolbar_style) + { + case MIDORI_TOOLBAR_ICONS: + gtk_toolbar_style = GTK_TOOLBAR_ICONS; + break; + case MIDORI_TOOLBAR_TEXT: + gtk_toolbar_style = GTK_TOOLBAR_TEXT; + break; + case MIDORI_TOOLBAR_BOTH: + gtk_toolbar_style = GTK_TOOLBAR_BOTH; + break; + case MIDORI_TOOLBAR_BOTH_HORIZ: + case MIDORI_TOOLBAR_DEFAULT: + gtk_toolbar_style = GTK_TOOLBAR_BOTH_HORIZ; + } + } + #endif + gtk_toolbar_set_style (GTK_TOOLBAR (browser->navigationbar), + gtk_toolbar_style); +} + +static gboolean +midori_browser_toolbar_item_button_press_event_cb (GtkWidget* toolitem, + GdkEventButton* event, + MidoriBrowser* browser) +{ + if (event->button == 3) + { + midori_browser_toolbar_popup_context_menu_cb ( + GTK_IS_BIN (toolitem) && gtk_bin_get_child (GTK_BIN (toolitem)) ? + gtk_widget_get_parent (toolitem) : toolitem, + event->x, event->y, event->button, browser); + + return TRUE; + } + return FALSE; +} + +static void +_midori_browser_set_toolbar_items (MidoriBrowser* browser, + const gchar* items) +{ + gchar** names; + gchar** name; + GtkAction* action; + GtkWidget* toolitem; + + #if HAVE_HILDON + items = "Bookmarks,Window,Back,Forward,ReloadStop,Location,Panel,Trash"; + #endif + + gtk_container_foreach (GTK_CONTAINER (browser->navigationbar), + (GtkCallback)gtk_widget_destroy, NULL); + + names = g_strsplit (items ? items : "", ",", 0); + name = names; + while (*name) + { + action = _action_by_name (browser, *name); + if (action) + { + toolitem = gtk_action_create_tool_item (action); + if (gtk_bin_get_child (GTK_BIN (toolitem))) + g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), + "button-press-event", + G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), + browser); + else + { + gtk_tool_item_set_use_drag_window (GTK_TOOL_ITEM (toolitem), TRUE); + g_signal_connect (toolitem, + "button-press-event", + G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), + browser); + } + gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), + GTK_TOOL_ITEM (toolitem), -1); + } + name++; + } + g_strfreev (names); + + action = gtk_action_group_get_action (browser->action_group, "Fullscreen"); + browser->button_fullscreen = gtk_action_create_tool_item (action); + gtk_widget_hide (browser->button_fullscreen); + g_signal_connect (browser->button_fullscreen, "clicked", + G_CALLBACK (_action_fullscreen_activate), browser); + gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), + GTK_TOOL_ITEM (browser->button_fullscreen), -1); +} + +static void +_midori_browser_update_settings (MidoriBrowser* browser) +{ + gboolean remember_last_window_size; + gint last_window_width, last_window_height; + MidoriWindowState last_window_state; + gboolean compact_sidepanel, right_align_sidepanel; + gint last_panel_position, last_panel_page; + gboolean show_menubar, show_bookmarkbar; + gboolean show_panel, show_transferbar; + MidoriToolbarStyle toolbar_style; + gchar* toolbar_items; + gint last_web_search; + gboolean close_buttons_on_tabs; + GdkScreen* screen; + gint default_width, default_height; + KatzeItem* item; + + g_free (browser->news_aggregator); + + g_object_get (browser->settings, + "remember-last-window-size", &remember_last_window_size, + "last-window-width", &last_window_width, + "last-window-height", &last_window_height, + "last-window-state", &last_window_state, + "compact-sidepanel", &compact_sidepanel, + "right-align-sidepanel", &right_align_sidepanel, + "last-panel-position", &last_panel_position, + "last-panel-page", &last_panel_page, + "show-menubar", &show_menubar, + "show-navigationbar", &browser->show_navigationbar, + "show-bookmarkbar", &show_bookmarkbar, + "show-panel", &show_panel, + "show-transferbar", &show_transferbar, + "show-statusbar", &browser->show_statusbar, + "toolbar-style", &toolbar_style, + "toolbar-items", &toolbar_items, + "last-web-search", &last_web_search, + "location-entry-search", &browser->location_entry_search, + "close-buttons-on-tabs", &close_buttons_on_tabs, + "progress-in-location", &browser->progress_in_location, + "remember-last-visited-pages", &browser->remember_last_visited_pages, + "news-aggregator", &browser->news_aggregator, + NULL); + + screen = gtk_window_get_screen (GTK_WINDOW (browser)); + default_width = gdk_screen_get_width (screen) / 1.7; + default_height = gdk_screen_get_height (screen) / 1.7; + + if (remember_last_window_size) + { + if (last_window_width && last_window_height) + gtk_window_set_default_size (GTK_WINDOW (browser), + last_window_width, last_window_height); + else + gtk_window_set_default_size (GTK_WINDOW (browser), + default_width, default_height); + switch (last_window_state) + { + case MIDORI_WINDOW_MINIMIZED: + gtk_window_iconify (GTK_WINDOW (browser)); + break; + case MIDORI_WINDOW_MAXIMIZED: + gtk_window_maximize (GTK_WINDOW (browser)); + break; + case MIDORI_WINDOW_FULLSCREEN: + gtk_window_fullscreen (GTK_WINDOW (browser)); + break; + default: + ;/* Do nothing. */ + } + } + + _midori_browser_set_toolbar_style (browser, toolbar_style); + _toggle_tabbar_smartly (browser); + _midori_browser_set_toolbar_items (browser, toolbar_items); + + if (browser->search_engines) + { + guint i; + + item = katze_array_get_nth_item (browser->search_engines, + last_web_search); + if (item) + midori_search_action_set_current_item (MIDORI_SEARCH_ACTION ( + _action_by_name (browser, "Search")), item); + + i = 0; + while ((item = katze_array_get_nth_item (browser->search_engines, i++))) + if (!g_strcmp0 (katze_item_get_uri (item), browser->location_entry_search)) + { + midori_search_action_set_default_item (MIDORI_SEARCH_ACTION ( + _action_by_name (browser, "Search")), item); + break; + } + } + + midori_panel_set_compact (MIDORI_PANEL (browser->panel), compact_sidepanel); + midori_panel_set_right_aligned (MIDORI_PANEL (browser->panel), + right_align_sidepanel); + gtk_paned_set_position (GTK_PANED (gtk_widget_get_parent (browser->panel)), + last_panel_position); + midori_panel_set_current_page (MIDORI_PANEL (browser->panel), last_panel_page); + + _action_set_active (browser, "Menubar", show_menubar); + _action_set_active (browser, "Navigationbar", browser->show_navigationbar); + _action_set_active (browser, "Bookmarkbar", show_bookmarkbar); + _action_set_active (browser, "Panel", show_panel); + #if WEBKIT_CHECK_VERSION (1, 1, 3) + _action_set_active (browser, "Transferbar", show_transferbar); + #endif + _action_set_active (browser, "Statusbar", browser->show_statusbar); + + g_free (toolbar_items); +} + +static void +midori_browser_settings_notify (MidoriWebSettings* web_settings, + GParamSpec* pspec, + MidoriBrowser* browser) +{ + const gchar* name; + GValue value = {0, }; + + name = g_intern_string (pspec->name); + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (web_settings), name, &value); + + if (name == g_intern_string ("toolbar-style")) + _midori_browser_set_toolbar_style (browser, g_value_get_enum (&value)); + else if (name == g_intern_string ("toolbar-items")) + _midori_browser_set_toolbar_items (browser, g_value_get_string (&value)); + else if (name == g_intern_string ("compact-sidepanel")) + midori_panel_set_compact (MIDORI_PANEL (browser->panel), + g_value_get_boolean (&value)); + else if (name == g_intern_string ("always-show-tabbar")) + _toggle_tabbar_smartly (browser); + else if (name == g_intern_string ("show-navigationbar")) + browser->show_navigationbar = g_value_get_boolean (&value); + else if (name == g_intern_string ("show-statusbar")) + browser->show_statusbar = g_value_get_boolean (&value); + else if (name == g_intern_string ("progress-in-location")) + browser->progress_in_location = g_value_get_boolean (&value); + else if (name == g_intern_string ("search-engines-in-completion")) + { + if (g_value_get_boolean (&value)) + midori_location_action_set_search_engines (MIDORI_LOCATION_ACTION ( + _action_by_name (browser, "Location")), browser->search_engines); + else + midori_location_action_set_search_engines (MIDORI_LOCATION_ACTION ( + _action_by_name (browser, "Location")), NULL); + } + else if (name == g_intern_string ("location-entry-search")) + { + katze_assign (browser->location_entry_search, g_value_dup_string (&value)); + } + else if (name == g_intern_string ("remember-last-visited-pages")) + browser->remember_last_visited_pages = g_value_get_boolean (&value); + else if (name == g_intern_string ("news-aggregator")) + { + katze_assign (browser->news_aggregator, g_value_dup_string (&value)); + } + else if (!g_object_class_find_property (G_OBJECT_GET_CLASS (web_settings), + name)) + g_warning (_("Unexpected setting '%s'"), name); + g_value_unset (&value); +} + +static void +browser_bookmarks_add_item_cb (KatzeArray* array, + KatzeItem* item, + MidoriBrowser* browser) +{ + GtkToolItem* toolitem; + + toolitem = katze_array_action_create_tool_item_for ( + KATZE_ARRAY_ACTION (_action_by_name (browser, "Bookmarks")), item); + + g_object_set_data (G_OBJECT (toolitem), "KatzeItem", item); + if (!KATZE_IS_ARRAY (item) && katze_item_get_uri (item)) + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_browser_menu_bookmarks_item_activate_cb), + browser); + if (KATZE_IS_ARRAY (item) || katze_item_get_uri (item)) + { + g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), + "button-press-event", + G_CALLBACK (midori_browser_bookmarkbar_item_button_press_event_cb), + browser); + g_object_set_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (toolitem))), + "KatzeItem", item); + } + else + { + gtk_tool_item_set_use_drag_window (toolitem, TRUE); + g_signal_connect (toolitem, + "button-press-event", + G_CALLBACK (midori_browser_bookmarkbar_item_button_press_event_cb), + browser); + g_object_set_data (G_OBJECT (toolitem), "KatzeItem", item); + } + gtk_widget_show (GTK_WIDGET (toolitem)); + gtk_toolbar_insert (GTK_TOOLBAR (browser->bookmarkbar), toolitem, -1); +} + +static void +browser_bookmarks_remove_item_cb (KatzeArray* array, + KatzeItem* removed_item, + MidoriBrowser* browser) +{ + GList* children; + GtkWidget* toolitem; + KatzeItem* item; + + children = gtk_container_get_children (GTK_CONTAINER (browser->bookmarkbar)); + while (children != NULL) + { + toolitem = GTK_WIDGET (children->data); + item = (KatzeItem*)g_object_get_data (G_OBJECT (toolitem), "KatzeItem"); + if (item == removed_item) + gtk_widget_destroy (toolitem); + children = g_list_next (children); + } +} + +static void +midori_browser_set_bookmarks (MidoriBrowser* browser, + KatzeArray* bookmarks) +{ + guint i; + KatzeItem* item; + + if (browser->bookmarks == bookmarks) + return; + + if (bookmarks) + g_object_ref (bookmarks); + katze_object_assign (browser->bookmarks, bookmarks); + + g_object_set (_action_by_name (browser, "Bookmarks"), "array", + browser->bookmarks, NULL); + + _action_set_sensitive (browser, "BookmarkAdd", FALSE); + _action_set_sensitive (browser, "BookmarkFolderAdd", FALSE); + + if (!browser->bookmarks) + return; + + i = 0; + while ((item = katze_array_get_nth_item (browser->bookmarks, i++))) + browser_bookmarks_add_item_cb (browser->bookmarks, item, browser); + g_signal_connect (browser->bookmarks, "add-item", + G_CALLBACK (browser_bookmarks_add_item_cb), browser); + g_signal_connect (browser->bookmarks, "remove-item", + G_CALLBACK (browser_bookmarks_remove_item_cb), browser); + + _action_set_sensitive (browser, "BookmarkAdd", TRUE); + _action_set_sensitive (browser, "BookmarkFolderAdd", TRUE); +} + +static void +midori_browser_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriBrowser* browser = MIDORI_BROWSER (object); + guint last_web_search; + KatzeItem* item; + + switch (prop_id) + { + case PROP_URI: + midori_browser_set_current_uri (browser, g_value_get_string (value)); + break; + case PROP_TAB: + midori_browser_set_current_tab (browser, g_value_get_object (value)); + break; + case PROP_STATUSBAR_TEXT: + _midori_browser_set_statusbar_text (browser, g_value_get_string (value)); + break; + case PROP_SETTINGS: + if (browser->settings) + g_signal_handlers_disconnect_by_func (browser->settings, + midori_browser_settings_notify, + browser); + katze_object_assign (browser->settings, g_value_dup_object (value)); + if (browser->settings) + { + _midori_browser_update_settings (browser); + g_signal_connect (browser->settings, "notify", + G_CALLBACK (midori_browser_settings_notify), browser); + } + gtk_container_foreach (GTK_CONTAINER (browser->notebook), + (GtkCallback) midori_view_set_settings, browser->settings); + break; + case PROP_BOOKMARKS: + midori_browser_set_bookmarks (browser, g_value_get_object (value)); + break; + case PROP_TRASH: + /* FIXME: Disconnect handlers */ + katze_object_assign (browser->trash, g_value_dup_object (value)); + g_object_set (_action_by_name (browser, "Trash"), "array", + browser->trash, NULL); + /* FIXME: Connect to updates */ + _midori_browser_update_actions (browser); + break; + case PROP_SEARCH_ENGINES: + /* FIXME: Disconnect handlers */ + katze_object_assign (browser->search_engines, g_value_dup_object (value)); + if (browser->settings) + { + if (katze_object_get_boolean (browser->settings, + "search-engines-in-completion")) + midori_location_action_set_search_engines (MIDORI_LOCATION_ACTION ( + _action_by_name (browser, "Location")), browser->search_engines); + else + midori_location_action_set_search_engines (MIDORI_LOCATION_ACTION ( + _action_by_name (browser, "Location")), NULL); + } + midori_search_action_set_search_engines (MIDORI_SEARCH_ACTION ( + _action_by_name (browser, "Search")), browser->search_engines); + /* FIXME: Connect to updates */ + if (browser->settings) + { + guint i; + + g_object_get (browser->settings, "last-web-search", + &last_web_search, NULL); + item = katze_array_get_nth_item (browser->search_engines, + last_web_search); + midori_search_action_set_current_item (MIDORI_SEARCH_ACTION ( + _action_by_name (browser, "Search")), item); + + i = 0; + while ((item = katze_array_get_nth_item (browser->search_engines, i++))) + if (!g_strcmp0 (katze_item_get_uri (item), browser->location_entry_search)) + { + midori_search_action_set_default_item (MIDORI_SEARCH_ACTION ( + _action_by_name (browser, "Search")), item); + break; + } + } + break; + case PROP_HISTORY: + midori_browser_set_history (browser, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_browser_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriBrowser* browser = MIDORI_BROWSER (object); + + switch (prop_id) + { + case PROP_MENUBAR: + g_value_set_object (value, browser->menubar); + break; + case PROP_NAVIGATIONBAR: + g_value_set_object (value, browser->navigationbar); + break; + case PROP_NOTEBOOK: + g_value_set_object (value, browser->notebook); + break; + case PROP_PANEL: + g_value_set_object (value, browser->panel); + break; + case PROP_URI: + g_value_set_string (value, midori_browser_get_current_uri (browser)); + break; + case PROP_TAB: + g_value_set_object (value, midori_browser_get_current_tab (browser)); + break; + case PROP_LOAD_STATUS: + { + GtkWidget* view = midori_browser_get_current_tab (browser); + if (view) + g_value_set_enum (value, + midori_view_get_load_status (MIDORI_VIEW (view))); + else + g_value_set_enum (value, MIDORI_LOAD_FINISHED); + break; + } + case PROP_STATUSBAR: + g_value_set_object (value, browser->statusbar); + break; + case PROP_STATUSBAR_TEXT: + g_value_set_string (value, browser->statusbar_text); + break; + case PROP_SETTINGS: + g_value_set_object (value, browser->settings); + break; + case PROP_BOOKMARKS: + g_value_set_object (value, browser->bookmarks); + break; + case PROP_TRASH: + g_value_set_object (value, browser->trash); + break; + case PROP_SEARCH_ENGINES: + g_value_set_object (value, browser->search_engines); + break; + case PROP_HISTORY: + g_value_set_object (value, browser->history); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_browser_new: + * + * Creates a new browser widget. + * + * A browser is a window with a menubar, toolbars, a notebook, panels + * and a statusbar. You should mostly treat it as an opaque widget. + * + * Return value: a new #MidoriBrowser + **/ +MidoriBrowser* +midori_browser_new (void) +{ + MidoriBrowser* browser = g_object_new (MIDORI_TYPE_BROWSER, + NULL); + + return browser; +} + +/** + * midori_browser_add_tab: + * @browser: a #MidoriBrowser + * @widget: a view + * + * Appends a view in the form of a new tab and creates an + * according item in the Window menu. + * + * Return value: the index of the new tab, or -1 in case of an error + **/ +gint +midori_browser_add_tab (MidoriBrowser* browser, + GtkWidget* view) +{ + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); + g_return_val_if_fail (GTK_IS_WIDGET (view), -1); + + g_signal_emit (browser, signals[ADD_TAB], 0, view); + return gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), view); +} + +/** + * midori_browser_remove_tab: + * @browser: a #MidoriBrowser + * @widget: a view + * + * Removes an existing view from the browser, + * including an associated menu item. + **/ +void +midori_browser_remove_tab (MidoriBrowser* browser, + GtkWidget* view) +{ + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + g_return_if_fail (GTK_IS_WIDGET (view)); + + g_signal_emit (browser, signals[REMOVE_TAB], 0, view); +} + +/** + * midori_browser_add_item: + * @browser: a #MidoriBrowser + * @item: an item + * + * Appends a new view as described by @item. + * + * Return value: the index of the new tab, or -1 in case of an error + **/ +gint +midori_browser_add_item (MidoriBrowser* browser, + KatzeItem* item) +{ + const gchar* uri; + const gchar* title; + GtkWidget* view; + + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); + g_return_val_if_fail (KATZE_IS_ITEM (item), -1); + + uri = katze_item_get_uri (item); + title = katze_item_get_name (item); + view = g_object_new (MIDORI_TYPE_VIEW, + "title", title, + "settings", browser->settings, + "net", browser->net, + NULL); + midori_view_set_uri (MIDORI_VIEW (view), uri); + gtk_widget_show (view); + + return midori_browser_add_tab (browser, view); +} + +/** + * midori_browser_add_uri: + * @browser: a #MidoriBrowser + * @uri: an URI + * + * Appends an uri in the form of a new view. + * + * Return value: the index of the new view, or -1 + **/ +gint +midori_browser_add_uri (MidoriBrowser* browser, + const gchar* uri) +{ + GtkWidget* view; + + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); + g_return_val_if_fail (uri != NULL, -1); + + if (browser->settings) + view = g_object_new (MIDORI_TYPE_VIEW, "settings", browser->settings, + "net", browser->net, NULL); + else + view = midori_view_new (browser->net); + midori_view_set_uri (MIDORI_VIEW (view), uri); + gtk_widget_show (view); + + return midori_browser_add_tab (browser, view); +} + +/** + * midori_browser_activate_action: + * @browser: a #MidoriBrowser + * @name: name of the action + * + * Activates the specified action. + **/ +void +midori_browser_activate_action (MidoriBrowser* browser, + const gchar* name) +{ + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + g_return_if_fail (name != NULL); + + g_signal_emit (browser, signals[ACTIVATE_ACTION], 0, name); +} + +/** + * midori_browser_get_action_group: + * @browser: a #MidoriBrowser + * + * Retrieves the action group holding all actions used + * by the browser. It allows obtaining individual + * actions and adding new actions. + * + * Return value: the action group of the browser + * + * Since: 0.1.4 + **/ +GtkActionGroup* +midori_browser_get_action_group (MidoriBrowser* browser) +{ + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); + + return browser->action_group; +} + +/** + * midori_browser_set_current_uri: + * @browser: a #MidoriBrowser + * @uri: an URI + * + * Loads the specified URI in the current view. + * + * If the current view is opaque, and cannot load + * new pages, it will automatically open a new tab. + **/ +void +midori_browser_set_current_uri (MidoriBrowser* browser, + const gchar* uri) +{ + GtkWidget* view; + + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + g_return_if_fail (uri != NULL); + + if ((view = midori_browser_get_current_tab (browser))) + midori_view_set_uri (MIDORI_VIEW (view), uri); + else + midori_browser_add_uri (browser, uri); +} + +/** + * midori_browser_get_current_uri: + * @browser: a #MidoriBrowser + * + * Determines the URI loaded in the current view. + * + * If there is no view present at all, %NULL is returned. + * + * Return value: the current URI, or %NULL + **/ +const gchar* +midori_browser_get_current_uri (MidoriBrowser* browser) +{ + GtkWidget* view; + + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); + + if ((view = midori_browser_get_current_tab (browser))) + return midori_view_get_display_uri (MIDORI_VIEW (view)); + return NULL; +} + +/** + * midori_browser_set_current_page: + * @browser: a #MidoriBrowser + * @n: the index of a page + * + * Switches to the page with the index @n. + * + * The widget will also grab the focus automatically. + **/ +void +midori_browser_set_current_page (MidoriBrowser* browser, + gint n) +{ + GtkWidget* view; + + gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n); + view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), n); + if (view && midori_view_is_blank (MIDORI_VIEW (view))) + gtk_action_activate (_action_by_name (browser, "Location")); + else + gtk_widget_grab_focus (view); +} + +/** + * midori_browser_get_current_page: + * @browser: a #MidoriBrowser + * + * Determines the currently selected page. + * + * If there is no page present at all, %NULL is returned. + * + * Return value: the selected page, or -1 + **/ +gint +midori_browser_get_current_page (MidoriBrowser* browser) +{ + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); + + return gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); +} + +/** + * midori_browser_set_current_tab: + * @browser: a #MidoriBrowser + * @view: a #GtkWidget + * + * Switches to the page containing @view. + * + * The widget will also grab the focus automatically. + **/ +void +midori_browser_set_current_tab (MidoriBrowser* browser, + GtkWidget* view) +{ + gint n; + + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + g_return_if_fail (GTK_IS_WIDGET (view)); + + n = gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), view); + gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n); + if (view && midori_view_is_blank (MIDORI_VIEW (view))) + gtk_action_activate (_action_by_name (browser, "Location")); + else + gtk_widget_grab_focus (view); +} + +/** + * midori_browser_get_current_tab: + * @browser: a #MidoriBrowser + * + * Retrieves the currently selected tab. + * + * If there is no tab present at all, %NULL is returned. + * + * See also midori_browser_get_current_page(). + * + * Return value: the selected tab, or %NULL + **/ +GtkWidget* +midori_browser_get_current_tab (MidoriBrowser* browser) +{ + gint n; + + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); + + n = gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); + if (n >= 0) + return gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), n); + else + return NULL; +} + +/** + * midori_browser_get_proxy_array: + * @browser: a #MidoriBrowser + * + * Retrieves a proxy array representing the respective proxy items + * of the present views that can be used for session management. + * + * The array is updated automatically. + * + * Note: Calling this function doesn't add a reference and the browser + * may release its reference at some point. + * + * Return value: the proxy #KatzeArray + **/ +KatzeArray* +midori_browser_get_proxy_array (MidoriBrowser* browser) +{ + g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); + + return browser->proxy_array; +} + +/** + * midori_browser_quit: + * @browser: a #MidoriBrowser + * + * Quits the browser, including any other browser windows. + * + * This function relys on the application implementing + * the MidoriBrowser::quit signal. If the browser was added + * to the MidoriApp, this is handled automatically. + **/ +void +midori_browser_quit (MidoriBrowser* browser) +{ + g_return_if_fail (MIDORI_IS_BROWSER (browser)); + + g_signal_emit (browser, signals[QUIT], 0); +} diff --git a/midori/midori-browser.h b/midori/midori-browser.h new file mode 100644 index 00000000..92a61779 --- /dev/null +++ b/midori/midori-browser.h @@ -0,0 +1,135 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_BROWSER_H__ +#define __MIDORI_BROWSER_H__ + +#include +#if defined(HAVE_HILDON) && HAVE_HILDON + #include +#endif + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_BROWSER \ + (midori_browser_get_type ()) +#define MIDORI_BROWSER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_BROWSER, MidoriBrowser)) +#define MIDORI_BROWSER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_BROWSER, MidoriBrowserClass)) +#define MIDORI_IS_BROWSER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_BROWSER)) +#define MIDORI_IS_BROWSER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_BROWSER)) +#define MIDORI_BROWSER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_BROWSER, MidoriBrowserClass)) + +typedef struct _MidoriBrowser MidoriBrowser; +typedef struct _MidoriBrowserClass MidoriBrowserClass; + +struct _MidoriBrowserClass +{ + #if defined(HAVE_HILDON) && HAVE_HILDON + HildonWindowClass parent_class; + #else + GtkWindowClass parent_class; + #endif + + /* Signals */ + void + (*window_object_cleared) (MidoriBrowser* browser, + WebKitWebFrame* web_frame, + JSContextRef* context, + JSObjectRef* window_object); + void + (*statusbar_text_changed) (MidoriBrowser* browser, + const gchar* text); + void + (*element_motion) (MidoriBrowser* browser, + const gchar* link_uri); + void + (*new_window) (MidoriBrowser* browser, + const gchar* uri); + + void + (*add_tab) (MidoriBrowser* browser, + GtkWidget* view); + void + (*remove_tab) (MidoriBrowser* browser, + GtkWidget* view); + void + (*activate_action) (MidoriBrowser* browser, + const gchar* name); + void + (*quit) (MidoriBrowser* browser); +}; + +GType +midori_browser_get_type (void); + +MidoriBrowser* +midori_browser_new (void); + +gint +midori_browser_add_tab (MidoriBrowser* browser, + GtkWidget* widget); + +void +midori_browser_remove_tab (MidoriBrowser* browser, + GtkWidget* widget); + +gint +midori_browser_add_item (MidoriBrowser* browser, + KatzeItem* item); + +gint +midori_browser_add_uri (MidoriBrowser* browser, + const gchar* uri); + +void +midori_browser_activate_action (MidoriBrowser* browser, + const gchar* name); + +GtkActionGroup* +midori_browser_get_action_group (MidoriBrowser* browser); + +void +midori_browser_set_current_uri (MidoriBrowser* browser, + const gchar* uri); + +const gchar* +midori_browser_get_current_uri (MidoriBrowser* browser); + +void +midori_browser_set_current_page (MidoriBrowser* browser, + gint n); + +gint +midori_browser_get_current_page (MidoriBrowser* browser); + +void +midori_browser_set_current_tab (MidoriBrowser* browser, + GtkWidget* widget); + +GtkWidget* +midori_browser_get_current_tab (MidoriBrowser* browser); + +KatzeArray* +midori_browser_get_proxy_array (MidoriBrowser* browser); + +void +midori_browser_quit (MidoriBrowser* browser); + +G_END_DECLS + +#endif /* __MIDORI_BROWSER_H__ */ diff --git a/midori/midori-extension.c b/midori/midori-extension.c new file mode 100644 index 00000000..0bbcfef7 --- /dev/null +++ b/midori/midori-extension.c @@ -0,0 +1,772 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-extension.h" + +#if HAVE_CONFIG_H + #include +#endif + +#include +#include "sokoke.h" +#include + +G_DEFINE_TYPE (MidoriExtension, midori_extension, G_TYPE_OBJECT); + +struct _MidoriExtensionPrivate +{ + gchar* name; + gchar* description; + gchar* version; + gchar* authors; + + MidoriApp* app; + gboolean active; + gchar* config_dir; + GList* lsettings; + GHashTable* settings; + GKeyFile* key_file; +}; + +typedef struct +{ + gchar* name; + GType type; + gboolean default_value; + gboolean value; +} MESettingBoolean; + +typedef struct +{ + gchar* name; + GType type; + gint default_value; + gint value; +} MESettingInteger; + +typedef struct +{ + gchar* name; + GType type; + gchar* default_value; + gchar* value; +} MESettingString; + +void me_setting_free (gpointer setting) +{ + MESettingString* string_setting = (MESettingString*)setting; + + g_free (string_setting->name); + if (string_setting->type == G_TYPE_STRING) + { + g_free (string_setting->default_value); + g_free (string_setting->value); + } +} + +#define midori_extension_can_install_setting(extension, name) \ + if (extension->priv->active) \ + { \ + g_critical ("%s: Settings have to be installed before " \ + "the extension is activated.", G_STRFUNC); \ + return; \ + } \ + if (g_hash_table_lookup (extension->priv->settings, name)) \ + { \ + g_critical ("%s: A setting with the name '%s' is already installed.", \ + G_STRFUNC, name); \ + return; \ + } + +#define me_setting_install(stype, _name, gtype, _default_value, _value) \ + setting = g_new (stype, 1); \ + setting->name = _name; \ + setting->type = gtype; \ + setting->default_value = _default_value; \ + setting->value = _value; \ + g_hash_table_insert (extension->priv->settings, setting->name, setting); \ + extension->priv->lsettings = g_list_prepend \ + (extension->priv->lsettings, setting); + +#define me_setting_type(setting, gtype, rreturn) \ +if (!setting) { \ +g_critical ("%s: There is no setting with the name '%s' installed.", G_STRFUNC, name); \ +rreturn; } \ +if (setting->type != gtype) { \ +g_critical ("%s: The setting '%s' is not a string.", G_STRFUNC, name); \ +rreturn; } + +enum +{ + PROP_0, + + PROP_NAME, + PROP_DESCRIPTION, + PROP_VERSION, + PROP_AUTHORS +}; + +enum { + ACTIVATE, + DEACTIVATE, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +midori_extension_finalize (GObject* object); + +static void +midori_extension_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_extension_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_extension_class_init (MidoriExtensionClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + signals[ACTIVATE] = g_signal_new ( + "activate", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + MIDORI_TYPE_APP); + + signals[DEACTIVATE] = g_signal_new ( + "deactivate", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, + G_TYPE_NONE); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_extension_finalize; + gobject_class->set_property = midori_extension_set_property; + gobject_class->get_property = midori_extension_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS; + + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ( + "name", + "Name", + "The name of the extension", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_DESCRIPTION, + g_param_spec_string ( + "description", + "Description", + "The description of the extension", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_VERSION, + g_param_spec_string ( + "version", + "Version", + "The version of the extension", + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_AUTHORS, + g_param_spec_string ( + "authors", + "Authors", + "The authors of the extension", + NULL, + flags)); + + g_type_class_add_private (class, sizeof (MidoriExtensionPrivate)); +} + +static void +midori_extension_activate_cb (MidoriExtension* extension, + MidoriApp* app) +{ + GList* lsettings; + + g_return_if_fail (MIDORI_IS_APP (app)); + + lsettings = g_list_first (extension->priv->lsettings); + + /* If a configuration directory was requested before activation we + assume we should load and save settings. This is a detail that + extension writers shouldn't worry about. */ + extension->priv->key_file = lsettings && extension->priv->config_dir + ? g_key_file_new () : NULL; + if (extension->priv->key_file) + { + gchar* config_file; + GError* error = NULL; + + config_file = g_build_filename (extension->priv->config_dir, "config", NULL); + if (!g_key_file_load_from_file (extension->priv->key_file, config_file, + G_KEY_FILE_KEEP_COMMENTS, &error)) + { + if (error->code != G_FILE_ERROR_NOENT) + printf (_("The configuration of the extension '%s' couldn't be loaded: %s\n"), + extension->priv->name, error->message); + g_error_free (error); + } + } + + while (lsettings) + { + MESettingString* setting = (MESettingString*)lsettings->data; + + if (setting->type == G_TYPE_BOOLEAN) + { + MESettingBoolean* setting_ = (MESettingBoolean*)setting; + if (extension->priv->key_file) + setting_->value = sokoke_key_file_get_boolean_default ( + extension->priv->key_file, + "settings", setting->name, setting_->default_value, NULL); + else + setting_->value = setting_->default_value; + } + else if (setting->type == G_TYPE_INT) + { + MESettingInteger* setting_ = (MESettingInteger*)setting; + if (extension->priv->key_file) + setting_->value = sokoke_key_file_get_integer_default ( + extension->priv->key_file, + "settings", setting->name, setting_->default_value, NULL); + else + setting_->value = setting_->default_value; + } + else if (setting->type == G_TYPE_STRING) + { + if (extension->priv->key_file) + setting->value = sokoke_key_file_get_string_default ( + extension->priv->key_file, + "settings", setting->name, setting->default_value, NULL); + else + setting->value = g_strdup (setting->default_value); + } + else + g_assert_not_reached (); + + lsettings = g_list_next (lsettings); + } + + extension->priv->app = g_object_ref (app); + extension->priv->active = TRUE; + /* FIXME: Disconnect all signal handlers */ +} + +static void +midori_extension_init (MidoriExtension* extension) +{ + extension->priv = G_TYPE_INSTANCE_GET_PRIVATE (extension, + MIDORI_TYPE_EXTENSION, MidoriExtensionPrivate); + + extension->priv->app = NULL; + extension->priv->active = FALSE; + extension->priv->config_dir = NULL; + extension->priv->lsettings = NULL; + extension->priv->settings = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, me_setting_free); + extension->priv->key_file = NULL; + + g_signal_connect (extension, "activate", + G_CALLBACK (midori_extension_activate_cb), NULL); +} + +static void +midori_extension_finalize (GObject* object) +{ + MidoriExtension* extension = MIDORI_EXTENSION (object); + + katze_object_assign (extension->priv->app, NULL); + katze_assign (extension->priv->name, NULL); + katze_assign (extension->priv->description, NULL); + katze_assign (extension->priv->version, NULL); + katze_assign (extension->priv->authors, NULL); + + katze_assign (extension->priv->config_dir, NULL); + g_list_free (extension->priv->lsettings); + g_hash_table_destroy (extension->priv->settings); + if (extension->priv->key_file) + g_key_file_free (extension->priv->key_file); +} + +static void +midori_extension_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriExtension* extension = MIDORI_EXTENSION (object); + + switch (prop_id) + { + case PROP_NAME: + katze_assign (extension->priv->name, g_value_dup_string (value)); + break; + case PROP_DESCRIPTION: + katze_assign (extension->priv->description, g_value_dup_string (value)); + break; + case PROP_VERSION: + katze_assign (extension->priv->version, g_value_dup_string (value)); + break; + case PROP_AUTHORS: + katze_assign (extension->priv->authors, g_value_dup_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_extension_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriExtension* extension = MIDORI_EXTENSION (object); + + switch (prop_id) + { + case PROP_NAME: + g_value_set_string (value, extension->priv->name); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, extension->priv->description); + break; + case PROP_VERSION: + g_value_set_string (value, extension->priv->version); + break; + case PROP_AUTHORS: + g_value_set_string (value, extension->priv->authors); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_extension_is_prepared: + * @extension: a #MidoriExtension + * + * Determines if @extension is prepared for use, for instance + * by ensuring that all required values are set and that it + * is actually activatable. + * + * Return value: %TRUE if @extension is ready for use + **/ +gboolean +midori_extension_is_prepared (MidoriExtension* extension) +{ + g_return_val_if_fail (MIDORI_IS_EXTENSION (extension), FALSE); + + if (extension->priv->name && extension->priv->description + && extension->priv->version && extension->priv->authors + && g_signal_has_handler_pending (extension, signals[ACTIVATE], 0, FALSE)) + return TRUE; + return FALSE; +} + +/** + * midori_extension_is_active: + * @extension: a #MidoriExtension + * + * Determines if @extension is active. + * + * Return value: %TRUE if @extension is active + * + * Since: 0.1.2 + **/ +gboolean +midori_extension_is_active (MidoriExtension* extension) +{ + g_return_val_if_fail (MIDORI_IS_EXTENSION (extension), FALSE); + + return extension->priv->active; +} + +/** + * midori_extension_deactivate: + * @extension: a #MidoriExtension + * + * Attempts to deactivate @extension. + **/ +void +midori_extension_deactivate (MidoriExtension* extension) +{ + g_return_if_fail (midori_extension_is_active (extension)); + + g_signal_emit (extension, signals[DEACTIVATE], 0); + extension->priv->active = FALSE; + katze_object_assign (extension->priv->app, NULL); +} + +/** + * midori_extension_get_app: + * @extension: a #MidoriExtension + * + * Retrieves the #MidoriApp the extension belongs to. The + * extension has to be active. + * + * Return value: the #MidoriApp instance + * + * Since 0.1.6 + **/ +MidoriApp* +midori_extension_get_app (MidoriExtension* extension) +{ + g_return_val_if_fail (midori_extension_is_active (extension), NULL); + + return extension->priv->app; +} + +/** + * midori_extension_get_config_dir: + * @extension: a #MidoriExtension + * + * Retrieves the path to a directory reserved for configuration + * files specific to the extension. For that purpose the 'name' + * of the extension is actually part of the path. + * + * If settings are installed on the extension, they will be + * loaded from and saved to a file "config" in this path. + * + * Return value: a path, such as ~/.config/midori/extensions/name + **/ +const gchar* +midori_extension_get_config_dir (MidoriExtension* extension) +{ + g_return_val_if_fail (midori_extension_is_prepared (extension), NULL); + + if (!extension->priv->config_dir) + extension->priv->config_dir = g_build_filename ( + sokoke_set_config_dir (NULL), "extensions", + extension->priv->name, NULL); + + return extension->priv->config_dir; +} + +/** + * midori_extension_install_boolean: + * @extension: a #MidoriExtension + * @name: the name of the setting + * @default_value: the default value + * + * Installs a boolean that can be used to conveniently + * store user configuration. + * + * Note that all settings have to be installed before + * the extension is activated. + * + * Since: 0.1.3 + **/ +void +midori_extension_install_boolean (MidoriExtension* extension, + const gchar* name, + gboolean default_value) +{ + MESettingBoolean* setting; + + g_return_if_fail (midori_extension_is_prepared (extension)); + midori_extension_can_install_setting (extension, name); + + me_setting_install (MESettingBoolean, g_strdup (name), G_TYPE_BOOLEAN, + default_value, FALSE); +} + +/** + * midori_extension_get_boolean: + * @extension: a #MidoriExtension + * @name: the name of the setting + * + * Retrieves the value of the specified setting. + * + * Since: 0.1.3 + **/ +gboolean +midori_extension_get_boolean (MidoriExtension* extension, + const gchar* name) +{ + MESettingBoolean* setting; + + g_return_val_if_fail (midori_extension_is_prepared (extension), FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + setting = g_hash_table_lookup (extension->priv->settings, name); + + me_setting_type (setting, G_TYPE_BOOLEAN, return FALSE); + + return setting->value; +} + +/** + * midori_extension_set_boolean: + * @extension: a #MidoriExtension + * @name: the name of the setting + * @value: the new value + * + * Assigns a new value to the specified setting. + * + * Since: 0.1.3 + **/ +void +midori_extension_set_boolean (MidoriExtension* extension, + const gchar* name, + gboolean value) +{ + MESettingBoolean* setting; + + g_return_if_fail (midori_extension_is_active (extension)); + g_return_if_fail (name != NULL); + + setting = g_hash_table_lookup (extension->priv->settings, name); + + me_setting_type (setting, G_TYPE_BOOLEAN, return); + + setting->value = value; + if (extension->priv->key_file) + { + GError* error = NULL; + /* FIXME: Handle readonly folder/ file */ + gchar* config_file = g_build_filename (extension->priv->config_dir, + "config", NULL); + g_mkdir_with_parents (extension->priv->config_dir, 0700); + g_key_file_set_boolean (extension->priv->key_file, + "settings", name, value); + sokoke_key_file_save_to_file (extension->priv->key_file, config_file, &error); + if (error) + { + printf (_("The configuration of the extension '%s' couldn't be saved: %s\n"), + extension->priv->name, error->message); + g_error_free (error); + } + } +} + +/** + * midori_extension_install_integer: + * @extension: a #MidoriExtension + * @name: the name of the setting + * @default_value: the default value + * + * Installs an integer that can be used to conveniently + * store user configuration. + * + * Note that all settings have to be installed before + * the extension is activated. + * + * Since: 0.1.3 + **/ +void +midori_extension_install_integer (MidoriExtension* extension, + const gchar* name, + gint default_value) +{ + MESettingInteger* setting; + + g_return_if_fail (midori_extension_is_prepared (extension)); + midori_extension_can_install_setting (extension, name); + + me_setting_install (MESettingInteger, g_strdup (name), G_TYPE_INT, + default_value, 0); +} + +/** + * midori_extension_get_integer: + * @extension: a #MidoriExtension + * @name: the name of the setting + * + * Retrieves the value of the specified setting. + * + * Since: 0.1.3 + **/ +gint +midori_extension_get_integer (MidoriExtension* extension, + const gchar* name) +{ + MESettingInteger* setting; + + g_return_val_if_fail (midori_extension_is_prepared (extension), 0); + g_return_val_if_fail (name != NULL, 0); + + setting = g_hash_table_lookup (extension->priv->settings, name); + + me_setting_type (setting, G_TYPE_INT, return 0); + + return setting->value; +} + +/** + * midori_extension_set_integer: + * @extension: a #MidoriExtension + * @name: the name of the setting + * @value: the new value + * + * Assigns a new value to the specified setting. + * + * Since: 0.1.3 + **/ +void +midori_extension_set_integer (MidoriExtension* extension, + const gchar* name, + gint value) +{ + MESettingInteger* setting; + + g_return_if_fail (midori_extension_is_active (extension)); + g_return_if_fail (name != NULL); + + setting = g_hash_table_lookup (extension->priv->settings, name); + + me_setting_type (setting, G_TYPE_INT, return); + + setting->value = value; + if (extension->priv->key_file) + { + GError* error = NULL; + /* FIXME: Handle readonly folder/ file */ + gchar* config_file = g_build_filename (extension->priv->config_dir, + "config", NULL); + g_mkdir_with_parents (extension->priv->config_dir, 0700); + g_key_file_set_integer (extension->priv->key_file, + "settings", name, value); + sokoke_key_file_save_to_file (extension->priv->key_file, config_file, &error); + if (error) + { + printf (_("The configuration of the extension '%s' couldn't be saved: %s\n"), + extension->priv->name, error->message); + g_error_free (error); + } + } +} + +/** + * midori_extension_install_string: + * @extension: a #MidoriExtension + * @name: the name of the setting + * @default_value: the default value + * + * Installs a string that can be used to conveniently + * store user configuration. + * + * Note that all settings have to be installed before + * the extension is activated. + * + * Since: 0.1.3 + **/ +void +midori_extension_install_string (MidoriExtension* extension, + const gchar* name, + const gchar* default_value) +{ + MESettingString* setting; + + g_return_if_fail (midori_extension_is_prepared (extension)); + midori_extension_can_install_setting (extension, name); + + me_setting_install (MESettingString, g_strdup (name), G_TYPE_STRING, + g_strdup (default_value), NULL); +} + +/** + * midori_extension_get_string: + * @extension: a #MidoriExtension + * @name: the name of the setting + * + * Retrieves the value of the specified setting. + * + * Since: 0.1.3 + **/ +const gchar* +midori_extension_get_string (MidoriExtension* extension, + const gchar* name) +{ + MESettingString* setting; + + g_return_val_if_fail (midori_extension_is_prepared (extension), NULL); + g_return_val_if_fail (name != NULL, NULL); + + setting = g_hash_table_lookup (extension->priv->settings, name); + + me_setting_type (setting, G_TYPE_STRING, return NULL); + + return setting->value; +} + +/** + * midori_extension_set_string: + * @extension: a #MidoriExtension + * @name: the name of the setting + * @value: the new value + * + * Assigns a new value to the specified setting. + * + * Since: 0.1.3 + **/ +void +midori_extension_set_string (MidoriExtension* extension, + const gchar* name, + const gchar* value) +{ + MESettingString* setting; + + g_return_if_fail (midori_extension_is_active (extension)); + g_return_if_fail (name != NULL); + + setting = g_hash_table_lookup (extension->priv->settings, name); + + me_setting_type (setting, G_TYPE_STRING, return); + + katze_assign (setting->value, g_strdup (value)); + if (extension->priv->key_file) + { + GError* error = NULL; + /* FIXME: Handle readonly folder/ file */ + gchar* config_file = g_build_filename (extension->priv->config_dir, + "config", NULL); + g_mkdir_with_parents (extension->priv->config_dir, 0700); + g_key_file_set_string (extension->priv->key_file, + "settings", name, value); + sokoke_key_file_save_to_file (extension->priv->key_file, config_file, &error); + if (error) + { + printf (_("The configuration of the extension '%s' couldn't be saved: %s\n"), + extension->priv->name, error->message); + g_error_free (error); + } + } +} diff --git a/midori/midori-extension.h b/midori/midori-extension.h new file mode 100644 index 00000000..1125d4cb --- /dev/null +++ b/midori/midori-extension.h @@ -0,0 +1,110 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_EXTENSION_H__ +#define __MIDORI_EXTENSION_H__ + +#include "midori-app.h" + +G_BEGIN_DECLS + +#define MIDORI_TYPE_EXTENSION \ + (midori_extension_get_type ()) +#define MIDORI_EXTENSION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_EXTENSION, MidoriExtension)) +#define MIDORI_EXTENSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_EXTENSION, MidoriExtensionClass)) +#define MIDORI_IS_EXTENSION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_EXTENSION)) +#define MIDORI_IS_EXTENSION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_EXTENSION)) +#define MIDORI_EXTENSION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_EXTENSION, MidoriExtensionClass)) + +typedef struct _MidoriExtension MidoriExtension; +typedef struct _MidoriExtensionClass MidoriExtensionClass; +typedef struct _MidoriExtensionPrivate MidoriExtensionPrivate; + +struct _MidoriExtension +{ + GObject parent_instance; + + MidoriExtensionPrivate* priv; +}; + +struct _MidoriExtensionClass +{ + GObjectClass parent_class; +}; + +GType +midori_extension_get_type (void); + +gboolean +midori_extension_is_prepared (MidoriExtension* extension); + +gboolean +midori_extension_is_active (MidoriExtension* extension); + +void +midori_extension_deactivate (MidoriExtension* extension); + +MidoriApp* +midori_extension_get_app (MidoriExtension* extension); + +const gchar* +midori_extension_get_config_dir (MidoriExtension* extension); + +void +midori_extension_install_boolean (MidoriExtension* extension, + const gchar* name, + gboolean default_value); + +gboolean +midori_extension_get_boolean (MidoriExtension* extension, + const gchar* name); + +void +midori_extension_set_boolean (MidoriExtension* extension, + const gchar* name, + gboolean value); + +void +midori_extension_install_integer (MidoriExtension* extension, + const gchar* name, + gint default_value); + +gint +midori_extension_get_integer (MidoriExtension* extension, + const gchar* name); + +void +midori_extension_set_integer (MidoriExtension* extension, + const gchar* name, + gint value); + +void +midori_extension_install_string (MidoriExtension* extension, + const gchar* name, + const gchar* default_value); + +const gchar* +midori_extension_get_string (MidoriExtension* extension, + const gchar* name); + +void +midori_extension_set_string (MidoriExtension* extension, + const gchar* name, + const gchar* value); + +G_END_DECLS + +#endif /* __MIDORI_EXTENSION_H__ */ diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c new file mode 100644 index 00000000..7d4ae733 --- /dev/null +++ b/midori/midori-locationaction.c @@ -0,0 +1,1363 @@ +/* + Copyright (C) 2008 Christian Dywan + Copyright (C) 2008 Dale Whittaker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-locationaction.h" + +#include "gtkiconentry.h" +#include "marshal.h" +#include "sokoke.h" + +#include +#include +#include + +#define MAX_ITEMS 25 + +struct _MidoriLocationAction +{ + GtkAction parent_instance; + + gchar* uri; + KatzeArray* search_engines; + gdouble progress; + gchar* secondary_icon; + + GtkTreeModel* model; + GtkTreeModel* filter_model; + GtkTreeModel* sort_model; + GdkPixbuf* default_icon; + GHashTable* items; +}; + +struct _MidoriLocationActionClass +{ + GtkActionClass parent_class; +}; + +G_DEFINE_TYPE (MidoriLocationAction, midori_location_action, GTK_TYPE_ACTION) + +enum +{ + PROP_0, + + PROP_PROGRESS, + PROP_SECONDARY_ICON +}; + +enum +{ + ACTIVE_CHANGED, + FOCUS_OUT, + SECONDARY_ICON_RELEASED, + RESET_URI, + SUBMIT_URI, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +enum +{ + FAVICON_COL, + URI_COL, + TITLE_COL, + VISITS_COL, + VISIBLE_COL, + N_COLS +}; + +static void +midori_location_action_finalize (GObject* object); + +static void +midori_location_action_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_location_action_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_location_action_activate (GtkAction* object); + +static GtkWidget* +midori_location_action_create_tool_item (GtkAction* action); + +static void +midori_location_action_connect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +midori_location_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +midori_location_action_class_init (MidoriLocationActionClass* class) +{ + GObjectClass* gobject_class; + GtkActionClass* action_class; + + signals[ACTIVE_CHANGED] = g_signal_new ("active-changed", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + + signals[FOCUS_OUT] = g_signal_new ("focus-out", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[SECONDARY_ICON_RELEASED] = g_signal_new ("secondary-icon-released", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_WIDGET); + + signals[RESET_URI] = g_signal_new ("reset-uri", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[SUBMIT_URI] = g_signal_new ("submit-uri", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + midori_cclosure_marshal_VOID__STRING_BOOLEAN, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_BOOLEAN); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_location_action_finalize; + gobject_class->set_property = midori_location_action_set_property; + gobject_class->get_property = midori_location_action_get_property; + + action_class = GTK_ACTION_CLASS (class); + action_class->activate = midori_location_action_activate; + action_class->create_tool_item = midori_location_action_create_tool_item; + action_class->connect_proxy = midori_location_action_connect_proxy; + action_class->disconnect_proxy = midori_location_action_disconnect_proxy; + + g_object_class_install_property (gobject_class, + PROP_PROGRESS, + g_param_spec_double ( + "progress", + "Progress", + "The current progress of the action", + 0.0, 1.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_SECONDARY_ICON, + g_param_spec_string ( + "secondary-icon", + "Secondary", + "The stock ID of the secondary icon", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +midori_location_action_set_model (MidoriLocationAction* location_action, + GtkTreeModel* model) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + + g_object_set (location_entry, "model", model, NULL); + gtk_entry_completion_set_model ( + gtk_entry_get_completion (GTK_ENTRY (entry)), + model ? location_action->filter_model : NULL); + } +} + +static gboolean +midori_location_action_is_frozen (MidoriLocationAction* location_action) +{ + return location_action->filter_model == NULL; +} + +/** + * midori_location_action_freeze: + * @location_action: a #MidoriLocationAction + * + * Freezes the action, which essentially means disconnecting models + * from proxies and skipping updates of the current state. + * + * Freezing is recommended if you need to insert a large amount + * of items at once, which is faster in the frozen state. + * + * Use midori_location_action_thaw() to go back to normal operation. + * + * Since: 0.1.2 + **/ +void +midori_location_action_freeze (MidoriLocationAction* location_action) +{ + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (!midori_location_action_is_frozen (location_action)); + + katze_object_assign (location_action->sort_model, NULL); + katze_object_assign (location_action->filter_model, NULL); + midori_location_action_set_model (location_action, NULL); + + if (location_action->items) + g_hash_table_remove_all (location_action->items); +} + +/** + * midori_location_action_thaw: + * @location_action: a #MidoriLocationAction + * + * Thaws the action, ie. after freezing it. + * + * Since: 0.1.2 + **/ +void +midori_location_action_thaw (MidoriLocationAction* location_action) +{ + GtkTreeModel* sort_model; + GtkTreeModel* filter_model; + GtkTreeIter iter; + GtkTreeIter child_iter; + gint i; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (midori_location_action_is_frozen (location_action)); + + sort_model = (GtkTreeModel*)gtk_tree_model_sort_new_with_model ( + location_action->model); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model), + VISITS_COL, GTK_SORT_DESCENDING); + filter_model = gtk_tree_model_filter_new (sort_model, NULL); + gtk_tree_model_filter_set_visible_column ( + GTK_TREE_MODEL_FILTER (filter_model), VISIBLE_COL); + midori_location_action_set_model (location_action, location_action->model); + + location_action->filter_model = filter_model; + location_action->sort_model = sort_model; + + i = MAX_ITEMS; + while (gtk_tree_model_iter_nth_child (sort_model, &iter, NULL, i++)) + { + gtk_tree_model_sort_convert_iter_to_child_iter ( + GTK_TREE_MODEL_SORT (sort_model), &child_iter, &iter); + gtk_list_store_set (GTK_LIST_STORE (location_action->model), + &child_iter, VISIBLE_COL, FALSE, -1); + } +} + +static void +midori_location_action_init (MidoriLocationAction* location_action) +{ + location_action->uri = NULL; + location_action->search_engines = NULL; + location_action->progress = 0.0; + location_action->secondary_icon = NULL; + location_action->default_icon = NULL; + + location_action->model = (GtkTreeModel*)gtk_list_store_new (N_COLS, + GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_INT, G_TYPE_BOOLEAN); + + location_action->filter_model = NULL; + location_action->sort_model = NULL; + midori_location_action_thaw (location_action); + + location_action->items = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); +} + +static void +midori_location_action_finalize (GObject* object) +{ + MidoriLocationAction* location_action = MIDORI_LOCATION_ACTION (object); + + katze_assign (location_action->uri, NULL); + katze_assign (location_action->search_engines, NULL); + + katze_object_assign (location_action->model, NULL); + katze_object_assign (location_action->sort_model, NULL); + katze_object_assign (location_action->filter_model, NULL); + katze_object_assign (location_action->default_icon, NULL); + + g_hash_table_destroy (location_action->items); + + G_OBJECT_CLASS (midori_location_action_parent_class)->finalize (object); +} + +static void +midori_location_action_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriLocationAction* location_action = MIDORI_LOCATION_ACTION (object); + + switch (prop_id) + { + case PROP_PROGRESS: + midori_location_action_set_progress (location_action, + g_value_get_double (value)); + break; + case PROP_SECONDARY_ICON: + midori_location_action_set_secondary_icon (location_action, + g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_location_action_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriLocationAction* location_action = MIDORI_LOCATION_ACTION (object); + + switch (prop_id) + { + case PROP_PROGRESS: + g_value_set_double (value, location_action->progress); + break; + case PROP_SECONDARY_ICON: + g_value_set_string (value, location_action->secondary_icon); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_location_action_activate (GtkAction* action) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + + proxies = gtk_action_get_proxies (action); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + /* Obviously only one widget can end up with the focus. + Yet we can't predict which one that is, can we? */ + gtk_widget_grab_focus (entry); + } + + if (GTK_ACTION_CLASS (midori_location_action_parent_class)->activate) + GTK_ACTION_CLASS (midori_location_action_parent_class)->activate (action); +} + +static GtkWidget* +midori_location_action_create_tool_item (GtkAction* action) +{ + GtkWidget* toolitem; + GtkWidget* location_entry; + GtkWidget* alignment; + + toolitem = GTK_WIDGET (gtk_tool_item_new ()); + gtk_tool_item_set_expand (GTK_TOOL_ITEM (toolitem), TRUE); + location_entry = midori_location_entry_new (); + + alignment = gtk_alignment_new (0.0f, 0.5f, 1.0f, 0.1f); + gtk_container_add (GTK_CONTAINER (alignment), location_entry); + gtk_widget_show (location_entry); + gtk_container_add (GTK_CONTAINER (toolitem), alignment); + gtk_widget_show (alignment); + + return toolitem; +} + +static gboolean +midori_location_action_key_press_event_cb (GtkWidget* widget, + GdkEventKey* event, + GtkAction* action) +{ + const gchar* uri; + + switch (event->keyval) + { + case GDK_ISO_Enter: + case GDK_KP_Enter: + case GDK_Return: + { + if ((uri = gtk_entry_get_text (GTK_ENTRY (widget))) && *uri) + { + g_signal_emit (action, signals[SUBMIT_URI], 0, uri, + (event->state & GDK_MOD1_MASK) ? TRUE : FALSE); + return TRUE; + } + } + case GDK_Escape: + { + g_signal_emit (action, signals[RESET_URI], 0); + return TRUE; + } + } + return FALSE; +} + +static gboolean +midori_location_action_focus_out_event_cb (GtkWidget* widget, + GdkEventKey* event, + GtkAction* action) +{ + g_signal_emit (action, signals[FOCUS_OUT], 0); + return FALSE; +} + +static void +midori_location_action_icon_released_cb (GtkWidget* widget, + GtkIconEntryPosition icon_pos, + gint button, + GtkAction* action) +{ + if (icon_pos == GTK_ICON_ENTRY_SECONDARY) + g_signal_emit (action, signals[SECONDARY_ICON_RELEASED], 0, widget); +} + +static void +midori_location_entry_render_pixbuf_cb (GtkCellLayout* layout, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + gpointer data) +{ + GdkPixbuf* pixbuf; + + gtk_tree_model_get (model, iter, FAVICON_COL, &pixbuf, -1); + if (pixbuf) + { + g_object_set (renderer, "pixbuf", pixbuf, "yalign", 0.25, NULL); + g_object_unref (pixbuf); + } +} + +static void +midori_location_entry_render_text_cb (GtkCellLayout* layout, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + gpointer data) +{ + gchar* uri; + gchar* title; + gchar* desc; + gchar* desc_uri; + gchar* desc_title; + GtkWidget* entry; + gchar* key; + gchar* start; + gchar* skey; + gchar* temp; + gchar** parts; + size_t len; + + gtk_tree_model_get (model, iter, URI_COL, &uri, TITLE_COL, &title, -1); + + desc_uri = desc_title = key = NULL; + if (G_LIKELY (data)) + { + entry = gtk_entry_completion_get_entry (GTK_ENTRY_COMPLETION (data)); + key = title ? g_utf8_strdown (gtk_entry_get_text (GTK_ENTRY (entry)), -1) + : g_ascii_strdown (gtk_entry_get_text (GTK_ENTRY (entry)), -1); + len = 0; + } + if (G_LIKELY (data && uri)) + { + temp = g_ascii_strdown (uri, -1); + if ((start = strstr (temp, key))) + { + len = strlen (key); + skey = g_malloc0 (len + 1); + strncpy (skey, uri + (start - temp), len); + if (skey && *skey && (parts = g_strsplit (uri, skey, 2))) + { + if (parts[0] && parts[1]) + { + desc_uri = g_markup_printf_escaped ("%s%s%s", + parts[0], skey, parts[1]); + g_strfreev (parts); + } + } + g_free (skey); + } + g_free (temp); + } + if (uri && !desc_uri) + desc_uri = g_markup_escape_text (uri, -1); + if (G_LIKELY (data && title)) + { + temp = g_utf8_strdown (title, -1); + if ((start = strstr (temp, key))) + { + if (!len) + len = strlen (key); + skey = g_malloc0 (len + 1); + strncpy (skey, title + (start - temp), len); + parts = g_strsplit (title, skey, 2); + if (parts && parts[0] && parts[1]) + desc_title = g_markup_printf_escaped ("%s%s%s", + parts[0], skey, parts[1]); + g_strfreev (parts); + g_free (skey); + } + g_free (temp); + } + if (title && !desc_title) + desc_title = g_markup_escape_text (title, -1); + + if (desc_title) + { + desc = g_strdup_printf ("%s\n%s", + desc_title, desc_uri); + g_free (desc_uri); + g_free (desc_title); + } + else + desc = desc_uri; + + g_object_set (renderer, "markup", desc, + "ellipsize-set", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL); + + g_free (uri); + g_free (title); + g_free (key); + g_free (desc); +} + +static gboolean +midori_location_entry_completion_match_cb (GtkEntryCompletion* completion, + const gchar* key, + GtkTreeIter* iter, + gpointer data) +{ + GtkTreeModel* model; + gchar* uri; + gchar* title; + gboolean match; + gchar* temp; + + model = gtk_entry_completion_get_model (completion); + gtk_tree_model_get (model, iter, URI_COL, &uri, TITLE_COL, &title, -1); + + match = FALSE; + if (G_LIKELY (uri)) + { + temp = g_utf8_casefold (uri, -1); + match = (strstr (temp, key) != NULL); + g_free (temp); + g_free (uri); + + if (!match && G_LIKELY (title)) + { + temp = g_utf8_casefold (title, -1); + match = (strstr (temp, key) != NULL); + g_free (temp); + g_free (title); + } + } + + return match; +} + +static void +midori_location_action_set_item (MidoriLocationAction* location_action, + GtkTreeIter* iter, + MidoriLocationEntryItem* item) +{ + GdkPixbuf* icon; + GdkPixbuf* new_icon; + + gtk_list_store_set (GTK_LIST_STORE (location_action->model), iter, + URI_COL, item->uri, TITLE_COL, item->title, -1); + + gtk_tree_model_get (location_action->model, iter, FAVICON_COL, &icon, -1); + if (item->favicon) + new_icon = item->favicon; + else if (!icon) + new_icon = location_action->default_icon; + else + new_icon = NULL; + if (new_icon) + gtk_list_store_set (GTK_LIST_STORE (location_action->model), iter, + FAVICON_COL, new_icon, -1); +} + +/** + * midori_location_action_iter_lookup: + * @location_action: a #MidoriLocationAction + * @uri: a string + * @iter: a #GtkTreeIter + * + * Retrieves the iter of the item matching @uri if it was + * inserted with midori_location_action_iter_insert(). + * + * Return value: %TRUE if @uri was found, %FALSE otherwise + **/ +static gboolean +midori_location_action_iter_lookup (MidoriLocationAction* location_action, + const gchar* uri, + GtkTreeIter* iter) +{ + GtkTreeModel* model; + gchar* path; + + model = location_action->model; + + if (midori_location_action_is_frozen (location_action)) + { + gboolean found = FALSE; + if ((path = g_hash_table_lookup (location_action->items, uri))) + if (!(found = gtk_tree_model_get_iter_from_string (model, iter, path))) + g_hash_table_remove (location_action->items, uri); + return found; + } + + if (gtk_tree_model_get_iter_first (model, iter)) + { + gchar* tmp_uri = NULL; + do + { + gint cmp; + gtk_tree_model_get (model, iter, URI_COL, &tmp_uri, -1); + cmp = strcmp (uri, tmp_uri); + g_free (tmp_uri); + if (!cmp) + return TRUE; + } + while (gtk_tree_model_iter_next (model, iter)); + } + + return FALSE; +} + +/** + * midori_location_action_iter_insert: + * @location_action: a #MidoriLocationAction + * @uri: a string + * @iter: a #GtkTreeIter + * @position: position to insert the new row + * + * Creates a new row for @uri if it doesn't exist, or sets @iter + * to the existing iter for @uri. + * + * Return value: %TRUE if @uri was found, %FALSE otherwise + **/ +static gboolean +midori_location_action_iter_insert (MidoriLocationAction* location_action, + const gchar* uri, + GtkTreeIter* iter, + gint position) +{ + if (!midori_location_action_iter_lookup (location_action, uri, iter)) + { + GtkTreeModel* model; + + model = location_action->model; + gtk_list_store_insert (GTK_LIST_STORE (model), iter, position); + if (midori_location_action_is_frozen (location_action)) + { + gchar* new_uri = g_strdup (uri); + gchar* path = gtk_tree_model_get_string_from_iter (model, iter); + g_hash_table_insert (location_action->items, new_uri, path); + } + return FALSE; + } + + return TRUE; +} + +static gboolean +midori_location_entry_match_selected_cb (GtkEntryCompletion* completion, + GtkTreeModel* model, + GtkTreeIter* iter, + MidoriLocationAction* location_action) +{ + gchar* uri; + gtk_tree_model_get (model, iter, URI_COL, &uri, -1); + + midori_location_action_set_uri (location_action, uri); + g_signal_emit (location_action, signals[SUBMIT_URI], 0, uri, FALSE); + g_free (uri); + + return FALSE; +} + +static void +midori_location_entry_action_activated_cb (GtkEntryCompletion* completion, + gint action, + MidoriLocationAction* location_action) +{ + if (location_action->search_engines) + { + KatzeItem* item = katze_array_get_nth_item ( + location_action->search_engines, action); + GtkWidget* entry = gtk_entry_completion_get_entry (completion); + const gchar* keywords = gtk_entry_get_text (GTK_ENTRY (entry)); + const gchar* uri = katze_item_get_uri (item); + gchar* search; + if (!item) + return; + if (strstr (uri, "%s")) + search = g_strdup_printf (uri, keywords); + else + search = g_strconcat (uri, " ", keywords, NULL); + midori_location_action_set_uri (location_action, search); + g_signal_emit (location_action, signals[SUBMIT_URI], 0, search, FALSE); + g_free (search); + } +} + +static void +midori_location_action_add_actions (GtkEntryCompletion* completion, + KatzeArray* search_engines) +{ + guint i; + KatzeItem* item; + + if (!search_engines) + return; + + i = 0; + while ((item = katze_array_get_nth_item (search_engines, i))) + { + gchar* text = g_strdup_printf (_("Search with %s"), + katze_item_get_name (item)); + gtk_entry_completion_insert_action_text (completion, i++, text); + g_free (text); + } +} + +static void +midori_location_action_completion_init (MidoriLocationAction* location_action, + GtkWidget* location_entry) +{ + GtkWidget* entry; + GtkEntryCompletion* completion; + GtkCellRenderer* renderer; + + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + completion = gtk_entry_completion_new (); + + gtk_entry_completion_set_model (completion, location_action->sort_model); + gtk_entry_completion_set_text_column (completion, URI_COL); + #if GTK_CHECK_VERSION (2, 12, 0) + gtk_entry_completion_set_inline_selection (completion, TRUE); + #endif + gtk_cell_layout_clear (GTK_CELL_LAYOUT (completion)); + + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (completion), renderer, FALSE); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (completion), renderer, + midori_location_entry_render_pixbuf_cb, + NULL, NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (completion), renderer, TRUE); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (completion), renderer, + midori_location_entry_render_text_cb, + completion, NULL); + gtk_entry_completion_set_match_func (completion, + midori_location_entry_completion_match_cb, NULL, NULL); + + gtk_entry_set_completion (GTK_ENTRY (entry), completion); + g_signal_connect (completion, "match-selected", + G_CALLBACK (midori_location_entry_match_selected_cb), location_action); + + midori_location_action_add_actions (completion, + location_action->search_engines); + g_signal_connect (completion, "action-activated", + G_CALLBACK (midori_location_entry_action_activated_cb), location_action); + + g_object_unref (completion); +} + +static void +midori_location_action_entry_changed_cb (GtkComboBox* combo_box, + MidoriLocationAction* location_action) +{ + GtkTreeIter iter; + GtkIconEntry* entry; + GtkTreeModel* model; + GdkPixbuf* pixbuf; + gchar* uri; + + if (gtk_combo_box_get_active_iter (combo_box, &iter)) + { + if ((entry = GTK_ICON_ENTRY (gtk_bin_get_child (GTK_BIN (combo_box))))) + { + pixbuf = NULL; + + model = location_action->filter_model; + gtk_tree_model_get (model, &iter, FAVICON_COL, &pixbuf, + URI_COL, &uri, -1); + + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, pixbuf); + g_object_unref (pixbuf); + katze_assign (location_action->uri, uri); + + g_signal_emit (location_action, signals[ACTIVE_CHANGED], 0, + gtk_combo_box_get_active (combo_box)); + } + } +} + +static void +midori_location_action_connect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + GtkWidget* alignment; + GtkWidget* entry; + MidoriLocationAction* location_action; + GtkCellRenderer* renderer; + + GTK_ACTION_CLASS (midori_location_action_parent_class)->connect_proxy ( + action, proxy); + + location_action = MIDORI_LOCATION_ACTION (action); + katze_object_assign (location_action->default_icon, + gtk_widget_render_icon (proxy, GTK_STOCK_FILE, + GTK_ICON_SIZE_MENU, NULL)); + + if (GTK_IS_TOOL_ITEM (proxy)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxy)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + midori_location_entry_set_progress (MIDORI_LOCATION_ENTRY (entry), + MIDORI_LOCATION_ACTION (action)->progress); + gtk_combo_box_set_model (GTK_COMBO_BOX (entry), + MIDORI_LOCATION_ACTION (action)->filter_model); + gtk_combo_box_entry_set_text_column ( + GTK_COMBO_BOX_ENTRY (entry), URI_COL); + gtk_cell_layout_clear (GTK_CELL_LAYOUT (entry)); + + /* Setup the renderer for the favicon */ + renderer = gtk_cell_renderer_pixbuf_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (entry), renderer, FALSE); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (entry), + renderer, midori_location_entry_render_pixbuf_cb, NULL, NULL); + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (entry), renderer, TRUE); + gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (entry), + renderer, midori_location_entry_render_text_cb, NULL, NULL); + + gtk_combo_box_set_active (GTK_COMBO_BOX (entry), -1); + midori_location_action_completion_init (location_action, entry); + g_signal_connect (entry, "changed", + G_CALLBACK (midori_location_action_entry_changed_cb), action); + + g_object_connect (gtk_bin_get_child (GTK_BIN (entry)), + "signal::key-press-event", + midori_location_action_key_press_event_cb, action, + "signal::focus-out-event", + midori_location_action_focus_out_event_cb, action, + "signal::icon-release", + midori_location_action_icon_released_cb, action, + NULL); + } +} + +static void +midori_location_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + /* FIXME: This is wrong */ + g_signal_handlers_disconnect_by_func (proxy, + G_CALLBACK (gtk_action_activate), action); + + GTK_ACTION_CLASS (midori_location_action_parent_class)->disconnect_proxy + (action, proxy); +} + +const gchar* +midori_location_action_get_uri (MidoriLocationAction* location_action) +{ + g_return_val_if_fail (MIDORI_IS_LOCATION_ACTION (location_action), NULL); + + return location_action->uri; +} + +/** + * midori_location_action_set_text: + * @location_action: a #MidoriLocationAction + * @text: a string + * + * Sets the entry text to @text and, if applicable, updates the icon. + **/ +static void +midori_location_action_set_text (MidoriLocationAction* location_action, + const gchar* text) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + GtkTreeIter iter; + GdkPixbuf* icon; + + if (!(proxies = gtk_action_get_proxies (GTK_ACTION (location_action)))) + return; + + if (midori_location_action_iter_lookup (location_action, text, &iter)) + gtk_tree_model_get (location_action->model, + &iter, FAVICON_COL, &icon, -1); + else + icon = g_object_ref (location_action->default_icon); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + + gtk_entry_set_text (GTK_ENTRY (entry), text); + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, icon); + } + + if (icon) + g_object_unref (icon); +} + +void +midori_location_action_set_uri (MidoriLocationAction* location_action, + const gchar* uri) +{ + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (uri != NULL); + + katze_assign (location_action->uri, g_strdup (uri)); + + midori_location_action_set_text (location_action, uri); +} + +void +midori_location_action_set_icon (MidoriLocationAction* location_action, + GdkPixbuf* icon) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (GDK_IS_PIXBUF (icon)); + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, icon); + } +} + +/** + * midori_location_action_prepend_item: + * @location_action: a #MidoriLocationAction + * @item: a MidoriLocationItem + * + * Prepends @item if it is not already in the list. + * If the item already exists, it is moved before the first item. + * If the maximum is reached, the last item is removed. + **/ +static void +midori_location_action_prepend_item (MidoriLocationAction* location_action, + MidoriLocationEntryItem* item) +{ + GtkTreeModel* filter_model; + GtkTreeModel* sort_model; + GtkTreeModel* model; + GtkTreeIter iter; + GtkTreeIter sort_iter; + GtkTreeIter idx; + gint n; + gint visits = 0; + + filter_model = location_action->filter_model; + sort_model = location_action->sort_model; + model = location_action->model; + + if (midori_location_action_iter_insert (location_action, + item->uri, &iter, 0)) + { + gtk_tree_model_get_iter_first (model, &idx); + gtk_tree_model_get (model, &iter, VISITS_COL, &visits, -1); + gtk_list_store_move_before (GTK_LIST_STORE (model), &iter, &idx); + } + + /* Only increment the visits when we add the uri */ + if (!item->title && !item->favicon) + gtk_list_store_set (GTK_LIST_STORE (model), &iter, VISITS_COL, ++visits, + VISIBLE_COL, TRUE, -1); + + if (filter_model) + { + n = gtk_tree_model_iter_n_children (filter_model, NULL); + if (n > MAX_ITEMS) + { + gtk_tree_model_iter_nth_child (filter_model, &idx, NULL, n - 1); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (filter_model), + &sort_iter, &idx); + gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (sort_model), + &idx, &sort_iter); + gtk_list_store_set (GTK_LIST_STORE (model), + &idx, VISIBLE_COL, FALSE, -1); + } + } + midori_location_action_set_item (location_action, &iter, item); +} + +/** + * midori_location_entry_append_item: + * @location_entry: a #MidoriLocationEntry + * @item: a MidoriLocationItem + * + * Appends @item if it is not already in the list. + * @item is not added if the maximum is reached. + **/ +static void +midori_location_action_append_item (MidoriLocationAction* location_action, + MidoriLocationEntryItem* item) +{ + GtkTreeModel* model; + GtkTreeIter iter; + gint visits = 0; + + model = location_action->model; + + if (midori_location_action_iter_insert (location_action, + item->uri, &iter, G_MAXINT)) + gtk_tree_model_get (model, &iter, VISITS_COL, &visits, -1); + + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + VISITS_COL, ++visits, VISIBLE_COL, TRUE, -1); + midori_location_action_set_item (location_action, &iter, item); +} + +void +midori_location_action_add_uri (MidoriLocationAction* location_action, + const gchar* uri) +{ + MidoriLocationEntryItem item; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (uri != NULL); + + if (midori_location_action_is_frozen (location_action)) + return; + + item.favicon = NULL; + item.uri = uri; + item.title = NULL; + midori_location_action_prepend_item (location_action, &item); + + katze_assign (location_action->uri, g_strdup (uri)); +} + +void +midori_location_action_add_item (MidoriLocationAction* location_action, + const gchar* uri, + GdkPixbuf* icon, + const gchar* title) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + MidoriLocationEntryItem item; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (uri != NULL); + g_return_if_fail (title != NULL); + g_return_if_fail (!icon || GDK_IS_PIXBUF (icon)); + + item.favicon = icon; + item.uri = uri; + item.title = title; + midori_location_action_append_item (location_action, &item); + + if (midori_location_action_is_frozen (location_action)) + return; + + katze_assign (location_action->uri, g_strdup (uri)); + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data) && + !strcmp (location_action->uri, uri)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, icon); + } +} + +void +midori_location_action_set_icon_for_uri (MidoriLocationAction* location_action, + GdkPixbuf* icon, + const gchar* uri) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + MidoriLocationEntryItem item; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (!icon || GDK_IS_PIXBUF (icon)); + g_return_if_fail (uri != NULL); + + item.favicon = icon; + item.uri = uri; + item.title = NULL; + midori_location_action_prepend_item (location_action, &item); + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data) && + !g_strcmp0 (location_action->uri, uri)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, icon); + } +} + +void +midori_location_action_set_title_for_uri (MidoriLocationAction* location_action, + const gchar* title, + const gchar* uri) +{ + MidoriLocationEntryItem item; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (title != NULL); + g_return_if_fail (uri != NULL); + + item.favicon = NULL; + item.uri = uri; + item.title = title; + midori_location_action_prepend_item (location_action, &item); +} + +/** + * midori_location_action_set_search_engines: + * @location_action: a #MidoriLocationAction + * @search_engines: a #KatzeArray + * + * Assigns the specified search engines to the location action. + * Search engines will appear as actions in the completion. + * + * Since: 0.1.6 + **/ +void +midori_location_action_set_search_engines (MidoriLocationAction* location_action, + KatzeArray* search_engines) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + GtkWidget* child; + GtkEntryCompletion* completion; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + + if (search_engines) + g_object_ref (search_engines); + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + KatzeItem* item; + guint i; + + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + child = gtk_bin_get_child (GTK_BIN (entry)); + + completion = gtk_entry_get_completion (GTK_ENTRY (child)); + i = 0; + if (location_action->search_engines) + while ((item = katze_array_get_nth_item (location_action->search_engines, i++))) + gtk_entry_completion_delete_action (completion, 0); + midori_location_action_add_actions (completion, search_engines); + } + + katze_object_assign (location_action->search_engines, search_engines); + /* FIXME: Take care of adding and removing search engines as needed */ +} + +gdouble +midori_location_action_get_progress (MidoriLocationAction* location_action) +{ + g_return_val_if_fail (MIDORI_IS_LOCATION_ACTION (location_action), 0.0); + + return location_action->progress; +} + +void +midori_location_action_set_progress (MidoriLocationAction* location_action, + gdouble progress) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + + location_action->progress = CLAMP (progress, 0.0, 1.0); + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + midori_location_entry_set_progress (MIDORI_LOCATION_ENTRY (entry), + location_action->progress); + } +} + +void +midori_location_action_set_secondary_icon (MidoriLocationAction* location_action, + const gchar* stock_id) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + GtkWidget* child; + GtkStockItem stock_item; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (!stock_id || gtk_stock_lookup (stock_id, &stock_item)); + + katze_assign (location_action->secondary_icon, g_strdup (stock_id)); + + proxies = gtk_action_get_proxies (GTK_ACTION (location_action)); + + for (; proxies != NULL; proxies = g_slist_next (proxies)) + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + child = gtk_bin_get_child (GTK_BIN (entry)); + + if (stock_id) + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (child), + GTK_ICON_ENTRY_SECONDARY, stock_id); + else + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (child), + GTK_ICON_ENTRY_SECONDARY, NULL); + } +} + +/** + * midori_location_action_set_item_from_uri: + * @location_action: a #MidoriLocationAction + * @uri: a string + * + * Finds the item from the list matching @uri + * and removes it if it is the last instance. + **/ +void +midori_location_action_delete_item_from_uri (MidoriLocationAction* location_action, + const gchar* uri) +{ + GtkTreeModel* model; + GtkTreeIter iter; + gint visits; + + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + g_return_if_fail (uri != NULL); + + model = location_action->model; + if (midori_location_action_iter_lookup (location_action, uri, &iter)) + { + gtk_tree_model_get (model, &iter, VISITS_COL, &visits, -1); + if (visits > 1) + gtk_list_store_set (GTK_LIST_STORE (model), + &iter, VISITS_COL, --visits, -1); + else + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + } +} + +void +midori_location_action_clear (MidoriLocationAction* location_action) +{ + g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action)); + + gtk_list_store_clear (GTK_LIST_STORE (location_action->model)); +} diff --git a/midori/midori-locationaction.h b/midori/midori-locationaction.h new file mode 100644 index 00000000..593d55df --- /dev/null +++ b/midori/midori-locationaction.h @@ -0,0 +1,108 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_LOCATION_ACTION_H__ +#define __MIDORI_LOCATION_ACTION_H__ + +#include "midori-locationentry.h" + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_LOCATION_ACTION \ + (midori_location_action_get_type ()) +#define MIDORI_LOCATION_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_LOCATION_ACTION, MidoriLocationAction)) +#define MIDORI_LOCATION_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_LOCATION_ACTION, MidoriLocationActionClass)) +#define MIDORI_IS_LOCATION_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_LOCATION_ACTION)) +#define MIDORI_IS_LOCATION_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_LOCATION_ACTION)) +#define MIDORI_LOCATION_ACTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_LOCATION_ACTION, MidoriLocationActionClass)) + +typedef struct _MidoriLocationAction MidoriLocationAction; +typedef struct _MidoriLocationActionClass MidoriLocationActionClass; + +struct _MidoriLocationEntryItem +{ + GdkPixbuf* favicon; + const gchar* uri; + const gchar* title; +}; + +GType +midori_location_action_get_type (void); + +void +midori_location_action_freeze (MidoriLocationAction* location_action); + +void +midori_location_action_thaw (MidoriLocationAction* location_action); + +const gchar* +midori_location_action_get_uri (MidoriLocationAction* location_action); + +void +midori_location_action_set_uri (MidoriLocationAction* location_action, + const gchar* uri); + +void +midori_location_action_set_icon (MidoriLocationAction* location_action, + GdkPixbuf* icon); + +void +midori_location_action_add_uri (MidoriLocationAction* location_action, + const gchar* uri); + +void +midori_location_action_add_item (MidoriLocationAction* location_action, + const gchar* uri, + GdkPixbuf* icon, + const gchar* title); + +void +midori_location_action_set_icon_for_uri (MidoriLocationAction* location_action, + GdkPixbuf* icon, + const gchar* text); + +void +midori_location_action_set_title_for_uri (MidoriLocationAction* location_action, + const gchar* title, + const gchar* text); + +void +midori_location_action_set_search_engines (MidoriLocationAction* location_action, + KatzeArray* search_engines); + +gdouble +midori_location_action_get_progress (MidoriLocationAction* location_action); + +void +midori_location_action_set_progress (MidoriLocationAction* location_action, + gdouble progress); + +void +midori_location_action_set_secondary_icon (MidoriLocationAction* location_action, + const gchar* stock_id); + +void +midori_location_action_delete_item_from_uri (MidoriLocationAction* location_action, + const gchar* uri); + +void +midori_location_action_clear (MidoriLocationAction* location_action); + +G_END_DECLS + +#endif /* __MIDORI_LOCATION_ACTION_H__ */ diff --git a/midori/midori-locationentry.c b/midori/midori-locationentry.c new file mode 100644 index 00000000..1f1f5d12 --- /dev/null +++ b/midori/midori-locationentry.c @@ -0,0 +1,436 @@ +/* + Copyright (C) 2008 Dale Whittaker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-locationentry.h" + +#include "gtkiconentry.h" +#include "sokoke.h" +#include + +struct _MidoriLocationEntry +{ + GtkComboBoxEntry parent_instance; + + gdouble progress; +}; + +struct _MidoriLocationEntryClass +{ + GtkComboBoxEntryClass parent_class; +}; + +G_DEFINE_TYPE (MidoriLocationEntry, + midori_location_entry, GTK_TYPE_COMBO_BOX_ENTRY) + +enum +{ + FAVICON_COL, + URI_COL, + TITLE_COL, + VISITS_COL, + VISIBLE_COL, + N_COLS +}; + +static gboolean +entry_key_press_event (GtkWidget* widget, + GdkEventKey* event, + MidoriLocationEntry* location_entry); + +static void +midori_location_entry_class_init (MidoriLocationEntryClass* class) +{ + +} + +#if !GTK_CHECK_VERSION (2, 16, 0) + +/* GTK+/ GtkEntry internal helper function + Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + Modified by the GTK+ Team and others 1997-2000 + Copied from Gtk+ 2.13, whitespace adjusted */ +static void +gtk_entry_get_pixel_ranges (GtkEntry *entry, + gint **ranges, + gint *n_ranges) +{ + gint start_char, end_char; + + if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), + &start_char, &end_char)) + { + PangoLayout *layout = gtk_entry_get_layout (entry); + PangoLayoutLine *line = pango_layout_get_lines (layout)->data; + const char *text = pango_layout_get_text (layout); + gsize start_index = g_utf8_offset_to_pointer (text, start_char) - text; + gsize end_index = g_utf8_offset_to_pointer (text, end_char) - text; + gint real_n_ranges, i; + + pango_layout_line_get_x_ranges (line, + start_index, end_index, ranges, &real_n_ranges); + + if (ranges) + { + gint *r = *ranges; + + for (i = 0; i < real_n_ranges; ++i) + { + r[2 * i + 1] = (r[2 * i + 1] - r[2 * i]) / PANGO_SCALE; + r[2 * i] = r[2 * i] / PANGO_SCALE; + } + } + + if (n_ranges) + *n_ranges = real_n_ranges; + } + else + { + if (n_ranges) + *n_ranges = 0; + if (ranges) + *ranges = NULL; + } +} + +/* GTK+/ GtkEntry internal helper function + Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + Modified by the GTK+ Team and others 1997-2000 + Copied from Gtk+ 2.13, whitespace adjusted + Code adjusted to not rely on internal qdata */ +static void +_gtk_entry_effective_inner_border (GtkEntry *entry, + GtkBorder *border) +{ + static const GtkBorder default_inner_border = { 2, 2, 2, 2 }; + GtkBorder *tmp_border; + + tmp_border = (GtkBorder*) gtk_entry_get_inner_border (entry); + + if (tmp_border) + { + *border = *tmp_border; + return; + } + + gtk_widget_style_get (GTK_WIDGET (entry), "inner-border", &tmp_border, NULL); + + if (tmp_border) + { + *border = *tmp_border; + gtk_border_free (tmp_border); + return; + } + + *border = default_inner_border; +} + +static void +gtk_entry_borders (GtkEntry* entry, + gint* xborder, + gint* yborder, + gboolean* interior_focus, + gint* focus_width) +{ + GtkWidget *widget = GTK_WIDGET (entry); + + if (entry->has_frame) + { + *xborder = widget->style->xthickness; + *yborder = widget->style->ythickness; + } + else + { + *xborder = 0; + *yborder = 0; + } + + gtk_widget_style_get (widget, "interior-focus", interior_focus, + "focus-line-width", focus_width, NULL); + + if (interior_focus) + { + *xborder += *focus_width; + *yborder += *focus_width; + } +} + +/* GTK+/ GtkEntry internal helper function + Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + Modified by the GTK+ Team and others 1997-2000 + Copied from Gtk+ 2.13, whitespace adjusted */ +static void +gtk_entry_get_text_area_size (GtkEntry *entry, + gint *x, + gint *y, + gint *width, + gint *height) +{ + gint frame_height; + gint xborder, yborder; + gboolean interior_focus; + gint focus_width; + GtkRequisition requisition; + GtkWidget *widget = GTK_WIDGET (entry); + + gtk_widget_get_child_requisition (widget, &requisition); + gtk_entry_borders (entry, &xborder, &yborder, &interior_focus, &focus_width); + + if (GTK_WIDGET_REALIZED (widget)) + gdk_drawable_get_size (widget->window, NULL, &frame_height); + else + frame_height = requisition.height; + + if (GTK_WIDGET_HAS_FOCUS (widget) && interior_focus) + frame_height -= 2 * focus_width; + + if (x) + *x = xborder; + + if (y) + *y = frame_height / 2 - (requisition.height - yborder * 2) / 2; + + if (width) + *width = GTK_WIDGET (entry)->allocation.width - xborder * 2; + + if (height) + *height = requisition.height - yborder * 2; +} + +/* GTK+/ GtkEntry internal helper function + Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + Modified by the GTK+ Team and others 1997-2000 + Copied from Gtk+ 2.13, whitespace adjusted */ +static void +get_layout_position (GtkEntry *entry, + gint *x, + gint *y) +{ + PangoLayout *layout; + PangoRectangle logical_rect; + gint area_width, area_height; + GtkBorder inner_border; + gint y_pos; + PangoLayoutLine *line; + + layout = gtk_entry_get_layout (entry); + + gtk_entry_get_text_area_size (entry, NULL, NULL, &area_width, &area_height); + _gtk_entry_effective_inner_border (entry, &inner_border); + + area_height = PANGO_SCALE * + (area_height - inner_border.top - inner_border.bottom); + + line = pango_layout_get_lines (layout)->data; + pango_layout_line_get_extents (line, NULL, &logical_rect); + + /* Align primarily for locale's ascent/descent */ + y_pos = ((area_height - entry->ascent - entry->descent) / 2 + + entry->ascent + logical_rect.y); + + /* Now see if we need to adjust to fit in actual drawn string */ + if (logical_rect.height > area_height) + y_pos = (area_height - logical_rect.height) / 2; + else if (y_pos < 0) + y_pos = 0; + else if (y_pos + logical_rect.height > area_height) + y_pos = area_height - logical_rect.height; + + y_pos = inner_border.top + y_pos / PANGO_SCALE; + + if (x) + *x = inner_border.left - entry->scroll_offset; + + if (y) + *y = y_pos; +} + +/* GTK+/ GtkEntry internal helper function + Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + Modified by the GTK+ Team and others 1997-2000 + Copied from Gtk+ 2.13, whitespace adjusted + Code adjusted to not rely on internal _gtk_entry_ensure_layout */ +static void +gtk_entry_draw_text (GtkEntry *entry) +{ + GtkWidget *widget; + + if (!entry->visible && entry->invisible_char == 0) + return; + + if (GTK_WIDGET_DRAWABLE (entry)) + { + PangoLayout *layout = gtk_entry_get_layout (entry); + cairo_t *cr; + gint x, y; + gint start_pos, end_pos; + + widget = GTK_WIDGET (entry); + + get_layout_position (entry, &x, &y); + + cr = gdk_cairo_create (entry->text_area); + + cairo_move_to (cr, x, y); + gdk_cairo_set_source_color (cr, &widget->style->text [widget->state]); + pango_cairo_show_layout (cr, layout); + + if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), + &start_pos, &end_pos)) + { + gint *ranges; + gint n_ranges, i; + PangoRectangle logical_rect; + GdkColor *selection_color, *text_color; + GtkBorder inner_border; + + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); + gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges); + + if (GTK_WIDGET_HAS_FOCUS (entry)) + { + selection_color = &widget->style->base [GTK_STATE_SELECTED]; + text_color = &widget->style->text [GTK_STATE_SELECTED]; + } + else + { + selection_color = &widget->style->base [GTK_STATE_ACTIVE]; + text_color = &widget->style->text [GTK_STATE_ACTIVE]; + } + + _gtk_entry_effective_inner_border (entry, &inner_border); + + for (i = 0; i < n_ranges; ++i) + cairo_rectangle (cr, + inner_border.left - + entry->scroll_offset + ranges[2 * i], + y, + ranges[2 * i + 1], + logical_rect.height); + + cairo_clip (cr); + + gdk_cairo_set_source_color (cr, selection_color); + cairo_paint (cr); + + cairo_move_to (cr, x, y); + gdk_cairo_set_source_color (cr, text_color); + pango_cairo_show_layout (cr, layout); + + g_free (ranges); + } + + cairo_destroy (cr); + } +} + +static gboolean +entry_expose_event (GtkWidget* entry, + GdkEventExpose* event, + MidoriLocationEntry* location_entry) +{ + GdkWindow* text_area; + gint width, height; + + text_area = GTK_ENTRY (entry)->text_area; + + gdk_drawable_get_size (text_area, &width, &height); + + if (location_entry->progress > 0.0) + { + gtk_paint_box (entry->style, text_area, + GTK_STATE_SELECTED, GTK_SHADOW_OUT, + &event->area, entry, "bar", + 0, 0, location_entry->progress * width, height); + gtk_entry_draw_text (GTK_ENTRY (entry)); + } + return FALSE; +} + +#endif + +void +midori_location_entry_set_progress (MidoriLocationEntry* location_entry, + gdouble progress) +{ + GtkWidget* child; + + g_return_if_fail (MIDORI_IS_LOCATION_ENTRY (location_entry)); + + location_entry->progress = CLAMP (progress, 0.0, 1.0); + + child = gtk_bin_get_child (GTK_BIN (location_entry)); + #if !GTK_CHECK_VERSION (2, 16, 0) + if (GTK_ENTRY (child)->text_area) + gdk_window_invalidate_rect (GTK_ENTRY (child)->text_area, NULL, FALSE); + #else + gtk_entry_set_progress_fraction (GTK_ENTRY (child), progress); + #endif +} + +static void +midori_location_entry_init (MidoriLocationEntry* location_entry) +{ + GtkWidget* entry; + + /* We want the widget to have appears-as-list applied */ + gtk_rc_parse_string ("style \"midori-location-entry-style\" {\n" + " GtkComboBox::appears-as-list = 1\n }\n" + "widget_class \"*MidoriLocationEntry\" " + "style \"midori-location-entry-style\"\n"); + + location_entry->progress = 0.0; + + entry = gtk_icon_entry_new (); + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, GTK_STOCK_FILE); + gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_SECONDARY, TRUE); + g_signal_connect_after (entry, "key-press-event", + G_CALLBACK (entry_key_press_event), location_entry); + #if !GTK_CHECK_VERSION (2, 16, 0) + g_signal_connect_after (entry, "expose-event", + G_CALLBACK (entry_expose_event), location_entry); + #endif + gtk_widget_show (entry); + gtk_container_add (GTK_CONTAINER (location_entry), entry); +} + +static gboolean +entry_key_press_event (GtkWidget* widget, + GdkEventKey* event, + MidoriLocationEntry* location_entry) +{ + switch (event->keyval) + { + case GDK_Down: + case GDK_Up: + { + if (!katze_object_get_boolean (location_entry, "popup-shown")) + gtk_combo_box_popup (GTK_COMBO_BOX (location_entry)); + return TRUE; + } + } + + return FALSE; +} + +/** + * midori_location_entry_new: + * + * Creates a new #MidoriLocationEntry. + * + * Return value: a new #MidoriLocationEntry + **/ +GtkWidget* +midori_location_entry_new (void) +{ + return g_object_new (MIDORI_TYPE_LOCATION_ENTRY, NULL); +} diff --git a/midori/midori-locationentry.h b/midori/midori-locationentry.h new file mode 100644 index 00000000..f84d0b29 --- /dev/null +++ b/midori/midori-locationentry.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2008 Dale Whittaker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_LOCATION_ENTRY_H__ +#define __MIDORI_LOCATION_ENTRY_H__ + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_LOCATION_ENTRY (midori_location_entry_get_type ()) +#define MIDORI_LOCATION_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_LOCATION_ENTRY, MidoriLocationEntry)) +#define MIDORI_LOCATION_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_LOCATION_ENTRY, MidoriLocationEntryClass)) +#define MIDORI_IS_LOCATION_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_LOCATION_ENTRY)) +#define MIDORI_IS_LOCATION_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_LOCATION_ENTRY)) +#define MIDORI_LOCATION_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_LOCATION_ENTRY, MidoriLocationEntryClass)) + +typedef struct _MidoriLocationEntry MidoriLocationEntry; +typedef struct _MidoriLocationEntryClass MidoriLocationEntryClass; +typedef struct _MidoriLocationEntryItem MidoriLocationEntryItem; + +GType +midori_location_entry_get_type (void); + +GtkWidget* +midori_location_entry_new (void); + +void +midori_location_entry_set_progress (MidoriLocationEntry* location_entry, + gdouble progress); + +G_END_DECLS + +#endif /* __MIDORI_LOCATION_ENTRY_H__ */ diff --git a/midori/midori-panel.c b/midori/midori-panel.c new file mode 100644 index 00000000..44e59b1d --- /dev/null +++ b/midori/midori-panel.c @@ -0,0 +1,943 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-panel.h" + +#include "midori-view.h" + +#include "compat.h" +#include "marshal.h" +#include "sokoke.h" + +#include + +struct _MidoriPanel +{ + GtkHBox parent_instance; + + GtkWidget* toolbar; + GtkToolItem* button_align; + GtkWidget* toolbar_label; + GtkWidget* frame; + GtkWidget* toolbook; + GtkWidget* notebook; + GtkMenu* menu; + + gboolean right_aligned; +}; + +struct _MidoriPanelClass +{ + GtkHBoxClass parent_class; + + /* Signals */ + gboolean + (*close) (MidoriPanel* panel); +}; + +G_DEFINE_TYPE (MidoriPanel, midori_panel, GTK_TYPE_HBOX) + +enum +{ + PROP_0, + + PROP_SHADOW_TYPE, + PROP_MENU, + PROP_PAGE, + PROP_RIGHT_ALIGNED, +}; + +enum { + CLOSE, + SWITCH_PAGE, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +midori_panel_finalize (GObject* object); + +static void +midori_panel_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_panel_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static gboolean +midori_panel_close (MidoriPanel* panel) +{ + gtk_widget_hide (GTK_WIDGET (panel)); + return FALSE; +} + +static void +midori_panel_class_init (MidoriPanelClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + signals[CLOSE] = g_signal_new ( + "close", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + G_STRUCT_OFFSET (MidoriPanelClass, close), + g_signal_accumulator_true_handled, + NULL, + midori_cclosure_marshal_BOOLEAN__VOID, + G_TYPE_BOOLEAN, 0); + + signals[SWITCH_PAGE] = g_signal_new ( + "switch-page", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_panel_finalize; + gobject_class->set_property = midori_panel_set_property; + gobject_class->get_property = midori_panel_get_property; + + class->close = midori_panel_close; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS; + + g_object_class_install_property (gobject_class, + PROP_SHADOW_TYPE, + g_param_spec_enum ( + "shadow-type", + "Shadow Type", + "Appearance of the shadow around each panel", + GTK_TYPE_SHADOW_TYPE, + GTK_SHADOW_NONE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_MENU, + g_param_spec_object ( + "menu", + "Menu", + "Menu to hold panel items", + GTK_TYPE_MENU, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_PAGE, + g_param_spec_int ( + "page", + "Page", + "The index of the current page", + -1, G_MAXINT, -1, + flags)); + + /** + * MidoriWebSettings:right-aligned: + * + * Whether to align the panel on the right. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_RIGHT_ALIGNED, + g_param_spec_boolean ( + "right-aligned", + "Right aligned", + "Whether the panel is aligned to the right", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +midori_panel_button_close_clicked_cb (GtkWidget* toolitem, + MidoriPanel* panel) +{ + gboolean return_value; + g_signal_emit (panel, signals[CLOSE], 0, &return_value); +} + +static GtkToolItem* +midori_panel_construct_tool_item (MidoriPanel* panel, + MidoriViewable* viewable); + +static GtkWidget* +_midori_panel_child_for_scrolled (MidoriPanel* panel, + GtkWidget* scrolled); + +static gboolean +midori_panel_detached_window_delete_event_cb (GtkWidget* window, + GdkEvent* event, + MidoriPanel* panel) +{ + /* FIXME: The panel will not end up at its original position */ + /* FIXME: The menuitem may be mispositioned */ + GtkWidget* vbox = gtk_bin_get_child (GTK_BIN (window)); + GtkWidget* scrolled = g_object_get_data (G_OBJECT (window), "scrolled"); + GtkWidget* toolbar = g_object_get_data (G_OBJECT (scrolled), "panel-toolbar"); + GtkWidget* menuitem = g_object_get_data (G_OBJECT (scrolled), "panel-menuitem"); + GtkToolItem* toolitem; + g_object_ref (toolbar); + gtk_container_remove (GTK_CONTAINER (vbox), toolbar); + gtk_container_add (GTK_CONTAINER (panel->toolbook), toolbar); + g_object_unref (toolbar); + g_object_ref (scrolled); + gtk_container_remove (GTK_CONTAINER (vbox), scrolled); + gtk_container_add (GTK_CONTAINER (panel->notebook), scrolled); + g_object_unref (scrolled); + toolitem = midori_panel_construct_tool_item (panel, + MIDORI_VIEWABLE (_midori_panel_child_for_scrolled (panel, scrolled))); + if (menuitem) + { + gtk_widget_show (menuitem); + g_object_set_data (G_OBJECT (menuitem), "toolitem", toolitem); + } + return FALSE; +} + +static void +midori_panel_button_detach_clicked_cb (GtkWidget* toolbutton, + MidoriPanel* panel) +{ + /* FIXME: Use stock icon for window */ + /* FIXME: What happens when the browser is destroyed? */ + /* FIXME: What about multiple browsers? */ + /* FIXME: Should we remember if the child was detached? */ + /* FIXME: Fix label of the sidepanel after removing the widgets */ + gint n = midori_panel_get_current_page (panel); + GtkToolItem* toolitem = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (panel->toolbar), n); + const gchar* title = gtk_tool_button_get_label (GTK_TOOL_BUTTON (toolitem)); + GtkWidget* toolbar = gtk_notebook_get_nth_page ( + GTK_NOTEBOOK (panel->toolbook), n); + GtkWidget* scrolled = gtk_notebook_get_nth_page ( + GTK_NOTEBOOK (panel->notebook), n); + GtkWidget* menuitem = g_object_get_data (G_OBJECT (scrolled), "panel-menuitem"); + GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + GtkWidget* vbox = gtk_vbox_new (FALSE, 0); + g_object_set_data (G_OBJECT (window), "scrolled", scrolled); + gtk_window_set_title (GTK_WINDOW (window), title); + gtk_window_set_default_size (GTK_WINDOW (window), 250, 400); + gtk_window_set_transient_for (GTK_WINDOW (window), + GTK_WINDOW (gtk_widget_get_toplevel (panel->notebook))); + gtk_widget_show (vbox); + gtk_container_add (GTK_CONTAINER (window), vbox); + if (menuitem) + gtk_widget_hide (menuitem); + gtk_container_remove (GTK_CONTAINER (panel->toolbar), GTK_WIDGET (toolitem)); + g_object_ref (toolbar); + gtk_container_remove (GTK_CONTAINER (panel->toolbook), toolbar); + gtk_box_pack_start (GTK_BOX (vbox), toolbar, FALSE, FALSE, 0); + g_object_unref (toolbar); + g_object_set_data (G_OBJECT (scrolled), "panel-toolbar", toolbar); + g_object_ref (scrolled); + gtk_container_remove (GTK_CONTAINER (panel->notebook), scrolled); + gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0); + g_object_unref (scrolled); + g_signal_connect (window, "delete-event", + G_CALLBACK (midori_panel_detached_window_delete_event_cb), panel); + gtk_widget_show (window); +} + +static void +midori_panel_button_align_clicked_cb (GtkWidget* toolitem, + MidoriPanel* panel) +{ + midori_panel_set_right_aligned (panel, !panel->right_aligned); +} + +static void +midori_panel_destroy_cb (MidoriPanel* panel) +{ + /* Destroy pages first, so they don't need special care */ + gtk_container_foreach (GTK_CONTAINER (panel->notebook), + (GtkCallback) gtk_widget_destroy, NULL); +} + +static void +midori_panel_init (MidoriPanel* panel) +{ + GtkWidget* vbox; + GtkWidget* labelbar; + GtkToolItem* toolitem; + + panel->right_aligned = FALSE; + + /* Create the sidebar */ + panel->toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (panel->toolbar), GTK_TOOLBAR_BOTH); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (panel->toolbar), + GTK_ICON_SIZE_BUTTON); + gtk_toolbar_set_orientation (GTK_TOOLBAR (panel->toolbar), + GTK_ORIENTATION_VERTICAL); + gtk_box_pack_start (GTK_BOX (panel), panel->toolbar, FALSE, FALSE, 0); + gtk_widget_show_all (panel->toolbar); + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (panel), vbox, TRUE, TRUE, 0); + + /* Create the titlebar */ + labelbar = gtk_toolbar_new (); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (labelbar), GTK_ICON_SIZE_MENU); + gtk_toolbar_set_style (GTK_TOOLBAR (labelbar), GTK_TOOLBAR_ICONS); + toolitem = gtk_tool_item_new (); + gtk_tool_item_set_expand (toolitem, TRUE); + panel->toolbar_label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (panel->toolbar_label), 0, 0.5); + gtk_container_add (GTK_CONTAINER (toolitem), panel->toolbar_label); + gtk_container_set_border_width (GTK_CONTAINER (toolitem), 6); + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_FULLSCREEN); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), + _("Detach chosen panel from the window")); + gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem), + _("Whether to detach the chosen panel from the window")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_panel_button_detach_clicked_cb), panel); + #if HAVE_OSX + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, 0); + #else + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1); + #endif + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), + _("Align sidepanel on the right")); + gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem), + _("Whether to align the sidepanel on the right")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_panel_button_align_clicked_cb), panel); + #if HAVE_OSX + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, 0); + #else + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1); + #endif + panel->button_align = toolitem; + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_CLOSE); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("Close panel")); + gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem), _("Close panel")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_panel_button_close_clicked_cb), panel); + #if HAVE_OSX + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, 0); + #else + gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1); + #endif + gtk_box_pack_start (GTK_BOX (vbox), labelbar, FALSE, FALSE, 0); + gtk_widget_show_all (vbox); + + /* Create the toolbook */ + panel->toolbook = gtk_notebook_new (); + gtk_notebook_set_show_border (GTK_NOTEBOOK (panel->toolbook), FALSE); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (panel->toolbook), FALSE); + gtk_box_pack_start (GTK_BOX (vbox), panel->toolbook, FALSE, FALSE, 0); + gtk_widget_show (panel->toolbook); + + /* Create the notebook */ + panel->notebook = gtk_notebook_new (); + gtk_notebook_set_show_border (GTK_NOTEBOOK (panel->notebook), FALSE); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (panel->notebook), FALSE); + panel->frame = gtk_frame_new (NULL); + gtk_container_add (GTK_CONTAINER (panel->frame), panel->notebook); + gtk_box_pack_start (GTK_BOX (vbox), panel->frame, TRUE, TRUE, 0); + gtk_widget_show_all (panel->frame); + + g_signal_connect (panel, "destroy", + G_CALLBACK (midori_panel_destroy_cb), NULL); +} + +static void +midori_panel_finalize (GObject* object) +{ + G_OBJECT_CLASS (midori_panel_parent_class)->finalize (object); +} + +static void +midori_panel_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriPanel* panel = MIDORI_PANEL (object); + + switch (prop_id) + { + case PROP_SHADOW_TYPE: + gtk_frame_set_shadow_type (GTK_FRAME (panel->frame), + g_value_get_enum (value)); + break; + case PROP_MENU: + katze_object_assign (panel->menu, g_value_dup_object (value)); + /* FIXME: Move existing items to the new menu */ + break; + case PROP_PAGE: + midori_panel_set_current_page (panel, g_value_get_int (value)); + break; + case PROP_RIGHT_ALIGNED: + midori_panel_set_right_aligned (panel, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_panel_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriPanel* panel = MIDORI_PANEL (object); + + switch (prop_id) + { + case PROP_SHADOW_TYPE: + g_value_set_enum (value, + gtk_frame_get_shadow_type (GTK_FRAME (panel->frame))); + break; + case PROP_MENU: + g_value_set_object (value, panel->menu); + break; + case PROP_PAGE: + g_value_set_int (value, midori_panel_get_current_page (panel)); + break; + case PROP_RIGHT_ALIGNED: + g_value_set_boolean (value, panel->right_aligned); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_panel_new: + * + * Creates a new empty panel. + * + * Return value: a new #MidoriPanel + **/ +GtkWidget* +midori_panel_new (void) +{ + MidoriPanel* panel = g_object_new (MIDORI_TYPE_PANEL, + NULL); + + return GTK_WIDGET (panel); +} + +/** + * midori_panel_set_compact: + * @compact: %TRUE if the panel should be compact + * + * Determines if the panel should be compact. + **/ +void +midori_panel_set_compact (MidoriPanel* panel, + gboolean compact) +{ + g_return_if_fail (MIDORI_IS_PANEL (panel)); + + #if HAVE_HILDON + compact = TRUE; + #endif + gtk_toolbar_set_style (GTK_TOOLBAR (panel->toolbar), + compact ? GTK_TOOLBAR_ICONS : GTK_TOOLBAR_BOTH); +} + +/** + * midori_panel_set_right_aligned: + * @compact: %TRUE if the panel should be aligned to the right + * + * Determines if the panel should be right aligned. + * + * Since: 0.1.3 + **/ +void +midori_panel_set_right_aligned (MidoriPanel* panel, + gboolean right_aligned) +{ + GtkWidget* box; + + g_return_if_fail (MIDORI_IS_PANEL (panel)); + + box = gtk_widget_get_parent (panel->toolbar); + gtk_box_reorder_child (GTK_BOX (box), panel->toolbar, + right_aligned ? -1 : 0); + gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (panel->button_align), + right_aligned ? GTK_STOCK_GO_BACK : GTK_STOCK_GO_FORWARD); + panel->right_aligned = right_aligned; + g_object_notify (G_OBJECT (panel), "right-aligned"); +} + +static void +midori_panel_menu_item_activate_cb (GtkWidget* widget, + MidoriPanel* panel) +{ + GtkWidget* child; + GtkToggleToolButton* toolitem; + guint n; + + child = g_object_get_data (G_OBJECT (widget), "page"); + toolitem = g_object_get_data (G_OBJECT (widget), "toolitem"); + + if (toolitem) + { + /* Unsetting the button before setting it ensures that + it will emit signals even if it was active before */ + gtk_toggle_tool_button_set_active (toolitem, FALSE); + gtk_toggle_tool_button_set_active (toolitem, TRUE); + } + else + { + n = midori_panel_page_num (panel, child); + midori_panel_set_current_page (panel, n); + g_signal_emit (panel, signals[SWITCH_PAGE], 0, n); + gtk_widget_show (GTK_WIDGET (panel)); + } +} + +static void +midori_panel_viewable_destroy_cb (GtkWidget* viewable, + MidoriPanel* panel) +{ + gint i = gtk_notebook_page_num (GTK_NOTEBOOK (panel->notebook), viewable); + if (i > -1) + gtk_notebook_remove_page (GTK_NOTEBOOK (panel->notebook), i); + g_signal_handlers_disconnect_by_func ( + viewable, midori_panel_viewable_destroy_cb, panel); +} + +static void +midori_panel_widget_destroy_cb (GtkWidget* viewable, + GtkWidget* widget) +{ + gtk_widget_destroy (widget); + g_signal_handlers_disconnect_by_func ( + viewable, midori_panel_widget_destroy_cb, widget); +} + +static GtkToolItem* +midori_panel_construct_tool_item (MidoriPanel* panel, + MidoriViewable* viewable) +{ + const gchar* label = midori_viewable_get_label (viewable); + const gchar* stock_id = midori_viewable_get_stock_id (viewable); + GtkToolItem* toolitem; + GtkWidget* image; + + toolitem = gtk_radio_tool_button_new_from_stock (NULL, stock_id); + g_object_set (toolitem, "group", + gtk_toolbar_get_nth_item (GTK_TOOLBAR (panel->toolbar), 0), NULL); + image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON); + gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (toolitem), image); + if (label) + { + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), label); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), label); + } + g_object_set_data (G_OBJECT (toolitem), "page", viewable); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_panel_menu_item_activate_cb), panel); + gtk_widget_show_all (GTK_WIDGET (toolitem)); + gtk_toolbar_insert (GTK_TOOLBAR (panel->toolbar), toolitem, -1); + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), toolitem); + return toolitem; +} + +/** + * midori_panel_append_page: + * @panel: a #MidoriPanel + * @viewable: a viewable widget + * @toolbar: a toolbar widget, or %NULL + * @stock_id: a stock ID + * @label: a string to use as the label + * + * Appends a new page to the panel. If @toolbar is specified it will + * be packed above @viewable. + * + * Since 0.1.3 destroying the @viewable implicitly removes + * the page including the menu and eventual toolbar. + * + * In the case of an error, -1 is returned. + * + * Return value: the index of the new page, or -1 + **/ +gint +midori_panel_append_page (MidoriPanel* panel, + MidoriViewable* viewable) +{ + GtkWidget* scrolled; + GObjectClass* gobject_class; + GtkWidget* widget; + GtkWidget* toolbar; + const gchar* label; + const gchar* stock_id; + GtkToolItem* toolitem; + GtkWidget* menuitem; + guint n; + + g_return_val_if_fail (MIDORI_IS_PANEL (panel), -1); + g_return_val_if_fail (MIDORI_IS_VIEWABLE (viewable), -1); + + if (GTK_IS_SCROLLED_WINDOW (viewable)) + scrolled = (GtkWidget*)viewable; + else + { + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + GTK_WIDGET_SET_FLAGS (scrolled, GTK_CAN_FOCUS); + gtk_widget_show (scrolled); + gobject_class = G_OBJECT_GET_CLASS (viewable); + if (GTK_WIDGET_CLASS (gobject_class)->set_scroll_adjustments_signal) + widget = (GtkWidget*)viewable; + else + { + widget = gtk_viewport_new (NULL, NULL); + gtk_widget_show (widget); + gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (viewable)); + } + gtk_container_add (GTK_CONTAINER (scrolled), widget); + } + gtk_container_add (GTK_CONTAINER (panel->notebook), scrolled); + + toolbar = midori_viewable_get_toolbar (viewable); + gtk_widget_show (toolbar); + gtk_container_add (GTK_CONTAINER (panel->toolbook), toolbar); + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), toolbar); + + n = midori_panel_page_num (panel, scrolled); + label = midori_viewable_get_label (viewable); + stock_id = midori_viewable_get_stock_id (viewable); + + toolitem = midori_panel_construct_tool_item (panel, viewable); + + if (panel->menu) + { + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + gtk_widget_show (menuitem); + g_object_set_data (G_OBJECT (menuitem), "page", viewable); + g_object_set_data (G_OBJECT (menuitem), "toolitem", toolitem); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_panel_menu_item_activate_cb), + panel); + gtk_menu_shell_append (GTK_MENU_SHELL (panel->menu), menuitem); + g_object_set_data (G_OBJECT (scrolled), "panel-menuitem", menuitem); + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), menuitem); + } + + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_viewable_destroy_cb), panel); + + return n; +} + +/** + * midori_panel_get_current_page: + * @panel: a #MidoriPanel + * + * Retrieves the index of the currently selected page. + * + * If @panel has no children, -1 is returned. + * + * Return value: the index of the current page, or -1 + **/ +gint +midori_panel_get_current_page (MidoriPanel* panel) +{ + g_return_val_if_fail (MIDORI_IS_PANEL (panel), -1); + + return gtk_notebook_get_current_page (GTK_NOTEBOOK (panel->notebook)); +} + +static GtkWidget* +_midori_panel_child_for_scrolled (MidoriPanel* panel, + GtkWidget* scrolled) +{ + GtkWidget* child; + + /* This is a lazy hack, we should have a way of determining + whether the scrolled is the actual child. */ + if (MIDORI_IS_VIEW (scrolled)) + return scrolled; + child = gtk_bin_get_child (GTK_BIN (scrolled)); + if (GTK_IS_VIEWPORT (child)) + child = gtk_bin_get_child (GTK_BIN (child)); + return child; +} + +/** + * midori_panel_get_nth_page: + * @panel: a #MidoriPanel + * + * Retrieves the child widget of the nth page. + * + * If @panel has no children, %NULL is returned. + * + * Return value: the child widget of the new page, or %NULL + **/ +GtkWidget* +midori_panel_get_nth_page (MidoriPanel* panel, + guint page_num) +{ + GtkWidget* scrolled; + + g_return_val_if_fail (MIDORI_IS_PANEL (panel), NULL); + + scrolled = gtk_notebook_get_nth_page ( + GTK_NOTEBOOK (panel->notebook), page_num); + if (scrolled) + return _midori_panel_child_for_scrolled (panel, scrolled); + return NULL; +} + +/** + * midori_panel_get_n_pages: + * @panel: a #MidoriPanel + * + * Retrieves the number of pages contained in the panel. + * + * Return value: the number of pages + **/ +guint +midori_panel_get_n_pages (MidoriPanel* panel) +{ + g_return_val_if_fail (MIDORI_IS_PANEL (panel), 0); + + return gtk_notebook_get_n_pages (GTK_NOTEBOOK (panel->notebook)); +} + +static GtkWidget* +_midori_panel_scrolled_for_child (MidoriPanel* panel, + GtkWidget* child) +{ + GtkWidget* scrolled; + + /* This is a lazy hack, we should have a way of determining + whether the scrolled is the actual child. */ + if (MIDORI_IS_VIEW (child)) + return child; + scrolled = gtk_widget_get_parent (GTK_WIDGET (child)); + if (GTK_IS_VIEWPORT (scrolled)) + scrolled = gtk_widget_get_parent (scrolled); + return scrolled; +} + +/** + * midori_panel_page_num: + * @panel: a #MidoriPanel + * + * Retrieves the index of the page associated to @widget. + * + * If @panel has no children, -1 is returned. + * + * Return value: the index of page associated to @widget, or -1 + **/ +gint +midori_panel_page_num (MidoriPanel* panel, + GtkWidget* child) +{ + GtkWidget* scrolled; + + g_return_val_if_fail (MIDORI_IS_PANEL (panel), -1); + g_return_val_if_fail (GTK_IS_WIDGET (child), -1); + + scrolled = _midori_panel_scrolled_for_child (panel, child); + return gtk_notebook_page_num (GTK_NOTEBOOK (panel->notebook), scrolled); +} + +/** + * midori_panel_set_current_page: + * @panel: a #MidoriPanel + * @n: index of the page to switch to, or -1 to mean the last page + * + * Switches to the page with the given index. + * + * The child must be visible, otherwise the underlying GtkNotebook will + * silently ignore the attempt to switch the page. + **/ +void +midori_panel_set_current_page (MidoriPanel* panel, + gint n) +{ + GtkWidget* viewable; + + g_return_if_fail (MIDORI_IS_PANEL (panel)); + + gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->toolbook), n); + gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->notebook), n); + + if ((viewable = midori_panel_get_nth_page (panel, n))) + { + const gchar* label; + + label = midori_viewable_get_label (MIDORI_VIEWABLE (viewable)); + g_object_set (panel->toolbar_label, "label", label, NULL); + } +} + +typedef struct +{ + GtkAlignment parent_instance; + + gchar* label; + gchar* stock_id; + GtkWidget* toolbar; +} MidoriDummyViewable; + +typedef struct +{ + GtkAlignmentClass parent_class; +} MidoriDummyViewableClass; + +GType midori_dummy_viewable_get_type (void) G_GNUC_CONST; +#define MIDORI_TYPE_DUMMY_VIEWABLE (midori_dummy_viewable_get_type ()) +#define MIDORI_DUMMY_VIEWABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + MIDORI_TYPE_DUMMY_VIEWABLE, MidoriDummyViewable)) +#define MIDORI_IS_DUMMY_VIEWABLE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_DUMMY_VIEWABLE)) + +static void +midori_dummy_viewable_iface_init (MidoriViewableIface* iface); + +static void +midori_dummy_viewable_finalize (GObject* object); + +G_DEFINE_TYPE_WITH_CODE (MidoriDummyViewable, midori_dummy_viewable, + GTK_TYPE_ALIGNMENT, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_dummy_viewable_iface_init)); + +static void +midori_dummy_viewable_class_init (MidoriDummyViewableClass* class) +{ + GObjectClass* gobject_class; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_dummy_viewable_finalize; +} + +static const gchar* +midori_dummy_viewable_get_label (MidoriViewable* viewable) +{ + return MIDORI_DUMMY_VIEWABLE (viewable)->label; +} + +static const gchar* +midori_dummy_viewable_get_stock_id (MidoriViewable* viewable) +{ + return MIDORI_DUMMY_VIEWABLE (viewable)->stock_id; +} + +static GtkWidget* +midori_dummy_viewable_get_toolbar (MidoriViewable* viewable) +{ + return MIDORI_DUMMY_VIEWABLE (viewable)->toolbar; +} + +static void +midori_dummy_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_dummy_viewable_get_stock_id; + iface->get_label = midori_dummy_viewable_get_label; + iface->get_toolbar = midori_dummy_viewable_get_toolbar; +} + +static void +midori_dummy_viewable_init (MidoriDummyViewable* viewable) +{ + viewable->stock_id = NULL; + viewable->label = NULL; + viewable->toolbar = NULL; +} + +static void +midori_dummy_viewable_finalize (GObject* object) +{ + MidoriDummyViewable* viewable = MIDORI_DUMMY_VIEWABLE (object); + + katze_assign (viewable->stock_id, NULL); + katze_assign (viewable->label, NULL); + + G_OBJECT_CLASS (midori_dummy_viewable_parent_class)->finalize (object); +} + +/* static */ GtkWidget* +midori_dummy_viewable_new (const gchar* stock_id, + const gchar* label, + GtkWidget* toolbar) +{ + GtkWidget* viewable = g_object_new (MIDORI_TYPE_DUMMY_VIEWABLE, NULL); + + MIDORI_DUMMY_VIEWABLE (viewable)->stock_id = g_strdup (stock_id); + MIDORI_DUMMY_VIEWABLE (viewable)->label = g_strdup (label); + MIDORI_DUMMY_VIEWABLE (viewable)->toolbar = toolbar; + + return viewable; +} + +/** + * midori_panel_append_widget: + * @panel: a #MidoriPanel + * @widget: the child widget + * @stock_id: a stock ID + * @label: a string to use as the label, or %NULL + * @toolbar: a toolbar widget, or %NULL + * + * Appends an arbitrary widget to the panel by wrapping it + * in a #MidoriViewable created on the fly. + * + * Actually implementing #MidoriViewable instead of using + * this convenience is recommended. + * + * Since 0.1.3 destroying the @widget implicitly removes + * the page including the menu and eventual toolbar. + * + * In the case of an error, -1 is returned. + * + * Return value: the index of the new page, or -1 + **/ +gint +midori_panel_append_widget (MidoriPanel* panel, + GtkWidget* widget, + const gchar* stock_id, + const gchar* label, + GtkWidget* toolbar) +{ + GtkWidget* viewable; + + g_return_val_if_fail (MIDORI_IS_PANEL (panel), -1); + g_return_val_if_fail (GTK_IS_WIDGET (widget), -1); + + g_return_val_if_fail (stock_id != NULL, -1); + g_return_val_if_fail (!toolbar || GTK_IS_WIDGET (toolbar), -1); + + viewable = midori_dummy_viewable_new (stock_id, label, toolbar); + gtk_widget_show (viewable); + gtk_container_add (GTK_CONTAINER (viewable), widget); + g_signal_connect (widget, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), viewable); + return midori_panel_append_page (panel, MIDORI_VIEWABLE (viewable)); +} diff --git a/midori/midori-panel.h b/midori/midori-panel.h new file mode 100644 index 00000000..704fd95e --- /dev/null +++ b/midori/midori-panel.h @@ -0,0 +1,84 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_PANEL_H__ +#define __MIDORI_PANEL_H__ + +#include + +#include + +#include "midori-viewable.h" + +G_BEGIN_DECLS + +#define MIDORI_TYPE_PANEL \ + (midori_panel_get_type ()) +#define MIDORI_PANEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_PANEL, MidoriPanel)) +#define MIDORI_PANEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_PANEL, MidoriPanelClass)) +#define MIDORI_IS_PANEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_PANEL)) +#define MIDORI_IS_PANEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_PANEL)) +#define MIDORI_PANEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_PANEL, MidoriPanelClass)) + +typedef struct _MidoriPanel MidoriPanel; +typedef struct _MidoriPanelClass MidoriPanelClass; + +GType +midori_panel_get_type (void); + +GtkWidget* +midori_panel_new (void); + +void +midori_panel_set_compact (MidoriPanel* panel, + gboolean compact); + +void +midori_panel_set_right_aligned (MidoriPanel* panel, + gboolean right_aligned); + +gint +midori_panel_append_page (MidoriPanel* panel, + MidoriViewable* viewable); + +gint +midori_panel_get_current_page (MidoriPanel* panel); + +GtkWidget* +midori_panel_get_nth_page (MidoriPanel* panel, + guint page_num); + +guint +midori_panel_get_n_pages (MidoriPanel* panel); + +gint +midori_panel_page_num (MidoriPanel* panel, + GtkWidget* child); + +void +midori_panel_set_current_page (MidoriPanel* panel, + gint n); + +gint +midori_panel_append_widget (MidoriPanel* panel, + GtkWidget* widget, + const gchar* stock_id, + const gchar* label, + GtkWidget* toolbar); + +G_END_DECLS + +#endif /* __MIDORI_PANEL_H__ */ diff --git a/midori/midori-preferences.c b/midori/midori-preferences.c new file mode 100644 index 00000000..03e75bc6 --- /dev/null +++ b/midori/midori-preferences.c @@ -0,0 +1,672 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-preferences.h" + +#if HAVE_CONFIG_H + #include +#endif + +#include "sokoke.h" +#include "compat.h" + +#include +#include +#include + +struct _MidoriPreferences +{ + GtkDialog parent_instance; + + MidoriWebSettings* settings; + GtkWidget* notebook; +}; + +G_DEFINE_TYPE (MidoriPreferences, midori_preferences, GTK_TYPE_DIALOG) + +enum +{ + PROP_0, + + PROP_SETTINGS +}; + +static void +midori_preferences_finalize (GObject* object); + +static void +midori_preferences_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_preferences_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_preferences_class_init (MidoriPreferencesClass* class) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_preferences_finalize; + gobject_class->set_property = midori_preferences_set_property; + gobject_class->get_property = midori_preferences_get_property; + + g_object_class_install_property (gobject_class, + PROP_SETTINGS, + g_param_spec_object ( + "settings", + "Settings", + "Settings instance to provide properties", + MIDORI_TYPE_WEB_SETTINGS, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +midori_preferences_response_cb (MidoriPreferences* preferences, + gint response) +{ + if (response == GTK_RESPONSE_CLOSE) + gtk_widget_destroy (GTK_WIDGET (preferences)); +} + +static void +midori_preferences_init (MidoriPreferences* preferences) +{ + gchar* dialog_title; + + preferences->settings = NULL; + preferences->notebook = NULL; + + dialog_title = g_strdup_printf (_("Preferences for %s"), + g_get_application_name ()); + g_object_set (preferences, + "icon-name", GTK_STOCK_PREFERENCES, + "title", dialog_title, + "has-separator", FALSE, + NULL); + g_free (dialog_title); + #if !HAVE_OSX + gtk_dialog_add_buttons (GTK_DIALOG (preferences), + GTK_STOCK_HELP, GTK_RESPONSE_HELP, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + #endif + g_signal_connect (preferences, "response", + G_CALLBACK (midori_preferences_response_cb), NULL); +} + +static void +midori_preferences_finalize (GObject* object) +{ + G_OBJECT_CLASS (midori_preferences_parent_class)->finalize (object); +} + +static void +midori_preferences_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriPreferences* preferences = MIDORI_PREFERENCES (object); + + switch (prop_id) + { + case PROP_SETTINGS: + midori_preferences_set_settings (preferences, + g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_preferences_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriPreferences* preferences = MIDORI_PREFERENCES (object); + + switch (prop_id) + { + case PROP_SETTINGS: + g_value_set_object (value, preferences->settings); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_preferences_new: + * @parent: the parent window + * @settings: the settings + * + * Creates a new preferences dialog. + * + * Since 0.1.2 @parent may be %NULL. + * + * Return value: a new #MidoriPreferences + **/ +GtkWidget* +midori_preferences_new (GtkWindow* parent, + MidoriWebSettings* settings) +{ + MidoriPreferences* preferences; + + g_return_val_if_fail (!parent || GTK_IS_WINDOW (parent), NULL); + g_return_val_if_fail (MIDORI_IS_WEB_SETTINGS (settings), NULL); + + preferences = g_object_new (MIDORI_TYPE_PREFERENCES, + "transient-for", parent, + "settings", settings, + NULL); + + return GTK_WIDGET (preferences); +} + +static void +midori_preferences_homepage_current_clicked_cb (GtkWidget* button, + MidoriWebSettings* settings) +{ + GtkWidget* preferences = gtk_widget_get_toplevel (button); + GtkWidget* browser = katze_object_get_object (preferences, "transient-for"); + + if (GTK_IS_WINDOW (browser)) + { + gchar* uri = katze_object_get_string (browser, "uri"); + g_object_set (settings, "homepage", uri, NULL); + g_free (uri); + } +} + +static gboolean +proxy_download_manager_icon_cb (GtkWidget* entry, + GdkEventFocus* event, + GtkImage* icon) +{ + const gchar* command; + gchar* first_space; + gchar* first_part; + gchar* path; + + command = gtk_entry_get_text (GTK_ENTRY (entry)); + if ((first_space = strstr (command, " "))) + first_part = g_strndup (command, first_space - command); + else + first_part = g_strdup (command); + path = g_find_program_in_path (first_part); + + if (path) + { + if (gtk_icon_theme_has_icon (gtk_icon_theme_get_for_screen ( + gtk_widget_get_screen (entry)), first_part)) + gtk_image_set_from_icon_name (icon, first_part, GTK_ICON_SIZE_MENU); + else + gtk_image_set_from_stock (icon, GTK_STOCK_EXECUTE, GTK_ICON_SIZE_MENU); + g_free (path); + } + else if (first_part && *first_part) + gtk_image_set_from_stock (icon, GTK_STOCK_STOP, GTK_ICON_SIZE_MENU); + else + gtk_image_clear (icon); + + g_free (first_part); + + return FALSE; +} + +static void +midori_preferences_notify_preferred_encoding_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + GtkWidget* entry) +{ + MidoriPreferredEncoding preferred_encoding; + + preferred_encoding = katze_object_get_enum (settings, "preferred-encoding"); + gtk_widget_set_sensitive (entry, preferred_encoding == MIDORI_ENCODING_CUSTOM); +} + +static void +midori_preferences_notify_auto_detect_proxy_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + GtkWidget* entry) +{ + MidoriIdentity auto_detect_proxy = katze_object_get_enum (settings, + "auto-detect-proxy"); + + gtk_widget_set_sensitive (entry, !auto_detect_proxy); +} + +static void +midori_preferences_notify_identify_as_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + GtkWidget* entry) +{ + MidoriIdentity identify_as = katze_object_get_enum (settings, "identify-as"); + + gtk_widget_set_sensitive (entry, identify_as == MIDORI_IDENT_CUSTOM); +} + +#if HAVE_OSX +static void +midori_preferences_help_clicked_cb (GtkWidget* button, + GtkDialog* dialog) +{ + gtk_dialog_response (dialog, GTK_RESPONSE_HELP); +} + +static void +midori_preferences_toolbutton_clicked_cb (GtkWidget* toolbutton, + GtkWidget* page) +{ + gpointer notebook = g_object_get_data (G_OBJECT (toolbutton), "notebook"); + guint n = gtk_notebook_page_num (notebook, page); + gtk_notebook_set_current_page (notebook, n); +} +#endif + +static inline void +midori_preferences_add_toolbutton (GtkWidget* toolbar, + GtkWidget** toolbutton, + const gchar* icon, + const gchar* label, + GtkWidget* page) +{ +#if HAVE_OSX + *toolbutton = GTK_WIDGET (*toolbutton ? gtk_radio_tool_button_new_from_widget ( + GTK_RADIO_TOOL_BUTTON (*toolbutton)) : gtk_radio_tool_button_new (NULL)); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (*toolbutton), label); + gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (*toolbutton), icon); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), GTK_TOOL_ITEM (*toolbutton), -1); + g_signal_connect (*toolbutton, "clicked", + G_CALLBACK (midori_preferences_toolbutton_clicked_cb), page); +#endif +} + +/** + * midori_preferences_set_settings: + * @settings: the settings + * + * Assigns a settings instance to a preferences dialog. + * + * Note: This must not be called more than once. + * + * Since 0.1.2 this is equal to setting #MidoriPreferences:settings:. + **/ +void +midori_preferences_set_settings (MidoriPreferences* preferences, + MidoriWebSettings* settings) +{ + GtkWidget* header; + GtkWindow* parent; + const gchar* icon_name; + GtkSizeGroup* sizegroup; + GtkWidget* toolbar; + GtkWidget* toolbutton; + GtkWidget* page; + GtkWidget* frame; + GtkWidget* table; + GtkWidget* align; + GtkWidget* label; + GtkWidget* button; + GtkWidget* entry; + GtkWidget* hbox; + gint icon_width, icon_height; + + g_return_if_fail (MIDORI_IS_PREFERENCES (preferences)); + g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings)); + + g_return_if_fail (!preferences->notebook); + + katze_assign (preferences->settings, g_object_ref (settings)); + + g_object_get (preferences, "transient-for", &parent, NULL); + icon_name = parent ? gtk_window_get_icon_name (parent) : NULL; + if ((header = sokoke_xfce_header_new (icon_name, + gtk_window_get_title (GTK_WINDOW (preferences))))) + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (preferences)->vbox), + header, FALSE, FALSE, 0); + + preferences->notebook = gtk_notebook_new (); + gtk_container_set_border_width (GTK_CONTAINER (preferences->notebook), 6); + + #if HAVE_OSX + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (preferences->notebook), FALSE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (preferences->notebook), FALSE); + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH); + gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), FALSE); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (preferences)->vbox), + toolbar, FALSE, FALSE, 0); + #else + toolbar = NULL; + #endif + toolbutton = NULL; + + sizegroup = NULL; + #define PAGE_NEW(__icon, __label) \ + page = gtk_vbox_new (FALSE, 0); \ + midori_preferences_add_toolbutton (toolbar, &toolbutton, \ + __icon, __label, page); \ + if (toolbutton) g_object_set_data (G_OBJECT (toolbutton), \ + "notebook", preferences->notebook); \ + if (sizegroup) g_object_unref (sizegroup); \ + sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); \ + gtk_container_set_border_width (GTK_CONTAINER (page), 4); \ + gtk_notebook_append_page (GTK_NOTEBOOK (preferences->notebook), page, \ + gtk_label_new (__label)) + #define FRAME_NEW(__label) frame = sokoke_hig_frame_new (__label); \ + gtk_container_set_border_width (GTK_CONTAINER (frame), 4); \ + gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0); + #define TABLE_NEW(__rows, __cols) table = gtk_table_new ( \ + __rows, __cols, FALSE); \ + gtk_container_set_border_width (GTK_CONTAINER (table), 4); \ + gtk_container_add (GTK_CONTAINER (frame), table); + #define WIDGET_ADD(__widget, __left, __right, __top, __bottom) \ + gtk_table_attach (GTK_TABLE (table), __widget \ + , __left, __right, __top, __bottom \ + , GTK_FILL, GTK_FILL, 8, 2) + #define FILLED_ADD(__widget, __left, __right, __top, __bottom) \ + gtk_table_attach (GTK_TABLE (table), __widget \ + , __left, __right, __top, __bottom\ + , GTK_EXPAND | GTK_FILL, GTK_FILL, 8, 2) + #define INDENTED_ADD(__widget, __left, __right, __top, __bottom) \ + align = gtk_alignment_new (0, 0.5, 0, 0); \ + gtk_container_add (GTK_CONTAINER (align), __widget); \ + gtk_size_group_add_widget (sizegroup, align); \ + WIDGET_ADD (align, __left, __right, __top, __bottom) + #define SPANNED_ADD(__widget, __left, __right, __top, __bottom) \ + align = gtk_alignment_new (0, 0.5, 0, 0); \ + gtk_container_add (GTK_CONTAINER (align), __widget); \ + FILLED_ADD (align, __left, __right, __top, __bottom) + /* Page "General" */ + PAGE_NEW (GTK_STOCK_HOME, _("General")); + FRAME_NEW (_("Startup")); + TABLE_NEW (3, 2); + label = katze_property_label (settings, "load-on-startup"); + INDENTED_ADD (label, 0, 1, 0, 1); + button = katze_property_proxy (settings, "load-on-startup", NULL); + FILLED_ADD (button, 1, 2, 0, 1); + label = katze_property_label (settings, "homepage"); + INDENTED_ADD (label, 0, 1, 1, 2); + hbox = gtk_hbox_new (FALSE, 4); + entry = katze_property_proxy (settings, "homepage", NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + if (parent && katze_object_has_property (parent, "uri")) + { + button = gtk_button_new (); + label = gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), label); + gtk_widget_set_tooltip_text (button, _("Use current page as homepage")); + g_signal_connect (button, "clicked", + G_CALLBACK (midori_preferences_homepage_current_clicked_cb), settings); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + } + FILLED_ADD (hbox, 1, 2, 1, 2); + button = katze_property_proxy (settings, "show-crash-dialog", NULL); + SPANNED_ADD (button, 0, 2, 2, 3); + FRAME_NEW (_("Transfers")); + TABLE_NEW (4, 2); + #if WEBKIT_CHECK_VERSION (1, 1, 3) + label = katze_property_label (settings, "download-folder"); + INDENTED_ADD (label, 0, 1, 0, 1); + button = katze_property_proxy (settings, "download-folder", "folder"); + FILLED_ADD (button, 1, 2, 0, 1); + #endif + label = katze_property_label (settings, "download-manager"); + INDENTED_ADD (label, 0, 1, 1, 2); + hbox = gtk_hbox_new (FALSE, 4); + button = gtk_image_new (); + gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button), + GTK_ICON_SIZE_MENU, &icon_width, &icon_height); + gtk_widget_set_size_request (button, icon_width, icon_height); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); + entry = katze_property_proxy (settings, "download-manager", NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button)); + g_signal_connect (entry, "focus-out-event", + G_CALLBACK (proxy_download_manager_icon_cb), button); + FILLED_ADD (hbox, 1, 2, 1, 2); + label = katze_property_label (settings, "text-editor"); + INDENTED_ADD (label, 0, 1, 2, 3); + hbox = gtk_hbox_new (FALSE, 4); + button = gtk_image_new (); + gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button), + GTK_ICON_SIZE_MENU, &icon_width, &icon_height); + gtk_widget_set_size_request (button, icon_width, icon_height); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); + entry = katze_property_proxy (settings, "text-editor", NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button)); + g_signal_connect (entry, "focus-out-event", + G_CALLBACK (proxy_download_manager_icon_cb), button); + FILLED_ADD (hbox, 1, 2, 2, 3); + label = katze_property_label (settings, "news-aggregator"); + INDENTED_ADD (label, 0, 1, 3, 4); + hbox = gtk_hbox_new (FALSE, 4); + button = gtk_image_new (); + gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button), + GTK_ICON_SIZE_MENU, &icon_width, &icon_height); + gtk_widget_set_size_request (button, icon_width, icon_height); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4); + entry = katze_property_proxy (settings, "news-aggregator", NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); + proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button)); + g_signal_connect (entry, "focus-out-event", + G_CALLBACK (proxy_download_manager_icon_cb), button); + FILLED_ADD (hbox, 1, 2, 3, 4); + + /* Page "Appearance" */ + PAGE_NEW (GTK_STOCK_SELECT_FONT, _("Appearance")); + FRAME_NEW (_("Font settings")); + TABLE_NEW (6, 2); + label = gtk_label_new (_("Default Font Family")); + INDENTED_ADD (label, 0, 1, 0, 1); + hbox = gtk_hbox_new (FALSE, 4); + button = katze_property_proxy (settings, "default-font-family", "font"); + gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); + entry = katze_property_proxy (settings, "default-font-size", NULL); + gtk_widget_set_tooltip_text (entry, _("The default font size used to display text")); + gtk_box_pack_end (GTK_BOX (hbox), entry, FALSE, FALSE, 4); + FILLED_ADD (hbox, 1, 2, 0, 1); + label = gtk_label_new (_("Minimum Font Size")); + INDENTED_ADD (label, 0, 1, 1, 2); + entry = katze_property_proxy (settings, "minimum-font-size", NULL); + gtk_widget_set_tooltip_text (entry, _("The minimum font size used to display text")); + INDENTED_ADD (entry, 1, 2, 1, 2); + label = katze_property_label (settings, "preferred-encoding"); + INDENTED_ADD (label, 0, 1, 2, 3); + button = katze_property_proxy (settings, "preferred-encoding", NULL); + FILLED_ADD (button, 1, 2, 2, 3); + label = katze_property_label (settings, "default-encoding"); + gtk_label_set_label (GTK_LABEL (label), _("Encoding")); + INDENTED_ADD (label, 0, 1, 3, 4); + entry = katze_property_proxy (settings, "default-encoding", NULL); + gtk_widget_set_tooltip_text (entry, _("The character encoding to use by default")); + g_signal_connect (settings, "notify::preferred-encoding", + G_CALLBACK (midori_preferences_notify_preferred_encoding_cb), entry); + midori_preferences_notify_preferred_encoding_cb (settings, NULL, entry); + FILLED_ADD (entry, 1, 2, 3, 4); + + /* Page "Behavior" */ + PAGE_NEW (GTK_STOCK_SELECT_COLOR, _("Behavior")); + FRAME_NEW (_("Features")); + TABLE_NEW (6, 2); + button = katze_property_proxy (settings, "auto-load-images", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Load images automatically")); + gtk_widget_set_tooltip_text (button, _("Load and display images automatically")); + INDENTED_ADD (button, 0, 1, 0, 1); + button = katze_property_proxy (settings, "auto-shrink-images", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Shrink images automatically")); + gtk_widget_set_tooltip_text (button, _("Automatically shrink standalone images to fit")); + SPANNED_ADD (button, 1, 2, 0, 1); + button = katze_property_proxy (settings, "print-backgrounds", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Print background images")); + gtk_widget_set_tooltip_text (button, _("Whether background images should be printed")); + INDENTED_ADD (button, 0, 1, 1, 2); + button = katze_property_proxy (settings, "resizable-text-areas", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Resizable text areas")); + gtk_widget_set_tooltip_text (button, _("Whether text areas are resizable")); + SPANNED_ADD (button, 1, 2, 1, 2); + button = katze_property_proxy (settings, "enable-scripts", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Enable scripts")); + gtk_widget_set_tooltip_text (button, _("Enable embedded scripting languages")); + INDENTED_ADD (button, 0, 1, 2, 3); + button = katze_property_proxy (settings, "enable-plugins", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Enable plugins")); + gtk_widget_set_tooltip_text (button, _("Enable embedded plugin objects")); + SPANNED_ADD (button, 1, 2, 2, 3); + button = katze_property_proxy (settings, "enforce-96-dpi", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Enforce 96 dots per inch")); + gtk_widget_set_tooltip_text (button, _("Enforce a video dot density of 96 DPI")); + SPANNED_ADD (button, 0, 1, 3, 4); + button = katze_property_proxy (settings, "enable-developer-extras", NULL); + gtk_button_set_label (GTK_BUTTON (button), _("Enable developer tools")); + gtk_widget_set_tooltip_text (button, _("Enable special extensions for developers")); + SPANNED_ADD (button, 1, 2, 3, 4); + button = katze_property_proxy (settings, "zoom-text-and-images", NULL); + SPANNED_ADD (button, 0, 1, 4, 5); + button = katze_property_proxy (settings, "find-while-typing", NULL); + SPANNED_ADD (button, 1, 2, 4, 5); + + /* Page "Interface" */ + PAGE_NEW (GTK_STOCK_CONVERT, _("Interface")); + FRAME_NEW (_("Navigationbar")); + TABLE_NEW (2, 2); + #if !HAVE_HILDON + INDENTED_ADD (katze_property_label (settings, "toolbar-style"), 0, 1, 0, 1); + button = katze_property_proxy (settings, "toolbar-style", NULL); + FILLED_ADD (button, 1, 2, 0, 1); + #endif + button = katze_property_proxy (settings, "progress-in-location", NULL); + FILLED_ADD (button, 0, 1, 1, 2); + button = katze_property_proxy (settings, "search-engines-in-completion", NULL); + FILLED_ADD (button, 1, 2, 1, 2); + FRAME_NEW (_("Browsing")); + TABLE_NEW (5, 2); + label = katze_property_label (settings, "open-new-pages-in"); + INDENTED_ADD (label, 0, 1, 0, 1); + button = katze_property_proxy (settings, "open-new-pages-in", NULL); + FILLED_ADD (button, 1, 2, 0, 1); + #if HAVE_UNIQUE + label = katze_property_label (settings, "open-external-pages-in"); + INDENTED_ADD (label, 0, 1, 1, 2); + button = katze_property_proxy (settings, "open-external-pages-in", NULL); + FILLED_ADD (button, 1, 2, 1, 2); + #endif + button = katze_property_proxy (settings, "always-show-tabbar", NULL); + INDENTED_ADD (button, 0, 1, 2, 3); + button = katze_property_proxy (settings, "open-tabs-in-the-background", NULL); + INDENTED_ADD (button, 1, 2, 2, 3); + #if !HAVE_HILDON + button = katze_property_proxy (settings, "middle-click-opens-selection", NULL); + INDENTED_ADD (button, 0, 1, 3, 4); + button = katze_property_proxy (settings, "compact-sidepanel", NULL); + WIDGET_ADD (button, 1, 2, 3, 4); + #endif + /* button = katze_property_proxy (settings, "open-popups-in-tabs", NULL); + SPANNED_ADD (button, 0, 1, 4, 5);*/ + button = katze_property_proxy (settings, "open-tabs-next-to-current", NULL); + WIDGET_ADD (button, 0, 1, 5, 6); + button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL); + WIDGET_ADD (button, 1, 2, 5, 6); + + /* Page "Network" */ + PAGE_NEW (GTK_STOCK_NETWORK, _("Network")); + FRAME_NEW (_("Network")); + TABLE_NEW (5, 2); + label = katze_property_label (settings, "http-proxy"); + INDENTED_ADD (label, 0, 1, 0, 1); + entry = katze_property_proxy (settings, "http-proxy", NULL); + FILLED_ADD (entry, 1, 2, 0, 1); + button = katze_property_proxy (settings, "auto-detect-proxy", NULL); + FILLED_ADD (button, 1, 2, 1, 2); + g_signal_connect (settings, "notify::auto-detect-proxy", + G_CALLBACK (midori_preferences_notify_auto_detect_proxy_cb), entry); + midori_preferences_notify_auto_detect_proxy_cb (settings, NULL, entry); + label = katze_property_label (settings, "identify-as"); + INDENTED_ADD (label, 0, 1, 2, 3); + button = katze_property_proxy (settings, "identify-as", NULL); + FILLED_ADD (button, 1, 2, 2, 3); + label = katze_property_label (settings, "ident-string"); + INDENTED_ADD (label, 0, 1, 3, 4); + entry = katze_property_proxy (settings, "ident-string", NULL); + g_signal_connect (settings, "notify::identify-as", + G_CALLBACK (midori_preferences_notify_identify_as_cb), entry); + midori_preferences_notify_identify_as_cb (settings, NULL, entry); + FILLED_ADD (entry, 1, 2, 3, 4); + label = katze_property_label (settings, "cache-size"); + INDENTED_ADD (label, 0, 1, 4, 5); + hbox = gtk_hbox_new (FALSE, 4); + entry = katze_property_proxy (settings, "cache-size", NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("MB")), + FALSE, FALSE, 0); + FILLED_ADD (hbox, 1, 2, 4, 5); + + /* Page "Privacy" */ + PAGE_NEW (GTK_STOCK_INDEX, _("Privacy")); + FRAME_NEW (_("Web Cookies")); + TABLE_NEW (3, 2); + label = katze_property_label (settings, "accept-cookies"); + INDENTED_ADD (label, 0, 1, 0, 1); + button = katze_property_proxy (settings, "accept-cookies", NULL); + FILLED_ADD (button, 1, 2, 0, 1); + button = katze_property_proxy (settings, "original-cookies-only", NULL); + SPANNED_ADD (button, 0, 2, 1, 2); + label = katze_property_label (settings, "maximum-cookie-age"); + INDENTED_ADD (label, 0, 1, 2, 3); + hbox = gtk_hbox_new (FALSE, 4); + entry = katze_property_proxy (settings, "maximum-cookie-age", NULL); + gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("days")), + FALSE, FALSE, 0); + FILLED_ADD (hbox, 1, 2, 2, 3); + FRAME_NEW (_("History")); + TABLE_NEW (3, 2); + button = katze_property_proxy (settings, "remember-last-visited-pages", NULL); + SPANNED_ADD (button, 0, 1, 0, 1); + hbox = gtk_hbox_new (FALSE, 4); + button = katze_property_proxy (settings, "maximum-history-age", NULL); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("days")), + FALSE, FALSE, 0); + SPANNED_ADD (hbox, 1, 2, 0, 1); + button = katze_property_proxy (settings, "remember-last-form-inputs", NULL); + SPANNED_ADD (button, 0, 2, 1, 2); + button = katze_property_proxy (settings, "remember-last-downloaded-files", NULL); + SPANNED_ADD (button, 0, 2, 2, 3); + + g_object_unref (sizegroup); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (preferences)->vbox), + preferences->notebook, FALSE, FALSE, 4); + #if HAVE_OSX + GtkWidget* icon; + hbox = gtk_hbox_new (FALSE, 0); + button = gtk_button_new (); + icon = gtk_image_new_from_stock (GTK_STOCK_HELP, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), icon); + g_signal_connect (button, "clicked", + G_CALLBACK (midori_preferences_help_clicked_cb), preferences); + gtk_box_pack_end (GTK_BOX (hbox), + button, FALSE, FALSE, 4); + gtk_box_pack_end (GTK_BOX (GTK_DIALOG (preferences)->vbox), + hbox, FALSE, FALSE, 0); + #endif + gtk_widget_show_all (GTK_DIALOG (preferences)->vbox); +} diff --git a/midori/midori-preferences.h b/midori/midori-preferences.h new file mode 100644 index 00000000..9015d952 --- /dev/null +++ b/midori/midori-preferences.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_PREFERENCES_H__ +#define __MIDORI_PREFERENCES_H__ + +#include "midori-websettings.h" + +#include + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_PREFERENCES \ + (midori_preferences_get_type ()) +#define MIDORI_PREFERENCES(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_PREFERENCES, MidoriPreferences)) +#define MIDORI_PREFERENCES_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_PREFERENCES, MidoriPreferencesClass)) +#define MIDORI_IS_PREFERENCES(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_PREFERENCES)) +#define MIDORI_IS_PREFERENCES_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_PREFERENCES)) +#define MIDORI_PREFERENCES_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_PREFERENCES, MidoriPreferencesClass)) + +typedef struct _MidoriPreferences MidoriPreferences; +typedef struct _MidoriPreferencesClass MidoriPreferencesClass; + +struct _MidoriPreferencesClass +{ + GtkDialogClass parent_class; +}; + +GType +midori_preferences_get_type (void); + +GtkWidget* +midori_preferences_new (GtkWindow* parent, + MidoriWebSettings* settings); + +void +midori_preferences_set_settings (MidoriPreferences* preferences, + MidoriWebSettings* settings); + +G_END_DECLS + +#endif /* __MIDORI_PREFERENCES_H__ */ diff --git a/midori/midori-searchaction.c b/midori/midori-searchaction.c new file mode 100644 index 00000000..22790ff8 --- /dev/null +++ b/midori/midori-searchaction.c @@ -0,0 +1,1337 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-searchaction.h" + +#include "gtkiconentry.h" +#include "marshal.h" +#include "sokoke.h" + +#include +#include +#include + +struct _MidoriSearchAction +{ + GtkAction parent_instance; + + KatzeArray* search_engines; + KatzeItem* current_item; + KatzeItem* default_item; + gchar* text; + + KatzeNet* net; + + GtkWidget* last_proxy; + + GtkWidget* dialog; + GtkWidget* treeview; + GtkWidget* edit_button; + GtkWidget* remove_button; + GtkWidget* default_button; +}; + +struct _MidoriSearchActionClass +{ + GtkActionClass parent_class; +}; + +G_DEFINE_TYPE (MidoriSearchAction, midori_search_action, GTK_TYPE_ACTION) + +enum +{ + PROP_0, + + PROP_SEARCH_ENGINES, + PROP_CURRENT_ITEM, + PROP_DEFAULT_ITEM, + PROP_TEXT, + PROP_DIALOG +}; + +enum +{ + SUBMIT, + FOCUS_OUT, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +midori_search_action_finalize (GObject* object); + +static void +midori_search_action_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_search_action_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_search_action_activate (GtkAction* object); + +static GtkWidget* +midori_search_action_create_tool_item (GtkAction* action); + +static void +midori_search_action_connect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +midori_search_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy); + +static void +midori_search_action_class_init (MidoriSearchActionClass* class) +{ + GObjectClass* gobject_class; + GtkActionClass* action_class; + + signals[SUBMIT] = g_signal_new ("submit", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + midori_cclosure_marshal_VOID__STRING_BOOLEAN, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_BOOLEAN); + + signals[FOCUS_OUT] = g_signal_new ("focus-out", + G_TYPE_FROM_CLASS (class), + (GSignalFlags) (G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_search_action_finalize; + gobject_class->set_property = midori_search_action_set_property; + gobject_class->get_property = midori_search_action_get_property; + + action_class = GTK_ACTION_CLASS (class); + action_class->activate = midori_search_action_activate; + action_class->create_tool_item = midori_search_action_create_tool_item; + action_class->connect_proxy = midori_search_action_connect_proxy; + action_class->disconnect_proxy = midori_search_action_disconnect_proxy; + + g_object_class_install_property (gobject_class, + PROP_SEARCH_ENGINES, + g_param_spec_object ( + "search-engines", + "Search Engines", + "The list of search engines", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_CURRENT_ITEM, + g_param_spec_object ( + "current-item", + "Current Item", + "The currently selected item", + KATZE_TYPE_ITEM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriSearchAction:default-item: + * + * The default search engine. + * + * Since: 0.1.6 + */ + g_object_class_install_property (gobject_class, + PROP_DEFAULT_ITEM, + g_param_spec_object ( + "default-item", + "Default Item", + "The default search engine", + KATZE_TYPE_ITEM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_TEXT, + g_param_spec_string ( + "text", + "Text", + "The current text typed in the entry", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DIALOG, + g_param_spec_object ( + "dialog", + "Dialog", + "A dialog to manage search engines", + GTK_TYPE_DIALOG, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +midori_search_action_init (MidoriSearchAction* search_action) +{ + search_action->search_engines = NULL; + search_action->current_item = NULL; + search_action->default_item = NULL; + search_action->text = NULL; + + search_action->net = katze_net_new (); + + search_action->last_proxy = NULL; + + search_action->dialog = NULL; + search_action->treeview = NULL; + search_action->edit_button = NULL; + search_action->remove_button = NULL; + search_action->default_button = NULL; +} + +static void +midori_search_action_finalize (GObject* object) +{ + MidoriSearchAction* search_action = MIDORI_SEARCH_ACTION (object); + + katze_assign (search_action->text, NULL); + + katze_object_assign (search_action->net, NULL); + + G_OBJECT_CLASS (midori_search_action_parent_class)->finalize (object); +} + +static void +midori_search_action_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriSearchAction* search_action = MIDORI_SEARCH_ACTION (object); + + switch (prop_id) + { + case PROP_SEARCH_ENGINES: + midori_search_action_set_search_engines (search_action, + g_value_get_object (value)); + break; + case PROP_CURRENT_ITEM: + midori_search_action_set_current_item (search_action, + g_value_get_object (value)); + break; + case PROP_DEFAULT_ITEM: + midori_search_action_set_default_item (search_action, + g_value_get_object (value)); + break; + case PROP_TEXT: + midori_search_action_set_text (search_action, + g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_search_action_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriSearchAction* search_action = MIDORI_SEARCH_ACTION (object); + + switch (prop_id) + { + case PROP_SEARCH_ENGINES: + g_value_set_object (value, search_action->search_engines); + break; + case PROP_CURRENT_ITEM: + g_value_set_object (value, search_action->current_item); + break; + case PROP_DEFAULT_ITEM: + g_value_set_object (value, search_action->default_item); + break; + case PROP_TEXT: + g_value_set_string (value, search_action->text); + break; + case PROP_DIALOG: + g_value_set_object (value, + midori_search_action_get_dialog (search_action)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_search_action_activate (GtkAction* action) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + + proxies = gtk_action_get_proxies (action); + if (!proxies) + return; + + do + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + /* Obviously only one widget can end up with the focus. + Yet we can't predict which one that is, can we? */ + gtk_widget_grab_focus (entry); + MIDORI_SEARCH_ACTION (action)->last_proxy = proxies->data; + } + while ((proxies = g_slist_next (proxies))); + + if (GTK_ACTION_CLASS (midori_search_action_parent_class)->activate) + GTK_ACTION_CLASS (midori_search_action_parent_class)->activate (action); +} + +static GtkWidget* +midori_search_action_create_tool_item (GtkAction* action) +{ + GtkWidget* toolitem; + GtkWidget* entry; + GtkWidget* alignment; + + toolitem = GTK_WIDGET (gtk_tool_item_new ()); + entry = gtk_icon_entry_new (); + gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, TRUE); + alignment = gtk_alignment_new (0, 0.5, 1, 0.1); + gtk_container_add (GTK_CONTAINER (alignment), entry); + gtk_widget_show (entry); + gtk_container_add (GTK_CONTAINER (toolitem), alignment); + gtk_widget_show (alignment); + + MIDORI_SEARCH_ACTION (action)->last_proxy = GTK_WIDGET (toolitem); + return toolitem; +} + +static void +_midori_search_action_move_index (MidoriSearchAction* search_action, + guint n) +{ + gint i; + KatzeItem* item; + + i = katze_array_get_item_index (search_action->search_engines, + search_action->current_item); + item = katze_array_get_nth_item (search_action->search_engines, i + n); + if (item) + midori_search_action_set_current_item (search_action, item); +} + +static gboolean +midori_search_action_key_press_event_cb (GtkWidget* entry, + GdkEventKey* event, + MidoriSearchAction* search_action) +{ + const gchar* text; + + switch (event->keyval) + { + case GDK_ISO_Enter: + case GDK_KP_Enter: + case GDK_Return: + text = gtk_entry_get_text (GTK_ENTRY (entry)); + g_signal_emit (search_action, signals[SUBMIT], 0, text, + (event->state & GDK_MOD1_MASK) ? TRUE : FALSE); + search_action->last_proxy = entry; + return TRUE; + case GDK_Up: + if (event->state & GDK_CONTROL_MASK) + _midori_search_action_move_index (search_action, - 1); + return TRUE; + case GDK_Down: + if (event->state & GDK_CONTROL_MASK) + _midori_search_action_move_index (search_action, + 1); + return TRUE; + } + + return FALSE; +} + +static gboolean +midori_search_action_focus_out_event_cb (GtkWidget* widget, + GdkEventKey* event, + GtkAction* action) +{ + g_signal_emit (action, signals[FOCUS_OUT], 0); + return FALSE; +} + +static void +midori_search_action_engine_activate_cb (GtkWidget* menuitem, + MidoriSearchAction* search_action) +{ + KatzeItem* item; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "engine"); + midori_search_action_set_current_item (search_action, item); +} + +static void +midori_search_action_manage_activate_cb (GtkWidget* menuitem, + MidoriSearchAction* search_action) +{ + GtkWidget* dialog; + + dialog = midori_search_action_get_dialog (search_action); + if (GTK_WIDGET_VISIBLE (dialog)) + gtk_window_present (GTK_WINDOW (dialog)); + else + gtk_widget_show (dialog); +} + +/* Private function, used by MidoriView */ +/* static */ GdkPixbuf* +midori_search_action_get_icon (KatzeNet* net, + KatzeItem* item, + GtkWidget* widget) +{ + const gchar* icon; + + if ((icon = katze_item_get_icon (item)) && *icon) + { + GdkScreen* screen; + GtkIconTheme* icon_theme; + gint width, height; + GdkPixbuf* pixbuf; + + if (G_UNLIKELY (!(screen = gtk_widget_get_screen (widget)))) + return gtk_widget_render_icon (widget, GTK_STOCK_FILE, + GTK_ICON_SIZE_MENU, NULL); + icon_theme = gtk_icon_theme_get_for_screen (screen); + gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (widget), + GTK_ICON_SIZE_MENU, &width, &height); + if ((pixbuf = gtk_icon_theme_load_icon (icon_theme, icon, MAX (width, height), + GTK_ICON_LOOKUP_USE_BUILTIN, NULL))) + return pixbuf; + } + + if ((icon = katze_item_get_uri (item)) && (g_strstr_len (icon, 8, "://"))) + return katze_net_load_icon (net, icon, NULL, widget, NULL); + + return gtk_widget_render_icon (widget, GTK_STOCK_FILE, + GTK_ICON_SIZE_MENU, NULL); +} + +static void +midori_search_action_icon_released_cb (GtkWidget* entry, + GtkIconEntryPosition icon_pos, + gint button, + GtkAction* action) +{ + + if (icon_pos == GTK_ICON_ENTRY_SECONDARY) + return; + + KatzeArray* search_engines; + GtkWidget* menu; + guint i; + GtkWidget* menuitem; + KatzeItem* item; + GdkPixbuf* icon; + GtkWidget* image; + + search_engines = MIDORI_SEARCH_ACTION (action)->search_engines; + menu = gtk_menu_new (); + i = 0; + if ((item = katze_array_get_nth_item (search_engines, i))) + { + do + { + menuitem = gtk_image_menu_item_new_with_label ( + katze_item_get_name (item)); + image = gtk_image_new (); + icon = midori_search_action_get_icon ( + MIDORI_SEARCH_ACTION (action)->net, item, entry); + gtk_image_set_from_pixbuf (GTK_IMAGE (image), icon); + g_object_unref (icon); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "engine", item); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_search_action_engine_activate_cb), action); + gtk_widget_show (menuitem); + } + while ((item = katze_array_get_nth_item (search_engines, ++i))); + } + else + { + menuitem = gtk_image_menu_item_new_with_label (_("Empty")); + gtk_widget_set_sensitive (menuitem, FALSE); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + } + + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Manage Search Engines")); + image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_search_action_manage_activate_cb), action); + gtk_widget_show (menuitem); + sokoke_widget_popup (entry, GTK_MENU (menu), + NULL, SOKOKE_MENU_POSITION_LEFT); +} + +static gboolean +midori_search_action_scroll_event_cb (GtkWidget* entry, + GdkEventScroll* event, + MidoriSearchAction* search_action) +{ + if (event->direction == GDK_SCROLL_DOWN) + _midori_search_action_move_index (search_action, + 1); + else if (event->direction == GDK_SCROLL_UP) + _midori_search_action_move_index (search_action, - 1); + return FALSE; +} + +static void +midori_search_action_set_entry_icon (MidoriSearchAction* search_action, + GtkWidget* entry) +{ + GdkPixbuf* icon; + + if (search_action->current_item) + { + icon = midori_search_action_get_icon (search_action->net, + search_action->current_item, entry); + gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, icon); + g_object_unref (icon); + sokoke_entry_set_default_text (GTK_ENTRY (entry), + katze_item_get_name (search_action->current_item)); + } + else + { + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry), + GTK_ICON_ENTRY_PRIMARY, + GTK_STOCK_FIND); + sokoke_entry_set_default_text (GTK_ENTRY (entry), ""); + } +} + +static void +midori_search_action_connect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + GtkWidget* alignment; + GtkWidget* entry; + + GTK_ACTION_CLASS (midori_search_action_parent_class)->connect_proxy ( + action, proxy); + + if (GTK_IS_TOOL_ITEM (proxy)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxy)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + midori_search_action_set_entry_icon (MIDORI_SEARCH_ACTION (action), + entry); + g_object_connect (entry, + "signal::key-press-event", + midori_search_action_key_press_event_cb, action, + "signal::focus-out-event", + midori_search_action_focus_out_event_cb, action, + "signal::icon-release", + midori_search_action_icon_released_cb, action, + "signal::scroll-event", + midori_search_action_scroll_event_cb, action, + NULL); + } + + MIDORI_SEARCH_ACTION (action)->last_proxy = proxy; +} + +static void +midori_search_action_disconnect_proxy (GtkAction* action, + GtkWidget* proxy) +{ + GSList* proxies; + + /* FIXME: This is wrong */ + g_signal_handlers_disconnect_by_func (proxy, + G_CALLBACK (gtk_action_activate), action); + + GTK_ACTION_CLASS (midori_search_action_parent_class)->disconnect_proxy + (action, proxy); + + if (MIDORI_SEARCH_ACTION (action)->last_proxy == proxy) + { + proxies = gtk_action_get_proxies (action); + if (proxies) + MIDORI_SEARCH_ACTION (action)->last_proxy = proxies->data; + } +} + +const gchar* +midori_search_action_get_text (MidoriSearchAction* search_action) +{ + g_return_val_if_fail (MIDORI_IS_SEARCH_ACTION (search_action), NULL); + + return search_action->text; +} + +void +midori_search_action_set_text (MidoriSearchAction* search_action, + const gchar* text) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + + g_return_if_fail (MIDORI_IS_SEARCH_ACTION (search_action)); + + katze_assign (search_action->text, g_strdup (text)); + g_object_notify (G_OBJECT (search_action), "text"); + + proxies = gtk_action_get_proxies (GTK_ACTION (search_action)); + if (!proxies) + return; + + do + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + gtk_entry_set_text (GTK_ENTRY (entry), text ? text : ""); + search_action->last_proxy = proxies->data; + } + while ((proxies = g_slist_next (proxies))); +} + +KatzeArray* +midori_search_action_get_search_engines (MidoriSearchAction* search_action) +{ + g_return_val_if_fail (MIDORI_IS_SEARCH_ACTION (search_action), NULL); + + return search_action->search_engines; +} + +static void +midori_search_action_engines_add_item_cb (KatzeArray* list, + KatzeItem* item, + MidoriSearchAction* search_action) +{ + if (!search_action->current_item) + midori_search_action_set_current_item (search_action, item); +} + +static void +midori_search_action_engines_remove_item_cb (KatzeArray* list, + KatzeItem* item, + MidoriSearchAction* search_action) +{ + KatzeItem* found_item; + + if (search_action->current_item == item) + { + found_item = katze_array_get_nth_item (list, 0); + midori_search_action_set_current_item (search_action, found_item); + } +} + +void +midori_search_action_set_search_engines (MidoriSearchAction* search_action, + KatzeArray* search_engines) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + + g_return_if_fail (MIDORI_IS_SEARCH_ACTION (search_action)); + g_return_if_fail (!search_engines || + katze_array_is_a (search_engines, KATZE_TYPE_ITEM)); + + /* FIXME: Disconnect old search engines */ + /* FIXME: Disconnect and reconnect dialog signals */ + + if (search_engines) + g_object_ref (search_engines); + katze_object_assign (search_action->search_engines, search_engines); + if (!search_engines) + return; + + g_object_connect (search_engines, + "signal-after::add-item", + midori_search_action_engines_add_item_cb, search_action, + "signal-after::remove-item", + midori_search_action_engines_remove_item_cb, search_action, + NULL); + + g_object_notify (G_OBJECT (search_action), "search-engines"); + + proxies = gtk_action_get_proxies (GTK_ACTION (search_action)); + if (!proxies) + return; + + do + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + /* FIXME: Unset the current item if it isn't in the list */ + } + while ((proxies = g_slist_next (proxies))); +} + +KatzeItem* +midori_search_action_get_current_item (MidoriSearchAction* search_action) +{ + g_return_val_if_fail (MIDORI_IS_SEARCH_ACTION (search_action), NULL); + + return search_action->current_item; +} + +void +midori_search_action_set_current_item (MidoriSearchAction* search_action, + KatzeItem* item) +{ + GSList* proxies; + GtkWidget* alignment; + GtkWidget* entry; + + g_return_if_fail (MIDORI_IS_SEARCH_ACTION (search_action)); + g_return_if_fail (!item || KATZE_IS_ITEM (item)); + + if (item) + g_object_ref (item); + katze_object_assign (search_action->current_item, item); + + g_object_notify (G_OBJECT (search_action), "current-item"); + + proxies = gtk_action_get_proxies (GTK_ACTION (search_action)); + if (!proxies) + return; + + do + if (GTK_IS_TOOL_ITEM (proxies->data)) + { + alignment = gtk_bin_get_child (GTK_BIN (proxies->data)); + entry = gtk_bin_get_child (GTK_BIN (alignment)); + + midori_search_action_set_entry_icon (search_action, entry); + } + while ((proxies = g_slist_next (proxies))); +} + +/** + * midori_search_action_get_default_item: + * @search_action: a #MidoriSearchAction + * + * Retrieves the default search engine. + * + * Since 0.1.6 + * + * Return value: a #KatzeItem + **/ +KatzeItem* +midori_search_action_get_default_item (MidoriSearchAction* search_action) +{ + g_return_val_if_fail (MIDORI_IS_SEARCH_ACTION (search_action), NULL); + + return search_action->default_item; +} + +/** + * midori_search_action_set_default_item: + * @search_action: a #MidoriSearchAction + * @item: a #KatzeItem + * + * Sets the default search engine. + * + * Since 0.1.6 + **/ +void +midori_search_action_set_default_item (MidoriSearchAction* search_action, + KatzeItem* item) +{ + g_return_if_fail (MIDORI_IS_SEARCH_ACTION (search_action)); + g_return_if_fail (!item || KATZE_IS_ITEM (item)); + + if (item) + g_object_ref (item); + katze_object_assign (search_action->default_item, item); + g_object_notify (G_OBJECT (search_action), "default-item"); +} + +static void +midori_search_action_dialog_render_tick_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + MidoriSearchAction* search_action; + gint width; + + gtk_tree_model_get (model, iter, 0, &item, -1); + + search_action = g_object_get_data (G_OBJECT (treeview), "search-action"); + gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &width, NULL); + g_object_set (renderer, "stock-id", + search_action->default_item == item ? GTK_STOCK_YES : NULL, + "width", width + 4, NULL); + g_object_unref (item); +} + +static void +midori_search_action_dialog_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + MidoriSearchAction* search_action; + GdkPixbuf* icon; + + gtk_tree_model_get (model, iter, 0, &item, -1); + + search_action = g_object_get_data (G_OBJECT (treeview), "search-action"); + icon = midori_search_action_get_icon (search_action->net, item, treeview); + g_object_set (renderer, "pixbuf", icon, "yalign", 0.25, NULL); + g_object_unref (icon); + g_object_unref (item); +} + +static void +midori_search_action_dialog_render_text (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + const gchar* name; + const gchar* text; + gchar* markup; + + gtk_tree_model_get (model, iter, 0, &item, -1); + name = katze_item_get_name (item); + text = katze_item_get_text (item); + markup = g_markup_printf_escaped ("%s\n%s", name, text ? text : ""); + g_object_set (renderer, "markup", markup, NULL); + g_free (markup); + g_object_unref (item); +} + +static void +midori_search_action_dialog_render_token (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + const gchar* token; + gchar* markup; + + gtk_tree_model_get (model, iter, 0, &item, -1); + token = katze_item_get_token (item); + markup = g_markup_printf_escaped ("%s", token ? token : ""); + g_object_set (renderer, "markup", markup, "yalign", 0.0, NULL); + g_free (markup); + g_object_unref (item); +} + +static void +midori_search_action_editor_name_changed_cb (GtkWidget* entry, + GtkWidget* dialog) +{ + const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry)); + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), + GTK_RESPONSE_ACCEPT, text && *text); +} + +static inline const gchar* +STR_NON_NULL (const gchar* string) +{ + return string ? string : ""; +} + +static void +midori_search_action_get_editor (MidoriSearchAction* search_action, + gboolean new_engine) +{ + GtkWidget* toplevel; + GtkWidget* dialog; + GtkSizeGroup* sizegroup; + KatzeItem* item; + GtkWidget* hbox; + GtkWidget* label; + GtkTreeModel* liststore; + GtkTreeIter iter; + GtkTreeSelection* selection; + GtkWidget* entry_name; + GtkWidget* entry_description; + GtkWidget* entry_uri; + GtkWidget* entry_icon; + GtkWidget* entry_token; + + toplevel = gtk_widget_get_toplevel (search_action->treeview); + dialog = gtk_dialog_new_with_buttons ( + new_engine ? _("Add search engine") : _("Edit search engine"), + toplevel ? GTK_WINDOW (toplevel) : NULL, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + new_engine ? GTK_STOCK_ADD : GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + gtk_window_set_icon_name (GTK_WINDOW (dialog), + new_engine ? GTK_STOCK_ADD : GTK_STOCK_REMOVE); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 5); + sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + + if (new_engine) + { + item = katze_item_new (); + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), + GTK_RESPONSE_ACCEPT, FALSE); + } + else + { + selection = gtk_tree_view_get_selection ( + GTK_TREE_VIEW (search_action->treeview)); + gtk_tree_selection_get_selected (selection, &liststore, &iter); + gtk_tree_model_get (liststore, &iter, 0, &item, -1); + } + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Name:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_name = gtk_entry_new (); + g_signal_connect (entry_name, "changed", + G_CALLBACK (midori_search_action_editor_name_changed_cb), dialog); + gtk_entry_set_activates_default (GTK_ENTRY (entry_name), TRUE); + if (!new_engine) + gtk_entry_set_text (GTK_ENTRY (entry_name), + STR_NON_NULL (katze_item_get_name (item))); + gtk_box_pack_start (GTK_BOX (hbox), entry_name, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Description:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_description = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_description), TRUE); + if (!new_engine) + gtk_entry_set_text (GTK_ENTRY (entry_description) + , STR_NON_NULL (katze_item_get_text (item))); + gtk_box_pack_start (GTK_BOX (hbox), entry_description, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Address:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_uri = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_uri), TRUE); + if (!new_engine) + gtk_entry_set_text (GTK_ENTRY (entry_uri) + , STR_NON_NULL (katze_item_get_uri (item))); + gtk_box_pack_start (GTK_BOX (hbox), entry_uri, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Icon:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_icon = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_icon), TRUE); + if (!new_engine) + gtk_entry_set_text (GTK_ENTRY (entry_icon) + , STR_NON_NULL (katze_item_get_icon (item))); + gtk_box_pack_start (GTK_BOX (hbox), entry_icon, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + hbox = gtk_hbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + label = gtk_label_new_with_mnemonic (_("_Token:")); + gtk_size_group_add_widget (sizegroup, label); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + entry_token = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry_token), TRUE); + if (!new_engine) + gtk_entry_set_text (GTK_ENTRY (entry_token) + , STR_NON_NULL (katze_item_get_token (item))); + gtk_box_pack_start (GTK_BOX (hbox), entry_token, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), hbox); + gtk_widget_show_all (hbox); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + g_object_set (item, + "name", gtk_entry_get_text (GTK_ENTRY (entry_name)), + "text", gtk_entry_get_text (GTK_ENTRY (entry_description)), + "uri", gtk_entry_get_text (GTK_ENTRY (entry_uri)), + "icon", gtk_entry_get_text (GTK_ENTRY (entry_icon)), + "token", gtk_entry_get_text (GTK_ENTRY (entry_token)), + NULL); + + if (new_engine) + katze_array_add_item (search_action->search_engines, item); + } + gtk_widget_destroy (dialog); +} + +static void +midori_search_action_dialog_add_cb (GtkWidget* widget, + MidoriSearchAction* search_action) +{ + midori_search_action_get_editor (search_action, TRUE); +} + +static void +midori_search_action_dialog_edit_cb (GtkWidget* widget, + MidoriSearchAction* search_action) +{ + GtkWidget* treeview; + GtkTreeSelection* selection; + + treeview = search_action->treeview; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + if (gtk_tree_selection_get_selected (selection, NULL, NULL)) + midori_search_action_get_editor (search_action, FALSE); +} + +static void +midori_search_action_dialog_remove_cb (GtkWidget* widget, + MidoriSearchAction* search_action) +{ + KatzeArray* search_engines; + GtkWidget* treeview; + GtkTreeSelection* selection; + GtkTreeModel* liststore; + GtkTreeIter iter; + KatzeItem* item; + + search_engines = search_action->search_engines; + treeview = search_action->treeview; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + if (gtk_tree_selection_get_selected (selection, &liststore, &iter)) + { + gtk_tree_model_get (liststore, &iter, 0, &item, -1); + katze_array_remove_item (search_engines, item); + g_object_unref (item); + /* FIXME: we want to allow undo of some kind */ + } +} + +static void +midori_search_action_dialog_default_cb (GtkWidget* widget, + MidoriSearchAction* search_action) +{ + KatzeArray* search_engines; + GtkWidget* treeview; + GtkTreeSelection* selection; + GtkTreeModel* liststore; + GtkTreeIter iter; + KatzeItem* item; + + search_engines = search_action->search_engines; + treeview = search_action->treeview; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + if (gtk_tree_selection_get_selected (selection, &liststore, &iter)) + { + gtk_tree_model_get (liststore, &iter, 0, &item, -1); + midori_search_action_set_default_item (search_action, item); + g_object_unref (item); + gtk_widget_queue_draw (treeview); + } +} + +static void +midori_search_action_treeview_selection_cb (GtkTreeSelection* selection, + MidoriSearchAction* search_action) +{ + gboolean selected; + + selected = gtk_tree_selection_get_selected (selection, NULL, NULL); + + gtk_widget_set_sensitive (search_action->edit_button, selected); + gtk_widget_set_sensitive (search_action->remove_button, selected); + gtk_widget_set_sensitive (search_action->default_button, selected); +} + +static void +midori_search_action_dialog_engines_add_item_cb (KatzeArray* list, + KatzeItem* item, + GtkAction* action) +{ + MidoriSearchAction* search_action; + GtkTreeModel* liststore; + GtkTreeIter iter; + + search_action = MIDORI_SEARCH_ACTION (action); + liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (search_action->treeview)); + gtk_list_store_append (GTK_LIST_STORE (liststore), &iter); + gtk_list_store_set (GTK_LIST_STORE (liststore), &iter, 0, item, -1); +} + +static void +midori_search_action_dialog_engines_remove_item_cb (KatzeArray* list, + KatzeItem* item, + GtkAction* action) +{ + MidoriSearchAction* search_action; + GtkTreeModel* liststore; + GtkTreeIter iter; + gboolean valid; + KatzeItem* found_item; + + search_action = MIDORI_SEARCH_ACTION (action); + liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (search_action->treeview)); + valid = gtk_tree_model_get_iter_first (liststore, &iter); + while (valid) + { + gtk_tree_model_get (liststore, &iter, 0, &found_item, -1); + if (found_item == item) + { + gtk_list_store_remove (GTK_LIST_STORE (liststore), &iter); + valid = FALSE; + } + else + valid = gtk_tree_model_iter_next (liststore, &iter); + } +} + +static void +midori_search_action_treeview_destroy_cb (GtkWidget* treeview, + MidoriSearchAction* search_action) +{ + if (search_action->search_engines) + { + g_signal_handlers_disconnect_by_func ( + search_action->search_engines, + midori_search_action_dialog_engines_add_item_cb, search_action); + g_signal_handlers_disconnect_by_func ( + search_action->search_engines, + midori_search_action_dialog_engines_remove_item_cb, search_action); + } +} + +/** + * midori_search_action_get_dialog: + * @search_action: a #MidoriSearchAction + * + * Obtains a dialog that provides an interface for managing + * the list of search engines. + * + * The dialog is created once and this function will return + * the very same dialog until it is destroyed, in which case + * a new dialog is created. + * + * Return value: a #GtkDialog + **/ +GtkWidget* +midori_search_action_get_dialog (MidoriSearchAction* search_action) +{ + const gchar* dialog_title; + GtkWidget* toplevel; + GtkWidget* dialog; + gint width, height; + GtkWidget* xfce_heading; + GtkWidget* hbox; + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_text; + GtkCellRenderer* renderer_pixbuf; + GtkListStore* liststore; + GtkWidget* treeview; + GtkWidget* scrolled; + guint i; + KatzeItem* item; + GtkWidget* vbox; + GtkWidget* button; + GtkWidget* image; + + g_return_val_if_fail (MIDORI_IS_SEARCH_ACTION (search_action), NULL); + + /* If there is a dialog, use that. We want only one. */ + if (search_action->dialog) + return search_action->dialog; + + dialog_title = _("Manage Search Engines"); + toplevel = search_action->last_proxy ? + gtk_widget_get_toplevel (search_action->last_proxy) : NULL; + dialog = gtk_dialog_new_with_buttons (dialog_title, + toplevel ? GTK_WINDOW (toplevel) : NULL, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + #if !HAVE_OSX + GTK_STOCK_HELP, GTK_RESPONSE_HELP, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + #endif + NULL); + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), &search_action->dialog); + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_PROPERTIES); + /* TODO: Implement some kind of help function */ + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), + GTK_RESPONSE_HELP, FALSE); + sokoke_widget_get_text_size (dialog, "M", &width, &height); + gtk_window_set_default_size (GTK_WINDOW (dialog), width * 52, -1); + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), dialog); + /* TODO: Do we want tooltips for explainations or can we omit that? + We need mnemonics */ + if ((xfce_heading = sokoke_xfce_header_new ( + gtk_window_get_icon_name (GTK_WINDOW (dialog)), dialog_title))) + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), + xfce_heading, FALSE, FALSE, 0); + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, + TRUE, TRUE, 12); + liststore = gtk_list_store_new (1, KATZE_TYPE_ITEM); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore)); + search_action->treeview = treeview; + g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), + "changed", G_CALLBACK (midori_search_action_treeview_selection_cb), + search_action); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); + g_object_set_data (G_OBJECT (treeview), "search-action", search_action); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_search_action_dialog_render_tick_cb, + treeview, NULL); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_search_action_dialog_render_icon_cb, + treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, TRUE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_search_action_dialog_render_text, + treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, TRUE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_search_action_dialog_render_token, + treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (scrolled), treeview); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), + GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (hbox), scrolled, TRUE, TRUE, 5); + i = 0; + if (search_action->search_engines) + while ((item = katze_array_get_nth_item (search_action->search_engines, i))) + gtk_list_store_insert_with_values (GTK_LIST_STORE (liststore), + NULL, i++, 0, item, -1); + g_object_unref (liststore); + g_signal_connect (treeview, "destroy", + G_CALLBACK (midori_search_action_treeview_destroy_cb), search_action); + vbox = gtk_vbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 4); + button = gtk_button_new_from_stock (GTK_STOCK_ADD); + g_signal_connect (button, "clicked", + G_CALLBACK (midori_search_action_dialog_add_cb), search_action); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + button = gtk_button_new_from_stock (GTK_STOCK_EDIT); + search_action->edit_button = button; + g_signal_connect (button, "clicked", + G_CALLBACK (midori_search_action_dialog_edit_cb), search_action); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + if (!i) + gtk_widget_set_sensitive (button, FALSE); + button = gtk_button_new_from_stock (GTK_STOCK_REMOVE); + search_action->remove_button = button; + g_signal_connect (button, "clicked", + G_CALLBACK (midori_search_action_dialog_remove_cb), search_action); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + if (!i) + gtk_widget_set_sensitive (button, FALSE); + button = gtk_label_new (""); /* This is an invisible separator */ + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 8); + button = gtk_button_new_with_mnemonic (_("Use as _default")); + image = gtk_image_new_from_stock (GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + search_action->default_button = button; + g_signal_connect (button, "clicked", + G_CALLBACK (midori_search_action_dialog_default_cb), search_action); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); + if (!i) + gtk_widget_set_sensitive (button, FALSE); + button = gtk_label_new (""); /* This is an invisible separator */ + gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 12); + button = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); + gtk_widget_set_sensitive (button, FALSE); + gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); + button = gtk_button_new_from_stock (GTK_STOCK_GO_UP); + gtk_widget_set_sensitive (button, FALSE); + gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); + + #if HAVE_OSX + GtkWidget* icon; + hbox = gtk_hbox_new (FALSE, 0); + button = gtk_button_new (); + icon = gtk_image_new_from_stock (GTK_STOCK_HELP, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), icon); + /* TODO: Implement some kind of help function */ + gtk_widget_set_sensitive (button, FALSE); + /* g_signal_connect (button, "clicked", + G_CALLBACK (midori_search_action_dialog_help_clicked_cb), dialog); */ + gtk_box_pack_end (GTK_BOX (hbox), + button, FALSE, FALSE, 4); + gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->vbox), + hbox, FALSE, FALSE, 0); + #endif + gtk_widget_show_all (GTK_DIALOG (dialog)->vbox); + + if (search_action->search_engines) + g_object_connect (search_action->search_engines, + "signal-after::add-item", + midori_search_action_dialog_engines_add_item_cb, search_action, + "signal-after::remove-item", + midori_search_action_dialog_engines_remove_item_cb, search_action, + NULL); + + search_action->dialog = dialog; + return dialog; +} diff --git a/midori/midori-searchaction.h b/midori/midori-searchaction.h new file mode 100644 index 00000000..760dd4e5 --- /dev/null +++ b/midori/midori-searchaction.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_SEARCH_ACTION_H__ +#define __MIDORI_SEARCH_ACTION_H__ + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_SEARCH_ACTION \ + (midori_search_action_get_type ()) +#define MIDORI_SEARCH_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_SEARCH_ACTION, MidoriSearchAction)) +#define MIDORI_SEARCH_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_SEARCH_ACTION, MidoriSearchActionClass)) +#define MIDORI_IS_SEARCH_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_SEARCH_ACTION)) +#define MIDORI_IS_SEARCH_ACTION_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_SEARCH_ACTION)) +#define MIDORI_SEARCH_ACTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_SEARCH_ACTION, MidoriSearchActionClass)) + +typedef struct _MidoriSearchAction MidoriSearchAction; +typedef struct _MidoriSearchActionClass MidoriSearchActionClass; + +GType +midori_search_action_get_type (void); + +const gchar* +midori_search_action_get_text (MidoriSearchAction* action); + +void +midori_search_action_set_text (MidoriSearchAction* search_action, + const gchar* text); + +KatzeArray* +midori_search_action_get_search_engines (MidoriSearchAction* search_action); + +void +midori_search_action_set_search_engines (MidoriSearchAction* search_action, + KatzeArray* search_engines); + +KatzeItem* +midori_search_action_get_current_item (MidoriSearchAction* search_action); + +void +midori_search_action_set_current_item (MidoriSearchAction* search_action, + KatzeItem* item); + +KatzeItem* +midori_search_action_get_default_item (MidoriSearchAction* search_action); + +void +midori_search_action_set_default_item (MidoriSearchAction* search_action, + KatzeItem* item); + +GtkWidget* +midori_search_action_get_dialog (MidoriSearchAction* search_action); + +G_END_DECLS + +#endif /* __MIDORI_SEARCH_ACTION_H__ */ diff --git a/midori/midori-stock.h b/midori/midori-stock.h new file mode 100644 index 00000000..3b8436e8 --- /dev/null +++ b/midori/midori-stock.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2007-2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_STOCK_H__ +#define __MIDORI_STOCK_H__ 1 + +#include + +/* Custom stock items + + We should distribute these + Names should match with epiphany and/ or xdg spec */ + +#define STOCK_BOOKMARK "stock_bookmark" +#define STOCK_BOOKMARKS "vcard" +#define STOCK_CONSOLE "terminal" +#define STOCK_EXTENSION "extension" +#define STOCK_EXTENSIONS "extension" +#define STOCK_HISTORY "document-open-recent" +#define STOCK_NEWS_FEED "news-feed" +#define STOCK_STYLE "gnome-settings-theme" +#define STOCK_STYLES "gnome-settings-theme" +#define STOCK_TRANSFER "package" +#define STOCK_TRANSFERS "package" +#define STOCK_PLUGINS GTK_STOCK_CONVERT + +#define STOCK_BOOKMARK_ADD "stock_add-bookmark" +#define STOCK_HOMEPAGE GTK_STOCK_HOME +#define STOCK_IMAGE "gnome-mime-image" +#define STOCK_NETWORK_OFFLINE "network-offline" +#define STOCK_SCRIPT "stock_script" +#define STOCK_SCRIPTS "stock_script" +#define STOCK_SEND "stock_mail-send" +#define STOCK_TAB_NEW "stock_new-tab" +#define STOCK_USER_TRASH "gnome-stock-trash" +#define STOCK_WINDOW_NEW "stock_new-window" + +#endif /* !__MIDORI_STOCK_H__ */ diff --git a/midori/midori-view.c b/midori/midori-view.c new file mode 100644 index 00000000..bb10bfe5 --- /dev/null +++ b/midori/midori-view.c @@ -0,0 +1,2681 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori-view.h" +#include "midori-stock.h" + +#include "compat.h" +#include "marshal.h" +#include "sokoke.h" + +#include +#include +#include +#include + +#if GLIB_CHECK_VERSION (2, 18, 0) + #define D_(__domain, __message) g_dgettext (__domain, __message) +#elif ENABLE_NLS + #define D_(__domain, __message) dgettext (__domain, __message) +#else + #define D_(__domain, __message) __message +#endif + +/* This is unstable API, so we need to declare it */ +gchar* +webkit_web_view_get_selected_text (WebKitWebView* web_view); +void +webkit_web_frame_print (WebKitWebFrame* web_frame); + +GdkPixbuf* +midori_search_action_get_icon (KatzeNet* net, + KatzeItem* item, + GtkWidget* widget); + +struct _MidoriView +{ + GtkScrolledWindow parent_instance; + + gchar* uri; + gchar* title; + gchar* mime_type; + GdkPixbuf* icon; + gdouble progress; + MidoriLoadStatus load_status; + gchar* statusbar_text; + gchar* link_uri; + gboolean has_selection; + gchar* selected_text; + MidoriWebSettings* settings; + GtkWidget* web_view; + /* KatzeArray* news_feeds; */ + + gchar* download_manager; + gchar* news_aggregator; + gboolean middle_click_opens_selection; + gboolean open_tabs_in_the_background; + gboolean close_buttons_on_tabs; + MidoriNewPage open_new_pages_in; + gboolean find_while_typing; + + GtkWidget* menu_item; + GtkWidget* tab_label; + GtkWidget* tab_icon; + GtkWidget* tab_title; + GtkWidget* tab_close; + KatzeItem* item; + + KatzeNet* net; +}; + +struct _MidoriViewClass +{ + GtkScrolledWindowClass parent_class; +}; + +G_DEFINE_TYPE (MidoriView, midori_view, GTK_TYPE_SCROLLED_WINDOW) + +GType +midori_load_status_get_type (void) +{ + static GType type = 0; + static const GEnumValue values[] = { + { MIDORI_LOAD_PROVISIONAL, "MIDORI_LOAD_PROVISIONAL", "Load Provisional" }, + { MIDORI_LOAD_COMMITTED, "MIDORI_LOAD_COMMITTED", "Load Committed" }, + { MIDORI_LOAD_FINISHED, "MIDORI_LOAD_FINISHED", "Load Finished" }, + { 0, NULL, NULL } + }; + + if (type) + return type; + + type = g_enum_register_static ("MidoriLoadStatus", values); + return type; +} + +GType +midori_new_view_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_NEW_VIEW_TAB, "MIDORI_NEW_VIEW_TAB", "New view in a tab" }, + { MIDORI_NEW_VIEW_BACKGROUND, "MIDORI_NEW_VIEW_BACKGROUND", + "New view in a background tab" }, + { MIDORI_NEW_VIEW_WINDOW, "MIDORI_NEW_VIEW_WINDOW", + "New view in a window" }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriNewView", values); + } + return type; +} + +enum +{ + PROP_0, + + PROP_URI, + PROP_TITLE, + PROP_MIME_TYPE, + PROP_ICON, + PROP_LOAD_STATUS, + PROP_PROGRESS, + PROP_ZOOM_LEVEL, + /* PROP_NEWS_FEEDS, */ + PROP_STATUSBAR_TEXT, + PROP_SETTINGS, + PROP_NET +}; + +enum { + ACTIVATE_ACTION, + CONSOLE_MESSAGE, + CONTEXT_READY, + ATTACH_INSPECTOR, + NEW_TAB, + NEW_WINDOW, + NEW_VIEW, + DOWNLOAD_REQUESTED, + SEARCH_TEXT, + ADD_BOOKMARK, + SAVE_AS, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +static void +midori_view_finalize (GObject* object); + +static void +midori_view_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_view_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_view_settings_notify_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + MidoriView* view); + +static void +midori_view_class_init (MidoriViewClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + signals[ACTIVATE_ACTION] = g_signal_new ( + "activate-action", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + signals[CONSOLE_MESSAGE] = g_signal_new ( + "console-message", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + midori_cclosure_marshal_VOID__STRING_INT_STRING, + G_TYPE_NONE, 3, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_STRING); + + signals[CONTEXT_READY] = g_signal_new ( + "context-ready", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); + + signals[ATTACH_INSPECTOR] = g_signal_new ( + "attach-inspector", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_WIDGET); + + signals[NEW_TAB] = g_signal_new ( + "new-tab", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + midori_cclosure_marshal_VOID__STRING_BOOLEAN, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_BOOLEAN); + + signals[NEW_WINDOW] = g_signal_new ( + "new-window", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + /** + * MidoriView::new-view: + * @view: the object on which the signal is emitted + * @new_view: a newly created view + * @where: where to open the view + * + * Emitted when a new view is created. The value of + * @where determines where to open the view according + * to how it was opened and user preferences. + * + * Since: 0.1.2 + */ + signals[NEW_VIEW] = g_signal_new ( + "new-view", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + midori_cclosure_marshal_VOID__OBJECT_ENUM, + G_TYPE_NONE, 2, + MIDORI_TYPE_VIEW, + MIDORI_TYPE_NEW_VIEW); + + /** + * MidoriView::download-requested: + * @view: the object on which the signal is emitted + * @download: a new download + * + * Emitted when a new download is requested, if a + * file cannot be displayed or a download was started + * from the context menu. + * + * If the download should be accepted, a callback + * has to return %TRUE, and the download will also + * be started automatically. + * + * Note: This requires WebKitGTK 1.1.3. + * + * Return value: %TRUE if the download was handled + * + * Since: 0.1.5 + */ + signals[DOWNLOAD_REQUESTED] = g_signal_new ( + "download-requested", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + g_signal_accumulator_true_handled, + NULL, + midori_cclosure_marshal_BOOLEAN__OBJECT, + G_TYPE_BOOLEAN, 1, + G_TYPE_OBJECT); + + /** + * MidoriView::search-text: + * @view: the object on which the signal is emitted + * @found: whether the search was successful + * @typing: whether the search was initiated by typing + * + * Emitted when a search is performed. Either manually + * invoked or automatically by typing. The value of typing + * is actually the text the user typed. + * + * Note that in 0.1.3 the argument @typing was introduced. + */ + signals[SEARCH_TEXT] = g_signal_new ( + "search-text", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + midori_cclosure_marshal_VOID__BOOLEAN_STRING, + G_TYPE_NONE, 2, + G_TYPE_BOOLEAN, + G_TYPE_STRING); + + signals[ADD_BOOKMARK] = g_signal_new ( + "add-bookmark", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + signals[SAVE_AS] = g_signal_new ( + "save-as", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_view_finalize; + gobject_class->set_property = midori_view_set_property; + gobject_class->get_property = midori_view_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS; + + g_object_class_install_property (gobject_class, + PROP_URI, + g_param_spec_string ( + "uri", + "Uri", + "The URI of the currently loaded page", + "about:blank", + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_TITLE, + g_param_spec_string ( + "title", + "Title", + "The title of the currently loaded page", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriView:mime-type: + * + * The MIME type of the currently loaded page. + * + * Since: 0.1.2 + */ + g_object_class_install_property (gobject_class, + PROP_MIME_TYPE, + g_param_spec_string ( + "mime-type", + "MIME Type", + "The MIME type of the currently loaded page", + "text/html", + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ICON, + g_param_spec_object ( + "icon", + "Icon", + "The icon of the view", + GDK_TYPE_PIXBUF, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_LOAD_STATUS, + g_param_spec_enum ( + "load-status", + "Load Status", + "The current loading status", + MIDORI_TYPE_LOAD_STATUS, + MIDORI_LOAD_FINISHED, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_PROGRESS, + g_param_spec_double ( + "progress", + "Progress", + "The current loading progress", + 0.0, 1.0, 0.0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ZOOM_LEVEL, + g_param_spec_float ( + "zoom-level", + "Zoom Level", + "The current zoom level", + G_MINFLOAT, + G_MAXFLOAT, + 1.0f, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /* g_object_class_install_property (gobject_class, + PROP_NEWS_FEEDS, + g_param_spec_object ( + "news-feeds", + "News Feeds", + "The list of available news feeds", + KATZE_TYPE_ARRAY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); */ + + g_object_class_install_property (gobject_class, + PROP_STATUSBAR_TEXT, + g_param_spec_string ( + "statusbar-text", + "Statusbar Text", + "The text displayed in the statusbar", + "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_SETTINGS, + g_param_spec_object ( + "settings", + "Settings", + "The associated settings", + MIDORI_TYPE_WEB_SETTINGS, + flags)); + + g_object_class_install_property (gobject_class, + PROP_NET, + g_param_spec_object ( + "net", + "Net", + "The associated net", + KATZE_TYPE_NET, + flags)); +} + +static GdkPixbuf* +midori_view_mime_icon (GtkIconTheme* icon_theme, + const gchar* format, + const gchar* part1, + const gchar* part2, + gchar** name) +{ + GdkPixbuf* icon; + + *name = part2 ? g_strdup_printf (format, part1, part2) + : g_strdup_printf (format, part1); + if (!(icon = gtk_icon_theme_load_icon (icon_theme, *name, 16, 0, NULL))) + g_free (*name); + return icon ? g_object_ref (icon) : NULL; +} + +static void +midori_view_update_icon (MidoriView* view, + GdkPixbuf* icon) +{ + if (!icon) + { + GdkScreen* screen; + GtkIconTheme* icon_theme; + gchar** parts; + gchar* icon_name; + + if ((screen = gtk_widget_get_screen (GTK_WIDGET (view)))) + { + icon_theme = gtk_icon_theme_get_for_screen (screen); + if ((parts = g_strsplit (view->mime_type, "/", 2))) + parts = (parts[0] && parts[1]) ? parts : NULL; + } + else + parts = NULL; + + if (parts) + icon = midori_view_mime_icon (icon_theme, "%s-%s", + parts[0], parts[1], &icon_name); + if (!icon && parts) + icon = midori_view_mime_icon (icon_theme, "gnome-mime-%s-%s", + parts[0], parts[1], &icon_name); + if (!icon && parts) + icon = midori_view_mime_icon (icon_theme, "%s-x-generic", + parts[0], NULL, &icon_name); + if (!icon && parts) + icon = midori_view_mime_icon (icon_theme, "gnome-mime-%s-x-generic", + parts[0], NULL, &icon_name); + if (view->item) + katze_item_set_icon (view->item, icon ? icon_name : NULL); + if (!icon) + icon = gtk_widget_render_icon (GTK_WIDGET (view), + GTK_STOCK_FILE, GTK_ICON_SIZE_MENU, NULL); + } + else if (view->item) + katze_item_set_icon (view->item, NULL); + katze_object_assign (view->icon, icon); + g_object_notify (G_OBJECT (view), "icon"); + + if (view->tab_icon) + katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon), + view->icon); + if (view->menu_item) + gtk_image_menu_item_set_image ( + GTK_IMAGE_MENU_ITEM (view->menu_item), + gtk_image_new_from_pixbuf (view->icon)); +} + +static void +midori_view_icon_cb (GdkPixbuf* icon, + MidoriView* view) +{ + midori_view_update_icon (view, icon); +} + +static void +_midori_web_view_load_icon (MidoriView* view) +{ + GdkPixbuf* pixbuf = katze_net_load_icon (view->net, view->uri, + (KatzeNetIconCb)midori_view_icon_cb, NULL, view); + + midori_view_update_icon (view, pixbuf); +} + +static void +midori_view_update_load_status (MidoriView* view, + MidoriLoadStatus load_status) +{ + if (view->load_status == load_status) + return; + + view->load_status = load_status; + g_object_notify (G_OBJECT (view), "load-status"); + + if (view->tab_icon) + katze_throbber_set_animated (KATZE_THROBBER (view->tab_icon), + view->load_status != MIDORI_LOAD_FINISHED); + + if (view->web_view && view->load_status == MIDORI_LOAD_COMMITTED) + _midori_web_view_load_icon (view); +} + +static void +webkit_web_view_load_started_cb (WebKitWebView* web_view, + WebKitWebFrame* web_frame, + MidoriView* view) +{ + g_object_freeze_notify (G_OBJECT (view)); + + midori_view_update_load_status (view, MIDORI_LOAD_PROVISIONAL); + view->progress = 0.0; + g_object_notify (G_OBJECT (view), "progress"); + + g_object_thaw_notify (G_OBJECT (view)); +} + +static void +webkit_web_view_load_committed_cb (WebKitWebView* web_view, + WebKitWebFrame* web_frame, + MidoriView* view) +{ + const gchar* uri; + + g_object_freeze_notify (G_OBJECT (view)); + + uri = webkit_web_frame_get_uri (web_frame); + g_return_if_fail (uri != NULL); + katze_assign (view->uri, g_strdup (uri)); + if (view->item) + { + katze_item_set_uri (view->item, uri); + katze_item_set_added (view->item, time (NULL)); + } + g_object_notify (G_OBJECT (view), "uri"); + g_object_set (view, "title", NULL, NULL); + + midori_view_update_icon (view, NULL); + + midori_view_update_load_status (view, MIDORI_LOAD_COMMITTED); + + g_object_thaw_notify (G_OBJECT (view)); +} + +static void +webkit_web_view_progress_changed_cb (WebKitWebView* web_view, + gint progress, + MidoriView* view) +{ + view->progress = progress ? progress / 100.0 : 0.0; + g_object_notify (G_OBJECT (view), "progress"); +} + +static void +webkit_web_frame_load_done_cb (WebKitWebFrame* web_frame, + gboolean success, + MidoriView* view) +{ + gchar* title; + gchar* data; + + if (!success) + { + /* i18n: The title of the 404 - Not found error page */ + title = g_strdup_printf (_("Not found - %s"), view->uri); + katze_assign (view->title, title); + data = g_strdup_printf ( + "%s" + "

%s

" + "" + "

The page you were opening doesn't exist." + "

Try to load the page again, " + "or move on to another page." + "", + title, title, view->uri); + webkit_web_view_load_html_string ( + WEBKIT_WEB_VIEW (view->web_view), data, view->uri); + g_free (data); + } + + midori_view_update_load_status (view, MIDORI_LOAD_FINISHED); +} + +static void +webkit_web_view_load_finished_cb (WebKitWebView* web_view, + WebKitWebFrame* web_frame, + MidoriView* view) +{ + g_object_freeze_notify (G_OBJECT (view)); + + view->progress = 1.0; + g_object_notify (G_OBJECT (view), "progress"); + midori_view_update_load_status (view, MIDORI_LOAD_FINISHED); + + if (view->news_aggregator && *view->news_aggregator) + { + JSContextRef js_context = webkit_web_frame_get_global_context (web_frame); + gchar* value = sokoke_js_script_eval (js_context, + "function feeds (l) { var f = new Array (); for (i in l) " + "{ var t = l[i].type; " + "if (t && (t.indexOf ('rss') != -1 || t.indexOf ('atom') != -1)) " + "f.push (l[i].href); } return f; }" + "feeds (document.getElementsByTagName ('link'))", NULL); + g_object_set_data (G_OBJECT (view), "news-feeds", + value && *value ? (void*)1 : (void*)0); + /* Ensure load-status is notified again, whether it changed or not */ + g_object_notify (G_OBJECT (view), "load-status"); + } + + g_object_thaw_notify (G_OBJECT (view)); +} + +static void +webkit_web_view_title_changed_cb (WebKitWebView* web_view, + WebKitWebFrame* web_frame, + const gchar* title, + MidoriView* view) +{ + g_object_set (view, "title", title, NULL); +} + +static void +webkit_web_view_statusbar_text_changed_cb (WebKitWebView* web_view, + const gchar* text, + MidoriView* view) +{ + g_object_set (G_OBJECT (view), "statusbar-text", text, NULL); +} + +static void +webkit_web_view_hovering_over_link_cb (WebKitWebView* web_view, + const gchar* tooltip, + const gchar* link_uri, + MidoriView* view) +{ + katze_assign (view->link_uri, g_strdup (link_uri)); + g_object_set (G_OBJECT (view), "statusbar-text", link_uri, NULL); +} + +#define MIDORI_KEYS_MODIFIER_MASK (GDK_SHIFT_MASK | GDK_CONTROL_MASK \ + | GDK_MOD1_MASK | GDK_META_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK ) + +static gboolean +gtk_widget_button_press_event_cb (WebKitWebView* web_view, + GdkEventButton* event, + MidoriView* view) +{ + GtkClipboard* clipboard; + gchar* uri; + gchar* new_uri; + const gchar* link_uri; + gboolean background; + + event->state = event->state & MIDORI_KEYS_MODIFIER_MASK; + link_uri = midori_view_get_link_uri (MIDORI_VIEW (view)); + + switch (event->button) + { + case 1: + if (!link_uri) + return FALSE; + #if HAVE_OSX + /* FIXME: Test for Command key */ + if (0) + #else + if (event->state & GDK_CONTROL_MASK) + #endif + { + /* Open link in new tab */ + background = view->open_tabs_in_the_background; + if (event->state & GDK_SHIFT_MASK) + background = !background; + g_signal_emit (view, signals[NEW_TAB], 0, link_uri, background); + return TRUE; + } + else if (event->state & GDK_SHIFT_MASK) + { + /* Open link in new window */ + g_signal_emit (view, signals[NEW_WINDOW], 0, link_uri); + return TRUE; + } + else if (event->state & GDK_MOD1_MASK) + { + /* Open link in new tab */ + background = view->open_tabs_in_the_background; + if (event->state & GDK_CONTROL_MASK) + background = !background; + g_signal_emit (view, signals[NEW_TAB], 0, link_uri, background); + return TRUE; + } + break; + case 2: + if (link_uri) + { + /* Open link in new tab */ + background = view->open_tabs_in_the_background; + if (event->state & GDK_CONTROL_MASK) + background = !background; + g_signal_emit (view, signals[NEW_TAB], 0, link_uri, background); + return TRUE; + } + else if (event->state & GDK_CONTROL_MASK) + { + midori_view_set_zoom_level (MIDORI_VIEW (view), 1.0); + return FALSE; /* Allow Ctrl + Middle click */ + } + else if (view->middle_click_opens_selection) + { + guint i = 0; + clipboard = gtk_clipboard_get_for_display ( + gtk_widget_get_display (GTK_WIDGET (view)), + GDK_SELECTION_PRIMARY); + uri = gtk_clipboard_wait_for_text (clipboard); + if (uri && strchr (uri, '.')) + { + while (uri[i++] != '\0') + if (uri[i] == '\n' || uri[i] == '\r') + uri[i] = ' '; + new_uri = sokoke_magic_uri (g_strstrip (uri), NULL); + if (event->state & GDK_CONTROL_MASK) + { + background = view->open_tabs_in_the_background; + if (event->state & GDK_CONTROL_MASK) + background = !background; + g_signal_emit (view, signals[NEW_TAB], 0, new_uri, background); + } + else + { + midori_view_set_uri (MIDORI_VIEW (view), new_uri); + gtk_widget_grab_focus (GTK_WIDGET (view)); + } + g_free (new_uri); + return TRUE; + } + g_free (uri); + } + break; + case 8: + midori_view_go_back (view); + return TRUE; + case 9: + midori_view_go_forward (view); + return TRUE; + } + + return FALSE; +} + +static gboolean +gtk_widget_key_press_event_cb (WebKitWebView* web_view, + GdkEventKey* event, + MidoriView* view) +{ + guint character = gdk_unicode_to_keyval (event->keyval); + /* Skip control characters */ + if (character == (event->keyval | 0x01000000)) + return FALSE; + + if (view->find_while_typing && !webkit_web_view_can_cut_clipboard (web_view) + && !webkit_web_view_can_paste_clipboard (web_view)) + { + gchar* text = g_strdup_printf ("%c", character); + + g_signal_emit (view, signals[SEARCH_TEXT], 0, TRUE, text); + g_free (text); + } + + return FALSE; +} + +static gboolean +gtk_widget_scroll_event_cb (WebKitWebView* web_view, + GdkEventScroll* event, + MidoriView* view) +{ + event->state = event->state & MIDORI_KEYS_MODIFIER_MASK; + + if (event->state & GDK_CONTROL_MASK) + { + if (event->direction == GDK_SCROLL_DOWN) + midori_view_set_zoom_level (view, + midori_view_get_zoom_level (view) - 0.25f); + else if(event->direction == GDK_SCROLL_UP) + midori_view_set_zoom_level (view, + midori_view_get_zoom_level (view) + 0.25f); + return TRUE; + } + else + return FALSE; +} + +static void +midori_web_view_menu_new_tab_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + gchar* uri = view->link_uri; + + if (!uri) + uri = (gchar*)g_object_get_data (G_OBJECT (widget), "uri"); + g_signal_emit (view, signals[NEW_TAB], 0, uri, + view->open_tabs_in_the_background); +} + +static void +midori_web_view_menu_new_window_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + g_signal_emit (view, signals[NEW_WINDOW], 0, view->link_uri); +} + +static void +midori_web_view_menu_search_web_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + gchar* search; + gchar* uri; + + if ((search = g_object_get_data (G_OBJECT (widget), "search"))) + search = g_strdup (search); + else + g_object_get (view->settings, "location-entry-search", + &search, NULL); + if (strstr (search, "%s")) + uri = g_strdup_printf (search, view->selected_text); + else + uri = g_strconcat (search, view->selected_text, NULL); + g_free (search); + + g_signal_emit (view, signals[NEW_TAB], 0, uri, + view->open_tabs_in_the_background); + + g_free (uri); +} + +#if !WEBKIT_CHECK_VERSION (1, 1, 3) +static void +midori_web_view_menu_save_as_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + g_signal_emit (view, signals[SAVE_AS], 0, view->link_uri); +} +#endif + +static void +midori_web_view_menu_download_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + sokoke_spawn_program (view->download_manager, view->link_uri); +} + +static void +midori_web_view_menu_add_bookmark_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + g_signal_emit (view, signals[ADD_BOOKMARK], 0, view->link_uri); +} + +static void +midori_web_view_menu_action_activate_cb (GtkWidget* widget, + MidoriView* view) +{ + const gchar* action = g_object_get_data (G_OBJECT (widget), "action"); + g_signal_emit (view, signals[ACTIVATE_ACTION], 0, action); +} + +static void +webkit_web_view_populate_popup_cb (WebKitWebView* web_view, + GtkWidget* menu, + MidoriView* view) +{ + GtkWidget* menuitem; + GtkWidget* icon; + gchar* stock_id; + GdkScreen* screen; + GtkIconTheme* icon_theme; + GList* items; + gboolean has_selection; + GtkWidget* label; + + has_selection = midori_view_has_selection (view); + + /* Unfortunately inspecting the menu is the only way to + determine that the mouse is over a text area or selection. */ + items = gtk_container_get_children (GTK_CONTAINER (menu)); + menuitem = (GtkWidget*)g_list_nth_data (items, 0); + g_list_free (items); + if (GTK_IS_IMAGE_MENU_ITEM (menuitem)) + { + icon = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (menuitem)); + gtk_image_get_stock (GTK_IMAGE (icon), &stock_id, NULL); + if (!strcmp (stock_id, GTK_STOCK_CUT)) + return; + if (strcmp (stock_id, GTK_STOCK_FIND)) + has_selection = FALSE; + } + + if (view->link_uri) + { + items = gtk_container_get_children (GTK_CONTAINER (menu)); + menuitem = (GtkWidget*)g_list_nth_data (items, 0); + /* hack to localize menu item */ + label = gtk_bin_get_child (GTK_BIN (menuitem)); + gtk_label_set_label (GTK_LABEL (label), _("Open _Link")); + menuitem = gtk_image_menu_item_new_with_mnemonic ( + _("Open Link in New _Tab")); + screen = gtk_widget_get_screen (GTK_WIDGET (view)); + icon_theme = gtk_icon_theme_get_for_screen (screen); + if (gtk_icon_theme_has_icon (icon_theme, STOCK_TAB_NEW)) + { + icon = gtk_image_new_from_stock (STOCK_TAB_NEW, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + } + gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 1); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_new_tab_activate_cb), view); + gtk_widget_show (menuitem); + g_list_free (items); + items = gtk_container_get_children (GTK_CONTAINER (menu)); + menuitem = (GtkWidget*)g_list_nth_data (items, 2); + /* hack to localize menu item */ + label = gtk_bin_get_child (GTK_BIN (menuitem)); + gtk_label_set_label (GTK_LABEL (label), _("Open Link in New _Window")); + /* hack to implement New Window */ + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_new_window_activate_cb), view); + menuitem = (GtkWidget*)g_list_nth_data (items, 3); + g_list_free (items); + #if WEBKIT_CHECK_VERSION (1, 1, 3) + /* hack to localize menu item */ + label = gtk_bin_get_child (GTK_BIN (menuitem)); + gtk_label_set_label (GTK_LABEL (label), _("_Download Link destination")); + #else + /* hack to disable non-functional Download File + FIXME: Make sure this really is the right menu item */ + gtk_widget_hide (menuitem); + menuitem = gtk_image_menu_item_new_with_mnemonic ( + _("_Save Link destination")); + gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 3); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_save_as_activate_cb), view); + gtk_widget_show (menuitem); + #endif + if (view->download_manager && *view->download_manager) + { + menuitem = gtk_image_menu_item_new_with_mnemonic ( + _("Download with Download _Manager")); + icon = gtk_image_new_from_stock (GTK_STOCK_SAVE_AS, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 4); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_download_activate_cb), view); + gtk_widget_show (menuitem); + } + menuitem = gtk_image_menu_item_new_from_stock (STOCK_BOOKMARK_ADD, NULL); + gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 5); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_add_bookmark_activate_cb), view); + gtk_widget_show (menuitem); + } + + if (!view->link_uri && has_selection) + { + GtkWidget* window; + guint i; + + window = gtk_widget_get_toplevel (GTK_WIDGET (web_view)); + i = 0; + if (katze_object_has_property (window, "search-engines")) + { + KatzeArray* search_engines; + KatzeItem* item; + GtkWidget* sub_menu = gtk_menu_new (); + + menuitem = gtk_image_menu_item_new_with_mnemonic (_("Search _with")); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), sub_menu); + gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 1); + gtk_widget_show (menuitem); + + search_engines = katze_object_get_object (window, "search-engines"); + while ((item = katze_array_get_nth_item (search_engines, i++))) + { + GdkPixbuf* pixbuf; + menuitem = gtk_image_menu_item_new_with_mnemonic (katze_item_get_name (item)); + pixbuf = midori_search_action_get_icon (view->net, item, + GTK_WIDGET (web_view)); + icon = gtk_image_new_from_pixbuf (pixbuf); + g_object_unref (pixbuf); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + gtk_menu_shell_insert (GTK_MENU_SHELL (sub_menu), menuitem, i - 1); + g_object_set_data (G_OBJECT (menuitem), "search", + (gchar*)katze_item_get_uri (item)); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_search_web_activate_cb), view); + gtk_widget_show (menuitem); + } + g_object_unref (search_engines); + } + items = gtk_container_get_children (GTK_CONTAINER (menu)); + menuitem = (GtkWidget*)g_list_nth_data (items, 0); + /* hack to localize menu item */ + label = gtk_bin_get_child (GTK_BIN (menuitem)); + gtk_label_set_label (GTK_LABEL (label), _("_Search the Web")); + /* hack to implement Search the Web */ + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_search_web_activate_cb), view); + g_list_free (items); + + if (strchr (view->selected_text, '.') + && !strchr (view->selected_text, ' ')) + { + menuitem = gtk_image_menu_item_new_with_mnemonic ( + _("Open Address in New _Tab")); + icon = gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1); + g_object_set_data (G_OBJECT (menuitem), "uri", view->selected_text); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_new_tab_activate_cb), view); + gtk_widget_show (menuitem); + } + /* FIXME: view selection source */ + } + + if (!view->link_uri && !has_selection) + { + items = gtk_container_get_children (GTK_CONTAINER (menu)); + menuitem = (GtkWidget*)g_list_nth_data (items, 3); + /* hack to localize menu item */ + if (GTK_IS_BIN (menuitem)) + { + label = gtk_bin_get_child (GTK_BIN (menuitem)); + gtk_label_set_label (GTK_LABEL (label), D_("gtk20", "_Refresh")); + } + g_list_free (items); + menuitem = gtk_image_menu_item_new_with_mnemonic (_("Undo Close Tab")); + icon = gtk_image_new_from_stock (GTK_STOCK_UNDELETE, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "action", "UndoTabClose"); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_action_activate_cb), view); + /* FIXME: Make this sensitive only when there is a tab to undo */ + gtk_widget_show (menuitem); + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + menuitem = gtk_image_menu_item_new_from_stock (STOCK_BOOKMARK_ADD, NULL); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "action", "BookmarkAdd"); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_action_activate_cb), view); + gtk_widget_show (menuitem); + menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_SAVE_AS, NULL); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "action", "SaveAs"); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_action_activate_cb), view); + gtk_widget_show (menuitem); + /* Currently views that don't support source, don't support + saving either. If that changes, we need to think of something. */ + if (!midori_view_can_view_source (view)) + gtk_widget_set_sensitive (menuitem, FALSE); + menuitem = gtk_image_menu_item_new_with_mnemonic (_("View _Source")); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "action", "SourceView"); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_action_activate_cb), view); + gtk_widget_show (menuitem); + if (!midori_view_can_view_source (view)) + gtk_widget_set_sensitive (menuitem, FALSE); + menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PRINT, NULL); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + g_object_set_data (G_OBJECT (menuitem), "action", "Print"); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_web_view_menu_action_activate_cb), view); + gtk_widget_show (menuitem); + } +} + +static gboolean +webkit_web_view_web_view_ready_cb (GtkWidget* web_view, + MidoriView* view) +{ + GtkWidget* new_view = gtk_widget_get_parent (web_view); + MidoriNewView where = MIDORI_NEW_VIEW_TAB; + if (view->open_new_pages_in == MIDORI_NEW_PAGE_TAB) + { + if (view->open_tabs_in_the_background) + where = MIDORI_NEW_VIEW_BACKGROUND; + } + else if (view->open_new_pages_in == MIDORI_NEW_PAGE_WINDOW) + where = MIDORI_NEW_VIEW_WINDOW; + + gtk_widget_show (new_view); + if (view->open_new_pages_in == MIDORI_NEW_PAGE_CURRENT) + { + g_debug ("Opening all pages in current tab not implemented"); + g_signal_emit (view, signals[NEW_VIEW], 0, new_view, where); + } + else + g_signal_emit (view, signals[NEW_VIEW], 0, new_view, where); + + return TRUE; +} + +static GtkWidget* +webkit_web_view_create_web_view_cb (GtkWidget* web_view, + WebKitWebFrame* web_frame, + MidoriView* view) +{ + GtkWidget* new_view = g_object_new (MIDORI_TYPE_VIEW, + "net", view->net, + "settings", view->settings, + NULL); + midori_view_set_uri (MIDORI_VIEW (new_view), ""); + g_signal_connect (MIDORI_VIEW (new_view)->web_view, "web-view-ready", + G_CALLBACK (webkit_web_view_web_view_ready_cb), view); + return MIDORI_VIEW (new_view)->web_view; +} + +static gboolean +webkit_web_view_mime_type_decision_cb (GtkWidget* web_view, + WebKitWebFrame* web_frame, + WebKitNetworkRequest* request, + const gchar* mime_type, + WebKitWebPolicyDecision* decision, + MidoriView* view) +{ + #if WEBKIT_CHECK_VERSION (1, 1, 3) + GtkWidget* dialog; + gchar* content_type; + gchar* description; + #if GTK_CHECK_VERSION (2, 14, 0) + GIcon* icon; + GtkWidget* image; + #endif + gchar* title; + GdkScreen* screen; + GtkIconTheme* icon_theme; + gint response; + #else + gchar* uri; + #endif + + if (web_frame != webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view))) + return FALSE; + + if (webkit_web_view_can_show_mime_type (WEBKIT_WEB_VIEW (web_view), mime_type)) + { + katze_assign (view->mime_type, g_strdup (mime_type)); + midori_view_update_icon (view, NULL); + g_object_notify (G_OBJECT (view), "mime-type"); + return FALSE; + } + + #if WEBKIT_CHECK_VERSION (1, 1, 3) + dialog = gtk_message_dialog_new ( + NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, + _("Open or download file")); + #if GLIB_CHECK_VERSION (2, 18, 0) + content_type = g_content_type_from_mime_type (mime_type); + #else + content_type = g_strdup (mime_type); + #endif + description = g_content_type_get_description (content_type); + #if GTK_CHECK_VERSION (2, 14, 0) + icon = g_content_type_get_icon (content_type); + image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DIALOG); + g_object_unref (icon); + gtk_widget_show (image); + gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image); + #endif + g_free (content_type); + if (g_strrstr (description, mime_type)) + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("File Type: '%s'"), mime_type); + else + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("File Type: %s ('%s')"), description, mime_type); + g_free (description); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE); + /* i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" */ + title = g_strdup_printf (_("Open %s"), + webkit_network_request_get_uri (request)); + gtk_window_set_title (GTK_WINDOW (dialog), title); + g_free (title); + screen = gtk_widget_get_screen (dialog); + if (screen) + { + icon_theme = gtk_icon_theme_get_for_screen (screen); + if (gtk_icon_theme_has_icon (icon_theme, STOCK_TRANSFER)) + gtk_window_set_icon_name (GTK_WINDOW (dialog), STOCK_TRANSFER); + else + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_OPEN); + } + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_SAVE, 1, + GTK_STOCK_CANCEL, 2, + GTK_STOCK_OPEN, 3, + NULL); + response = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + g_object_set_data (G_OBJECT (view), "open-download", (gpointer)0); + switch (response) + { + case 3: + g_object_set_data (G_OBJECT (view), "open-download", (gpointer)1); + case 1: + webkit_web_policy_decision_download (decision); + /* Apparently WebKit will continue loading which ends in an error. + It's unclear whether it's a bug or we are doing something wrong. */ + webkit_web_view_stop_loading (WEBKIT_WEB_VIEW (view->web_view)); + return TRUE; + case 2: + default: + /* Apparently WebKit will continue loading which ends in an error. + It's unclear whether it's a bug or we are doing something wrong. */ + webkit_web_view_stop_loading (WEBKIT_WEB_VIEW (view->web_view)); + return FALSE; + } + #else + katze_assign (view->mime_type, NULL); + midori_view_update_icon (view, NULL); + g_object_notify (G_OBJECT (view), "mime-type"); + + uri = g_strdup_printf ("error:nodisplay %s", + webkit_network_request_get_uri (request)); + midori_view_set_uri (view, uri); + g_free (uri); + + return TRUE; + #endif +} + +#if WEBKIT_CHECK_VERSION (1, 1, 3) +static gboolean +webkit_web_view_download_requested_cb (GtkWidget* web_view, + WebKitDownload* download, + MidoriView* view) +{ + gboolean handled; + g_object_set_data (G_OBJECT (download), "open-download", + g_object_get_data (G_OBJECT (view), "open-download")); + g_object_set_data (G_OBJECT (view), "open-download", (gpointer)0); + g_signal_emit (view, signals[DOWNLOAD_REQUESTED], 0, download, &handled); + return handled; +} +#endif + +static void +webkit_web_view_console_message_cb (GtkWidget* web_view, + const gchar* message, + guint line, + const gchar* source_id, + MidoriView* view) +{ + g_signal_emit (view, signals[CONSOLE_MESSAGE], 0, message, line, source_id); +} + +static void +webkit_web_view_window_object_cleared_cb (GtkWidget* web_view, + WebKitWebFrame* web_frame, + JSContextRef js_context, + JSObjectRef js_window, + MidoriView* view) +{ + g_signal_emit (view, signals[CONTEXT_READY], 0, js_context); +} + +static void +midori_view_init (MidoriView* view) +{ + view->uri = NULL; + view->title = NULL; + view->mime_type = g_strdup ("text/html"); + view->icon = gtk_widget_render_icon (GTK_WIDGET (view), GTK_STOCK_FILE, + GTK_ICON_SIZE_MENU, NULL); + view->progress = 0.0; + view->load_status = MIDORI_LOAD_FINISHED; + view->statusbar_text = NULL; + view->link_uri = NULL; + view->selected_text = NULL; + view->item = NULL; + + view->download_manager = NULL; + view->news_aggregator = NULL; + view->web_view = NULL; + + /* Adjustments are not created automatically */ + g_object_set (view, "hadjustment", NULL, "vadjustment", NULL, NULL); +} + +static void +midori_view_finalize (GObject* object) +{ + MidoriView* view; + + view = MIDORI_VIEW (object); + + if (view->settings) + g_signal_handlers_disconnect_by_func (view->settings, + midori_view_settings_notify_cb, view); + + katze_assign (view->uri, NULL); + katze_assign (view->title, NULL); + katze_object_assign (view->icon, NULL); + katze_assign (view->statusbar_text, NULL); + katze_assign (view->link_uri, NULL); + katze_assign (view->selected_text, NULL); + + katze_object_assign (view->settings, NULL); + katze_object_assign (view->item, NULL); + + katze_assign (view->download_manager, NULL); + katze_assign (view->news_aggregator, NULL); + + katze_object_assign (view->net, NULL); + + G_OBJECT_CLASS (midori_view_parent_class)->finalize (object); +} + +static void +midori_view_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriView* view; + + view = MIDORI_VIEW (object); + + switch (prop_id) + { + case PROP_TITLE: + katze_assign (view->title, g_value_dup_string (value)); + #define title midori_view_get_display_title (view) + if (view->tab_label) + { + gtk_label_set_text (GTK_LABEL (view->tab_title), title); + gtk_widget_set_tooltip_text (view->tab_title, title); + } + if (view->menu_item) + gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN ( + view->menu_item))), title); + if (view->item) + katze_item_set_name (view->item, title); + #undef title + break; + case PROP_ZOOM_LEVEL: + midori_view_set_zoom_level (view, g_value_get_float (value)); + break; + case PROP_STATUSBAR_TEXT: + katze_assign (view->statusbar_text, g_value_dup_string (value)); + break; + case PROP_SETTINGS: + midori_view_set_settings (view, g_value_get_object (value)); + break; + case PROP_NET: + katze_object_assign (view->net, g_value_dup_object (value)); + if (!view->net) + view->net = katze_net_new (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_view_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriView* view = MIDORI_VIEW (object); + + switch (prop_id) + { + case PROP_URI: + g_value_set_string (value, view->uri); + break; + case PROP_TITLE: + g_value_set_string (value, view->title); + break; + case PROP_MIME_TYPE: + g_value_set_string (value, view->mime_type); + break; + case PROP_ICON: + g_value_set_object (value, view->icon); + break; + case PROP_PROGRESS: + g_value_set_double (value, midori_view_get_progress (view)); + break; + case PROP_LOAD_STATUS: + g_value_set_enum (value, midori_view_get_load_status (view)); + break; + case PROP_ZOOM_LEVEL: + g_value_set_float (value, midori_view_get_zoom_level (view)); + break; + case PROP_STATUSBAR_TEXT: + g_value_set_string (value, view->statusbar_text); + break; + case PROP_SETTINGS: + g_value_set_object (value, view->settings); + break; + case PROP_NET: + g_value_set_object (value, view->net); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_view_new: + * @net: a #KatzeNet + * + * Creates a new view. + * + * Return value: a new #MidoriView + **/ +GtkWidget* +midori_view_new (KatzeNet* net) +{ + g_return_val_if_fail (!net || KATZE_IS_NET (net), NULL); + + return g_object_new (MIDORI_TYPE_VIEW, "net", net, NULL); +} + +static void +_midori_view_update_settings (MidoriView* view) +{ + gboolean zoom_text_and_images; + + g_object_get (view->settings, + "download-manager", &view->download_manager, + "news-aggregator", &view->news_aggregator, + "zoom-text-and-images", &zoom_text_and_images, + "close-buttons-on-tabs", &view->close_buttons_on_tabs, + "open-new-pages-in", &view->open_new_pages_in, + "middle-click-opens-selection", &view->middle_click_opens_selection, + "open-tabs-in-the-background", &view->open_tabs_in_the_background, + "find-while-typing", &view->find_while_typing, + NULL); + + if (view->web_view) + g_object_set (view->web_view, "full-content-zoom", + zoom_text_and_images, NULL); +} + +static void +midori_view_settings_notify_cb (MidoriWebSettings* settings, + GParamSpec* pspec, + MidoriView* view) +{ + const gchar* name; + GValue value = { 0, }; + + name = g_intern_string (g_param_spec_get_name (pspec)); + g_value_init (&value, pspec->value_type); + g_object_get_property (G_OBJECT (view->settings), name, &value); + + if (name == g_intern_string ("download-manager")) + { + katze_assign (view->download_manager, g_value_dup_string (&value)); + } + else if (name == g_intern_string ("news-aggregator")) + { + katze_assign (view->news_aggregator, g_value_dup_string (&value)); + } + else if (name == g_intern_string ("zoom-text-and-images")) + { + if (view->web_view) + g_object_set (view->web_view, "full-content-zoom", + g_value_get_boolean (&value), NULL); + } + else if (name == g_intern_string ("close-buttons-on-tabs")) + { + view->close_buttons_on_tabs = g_value_get_boolean (&value); + sokoke_widget_set_visible (view->tab_close, + view->close_buttons_on_tabs); + } + else if (name == g_intern_string ("open-new-pages-in")) + { + view->open_new_pages_in = g_value_get_enum (&value); + } + else if (name == g_intern_string ("middle-click-opens-selection")) + { + view->middle_click_opens_selection = g_value_get_boolean (&value); + } + else if (name == g_intern_string ("open-tabs-in-the-background")) + { + view->open_tabs_in_the_background = g_value_get_boolean (&value); + } + else if (name == g_intern_string ("find-while-typing")) + { + view->find_while_typing = g_value_get_boolean (&value); + } + + g_value_unset (&value); +} + +/** + * midori_view_set_settings: + * @view: a #MidoriView + * @settings: a #MidoriWebSettings + * + * Assigns a settings instance to the view. + **/ +void +midori_view_set_settings (MidoriView* view, + MidoriWebSettings* settings) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + g_return_if_fail (!settings || MIDORI_IS_WEB_SETTINGS (settings)); + + if (view->settings == settings) + return; + + if (view->settings) + g_signal_handlers_disconnect_by_func (view->settings, + midori_view_settings_notify_cb, view); + + katze_object_assign (view->settings, settings); + if (settings) + { + g_object_ref (settings); + if (view->web_view) + g_object_set (view->web_view, "settings", settings, NULL); + _midori_view_update_settings (view); + g_signal_connect (settings, "notify", + G_CALLBACK (midori_view_settings_notify_cb), view); + } + g_object_notify (G_OBJECT (view), "settings"); +} + +/** + * midori_view_load_status: + * @web_view: a #MidoriView + * + * Determines the current loading status of a view. + * + * Return value: the current #MidoriLoadStatus + **/ +MidoriLoadStatus +midori_view_get_load_status (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), MIDORI_LOAD_FINISHED); + + return view->load_status; +} + +/** + * midori_view_get_progress: + * @view: a #MidoriView + * + * Retrieves the current loading progress as + * a fraction between 0.0 and 1.0. + * + * Return value: the current loading progress + **/ +gdouble +midori_view_get_progress (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), 0.0); + + return view->progress; +} + +static WebKitWebView* +webkit_web_inspector_inspect_web_view_cb (gpointer inspector, + WebKitWebView* web_view, + MidoriView* view) +{ + gchar* title; + GtkWidget* window; + GtkWidget* toplevel; + GdkScreen* screen; + gint width, height; + GtkIconTheme* icon_theme; + GdkPixbuf* icon; + GdkPixbuf* gray_icon; + GtkWidget* inspector_view; + + title = g_strdup_printf (_("Inspect page - %s"), ""); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), title); + g_free (title); + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view)); + if (GTK_WIDGET_TOPLEVEL (toplevel)) + { + gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (toplevel)); + screen = gtk_window_get_screen (GTK_WINDOW (toplevel)); + width = gdk_screen_get_width (screen) / 1.7; + height = gdk_screen_get_height (screen) / 1.7; + gtk_window_set_default_size (GTK_WINDOW (window), width, height); + } + + /* Attempt to make a gray version of the icon on the fly */ + icon_theme = gtk_icon_theme_get_for_screen ( + gtk_widget_get_screen (GTK_WIDGET (view))); + icon = gtk_icon_theme_load_icon (icon_theme, "midori", 32, + GTK_ICON_LOOKUP_USE_BUILTIN, NULL); + if (icon) + { + gray_icon = gdk_pixbuf_copy (icon); + if (gray_icon) + { + gdk_pixbuf_saturate_and_pixelate (gray_icon, gray_icon, 0.1f, FALSE); + gtk_window_set_icon (GTK_WINDOW (window), gray_icon); + g_object_unref (gray_icon); + } + g_object_unref (icon); + } + else + gtk_window_set_icon_name (GTK_WINDOW (window), "midori"); + inspector_view = webkit_web_view_new (); + gtk_container_add (GTK_CONTAINER (window), inspector_view); + + /* FIXME: Implement web inspector signals properly + FIXME: Save and restore window size + FIXME: Update window title with URI */ + gtk_widget_show_all (window); + /* inspector_view = webkit_web_view_new (); + gtk_widget_show (inspector_view); + g_signal_emit (view, signals[ATTACH_INSPECTOR], 0, inspector_view); */ + return WEBKIT_WEB_VIEW (inspector_view); +} + +static void +midori_view_construct_web_view (MidoriView* view) +{ + WebKitWebFrame* web_frame; + gpointer inspector; + + view->web_view = webkit_web_view_new (); + + /* Load something to avoid a bug where WebKit might not set a main frame */ + webkit_web_view_open (WEBKIT_WEB_VIEW (view->web_view), ""); + web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)); + + g_object_connect (view->web_view, + "signal::load-started", + webkit_web_view_load_started_cb, view, + "signal::load-committed", + webkit_web_view_load_committed_cb, view, + "signal::load-progress-changed", + webkit_web_view_progress_changed_cb, view, + "signal::load-finished", + webkit_web_view_load_finished_cb, view, + "signal::title-changed", + webkit_web_view_title_changed_cb, view, + "signal::status-bar-text-changed", + webkit_web_view_statusbar_text_changed_cb, view, + "signal::hovering-over-link", + webkit_web_view_hovering_over_link_cb, view, + "signal::button-press-event", + gtk_widget_button_press_event_cb, view, + "signal::key-press-event", + gtk_widget_key_press_event_cb, view, + "signal::scroll-event", + gtk_widget_scroll_event_cb, view, + "signal::populate-popup", + webkit_web_view_populate_popup_cb, view, + "signal::console-message", + webkit_web_view_console_message_cb, view, + "signal::window-object-cleared", + webkit_web_view_window_object_cleared_cb, view, + "signal::create-web-view", + webkit_web_view_create_web_view_cb, view, + "signal::mime-type-policy-decision-requested", + webkit_web_view_mime_type_decision_cb, view, + #if WEBKIT_CHECK_VERSION (1, 1, 3) + "signal::download-requested", + webkit_web_view_download_requested_cb, view, + #endif + NULL); + + g_object_connect (web_frame, + "signal::load-done", + webkit_web_frame_load_done_cb, view, + NULL); + + if (view->settings) + { + g_object_set (view->web_view, "settings", view->settings, + "full-content-zoom", katze_object_get_boolean (view->settings, + "zoom-text-and-images"), NULL); + } + + gtk_widget_show (view->web_view); + gtk_container_add (GTK_CONTAINER (view), view->web_view); + + inspector = katze_object_get_object (view->web_view, "web-inspector"); + g_object_connect (inspector, "signal::inspect-web-view", + webkit_web_inspector_inspect_web_view_cb, view, NULL); +} + +/** + * midori_view_set_uri: + * @view: a #MidoriView + * + * Opens the specified URI in the view. + **/ +void +midori_view_set_uri (MidoriView* view, + const gchar* uri) +{ + gchar* data; + + g_return_if_fail (MIDORI_IS_VIEW (view)); + + if (!uri) uri = ""; + + if (1) + { + if (!view->web_view) + midori_view_construct_web_view (view); + /* This is not prefectly elegant, but creating an + error page inline is the simplest solution. */ + if (g_str_has_prefix (uri, "error:")) + { + data = NULL; + if (!strncmp (uri, "error:nodisplay ", 16)) + { + gchar* title; + + katze_assign (view->uri, g_strdup (&uri[16])); + title = g_strdup_printf (_("Document cannot be displayed")); + data = g_strdup_printf ( + "%s" + "

%s

" + "" + "

The document %s of type '%s' cannot be displayed." + "", + title, title, view->uri, view->mime_type); + g_free (title); + } + else if (!strncmp (uri, "error:nodocs ", 13)) + { + gchar* title; + + katze_assign (view->uri, g_strdup (&uri[13])); + title = g_strdup_printf (_("No documentation installed")); + data = g_strdup_printf ( + "%s" + "

%s

" + "" + "

There is no documentation installed at %s." + "You may want to ask your distribution or " + "package maintainer for it or if this a custom build " + "verify that the build is setup properly." + "", + title, title, view->uri); + g_free (title); + } + if (data) + { + webkit_web_view_load_html_string ( + WEBKIT_WEB_VIEW (view->web_view), data, view->uri); + g_free (data); + g_object_notify (G_OBJECT (view), "uri"); + if (view->item) + katze_item_set_uri (view->item, uri); + return; + } + } + else if (g_str_has_prefix (uri, "javascript:")) + { + midori_view_execute_script (view, &uri[11], NULL); + } + else if (g_str_has_prefix (uri, "mailto:")) + { + if (!gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, NULL)) + { + /* Fallback to Exo for example if GConf isn't setup */ + gchar* command = g_strconcat ("exo-open ", uri, NULL); + g_spawn_command_line_async (command, NULL); + g_free (command); + } + } + else + { + katze_assign (view->uri, g_strdup (uri)); + g_object_notify (G_OBJECT (view), "uri"); + if (view->item) + katze_item_set_uri (view->item, uri); + webkit_web_view_open (WEBKIT_WEB_VIEW (view->web_view), uri); + } + } +} + +/** + * midori_view_is_blank: + * @view: a #MidoriView + * + * Determines whether the view is currently empty. + **/ +gboolean +midori_view_is_blank (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), TRUE); + + return midori_view_get_display_uri (view)[0] == '\0'; +} + +/** + * midori_view_get_icon: + * @view: a #MidoriView + * + * Retrieves the icon of the view. + * + * Return value: a #GdkPixbuf + **/ +GdkPixbuf* +midori_view_get_icon (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); + + return view->icon; +} + +/** + * midori_view_get_display_uri: + * @view: a #MidoriView + * + * Retrieves a string that is suitable for displaying. + * + * Note that "about:blank" is represented as "". + * + * You can assume that the string is not %NULL. + * + * Return value: an URI string + **/ +const gchar* +midori_view_get_display_uri (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), ""); + + /* Something in the stack tends to turn "" into "about:blank". + Yet for practical purposes we prefer "". */ + if (view->uri && !strcmp (view->uri, "about:blank")) + return ""; + + if (view->uri && *view->uri) + return view->uri; + return ""; +} + +/** + * midori_view_get_display_title: + * @view: a #MidoriView + * + * Retrieves a string that is suitable for displaying + * as a title. Most of the time this will be the title + * or the current URI. + * + * An empty page is represented as "about:blank". + * + * You can assume that the string is not %NULL. + * + * Return value: a title string + **/ +const gchar* +midori_view_get_display_title (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), "about:blank"); + + if (midori_view_is_blank (view)) + return _("Blank page"); + + if (view->title && *view->title) + return view->title; + return midori_view_get_display_uri (view); +} + +/** + * midori_view_get_link_uri: + * @view: a #MidoriView + * + * Retrieves the uri of the currently focused link, + * particularly while the mouse hovers a link or a + * context menu is being opened. + * + * Return value: an URI string, or %NULL if there is no link focussed + **/ +const gchar* +midori_view_get_link_uri (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); + + return view->link_uri; +} + +/** + * midori_view_has_selection: + * @view: a #MidoriView + * + * Determines whether something in the view is selected. + * + * This function returns %FALSE if there is a selection + * that effectively only consists of whitespace. + * + * Return value: %TRUE if effectively there is a selection + **/ +gboolean +midori_view_has_selection (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + katze_assign (view->selected_text, webkit_web_view_get_selected_text ( + WEBKIT_WEB_VIEW (view->web_view))); + if (view->selected_text && *view->selected_text) + return TRUE; + else + return FALSE; +} + +/** + * midori_view_get_selected_text: + * @view: a #MidoriView + * + * Retrieves the currently selected text. + * + * Return value: the selected text, or %NULL + **/ +const gchar* +midori_view_get_selected_text (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); + + if (midori_view_has_selection (view)) + return view->selected_text; + return NULL; +} + +/** + * midori_view_can_cut_clipboard: + * @view: a #MidoriView + * + * Determines whether a selection can be cut. + * + * Return value: %TRUE if a selection can be cut + **/ +gboolean +midori_view_can_cut_clipboard (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + if (view->web_view) + return webkit_web_view_can_cut_clipboard ( + WEBKIT_WEB_VIEW (view->web_view)); + else + return FALSE; +} + +/** + * midori_view_can_copy_clipboard: + * @view: a #MidoriView + * + * Determines whether a selection can be copied. + * + * Return value: %TRUE if a selection can be copied + **/ +gboolean +midori_view_can_copy_clipboard (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + if (view->web_view) + return webkit_web_view_can_copy_clipboard ( + WEBKIT_WEB_VIEW (view->web_view)); + else + return FALSE; +} + +/** + * midori_view_can_paste_clipboard: + * @view: a #MidoriView + * + * Determines whether a selection can be pasted. + * + * Return value: %TRUE if a selection can be pasted + **/ +gboolean +midori_view_can_paste_clipboard (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + if (view->web_view) + return webkit_web_view_can_paste_clipboard ( + WEBKIT_WEB_VIEW (view->web_view)); + else + return FALSE; +} + +/** + * midori_view_get_proxy_menu_item: + * @view: a #MidoriView + * + * Retrieves a proxy menu item that is typically added to a Window menu + * and which on activation switches to the right window/ tab. + * + * The item is created on the first call and will be updated to reflect + * changes to the icon and title automatically. + * + * The menu item is valid until it is removed from its container. + * + * Return value: the proxy #GtkMenuItem + **/ +GtkWidget* +midori_view_get_proxy_menu_item (MidoriView* view) +{ + const gchar* title; + + g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); + + if (!view->menu_item) + { + title = midori_view_get_display_title (view); + view->menu_item = sokoke_image_menu_item_new_ellipsized (title); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (view->menu_item), + gtk_image_new_from_pixbuf (view->icon)); + + g_signal_connect (view->menu_item, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &view->menu_item); + } + return view->menu_item; +} + +static gboolean +midori_view_tab_label_button_release_event (GtkWidget* tab_label, + GdkEventButton* event, + GtkWidget* widget) +{ + if (event->button == 2) + { + /* Close the widget on middle click */ + gtk_widget_destroy (widget); + return TRUE; + } + + return FALSE; +} + +static void +midori_view_tab_close_clicked (GtkWidget* tab_close, + GtkWidget* widget) +{ + gtk_widget_destroy (widget); +} + +static void +midori_view_tab_icon_style_set_cb (GtkWidget* tab_icon, + GtkStyle* previous_style) +{ + GtkSettings* gtk_settings; + gint width, height; + + gtk_settings = gtk_widget_get_settings (tab_icon); + gtk_icon_size_lookup_for_settings (gtk_settings, GTK_ICON_SIZE_MENU, + &width, &height); + gtk_widget_set_size_request (tab_icon, width + 4, height + 4); +} + +static void +midori_view_update_tab_title (GtkWidget* label, + gint size, + gdouble angle) +{ + gint width; + + sokoke_widget_get_text_size (label, "M", &width, NULL); + if (angle == 0.0 || angle == 360.0) + { + gtk_widget_set_size_request (label, width * size, -1); + gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); + } + else + { + gtk_widget_set_size_request (label, -1, width * size); + gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_NONE); + } + gtk_label_set_angle (GTK_LABEL (label), angle); +} + +static void +gtk_box_repack (GtkBox* box, + GtkWidget* child) +{ + GtkWidget* old_box; + gboolean expand, fill; + guint padding; + GtkPackType pack_type; + + old_box = gtk_widget_get_parent (child); + g_return_if_fail (GTK_IS_BOX (old_box)); + + gtk_box_query_child_packing (GTK_BOX (old_box), child, + &expand, &fill, &padding, &pack_type); + + g_object_ref (child); + gtk_container_remove (GTK_CONTAINER (old_box), child); + if (pack_type == GTK_PACK_START) + gtk_box_pack_start (box, child, expand, fill, padding); + else + gtk_box_pack_end (box, child, expand, fill, padding); + g_object_unref (child); +} + +static void +midori_view_tab_label_parent_set (GtkWidget* tab_label, + GtkObject* old_parent, + MidoriView* view) +{ + GtkWidget* parent; + + /* FIXME: Disconnect orientation notification + if (old_parent) + ; */ + + if (!(parent = gtk_widget_get_parent (tab_label))) + return; + + if (GTK_IS_NOTEBOOK (parent)) + { + GtkPositionType pos; + gdouble old_angle, angle; + GtkWidget* box; + + pos = gtk_notebook_get_tab_pos (GTK_NOTEBOOK (parent)); + old_angle = gtk_label_get_angle (GTK_LABEL (view->tab_title)); + switch (pos) + { + case GTK_POS_LEFT: + angle = 90.0; + break; + case GTK_POS_RIGHT: + angle = 270.0; + break; + default: + angle = 0.0; + } + + if (old_angle != angle) + { + if (angle == 0.0) + box = gtk_hbox_new (FALSE, 1); + else + box = gtk_vbox_new (FALSE, 1); + gtk_box_repack (GTK_BOX (box), view->tab_icon); + gtk_box_repack (GTK_BOX (box), view->tab_title); + gtk_box_repack (GTK_BOX (box), view->tab_close); + + gtk_container_remove (GTK_CONTAINER (tab_label), + gtk_bin_get_child (GTK_BIN (tab_label))); + gtk_container_add (GTK_CONTAINER (tab_label), GTK_WIDGET (box)); + gtk_widget_show (box); + } + + midori_view_update_tab_title (view->tab_title, 10, angle); + + /* FIXME: Connect orientation notification */ + } +} + +/** + * midori_view_get_proxy_tab_label: + * @view: a #MidoriView + * + * Retrieves a proxy tab label that is typically used when + * adding the view to a notebook. + * + * Note that the label actually adjusts its orientation + * to the according tab position when used in a notebook. + * + * The label is created on the first call and will be updated to reflect + * changes of the loading progress and title. + * + * The label is valid until it is removed from its container. + * + * Return value: the proxy #GtkEventBox + **/ +GtkWidget* +midori_view_get_proxy_tab_label (MidoriView* view) +{ + GtkWidget* event_box; + GtkWidget* hbox; + GtkRcStyle* rcstyle; + GtkWidget* image; + + g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); + + if (!view->tab_label) + { + view->tab_icon = katze_throbber_new (); + katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon), + midori_view_get_icon (view)); + gtk_misc_set_alignment (GTK_MISC (view->tab_icon), 0.0, 0.5); + + view->tab_title = gtk_label_new (midori_view_get_display_title (view)); + gtk_misc_set_alignment (GTK_MISC (view->tab_title), 0.0, 0.5); + + event_box = gtk_event_box_new (); + gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE); + hbox = gtk_hbox_new (FALSE, 1); + gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (hbox)); + midori_view_update_tab_title (view->tab_title, 10, 0.0); + + view->tab_close = gtk_button_new (); + gtk_button_set_relief (GTK_BUTTON (view->tab_close), GTK_RELIEF_NONE); + gtk_button_set_focus_on_click (GTK_BUTTON (view->tab_close), FALSE); + rcstyle = gtk_rc_style_new (); + rcstyle->xthickness = rcstyle->ythickness = 0; + gtk_widget_modify_style (view->tab_close, rcstyle); + g_object_unref (rcstyle); + image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); + gtk_button_set_image (GTK_BUTTON (view->tab_close), image); + gtk_misc_set_alignment (GTK_MISC (image), 0.0, 0.5); + + #if HAVE_OSX + gtk_box_pack_end (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0); + gtk_box_pack_end (GTK_BOX (hbox), view->tab_title, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), view->tab_close, FALSE, FALSE, 0); + #else + gtk_box_pack_start (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), view->tab_title, FALSE, TRUE, 0); + gtk_box_pack_end (GTK_BOX (hbox), view->tab_close, FALSE, FALSE, 0); + #endif + gtk_widget_show_all (GTK_WIDGET (event_box)); + + if (!view->close_buttons_on_tabs) + gtk_widget_hide (view->tab_close); + + g_signal_connect (event_box, "button-release-event", + G_CALLBACK (midori_view_tab_label_button_release_event), view); + g_signal_connect (view->tab_close, "style-set", + G_CALLBACK (midori_view_tab_icon_style_set_cb), NULL); + g_signal_connect (view->tab_close, "clicked", + G_CALLBACK (midori_view_tab_close_clicked), view); + + view->tab_label = event_box; + g_signal_connect (view->tab_icon, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &view->tab_icon); + g_signal_connect (view->tab_label, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &view->tab_label); + + g_signal_connect (view->tab_label, "parent-set", + G_CALLBACK (midori_view_tab_label_parent_set), + view); + } + return view->tab_label; +} + +/** + * midori_view_get_proxy_item: + * @view: a #MidoriView + * + * Retrieves a proxy item that can be used for bookmark storage as + * well as session management. + * + * The item is created on the first call and will be updated to reflect + * changes to the title and uri automatically. + * + * Return value: the proxy #KatzeItem + **/ +KatzeItem* +midori_view_get_proxy_item (MidoriView* view) +{ + const gchar* uri; + const gchar* title; + + g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); + + if (!view->item) + { + view->item = katze_item_new (); + uri = midori_view_get_display_uri (view); + katze_item_set_uri (view->item, uri); + title = midori_view_get_display_title (view); + katze_item_set_name (view->item, title); + } + return view->item; +} + +/** + * midori_view_get_zoom_level: + * @view: a #MidoriView + * + * Determines the current zoom level of the view. + * + * Return value: the current zoom level + **/ +gfloat +midori_view_get_zoom_level (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), 1.0f); + + if (view->web_view != NULL) + return webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW (view->web_view)); + return 1.0f; +} + +/** + * midori_view_set_zoom_level: + * @view: a #MidoriView + * @zoom_level: the new zoom level + * + * Sets the current zoom level of the view. + **/ +void +midori_view_set_zoom_level (MidoriView* view, + gfloat zoom_level) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_set_zoom_level ( + WEBKIT_WEB_VIEW (view->web_view), zoom_level); + g_object_notify (G_OBJECT (view), "zoom-level"); +} + +gboolean +midori_view_can_zoom_in (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + return view->web_view != NULL; +} + +gboolean +midori_view_can_zoom_out (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + return view->web_view != NULL; +} + +gboolean +midori_view_can_view_source (MidoriView* view) +{ + const gchar* uri = view->uri; + + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + /* FIXME: Consider other types that are also text */ + if (!g_str_has_prefix (view->mime_type, "text/") + && !g_strrstr (view->mime_type, "xml")) + return FALSE; + + if (!uri) + return FALSE; + if (g_str_has_prefix (uri, "http://") || g_str_has_prefix (uri, "https://")) + return TRUE; + if (g_str_has_prefix (uri, "file://")) + return TRUE; + return FALSE; +} + +#define can_do(what) \ +gboolean \ +midori_view_can_##what (MidoriView* view) \ +{ \ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); \ +\ + return view->web_view != NULL; \ +} + +can_do (reload) +can_do (print) +can_do (find) + +/** + * midori_view_reload: + * @view: a #MidoriView + * @from_cache: whether to allow caching + * + * Reloads the view. + * + * Note: The @from_cache value is currently ignored. + **/ +void +midori_view_reload (MidoriView* view, + gboolean from_cache) +{ + gchar* title; + + g_return_if_fail (MIDORI_IS_VIEW (view)); + + /* Error pages are special, we want to try loading the destination + again, not the error page which isn't even a proper page */ + title = g_strdup_printf (_("Not found - %s"), view->uri); + if (view->title && strstr (title, view->title)) + webkit_web_view_open (WEBKIT_WEB_VIEW (view->web_view), view->uri); + else if (from_cache) + webkit_web_view_reload (WEBKIT_WEB_VIEW (view->web_view)); + else + webkit_web_view_reload_bypass_cache (WEBKIT_WEB_VIEW (view->web_view)); + + g_free (title); +} + +/** + * midori_view_stop_loading + * @view: a #MidoriView + * + * Stops loading the view if it is currently loading. + **/ +void +midori_view_stop_loading (MidoriView* view) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_stop_loading (WEBKIT_WEB_VIEW (view->web_view)); +} + +/** + * midori_view_can_go_back + * @view: a #MidoriView + * + * Determines whether the view can go back. + **/ +gboolean +midori_view_can_go_back (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + if (view->web_view) + return webkit_web_view_can_go_back (WEBKIT_WEB_VIEW (view->web_view)); + else + return FALSE; +} + +/** + * midori_view_go_back + * @view: a #MidoriView + * + * Goes back one page in the view. + **/ +void +midori_view_go_back (MidoriView* view) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_go_back (WEBKIT_WEB_VIEW (view->web_view)); +} + +/** + * midori_view_can_go_forward + * @view: a #MidoriView + * + * Determines whether the view can go forward. + **/ +gboolean +midori_view_can_go_forward (MidoriView* view) +{ + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + + if (view->web_view) + return webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW (view->web_view)); + else + return FALSE; +} + +/** + * midori_view_go_forward + * @view: a #MidoriView + * + * Goes forward one page in the view. + **/ +void +midori_view_go_forward (MidoriView* view) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_go_forward (WEBKIT_WEB_VIEW (view->web_view)); +} + +/** + * midori_view_print + * @view: a #MidoriView + * + * Prints the contents of the view. + **/ +void +midori_view_print (MidoriView* view) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_frame_print (webkit_web_view_get_main_frame ( + WEBKIT_WEB_VIEW (view->web_view))); +} + +/** + * midori_view_unmark_text_matches + * @view: a #MidoriView + * + * Unmarks the text matches in the view. + **/ +void +midori_view_unmark_text_matches (MidoriView* view) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (view->web_view)); +} + +/** + * midori_view_search_text + * @view: a #MidoriView + * @text: a string + * @case_sensitive: case sensitivity + * @forward: whether to search forward + * + * Searches a text within the view. + **/ +void +midori_view_search_text (MidoriView* view, + const gchar* text, + gboolean case_sensitive, + gboolean forward) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + g_signal_emit (view, signals[SEARCH_TEXT], 0, + webkit_web_view_search_text (WEBKIT_WEB_VIEW (view->web_view), + text, case_sensitive, forward, TRUE), NULL); +} + +/** + * midori_view_mark_text_matches + * @view: a #MidoriView + * @text: a string + * @case_sensitive: case sensitivity + * + * Marks all text matches within the view. + **/ +void +midori_view_mark_text_matches (MidoriView* view, + const gchar* text, + gboolean case_sensitive) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (view->web_view), + text, case_sensitive, 0); +} + +/** + * midori_view_set_highlight_text_matches + * @view: a #MidoriView + * @highlight: whether to highlight matches + * + * Whether to highlight all matches within the view. + **/ +void +midori_view_set_highlight_text_matches (MidoriView* view, + gboolean highlight) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + webkit_web_view_set_highlight_text_matches ( + WEBKIT_WEB_VIEW (view->web_view), highlight); +} + +/** + * midori_view_execute_script + * @view: a #MidoriView + * @script: script code + * @exception: location to store an exception message + * + * Execute a script on the view. + * + * Returns: %TRUE if the script was executed successfully + **/ +gboolean +midori_view_execute_script (MidoriView* view, + const gchar* script, + gchar** exception) +{ + WebKitWebFrame* web_frame; + JSContextRef js_context; + gchar* script_decoded; + + g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); + g_return_val_if_fail (script != NULL, FALSE); + + /* FIXME Actually store exception. */ + web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)); + js_context = webkit_web_frame_get_global_context (web_frame); + if ((script_decoded = soup_uri_decode (script))) + { + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view->web_view), + script_decoded); + g_free (script_decoded); + } + else + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view->web_view), script); + return TRUE; +} diff --git a/midori/midori-view.h b/midori/midori-view.h new file mode 100644 index 00000000..74fa2834 --- /dev/null +++ b/midori/midori-view.h @@ -0,0 +1,194 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_VIEW_H__ +#define __MIDORI_VIEW_H__ + +#include "midori-websettings.h" + +#include + +G_BEGIN_DECLS + +typedef enum +{ + MIDORI_LOAD_PROVISIONAL, + MIDORI_LOAD_COMMITTED, + MIDORI_LOAD_FINISHED +} MidoriLoadStatus; + +GType +midori_load_status_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_LOAD_STATUS \ + (midori_load_status_get_type ()) + +typedef enum +{ + MIDORI_NEW_VIEW_TAB, + MIDORI_NEW_VIEW_BACKGROUND, + MIDORI_NEW_VIEW_WINDOW +} MidoriNewView; + +GType +midori_new_view_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_NEW_VIEW \ + (midori_new_view_get_type ()) + +#define MIDORI_TYPE_VIEW \ + (midori_view_get_type ()) +#define MIDORI_VIEW(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_VIEW, MidoriView)) +#define MIDORI_VIEW_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_VIEW, MidoriViewClass)) +#define MIDORI_IS_VIEW(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_VIEW)) +#define MIDORI_IS_VIEW_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_VIEW)) +#define MIDORI_VIEW_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_VIEW, MidoriViewClass)) + +typedef struct _MidoriView MidoriView; +typedef struct _MidoriViewClass MidoriViewClass; + +GType +midori_view_get_type (void); + +GtkWidget* +midori_view_new (KatzeNet* net); + +void +midori_view_set_settings (MidoriView* view, + MidoriWebSettings* settings); + +gdouble +midori_view_get_progress (MidoriView* view); + +MidoriLoadStatus +midori_view_get_load_status (MidoriView* view); + +void +midori_view_set_uri (MidoriView* view, + const gchar* uri); + +gboolean +midori_view_is_blank (MidoriView* view); + +const gchar* +midori_view_get_display_uri (MidoriView* view); + +const gchar* +midori_view_get_display_title (MidoriView* view); + +GdkPixbuf* +midori_view_get_icon (MidoriView* view); + +const gchar* +midori_view_get_link_uri (MidoriView* view); + +gboolean +midori_view_has_selection (MidoriView* view); + +const gchar* +midori_view_get_selected_text (MidoriView* view); + +gboolean +midori_view_can_cut_clipboard (MidoriView* view); + +gboolean +midori_view_can_copy_clipboard (MidoriView* view); + +gboolean +midori_view_can_paste_clipboard (MidoriView* view); + +GtkWidget* +midori_view_get_proxy_menu_item (MidoriView* view); + +GtkWidget* +midori_view_get_proxy_tab_label (MidoriView* view); + +KatzeItem* +midori_view_get_proxy_item (MidoriView* view); + +gfloat +midori_view_get_zoom_level (MidoriView* view); + +gboolean +midori_view_can_zoom_in (MidoriView* view); + +gboolean +midori_view_can_zoom_out (MidoriView* view); + +void +midori_view_set_zoom_level (MidoriView* view, + gfloat zoom_level); + +gboolean +midori_view_can_reload (MidoriView* view); + +void +midori_view_reload (MidoriView* view, + gboolean from_cache); + +void +midori_view_stop_loading (MidoriView* view); + +gboolean +midori_view_can_go_back (MidoriView* view); + +void +midori_view_go_back (MidoriView* view); + +gboolean +midori_view_can_go_forward (MidoriView* view); + +void +midori_view_go_forward (MidoriView* view); + +gboolean +midori_view_can_print (MidoriView* view); + +void +midori_view_print (MidoriView* view); + +gboolean +midori_view_can_view_source (MidoriView* view); + +gboolean +midori_view_can_find (MidoriView* view); + +void +midori_view_unmark_text_matches (MidoriView* view); + +void +midori_view_search_text (MidoriView* view, + const gchar* text, + gboolean case_sensitive, + gboolean forward); + +void +midori_view_mark_text_matches (MidoriView* view, + const gchar* text, + gboolean case_sensitive); + +void +midori_view_set_highlight_text_matches (MidoriView* view, + gboolean highlight); + +gboolean +midori_view_execute_script (MidoriView* view, + const gchar* script, + gchar** exception); + +G_END_DECLS + +#endif /* __MIDORI_VIEW_H__ */ diff --git a/midori/midori-viewable.c b/midori/midori-viewable.c new file mode 100644 index 00000000..7d43ea28 --- /dev/null +++ b/midori/midori-viewable.c @@ -0,0 +1,263 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-viewable.h" + +#include + +static void +midori_viewable_base_init (MidoriViewableIface* iface); + +static void +midori_viewable_base_finalize (MidoriViewableIface* iface); + +GType +midori_viewable_get_type (void) +{ + static GType viewable_type = 0; + + if (!viewable_type) + { + const GTypeInfo viewable_info = + { + sizeof (MidoriViewableIface), + (GBaseInitFunc) midori_viewable_base_init, + (GBaseFinalizeFunc) midori_viewable_base_finalize, + }; + + viewable_type = g_type_register_static (G_TYPE_INTERFACE, + "MidoriViewable", + &viewable_info, 0); + g_type_interface_add_prerequisite (viewable_type, GTK_TYPE_WIDGET); + } + + return viewable_type; +} + +static const gchar* +midori_viewable_default_get_stock_id (MidoriViewable* viewable) +{ + return NULL; +} + +static const gchar* +midori_viewable_default_get_label (MidoriViewable* viewable) +{ + return NULL; +} + +static GtkWidget* +midori_viewable_default_get_toolbar (MidoriViewable* viewable) +{ + return NULL; +} + +static void +midori_viewable_base_init (MidoriViewableIface* iface) +{ + static gboolean initialized = FALSE; + + if (initialized) + return; + + iface->p = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + iface->get_stock_id = midori_viewable_default_get_stock_id; + iface->get_label = midori_viewable_default_get_label; + iface->get_toolbar = midori_viewable_default_get_toolbar; + + initialized = TRUE; +} + +static void +midori_viewable_base_finalize (MidoriViewableIface* iface) +{ + g_hash_table_destroy (iface->p); +} + +/** + * midori_viewable_new_from_uri: + * @uri: an URI + * + * Attempts to create a new #MidoriViewable from the specified URI. + * + * The protocol of @uri must previously have been registered by + * the #MidoriViewable via midori_viewable_register_protocol(). + * + * Return value: a new #MidoriViewable, or %NULL + **/ +GtkWidget* +midori_viewable_new_from_uri (const gchar* uri) +{ + MidoriViewableIface* iface; + gchar** parts; + gchar* type_name; + GType type; + + if (!(iface = g_type_default_interface_peek (MIDORI_TYPE_VIEWABLE))) + { + g_warning ("No viewable interface available"); + return NULL; + } + + g_return_val_if_fail (uri != NULL, NULL); + + if (!g_hash_table_size (iface->p)) + return NULL; + + if ((parts = g_strsplit (uri, "://", 2))) + { + if (!(type_name = g_hash_table_lookup (iface->p, parts[0]))) + { + /* FIXME: Support midori://dummy/foo */ + + type_name = g_hash_table_lookup (iface->p, uri); + } + g_strfreev (parts); + if (type_name) + { + type = g_type_from_name (type_name); + g_free (type_name); + if (type) + return g_object_new (type, "uri", uri, NULL); + } + } + else if ((parts = g_strsplit_set (uri, ":", 2))) + { + type_name = g_hash_table_lookup (iface->p, parts[0]); + g_strfreev (parts); + if (type_name) + { + type = g_type_from_name (type_name); + g_free (type_name); + if (type) + return g_object_new (type, "uri", uri, NULL); + } + } + return NULL; +} + +static gboolean +viewable_type_implements (GType type, + GType interface) +{ + GType *interfaces; + guint i; + + if (!(interfaces = g_type_interfaces (type, NULL))) + return FALSE; + for (i = 0; interfaces[i]; i++) + { + if (interfaces[i] == interface) + { + g_free (interfaces); + return TRUE; + } + } + g_free (interfaces); + return FALSE; +} + +/** + * midori_viewable_register_protocol: + * @type: a type that implements #MidoriViewable + * @protocol: a protocol + * + * Registers the specified protocol as supported by @type. + * + * The following kinds of protocols are supported: + * + * "dummy": support URIs like "dummy://foo/bar" + * "about:dummy": support URIs like "about:dummy" + * FIXME: The following is not yet fully supported + * "midori://dummy": support URIs like "midori://dummy/foo" + * + * Return value: a new #MidoriViewable, or %NULL + **/ +void +midori_viewable_register_protocol (GType type, + const gchar* protocol) +{ + MidoriViewableIface* iface; + GObjectClass* class; + + if (!(iface = g_type_default_interface_peek (MIDORI_TYPE_VIEWABLE))) + { + g_warning ("No viewable interface available"); + return; + } + + g_return_if_fail (viewable_type_implements (type, MIDORI_TYPE_VIEWABLE)); + + if (!(class = g_type_class_peek (type))) + { + g_warning ("No class for %s available", g_type_name (type)); + return; + } + g_return_if_fail (g_object_class_find_property (class, "uri")); + /* FIXME: Verify the syntax of protocol */ + + g_hash_table_insert (iface->p, g_strdup (protocol), + g_strdup (g_type_name (type))); +} + +/** + * midori_viewable_get_stock_id: + * @viewable: a #MidoriViewable + * + * Retrieves the stock ID of the viewable. + * + * Return value: a stock ID + **/ +const gchar* +midori_viewable_get_stock_id (MidoriViewable* viewable) +{ + g_return_val_if_fail (MIDORI_IS_VIEWABLE (viewable), NULL); + + return MIDORI_VIEWABLE_GET_IFACE (viewable)->get_stock_id (viewable); +} + +/** + * midori_viewable_get_label: + * @viewable: a #MidoriViewable + * + * Retrieves the label of the viewable. + * + * Return value: a label string + **/ +const gchar* +midori_viewable_get_label (MidoriViewable* viewable) +{ + g_return_val_if_fail (MIDORI_IS_VIEWABLE (viewable), NULL); + + return MIDORI_VIEWABLE_GET_IFACE (viewable)->get_label (viewable); +} + +/** + * midori_viewable_get_toolbar: + * @viewable: a #MidoriViewable + * + * Retrieves the toolbar of the viewable. + * + * Return value: a toolbar + **/ +GtkWidget* +midori_viewable_get_toolbar (MidoriViewable* viewable) +{ + GtkWidget* toolbar; + + g_return_val_if_fail (MIDORI_IS_VIEWABLE (viewable), NULL); + + toolbar = MIDORI_VIEWABLE_GET_IFACE (viewable)->get_toolbar (viewable); + if (!toolbar) + toolbar = gtk_event_box_new (); + return toolbar; +} diff --git a/midori/midori-viewable.h b/midori/midori-viewable.h new file mode 100644 index 00000000..80a6a108 --- /dev/null +++ b/midori/midori-viewable.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_VIEWABLE_H__ +#define __MIDORI_VIEWABLE_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_VIEWABLE \ + (midori_viewable_get_type ()) +#define MIDORI_VIEWABLE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_VIEWABLE, MidoriViewable)) +#define MIDORI_IS_VIEWABLE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_VIEWABLE)) +#define MIDORI_VIEWABLE_GET_IFACE(inst) \ + (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MIDORI_TYPE_VIEWABLE, \ + MidoriViewableIface)) + +typedef struct _MidoriViewable MidoriViewable; +typedef struct _MidoriViewableIface MidoriViewableIface; + +struct _MidoriViewableIface +{ + GTypeInterface base_iface; + + /* Virtual functions */ + const gchar* + (*get_stock_id) (MidoriViewable* viewable); + + const gchar* + (*get_label) (MidoriViewable* viewable); + + GtkWidget* + (*get_toolbar) (MidoriViewable* viewable); + + /* Private data */ + gpointer p; +}; + +GType +midori_viewable_get_type (void); + +GtkWidget* +midori_viewable_new_from_uri (const gchar* uri); + +void +midori_viewable_register_protocol (GType type, + const gchar* protocol); + +const gchar* +midori_viewable_get_stock_id (MidoriViewable* viewable); + +const gchar* +midori_viewable_get_label (MidoriViewable* viewable); + +GtkWidget* +midori_viewable_get_toolbar (MidoriViewable* viewable); + +G_END_DECLS + +#endif /* __MIDORI_VIEWABLE_H__ */ diff --git a/midori/midori-websettings.c b/midori/midori-websettings.c new file mode 100644 index 00000000..eda71aae --- /dev/null +++ b/midori/midori-websettings.c @@ -0,0 +1,1399 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-websettings.h" + +#include "sokoke.h" + +#include +#include + +#if HAVE_CONFIG_H + #include +#endif + +struct _MidoriWebSettings +{ + WebKitWebSettings parent_instance; + + gboolean remember_last_window_size; + gint last_window_width; + gint last_window_height; + MidoriWindowState last_window_state; + gint last_panel_position; + gint last_panel_page; + gint last_web_search; + + gboolean show_menubar; + gboolean show_navigationbar; + gboolean show_bookmarkbar; + gboolean show_panel; + gboolean show_transferbar; + gboolean show_statusbar; + + MidoriToolbarStyle toolbar_style; + gboolean progress_in_location; + gboolean search_engines_in_completion; + gchar* toolbar_items; + gboolean compact_sidepanel; + gboolean right_align_sidepanel; + + MidoriStartup load_on_startup; + gchar* homepage; + gboolean show_crash_dialog; + gchar* download_folder; + gchar* download_manager; + gchar* text_editor; + gchar* news_aggregator; + gchar* location_entry_search; + MidoriPreferredEncoding preferred_encoding; + + gboolean always_show_tabbar; + gboolean close_buttons_on_tabs; + MidoriNewPage open_new_pages_in; + MidoriNewPage open_external_pages_in; + gboolean middle_click_opens_selection; + gboolean open_tabs_in_the_background; + gboolean open_tabs_next_to_current; + gboolean open_popups_in_tabs; + + gboolean zoom_text_and_images; + gboolean find_while_typing; + MidoriAcceptCookies accept_cookies; + gboolean original_cookies_only; + gint maximum_cookie_age; + + gboolean remember_last_visited_pages; + gint maximum_history_age; + gboolean remember_last_form_inputs; + gboolean remember_last_downloaded_files; + + gchar* http_proxy; + gboolean auto_detect_proxy; + MidoriIdentity identify_as; + gchar* ident_string; + gint cache_size; +}; + +struct _MidoriWebSettingsClass +{ + WebKitWebSettingsClass parent_class; +}; + +G_DEFINE_TYPE (MidoriWebSettings, midori_web_settings, WEBKIT_TYPE_WEB_SETTINGS) + +enum +{ + PROP_0, + + PROP_REMEMBER_LAST_WINDOW_SIZE, + PROP_LAST_WINDOW_WIDTH, + PROP_LAST_WINDOW_HEIGHT, + PROP_LAST_WINDOW_STATE, + PROP_LAST_PANEL_POSITION, + PROP_LAST_PANEL_PAGE, + PROP_LAST_WEB_SEARCH, + + PROP_SHOW_MENUBAR, + PROP_SHOW_NAVIGATIONBAR, + PROP_SHOW_BOOKMARKBAR, + PROP_SHOW_PANEL, + PROP_SHOW_TRANSFERBAR, + PROP_SHOW_STATUSBAR, + + PROP_TOOLBAR_STYLE, + PROP_PROGRESS_IN_LOCATION, + PROP_SEARCH_ENGINES_IN_COMPLETION, + PROP_TOOLBAR_ITEMS, + PROP_COMPACT_SIDEPANEL, + PROP_RIGHT_ALIGN_SIDEPANEL, + + PROP_LOAD_ON_STARTUP, + PROP_HOMEPAGE, + PROP_SHOW_CRASH_DIALOG, + PROP_DOWNLOAD_FOLDER, + PROP_DOWNLOAD_MANAGER, + PROP_TEXT_EDITOR, + PROP_NEWS_AGGREGATOR, + PROP_LOCATION_ENTRY_SEARCH, + PROP_PREFERRED_ENCODING, + + PROP_ALWAYS_SHOW_TABBAR, + PROP_CLOSE_BUTTONS_ON_TABS, + PROP_OPEN_NEW_PAGES_IN, + PROP_OPEN_EXTERNAL_PAGES_IN, + PROP_MIDDLE_CLICK_OPENS_SELECTION, + PROP_OPEN_TABS_IN_THE_BACKGROUND, + PROP_OPEN_TABS_NEXT_TO_CURRENT, + PROP_OPEN_POPUPS_IN_TABS, + + PROP_ENFORCE_96_DPI, + PROP_ENABLE_DEVELOPER_EXTRAS, + PROP_ZOOM_TEXT_AND_IMAGES, + PROP_FIND_WHILE_TYPING, + PROP_ACCEPT_COOKIES, + PROP_ORIGINAL_COOKIES_ONLY, + PROP_MAXIMUM_COOKIE_AGE, + + PROP_REMEMBER_LAST_VISITED_PAGES, + PROP_MAXIMUM_HISTORY_AGE, + PROP_REMEMBER_LAST_FORM_INPUTS, + PROP_REMEMBER_LAST_DOWNLOADED_FILES, + + PROP_HTTP_PROXY, + PROP_AUTO_DETECT_PROXY, + PROP_IDENTIFY_AS, + PROP_IDENT_STRING, + PROP_CACHE_SIZE +}; + +GType +midori_window_state_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_WINDOW_NORMAL, "MIDORI_WINDOW_NORMAL", "Normal" }, + { MIDORI_WINDOW_MINIMIZED, "MIDORI_WINDOW_MINIMIZED", "Minimized" }, + { MIDORI_WINDOW_MAXIMIZED, "MIDORI_WINDOW_MAXIMIZED", "Maximized" }, + { MIDORI_WINDOW_FULLSCREEN, "MIDORI_WINDOW_FULLSCREEN", "Fullscreen" }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriWindowState", values); + } + return type; +} + +GType +midori_startup_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_STARTUP_BLANK_PAGE, "MIDORI_STARTUP_BLANK_PAGE", N_("Blank page") }, + { MIDORI_STARTUP_HOMEPAGE, "MIDORI_STARTUP_HOMEPAGE", N_("Homepage") }, + { MIDORI_STARTUP_LAST_OPEN_PAGES, "MIDORI_STARTUP_LAST_OPEN_PAGES", N_("Last open pages") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriStartup", values); + } + return type; +} + +GType +midori_preferred_encoding_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_ENCODING_CHINESE, "MIDORI_ENCODING_CHINESE", N_("Chinese (BIG5)") }, + { MIDORI_ENCODING_JAPANESE, "MIDORI_ENCODING_JAPANESE", N_("Japanese (SHIFT_JIS)") }, + { MIDORI_ENCODING_RUSSIAN, "MIDORI_ENCODING_RUSSIAN", N_("Russian (KOI8-R)") }, + { MIDORI_ENCODING_UNICODE, "MIDORI_ENCODING_UNICODE", N_("Unicode (UTF-8)") }, + { MIDORI_ENCODING_WESTERN, "MIDORI_ENCODING_WESTERN", N_("Western (ISO-8859-1)") }, + { MIDORI_ENCODING_CUSTOM, "MIDORI_ENCODING_CUSTOM", N_("Custom...") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriPreferredEncoding", values); + } + return type; +} + +GType +midori_new_page_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_NEW_PAGE_TAB, "MIDORI_NEW_PAGE_TAB", N_("New tab") }, + { MIDORI_NEW_PAGE_WINDOW, "MIDORI_NEW_PAGE_WINDOW", N_("New window") }, + { MIDORI_NEW_PAGE_CURRENT, "MIDORI_NEW_PAGE_CURRENT", N_("Current tab") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriNewPage", values); + } + return type; +} + +GType +midori_toolbar_style_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_TOOLBAR_DEFAULT, "MIDORI_TOOLBAR_DEFAULT", N_("Default") }, + { MIDORI_TOOLBAR_ICONS, "MIDORI_TOOLBAR_ICONS", N_("Icons") }, + { MIDORI_TOOLBAR_TEXT, "MIDORI_TOOLBAR_TEXT", N_("Text") }, + { MIDORI_TOOLBAR_BOTH, "MIDORI_TOOLBAR_BOTH", N_("Both") }, + { MIDORI_TOOLBAR_BOTH_HORIZ, "MIDORI_TOOLBAR_BOTH_HORIZ", N_("Both horizontal") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriToolbarStyle", values); + } + return type; +} + +GType +midori_accept_cookies_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_ACCEPT_COOKIES_ALL, "MIDORI_ACCEPT_COOKIES_ALL", N_("All cookies") }, + { MIDORI_ACCEPT_COOKIES_SESSION, "MIDORI_ACCEPT_COOKIES_SESSION", N_("Session cookies") }, + { MIDORI_ACCEPT_COOKIES_NONE, "MIDORI_ACCEPT_COOKIES_NONE", N_("None") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriAcceptCookies", values); + } + return type; +} + +GType +midori_identity_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_IDENT_MIDORI, "MIDORI_IDENT_MIDORI", N_("Midori") }, + { MIDORI_IDENT_SAFARI, "MIDORI_IDENT_SAFARI", N_("Safari") }, + { MIDORI_IDENT_FIREFOX, "MIDORI_IDENT_FIREFOX", N_("Firefox") }, + { MIDORI_IDENT_EXPLORER, "MIDORI_IDENT_EXPLORER", N_("Internet Explorer") }, + { MIDORI_IDENT_CUSTOM, "MIDORI_IDENT_CUSTOM", N_("Custom...") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriIdentity", values); + } + return type; +} + +static void +midori_web_settings_finalize (GObject* object); + +static void +midori_web_settings_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_web_settings_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static const gchar* +midori_get_download_dir (void) +{ + const gchar* dir = g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD); + if (dir) + { + g_mkdir_with_parents (dir, 0700); + return dir; + } + return g_get_home_dir (); +} + +static void +midori_web_settings_class_init (MidoriWebSettingsClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_web_settings_finalize; + gobject_class->set_property = midori_web_settings_set_property; + gobject_class->get_property = midori_web_settings_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS; + + g_object_class_install_property (gobject_class, + PROP_REMEMBER_LAST_WINDOW_SIZE, + g_param_spec_boolean ( + "remember-last-window-size", + _("Remember last window size"), + _("Whether to save the last window size"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_LAST_WINDOW_WIDTH, + g_param_spec_int ( + "last-window-width", + _("Last window width"), + _("The last saved window width"), + 0, G_MAXINT, 0, + flags)); + + g_object_class_install_property (gobject_class, + PROP_LAST_WINDOW_HEIGHT, + g_param_spec_int ( + "last-window-height", + _("Last window height"), + _("The last saved window height"), + 0, G_MAXINT, 0, + flags)); + + /** + * MidoriWebSettings:last-window-state: + * + * The last saved window state. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_LAST_WINDOW_STATE, + g_param_spec_enum ( + "last-window-state", + "Last window state", + "The last saved window state", + MIDORI_TYPE_WINDOW_STATE, + MIDORI_WINDOW_NORMAL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_LAST_PANEL_POSITION, + g_param_spec_int ( + "last-panel-position", + _("Last panel position"), + _("The last saved panel position"), + 0, G_MAXINT, 0, + flags)); + + g_object_class_install_property (gobject_class, + PROP_LAST_PANEL_PAGE, + g_param_spec_int ( + "last-panel-page", + /* i18n: The internal index of the last opened panel */ + _("Last panel page"), + _("The last saved panel page"), + 0, G_MAXINT, 0, + flags)); + + g_object_class_install_property (gobject_class, + PROP_LAST_WEB_SEARCH, + g_param_spec_int ( + "last-web-search", + _("Last Web search"), + _("The last saved Web search"), + 0, G_MAXINT, 0, + flags)); + + + g_object_class_install_property (gobject_class, + PROP_SHOW_MENUBAR, + g_param_spec_boolean ( + "show-menubar", + _("Show Menubar"), + _("Whether to show the menubar"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_SHOW_NAVIGATIONBAR, + g_param_spec_boolean ( + "show-navigationbar", + _("Show Navigationbar"), + _("Whether to show the navigationbar"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_SHOW_BOOKMARKBAR, + g_param_spec_boolean ( + "show-bookmarkbar", + _("Show Bookmarkbar"), + _("Whether to show the bookmarkbar"), + FALSE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_SHOW_PANEL, + g_param_spec_boolean ( + "show-panel", + _("Show Panel"), + _("Whether to show the panel"), + FALSE, + flags)); + + /** + * MidoriWebSettings:show-transferbar: + * + * Whether to show the transferbar. + * + * Since: 0.1.5 + */ + g_object_class_install_property (gobject_class, + PROP_SHOW_TRANSFERBAR, + g_param_spec_boolean ( + "show-transferbar", + _("Show Transferbar"), + _("Whether to show the transferbar"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_SHOW_STATUSBAR, + g_param_spec_boolean ( + "show-statusbar", + _("Show Statusbar"), + _("Whether to show the statusbar"), + TRUE, + flags)); + + + g_object_class_install_property (gobject_class, + PROP_TOOLBAR_STYLE, + g_param_spec_enum ( + "toolbar-style", + _("Toolbar Style"), + _("The style of the toolbar"), + MIDORI_TYPE_TOOLBAR_STYLE, + MIDORI_TOOLBAR_DEFAULT, + flags)); + + /** + * MidoriWebSettings:progress-in-location: + * + * Whether to show loading progress in the location entry. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_PROGRESS_IN_LOCATION, + g_param_spec_boolean ( + "progress-in-location", + _("Show progress in location entry"), + _("Whether to show loading progress in the location entry"), + TRUE, + flags)); + + /** + * MidoriWebSettings:search-engines-in-completion: + * + * Whether to show search engines in the location completion. + * + * Since: 0.1.6 + */ + g_object_class_install_property (gobject_class, + PROP_SEARCH_ENGINES_IN_COMPLETION, + g_param_spec_boolean ( + "search-engines-in-completion", + _("Search engines in location completion"), + _("Whether to show search engines in the location completion"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_TOOLBAR_ITEMS, + g_param_spec_string ( + "toolbar-items", + _("Toolbar Items"), + _("The items to show on the toolbar"), + "Back,Forward,ReloadStop,Location,Panel,Trash,Search", + flags)); + + g_object_class_install_property (gobject_class, + PROP_COMPACT_SIDEPANEL, + g_param_spec_boolean ( + "compact-sidepanel", + _("Compact Sidepanel"), + _("Whether to make the sidepanel compact"), + FALSE, + flags)); + + /** + * MidoriWebSettings:right-sidepanel: + * + * Whether to align the sidepanel on the right. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_RIGHT_ALIGN_SIDEPANEL, + g_param_spec_boolean ( + "right-align-sidepanel", + _("Align sidepanel on the right"), + _("Whether to align the sidepanel on the right"), + FALSE, + flags)); + + + g_object_class_install_property (gobject_class, + PROP_LOAD_ON_STARTUP, + g_param_spec_enum ( + "load-on-startup", + _("Load on Startup"), + _("What to load on startup"), + MIDORI_TYPE_STARTUP, + MIDORI_STARTUP_HOMEPAGE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_HOMEPAGE, + g_param_spec_string ( + "homepage", + _("Homepage"), + _("The homepage"), + "http://www.google.com", + flags)); + + /** + * MidoriWebSettings:show-crash-dialog: + * + * Show a dialog after Midori crashed. + * + * Since: 0.1.2 + */ + g_object_class_install_property (gobject_class, + PROP_SHOW_CRASH_DIALOG, + g_param_spec_boolean ( + "show-crash-dialog", + _("Show crash dialog"), + _("Show a dialog after Midori crashed"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_DOWNLOAD_FOLDER, + g_param_spec_string ( + "download-folder", + _("Download Folder"), + _("The folder downloaded files are saved to"), + midori_get_download_dir (), + #if WEBKIT_CHECK_VERSION (1, 1, 3) + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + #else + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + #endif + + g_object_class_install_property (gobject_class, + PROP_DOWNLOAD_MANAGER, + g_param_spec_string ( + "download-manager", + _("Download Manager"), + _("An external download manager"), + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_TEXT_EDITOR, + g_param_spec_string ( + "text-editor", + _("Text Editor"), + _("An external text editor"), + NULL, + flags)); + + /** + * MidoriWebSettings:news-aggregator: + * + * An external news aggregator. + * + * Since: 0.1.6 + */ + g_object_class_install_property (gobject_class, + PROP_NEWS_AGGREGATOR, + g_param_spec_string ( + "news-aggregator", + _("News Aggregator"), + _("An external news aggregator"), + NULL, + flags)); + + g_object_class_install_property (gobject_class, + PROP_LOCATION_ENTRY_SEARCH, + g_param_spec_string ( + "location-entry-search", + _("Location entry Search"), + _("The search to perform inside the location entry"), + "http://www.google.com/search?q=%s", + flags)); + + g_object_class_install_property (gobject_class, + PROP_PREFERRED_ENCODING, + g_param_spec_enum ( + "preferred-encoding", + _("Preferred Encoding"), + _("The preferred character encoding"), + MIDORI_TYPE_PREFERRED_ENCODING, + MIDORI_ENCODING_WESTERN, + flags)); + + + g_object_class_install_property (gobject_class, + PROP_ALWAYS_SHOW_TABBAR, + g_param_spec_boolean ( + "always-show-tabbar", + _("Always Show Tabbar"), + _("Always show the tabbar"), + FALSE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_CLOSE_BUTTONS_ON_TABS, + g_param_spec_boolean ( + "close-buttons-on-tabs", + _("Close Buttons on Tabs"), + _("Whether tabs have close buttons"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_OPEN_NEW_PAGES_IN, + g_param_spec_enum ( + "open-new-pages-in", + _("Open new pages in"), + _("Where to open new pages"), + MIDORI_TYPE_NEW_PAGE, + MIDORI_NEW_PAGE_TAB, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_OPEN_EXTERNAL_PAGES_IN, + g_param_spec_enum ( + "open-external-pages-in", + _("Open external pages in"), + _("Where to open externally opened pages"), + MIDORI_TYPE_NEW_PAGE, + MIDORI_NEW_PAGE_TAB, + #if HAVE_UNIQUE + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + #else + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + #endif + + g_object_class_install_property (gobject_class, + PROP_MIDDLE_CLICK_OPENS_SELECTION, + g_param_spec_boolean ( + "middle-click-opens-selection", + _("Middle click opens Selection"), + _("Load an address from the selection via middle click"), + FALSE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_OPEN_TABS_IN_THE_BACKGROUND, + g_param_spec_boolean ( + "open-tabs-in-the-background", + _("Open tabs in the background"), + _("Whether to open new tabs in the background"), + FALSE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_OPEN_TABS_NEXT_TO_CURRENT, + g_param_spec_boolean ( + "open-tabs-next-to-current", + _("Open Tabs next to Current"), + _("Whether to open new tabs next to the current tab or after the last one"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_OPEN_POPUPS_IN_TABS, + g_param_spec_boolean ( + "open-popups-in-tabs", + _("Open popups in tabs"), + _("Whether to open popup windows in tabs"), + TRUE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + + /** + * MidoriWebSettings:zoom-text-and-images: + * + * Whether to zoom text and images. + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_ZOOM_TEXT_AND_IMAGES, + g_param_spec_boolean ( + "zoom-text-and-images", + _("Zoom Text and Images"), + _("Whether to zoom text and images"), + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriWebSettings:find-while-typing: + * + * Whether to automatically find inline while typing something. + * + * Since: 0.1.4 + */ + g_object_class_install_property (gobject_class, + PROP_FIND_WHILE_TYPING, + g_param_spec_boolean ( + "find-while-typing", + _("Find inline while typing"), + _("Whether to automatically find inline while typing"), + FALSE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_ACCEPT_COOKIES, + g_param_spec_enum ( + "accept-cookies", + _("Accept cookies"), + _("What type of cookies to accept"), + MIDORI_TYPE_ACCEPT_COOKIES, + MIDORI_ACCEPT_COOKIES_ALL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ORIGINAL_COOKIES_ONLY, + g_param_spec_boolean ( + "original-cookies-only", + _("Original cookies only"), + _("Accept cookies from the original website only"), + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_MAXIMUM_COOKIE_AGE, + g_param_spec_int ( + "maximum-cookie-age", + _("Maximum cookie age"), + _("The maximum number of days to save cookies for"), + 0, G_MAXINT, 30, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + + + g_object_class_install_property (gobject_class, + PROP_REMEMBER_LAST_VISITED_PAGES, + g_param_spec_boolean ( + "remember-last-visited-pages", + _("Remember last visited pages"), + _("Whether the last visited pages are saved"), + TRUE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_MAXIMUM_HISTORY_AGE, + g_param_spec_int ( + "maximum-history-age", + _("Maximum history age"), + _("The maximum number of days to save the history for"), + 0, G_MAXINT, 30, + flags)); + + g_object_class_install_property (gobject_class, + PROP_REMEMBER_LAST_FORM_INPUTS, + g_param_spec_boolean ( + "remember-last-form-inputs", + _("Remember last form inputs"), + _("Whether the last form inputs are saved"), + TRUE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_REMEMBER_LAST_DOWNLOADED_FILES, + g_param_spec_boolean ( + "remember-last-downloaded-files", + _("Remember last downloaded files"), + _("Whether the last downloaded files are saved"), + TRUE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + + + g_object_class_install_property (gobject_class, + PROP_HTTP_PROXY, + g_param_spec_string ( + "http-proxy", + _("Proxy Server"), + _("The proxy server used for HTTP connections"), + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriWebSettings:auto-detect-proxy: + * + * Whether to detect the proxy server automatically from the environment + * + * Since: 0.1.3 + */ + g_object_class_install_property (gobject_class, + PROP_AUTO_DETECT_PROXY, + g_param_spec_boolean ( + "auto-detect-proxy", + _("Detect proxy server automatically"), + _("Whether to detect the proxy server automatically from the environment"), + TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriWebSettings:identify-as: + * + * What to identify as to web pages. + * + * Since: 0.1.2 + */ + g_object_class_install_property (gobject_class, + PROP_IDENTIFY_AS, + g_param_spec_enum ( + "identify-as", + /* i18n: This refers to an application, not the 'user agent' string */ + _("Identify as"), + _("What to identify as to web pages"), + MIDORI_TYPE_IDENTITY, + MIDORI_IDENT_MIDORI, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * MidoriWebSettings:ident-string: + * + * The browser identification string. + * + * Since: 0.1.2 + */ + g_object_class_install_property (gobject_class, + PROP_IDENT_STRING, + g_param_spec_string ( + "ident-string", + _("Identification string"), + _("The application identification string"), + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_CACHE_SIZE, + g_param_spec_int ( + "cache-size", + _("Cache size"), + _("The allowed size of the cache"), + 0, G_MAXINT, 100, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +static void +notify_default_encoding_cb (GObject* object, + GParamSpec* pspec) +{ + MidoriWebSettings* web_settings; + const gchar* string; + const gchar* encoding; + + web_settings = MIDORI_WEB_SETTINGS (object); + + g_object_get (object, "default-encoding", &string, NULL); + encoding = string ? string : ""; + if (!strcmp (encoding, "BIG5")) + web_settings->preferred_encoding = MIDORI_ENCODING_CHINESE; + else if (!strcmp (encoding, "SHIFT_JIS")) + web_settings->preferred_encoding = MIDORI_ENCODING_JAPANESE; + else if (!strcmp (encoding, "KOI8-R")) + web_settings->preferred_encoding = MIDORI_ENCODING_RUSSIAN; + else if (!strcmp (encoding, "UTF-8")) + web_settings->preferred_encoding = MIDORI_ENCODING_UNICODE; + else if (!strcmp (encoding, "ISO-8859-1")) + web_settings->preferred_encoding = MIDORI_ENCODING_WESTERN; + else + web_settings->preferred_encoding = MIDORI_ENCODING_CUSTOM; + g_object_notify (object, "preferred-encoding"); +} + +static void +midori_web_settings_init (MidoriWebSettings* web_settings) +{ + web_settings->download_folder = g_strdup (midori_get_download_dir ()); + web_settings->http_proxy = NULL; + web_settings->open_popups_in_tabs = TRUE; + web_settings->remember_last_form_inputs = TRUE; + web_settings->remember_last_downloaded_files = TRUE; + web_settings->auto_detect_proxy = TRUE; + + g_signal_connect (web_settings, "notify::default-encoding", + G_CALLBACK (notify_default_encoding_cb), NULL); +} + +static void +midori_web_settings_finalize (GObject* object) +{ + G_OBJECT_CLASS (midori_web_settings_parent_class)->finalize (object); +} + +static gchar* +generate_ident_string (MidoriIdentity identify_as) +{ + const gchar* platform = + #ifdef GDK_WINDOWING_X11 + "X11"; + #elif defined(GDK_WINDOWING_WIN32) + "Windows"; + #elif defined(GDK_WINDOWING_QUARTZ) + "Macintosh"; + #elif defined(GDK_WINDOWING_DIRECTFB) + "DirectFB"; + #else + "Unknown"; + #endif + + const gchar* os = + #if HAVE_OSX + /* #if defined (HAVE_X86) */ + "Intel Mac OS X"; + /* #else + "PPC Mac OS X"; + #endif */ + #elif defined (G_OS_UNIX) + /* struct utsname name; + if (uname (&name) != -1) + String::format ("%s %s", name.sysname, name.machine); + else + "Unknown";*/ + "Linux"; + #elif defined (G_OS_WIN32) + // FIXME: Windows NT version + "Windows"; + #else + "Unknown"; + #endif + + const gchar* appname = "Midori/" + G_STRINGIFY (MIDORI_MAJOR_VERSION) "." + G_STRINGIFY (MIDORI_MINOR_VERSION) "." + G_STRINGIFY (MIDORI_MICRO_VERSION); + + const gchar* lang = pango_language_to_string (gtk_get_default_language ()); + + switch (identify_as) + { + case MIDORI_IDENT_MIDORI: + return g_strdup_printf ("%s (%s; %s; U; %s) WebKit/532+", + appname, platform, os, lang); + case MIDORI_IDENT_SAFARI: + return g_strdup_printf ("Mozilla/5.0 (%s; U; %s; %s) " + "AppleWebKit/532+ (KHTML, like Gecko) Safari/419.3 %s", + platform, os, lang, appname); + case MIDORI_IDENT_FIREFOX: + return g_strdup_printf ("Mozilla/5.0 (%s; U; %s; %s; rv:1.8.1) " + "Gecko/20061010 Firefox/2.0 %s", + platform, os, lang, appname); + case MIDORI_IDENT_EXPLORER: + return g_strdup_printf ("Mozilla/4.0 (compatible; " + "MSIE 6.0; Windows NT 5.1; %s) %s", + lang, appname); + default: + return g_strdup_printf ("%s", appname); + } +} + +static void +midori_web_settings_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriWebSettings* web_settings = MIDORI_WEB_SETTINGS (object); + + switch (prop_id) + { + case PROP_REMEMBER_LAST_WINDOW_SIZE: + web_settings->remember_last_window_size = g_value_get_boolean (value); + break; + case PROP_LAST_WINDOW_WIDTH: + web_settings->last_window_width = g_value_get_int (value); + break; + case PROP_LAST_WINDOW_HEIGHT: + web_settings->last_window_height = g_value_get_int (value); + break; + case PROP_LAST_WINDOW_STATE: + web_settings->last_window_state = g_value_get_enum (value); + break; + case PROP_LAST_PANEL_POSITION: + web_settings->last_panel_position = g_value_get_int (value); + break; + case PROP_LAST_PANEL_PAGE: + web_settings->last_panel_page = g_value_get_int (value); + break; + case PROP_LAST_WEB_SEARCH: + web_settings->last_web_search = g_value_get_int (value); + break; + + case PROP_SHOW_MENUBAR: + web_settings->show_menubar = g_value_get_boolean (value); + break; + case PROP_SHOW_NAVIGATIONBAR: + web_settings->show_navigationbar = g_value_get_boolean (value); + break; + case PROP_SHOW_BOOKMARKBAR: + web_settings->show_bookmarkbar = g_value_get_boolean (value); + break; + case PROP_SHOW_PANEL: + web_settings->show_panel = g_value_get_boolean (value); + break; + case PROP_SHOW_TRANSFERBAR: + web_settings->show_transferbar = g_value_get_boolean (value); + break; + case PROP_SHOW_STATUSBAR: + web_settings->show_statusbar = g_value_get_boolean (value); + break; + + case PROP_TOOLBAR_STYLE: + web_settings->toolbar_style = g_value_get_enum (value); + break; + case PROP_PROGRESS_IN_LOCATION: + web_settings->progress_in_location = g_value_get_boolean (value); + break; + case PROP_SEARCH_ENGINES_IN_COMPLETION: + web_settings->search_engines_in_completion = g_value_get_boolean (value); + break; + case PROP_TOOLBAR_ITEMS: + katze_assign (web_settings->toolbar_items, g_value_dup_string (value)); + break; + case PROP_COMPACT_SIDEPANEL: + web_settings->compact_sidepanel = g_value_get_boolean (value); + break; + case PROP_RIGHT_ALIGN_SIDEPANEL: + web_settings->right_align_sidepanel = g_value_get_boolean (value); + break; + + case PROP_LOAD_ON_STARTUP: + web_settings->load_on_startup = g_value_get_enum (value); + break; + case PROP_HOMEPAGE: + katze_assign (web_settings->homepage, g_value_dup_string (value)); + break; + case PROP_SHOW_CRASH_DIALOG: + web_settings->show_crash_dialog = g_value_get_boolean (value); + break; + case PROP_DOWNLOAD_FOLDER: + katze_assign (web_settings->download_folder, g_value_dup_string (value)); + break; + case PROP_DOWNLOAD_MANAGER: + katze_assign (web_settings->download_manager, g_value_dup_string (value)); + break; + case PROP_TEXT_EDITOR: + katze_assign (web_settings->text_editor, g_value_dup_string (value)); + break; + case PROP_NEWS_AGGREGATOR: + katze_assign (web_settings->news_aggregator, g_value_dup_string (value)); + break; + case PROP_LOCATION_ENTRY_SEARCH: + katze_assign (web_settings->location_entry_search, g_value_dup_string (value)); + break; + case PROP_PREFERRED_ENCODING: + web_settings->preferred_encoding = g_value_get_enum (value); + switch (web_settings->preferred_encoding) + { + case MIDORI_ENCODING_CHINESE: + g_object_set (object, "default-encoding", "BIG5", NULL); + break; + case MIDORI_ENCODING_JAPANESE: + g_object_set (object, "default-encoding", "SHIFT_JIS", NULL); + break; + case MIDORI_ENCODING_RUSSIAN: + g_object_set (object, "default-encoding", "KOI8-R", NULL); + break; + case MIDORI_ENCODING_UNICODE: + g_object_set (object, "default-encoding", "UTF-8", NULL); + break; + case MIDORI_ENCODING_WESTERN: + g_object_set (object, "default-encoding", "ISO-8859-1", NULL); + break; + case MIDORI_ENCODING_CUSTOM: + g_object_set (object, "default-encoding", "", NULL); + } + break; + + case PROP_ALWAYS_SHOW_TABBAR: + web_settings->always_show_tabbar = g_value_get_boolean (value); + break; + case PROP_CLOSE_BUTTONS_ON_TABS: + web_settings->close_buttons_on_tabs = g_value_get_boolean (value); + break; + case PROP_OPEN_NEW_PAGES_IN: + web_settings->open_new_pages_in = g_value_get_enum (value); + break; + case PROP_OPEN_EXTERNAL_PAGES_IN: + web_settings->open_external_pages_in = g_value_get_enum (value); + break; + case PROP_MIDDLE_CLICK_OPENS_SELECTION: + web_settings->middle_click_opens_selection = g_value_get_boolean (value); + break; + case PROP_OPEN_TABS_IN_THE_BACKGROUND: + web_settings->open_tabs_in_the_background = g_value_get_boolean (value); + break; + case PROP_OPEN_TABS_NEXT_TO_CURRENT: + web_settings->open_tabs_next_to_current = g_value_get_boolean (value); + break; + case PROP_OPEN_POPUPS_IN_TABS: + web_settings->open_popups_in_tabs = g_value_get_boolean (value); + break; + + case PROP_ZOOM_TEXT_AND_IMAGES: + web_settings->zoom_text_and_images = g_value_get_boolean (value); + break; + case PROP_FIND_WHILE_TYPING: + web_settings->find_while_typing = g_value_get_boolean (value); + break; + case PROP_ACCEPT_COOKIES: + web_settings->accept_cookies = g_value_get_enum (value); + break; + case PROP_ORIGINAL_COOKIES_ONLY: + web_settings->original_cookies_only = g_value_get_boolean (value); + break; + case PROP_MAXIMUM_COOKIE_AGE: + web_settings->maximum_cookie_age = g_value_get_int (value); + break; + + case PROP_REMEMBER_LAST_VISITED_PAGES: + web_settings->remember_last_visited_pages = g_value_get_boolean (value); + break; + case PROP_MAXIMUM_HISTORY_AGE: + web_settings->maximum_history_age = g_value_get_int (value); + break; + case PROP_REMEMBER_LAST_FORM_INPUTS: + web_settings->remember_last_form_inputs = g_value_get_boolean (value); + break; + case PROP_REMEMBER_LAST_DOWNLOADED_FILES: + web_settings->remember_last_downloaded_files = g_value_get_boolean (value); + break; + + case PROP_HTTP_PROXY: + katze_assign (web_settings->http_proxy, g_value_dup_string (value)); + break; + case PROP_AUTO_DETECT_PROXY: + web_settings->auto_detect_proxy = g_value_get_boolean (value); + break; + case PROP_IDENTIFY_AS: + web_settings->identify_as = g_value_get_enum (value); + if (web_settings->identify_as != MIDORI_IDENT_CUSTOM) + { + gchar* string = generate_ident_string (web_settings->identify_as); + katze_assign (web_settings->ident_string, string); + g_object_notify (object, "ident-string"); + } + break; + case PROP_IDENT_STRING: + katze_assign (web_settings->ident_string, g_value_dup_string (value)); + break; + case PROP_CACHE_SIZE: + web_settings->cache_size = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_web_settings_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriWebSettings* web_settings = MIDORI_WEB_SETTINGS (object); + + switch (prop_id) + { + case PROP_REMEMBER_LAST_WINDOW_SIZE: + g_value_set_boolean (value, web_settings->remember_last_window_size); + break; + case PROP_LAST_WINDOW_WIDTH: + g_value_set_int (value, web_settings->last_window_width); + break; + case PROP_LAST_WINDOW_HEIGHT: + g_value_set_int (value, web_settings->last_window_height); + break; + case PROP_LAST_WINDOW_STATE: + g_value_set_enum (value, web_settings->last_window_state); + break; + case PROP_LAST_PANEL_POSITION: + g_value_set_int (value, web_settings->last_panel_position); + break; + case PROP_LAST_PANEL_PAGE: + g_value_set_int (value, web_settings->last_panel_page); + break; + case PROP_LAST_WEB_SEARCH: + g_value_set_int (value, web_settings->last_web_search); + break; + + case PROP_SHOW_MENUBAR: + g_value_set_boolean (value, web_settings->show_menubar); + break; + case PROP_SHOW_NAVIGATIONBAR: + g_value_set_boolean (value, web_settings->show_navigationbar); + break; + case PROP_SHOW_BOOKMARKBAR: + g_value_set_boolean (value, web_settings->show_bookmarkbar); + break; + case PROP_SHOW_PANEL: + g_value_set_boolean (value, web_settings->show_panel); + break; + case PROP_SHOW_TRANSFERBAR: + g_value_set_boolean (value, web_settings->show_transferbar); + break; + case PROP_SHOW_STATUSBAR: + g_value_set_boolean (value, web_settings->show_statusbar); + break; + + case PROP_TOOLBAR_STYLE: + g_value_set_enum (value, web_settings->toolbar_style); + break; + case PROP_PROGRESS_IN_LOCATION: + g_value_set_boolean (value, web_settings->progress_in_location); + break; + case PROP_SEARCH_ENGINES_IN_COMPLETION: + g_value_set_boolean (value, web_settings->search_engines_in_completion); + break; + case PROP_TOOLBAR_ITEMS: + g_value_set_string (value, web_settings->toolbar_items); + break; + case PROP_COMPACT_SIDEPANEL: + g_value_set_boolean (value, web_settings->compact_sidepanel); + break; + case PROP_RIGHT_ALIGN_SIDEPANEL: + g_value_set_boolean (value, web_settings->right_align_sidepanel); + break; + + case PROP_LOAD_ON_STARTUP: + g_value_set_enum (value, web_settings->load_on_startup); + break; + case PROP_HOMEPAGE: + g_value_set_string (value, web_settings->homepage); + break; + case PROP_SHOW_CRASH_DIALOG: + g_value_set_boolean (value, web_settings->show_crash_dialog); + break; + case PROP_DOWNLOAD_FOLDER: + g_value_set_string (value, web_settings->download_folder); + break; + case PROP_DOWNLOAD_MANAGER: + g_value_set_string (value, web_settings->download_manager); + break; + case PROP_TEXT_EDITOR: + g_value_set_string (value, web_settings->text_editor); + break; + case PROP_NEWS_AGGREGATOR: + g_value_set_string (value, web_settings->news_aggregator); + break; + case PROP_LOCATION_ENTRY_SEARCH: + g_value_set_string (value, web_settings->location_entry_search); + break; + case PROP_PREFERRED_ENCODING: + g_value_set_enum (value, web_settings->preferred_encoding); + break; + + case PROP_ALWAYS_SHOW_TABBAR: + g_value_set_boolean (value, web_settings->always_show_tabbar); + break; + case PROP_CLOSE_BUTTONS_ON_TABS: + g_value_set_boolean (value, web_settings->close_buttons_on_tabs); + break; + case PROP_OPEN_NEW_PAGES_IN: + g_value_set_enum (value, web_settings->open_new_pages_in); + break; + case PROP_OPEN_EXTERNAL_PAGES_IN: + g_value_set_enum (value, web_settings->open_external_pages_in); + break; + case PROP_MIDDLE_CLICK_OPENS_SELECTION: + g_value_set_boolean (value, web_settings->middle_click_opens_selection); + break; + case PROP_OPEN_TABS_IN_THE_BACKGROUND: + g_value_set_boolean (value, web_settings->open_tabs_in_the_background); + break; + case PROP_OPEN_TABS_NEXT_TO_CURRENT: + g_value_set_boolean (value, web_settings->open_tabs_next_to_current); + break; + case PROP_OPEN_POPUPS_IN_TABS: + g_value_set_boolean (value, web_settings->open_popups_in_tabs); + break; + + case PROP_ENFORCE_96_DPI: + g_value_set_boolean (value, FALSE); + break; + case PROP_ENABLE_DEVELOPER_EXTRAS: + g_value_set_boolean (value, FALSE); + break; + case PROP_ZOOM_TEXT_AND_IMAGES: + g_value_set_boolean (value, web_settings->zoom_text_and_images); + break; + case PROP_FIND_WHILE_TYPING: + g_value_set_boolean (value, web_settings->find_while_typing); + break; + case PROP_ACCEPT_COOKIES: + g_value_set_enum (value, web_settings->accept_cookies); + break; + case PROP_ORIGINAL_COOKIES_ONLY: + g_value_set_boolean (value, web_settings->original_cookies_only); + break; + case PROP_MAXIMUM_COOKIE_AGE: + g_value_set_int (value, web_settings->maximum_cookie_age); + break; + + case PROP_REMEMBER_LAST_VISITED_PAGES: + g_value_set_boolean (value, web_settings->remember_last_visited_pages); + break; + case PROP_MAXIMUM_HISTORY_AGE: + g_value_set_int (value, web_settings->maximum_history_age); + break; + case PROP_REMEMBER_LAST_FORM_INPUTS: + g_value_set_boolean (value, web_settings->remember_last_form_inputs); + break; + case PROP_REMEMBER_LAST_DOWNLOADED_FILES: + g_value_set_boolean (value, web_settings->remember_last_downloaded_files); + break; + + case PROP_HTTP_PROXY: + g_value_set_string (value, web_settings->http_proxy); + break; + case PROP_AUTO_DETECT_PROXY: + g_value_set_boolean (value, web_settings->auto_detect_proxy); + break; + case PROP_IDENTIFY_AS: + g_value_set_enum (value, web_settings->identify_as); + break; + case PROP_IDENT_STRING: + if (!g_strcmp0 (web_settings->ident_string, "")) + { + gchar* string = generate_ident_string (web_settings->identify_as); + katze_assign (web_settings->ident_string, string); + } + g_value_set_string (value, web_settings->ident_string); + break; + case PROP_CACHE_SIZE: + g_value_set_int (value, web_settings->cache_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * midori_web_settings_new: + * + * Creates a new #MidoriWebSettings instance with default values. + * + * You will typically want to assign this to a #MidoriWebView or #MidoriBrowser. + * + * Return value: a new #MidoriWebSettings + **/ +MidoriWebSettings* +midori_web_settings_new (void) +{ + MidoriWebSettings* web_settings = g_object_new (MIDORI_TYPE_WEB_SETTINGS, + NULL); + + return web_settings; +} diff --git a/midori/midori-websettings.h b/midori/midori-websettings.h new file mode 100644 index 00000000..84742759 --- /dev/null +++ b/midori/midori-websettings.h @@ -0,0 +1,144 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_WEB_SETTINGS_H__ +#define __MIDORI_WEB_SETTINGS_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_WEB_SETTINGS \ + (midori_web_settings_get_type ()) +#define MIDORI_WEB_SETTINGS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_WEB_SETTINGS, MidoriWebSettings)) +#define MIDORI_WEB_SETTINGS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_WEB_SETTINGS, MidoriWebSettingsClass)) +#define MIDORI_IS_WEB_SETTINGS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_WEB_SETTINGS)) +#define MIDORI_IS_WEB_SETTINGS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_WEB_SETTINGS)) +#define MIDORI_WEB_SETTINGS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_WEB_SETTINGS, MidoriWebSettingsClass)) + +typedef struct _MidoriWebSettings MidoriWebSettings; +typedef struct _MidoriWebSettingsClass MidoriWebSettingsClass; + +typedef enum +{ + MIDORI_WINDOW_NORMAL, + MIDORI_WINDOW_MINIMIZED, + MIDORI_WINDOW_MAXIMIZED, + MIDORI_WINDOW_FULLSCREEN, +} MidoriWindowState; + +GType +midori_window_state_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_WINDOW_STATE \ + (midori_window_state_get_type ()) + +typedef enum +{ + MIDORI_STARTUP_BLANK_PAGE, + MIDORI_STARTUP_HOMEPAGE, + MIDORI_STARTUP_LAST_OPEN_PAGES +} MidoriStartup; + +GType +midori_startup_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_STARTUP \ + (midori_startup_get_type ()) + +typedef enum +{ + MIDORI_ENCODING_CHINESE, + MIDORI_ENCODING_JAPANESE, + MIDORI_ENCODING_RUSSIAN, + MIDORI_ENCODING_UNICODE, + MIDORI_ENCODING_WESTERN, + MIDORI_ENCODING_CUSTOM +} MidoriPreferredEncoding; + +GType +midori_preferred_encoding_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_PREFERRED_ENCODING \ + (midori_preferred_encoding_get_type ()) + +typedef enum +{ + MIDORI_NEW_PAGE_TAB, + MIDORI_NEW_PAGE_WINDOW, + MIDORI_NEW_PAGE_CURRENT +} MidoriNewPage; + +GType +midori_new_page_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_NEW_PAGE \ + (midori_new_page_get_type ()) + +typedef enum +{ + MIDORI_TOOLBAR_DEFAULT, + MIDORI_TOOLBAR_ICONS, + MIDORI_TOOLBAR_TEXT, + MIDORI_TOOLBAR_BOTH, + MIDORI_TOOLBAR_BOTH_HORIZ +} MidoriToolbarStyle; + +GType +midori_toolbar_style_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_TOOLBAR_STYLE \ + (midori_toolbar_style_get_type ()) + +typedef enum +{ + MIDORI_ACCEPT_COOKIES_ALL, + MIDORI_ACCEPT_COOKIES_SESSION, + MIDORI_ACCEPT_COOKIES_NONE +} MidoriAcceptCookies; + +GType +midori_accept_cookies_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_ACCEPT_COOKIES \ + (midori_accept_cookies_get_type ()) + +typedef enum +{ + MIDORI_IDENT_MIDORI, + MIDORI_IDENT_SAFARI, + MIDORI_IDENT_FIREFOX, + MIDORI_IDENT_EXPLORER, + MIDORI_IDENT_CUSTOM +} MidoriIdentity; + +GType +midori_identity_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_IDENTITY \ + (midori_identity_get_type ()) + +GType +midori_web_settings_get_type (void); + +MidoriWebSettings* +midori_web_settings_new (void); + +G_END_DECLS + +#endif /* __MIDORI_WEB_SETTINGS_H__ */ diff --git a/midori/midori.h b/midori/midori.h new file mode 100644 index 00000000..0886b7cd --- /dev/null +++ b/midori/midori.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_H__ +#define __MIDORI_H__ + +#include "midori-app.h" +#include "midori-array.h" +#include "midori-browser.h" +#include "midori-extension.h" +#include "midori-locationaction.h" +#include "midori-locationentry.h" +#include "midori-panel.h" +#include "midori-preferences.h" +#include "midori-searchaction.h" +#include "midori-stock.h" +#include "midori-view.h" +#include "midori-viewable.h" +#include "midori-websettings.h" + +/* For convenience, include localization header */ +#include + +#define MIDORI_CHECK_VERSION(major, minor, micro) \ + (MIDORI_MAJOR_VERSION > (major) || \ + (MIDORI_MAJOR_VERSION == (major) && MIDORI_MINOR_VERSION > (minor)) || \ + (MIDORI_MAJOR_VERSION == (major) && MIDORI_MINOR_VERSION == (minor) && \ + MIDORI_MICRO_VERSION >= (micro))) + +#endif /* __MIDORI_H__ */ diff --git a/midori/sokoke.c b/midori/sokoke.c new file mode 100644 index 00000000..adda6469 --- /dev/null +++ b/midori/sokoke.c @@ -0,0 +1,882 @@ +/* + Copyright (C) 2007-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "sokoke.h" +#include "midori-stock.h" + +#if HAVE_CONFIG_H + #include +#endif + +#if HAVE_UNISTD_H + #include +#endif +#include +#include + +#include +#include +#include +#include + +#if HAVE_LIBIDN + #include + #include + #include +#endif + +static gchar* +sokoke_js_string_utf8 (JSStringRef js_string) +{ + size_t size_utf8; + gchar* string_utf8; + + g_return_val_if_fail (js_string, NULL); + + size_utf8 = JSStringGetMaximumUTF8CStringSize (js_string); + string_utf8 = g_new (gchar, size_utf8); + JSStringGetUTF8CString (js_string, string_utf8, size_utf8); + return string_utf8; +} + +gchar* +sokoke_js_script_eval (JSContextRef js_context, + const gchar* script, + gchar** exception) +{ + gchar* value; + JSStringRef js_value_string; + + g_return_val_if_fail (js_context, FALSE); + g_return_val_if_fail (script, FALSE); + + JSStringRef js_script = JSStringCreateWithUTF8CString (script); + JSValueRef js_exception = NULL; + JSValueRef js_value = JSEvaluateScript (js_context, js_script, + JSContextGetGlobalObject (js_context), NULL, 0, &js_exception); + if (!js_value && exception) + { + JSStringRef js_message = JSValueToStringCopy (js_context, + js_exception, NULL); + *exception = sokoke_js_string_utf8 (js_message); + JSStringRelease (js_message); + js_value = JSValueMakeNull (js_context); + } + JSStringRelease (js_script); + + js_value_string = JSValueToStringCopy (js_context, js_value, NULL); + value = sokoke_js_string_utf8 (js_value_string); + JSStringRelease (js_value_string); + return value; +} + +static void +error_dialog (const gchar* short_message, + const gchar* detailed_message) +{ + GtkWidget* dialog = gtk_message_dialog_new ( + NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", short_message); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", detailed_message); + gtk_widget_show (dialog); + g_signal_connect_swapped (dialog, "response", + G_CALLBACK (gtk_widget_destroy), dialog); + + +} + +gboolean +sokoke_spawn_program (const gchar* command, + const gchar* argument) +{ + gchar* argument_escaped; + gchar* command_ready; + gchar** argv; + GError* error; + + g_return_val_if_fail (command != NULL, FALSE); + g_return_val_if_fail (argument != NULL, FALSE); + + argument_escaped = g_shell_quote (argument); + if (strstr (command, "%s")) + command_ready = g_strdup_printf (command, argument_escaped); + else + command_ready = g_strconcat (command, " ", argument_escaped, NULL); + + error = NULL; + if (!g_shell_parse_argv (command_ready, NULL, &argv, &error)) + { + error_dialog (_("Could not run external program."), error->message); + g_error_free (error); + g_free (command_ready); + g_free (argument_escaped); + return FALSE; + } + + error = NULL; + if (!g_spawn_async (NULL, argv, NULL, + (GSpawnFlags)G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, NULL, &error)) + { + error_dialog (_("Could not run external program."), error->message); + g_error_free (error); + } + + g_strfreev (argv); + g_free (command_ready); + g_free (argument_escaped); + return TRUE; +} + +static gchar* +sokoke_idn_to_punycode (gchar* uri) +{ + #if HAVE_LIBIDN + gchar* proto; + gchar* hostname; + gchar* path; + char *s; + uint32_t *q; + int rc; + gchar *result; + + if ((proto = g_utf8_strchr (uri, -1, ':'))) + { + gulong offset; + gchar* buffer; + + /* 'file' URIs don't have a hostname */ + if (!strcmp (proto, "file")) + return uri; + + offset = g_utf8_pointer_to_offset (uri, proto); + buffer = g_malloc0 (offset + 1); + g_utf8_strncpy (buffer, uri, offset); + proto = buffer; + } + + path = NULL; + if ((hostname = g_utf8_strchr (uri, -1, '/'))) + { + if (hostname[1] == '/') + hostname += 2; + if ((path = g_utf8_strchr (hostname, -1, '/'))) + { + gulong offset = g_utf8_pointer_to_offset (hostname, path); + gchar* buffer = g_malloc0 (offset + 1); + g_utf8_strncpy (buffer, hostname, offset); + hostname = buffer; + } + } + else + hostname = g_strdup (uri); + + if (!(q = stringprep_utf8_to_ucs4 (hostname, -1, NULL))) + { + g_free (proto); + g_free (hostname); + return uri; + } + + rc = idna_to_ascii_4z (q, &s, IDNA_ALLOW_UNASSIGNED); + free (q); + if (rc != IDNA_SUCCESS) + { + g_free (proto); + g_free (hostname); + return uri; + } + + if (proto) + { + result = g_strconcat (proto, "://", s, path ? path : "", NULL); + g_free (proto); + if (path) + g_free (hostname); + } + else + result = g_strdup (s); + g_free (uri); + free (s); + + return result; + #else + return uri; + #endif +} + +gchar* +sokoke_magic_uri (const gchar* uri, + KatzeArray* search_engines) +{ + gchar* current_dir; + gchar* result; + gchar** parts; + gchar* search; + const gchar* search_uri; + KatzeItem* item; + + g_return_val_if_fail (uri, NULL); + g_return_val_if_fail (!search_engines || + katze_array_is_a (search_engines, KATZE_TYPE_ITEM), NULL); + + /* Just return if it's a javascript: or mailto: uri */ + if (g_str_has_prefix (uri, "javascript:") + || g_str_has_prefix (uri, "mailto:") + || g_str_has_prefix (uri, "data:")) + return g_strdup (uri); + /* Add file:// if we have a local path */ + if (g_path_is_absolute (uri)) + return g_strconcat ("file://", uri, NULL); + /* Construct an absolute path if the file is relative */ + if (g_file_test (uri, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + { + current_dir = g_get_current_dir (); + result = g_strconcat ("file://", current_dir, + G_DIR_SEPARATOR_S, uri, NULL); + g_free (current_dir); + return result; + } + /* Do we have a protocol? */ + if (g_strstr_len (uri, 8, "://")) + return sokoke_idn_to_punycode (g_strdup (uri)); + + /* Do we have a domain, ip address or localhost? */ + search = NULL; + if (!strchr (uri, ' ') && + ((search = strchr (uri, ':')) || (search = strchr (uri, '@'))) && + search[0] && !g_ascii_isalpha (search[1])) + return sokoke_idn_to_punycode (g_strconcat ("http://", uri, NULL)); + if (!strcmp (uri, "localhost") || g_str_has_prefix (uri, "localhost/")) + return g_strconcat ("http://", uri, NULL); + parts = g_strsplit (uri, ".", 0); + if (!search && parts[0] && parts[1]) + { + if (!(parts[1][1] == '\0' && !g_ascii_isalpha (parts[1][0]))) + if (!strchr (parts[0], ' ') && !strchr (parts[1], ' ')) + if ((search = g_strconcat ("http://", uri, NULL))) + { + g_strfreev (parts); + return sokoke_idn_to_punycode (search); + } + } + g_strfreev (parts); + /* We don't want to search? So return early. */ + if (!search_engines) + return g_strdup (uri); + search = NULL; + search_uri = NULL; + /* Do we have a keyword and a string? */ + parts = g_strsplit (uri, " ", 2); + if (parts[0] && parts[1]) + if ((item = katze_array_find_token (search_engines, parts[0]))) + { + gchar* uri_ = g_uri_escape_string (parts[1], " :/", TRUE); + search_uri = katze_item_get_uri (item); + if (strstr (search_uri, "%s")) + search = g_strdup_printf (search_uri, uri_); + else + search = g_strconcat (search_uri, uri_, NULL); + g_free (uri_); + } + g_strfreev (parts); + return search; +} + +void +sokoke_combo_box_add_strings (GtkComboBox* combobox, + const gchar* label_first, ...) +{ + const gchar* label; + + /* Add a number of strings to a combobox, terminated with NULL + This works only for text comboboxes */ + va_list args; + va_start (args, label_first); + + for (label = label_first; label; label = va_arg (args, const gchar*)) + gtk_combo_box_append_text (combobox, label); + + va_end (args); +} + +void sokoke_widget_set_visible (GtkWidget* widget, gboolean visible) +{ + /* Show or hide the widget */ + if (visible) + gtk_widget_show (widget); + else + gtk_widget_hide (widget); +} + +void +sokoke_container_show_children (GtkContainer* container) +{ + /* Show every child but not the container itself */ + gtk_container_foreach (container, (GtkCallback)(gtk_widget_show_all), NULL); +} + +void +sokoke_widget_popup (GtkWidget* widget, + GtkMenu* menu, + GdkEventButton* event, + SokokeMenuPos pos) +{ + katze_widget_popup (widget, menu, event, (KatzeMenuPos)pos); +} + +typedef enum +{ + SOKOKE_DESKTOP_UNTESTED, + SOKOKE_DESKTOP_XFCE, + SOKOKE_DESKTOP_OSX, + SOKOKE_DESKTOP_UNKNOWN +} SokokeDesktop; + +static SokokeDesktop +sokoke_get_desktop (void) +{ + #if HAVE_OSX + return SOKOKE_DESKTOP_OSX; + #else + static SokokeDesktop desktop = SOKOKE_DESKTOP_UNTESTED; + if (G_UNLIKELY (desktop == SOKOKE_DESKTOP_UNTESTED)) + { + /* Are we running in Xfce? */ + gint result; + gchar *out = NULL; + gboolean success = g_spawn_command_line_sync ("xprop -root _DT_SAVE_MODE", + &out, NULL, &result, NULL); + if (success && ! result && out != NULL && strstr (out, "xfce4") != NULL) + desktop = SOKOKE_DESKTOP_XFCE; + else + desktop = SOKOKE_DESKTOP_UNKNOWN; + g_free (out); + } + + return desktop; + #endif +} + +/** + * sokoke_xfce_header_new: + * @icon: an icon name + * @title: the title of the header + * + * Creates an Xfce style header *if* Xfce is running. + * + * Return value: A #GtkWidget or %NULL + * + * Since 0.1.2 @icon may be NULL, and a default is used. + **/ +GtkWidget* +sokoke_xfce_header_new (const gchar* icon, + const gchar* title) +{ + g_return_val_if_fail (title, NULL); + + /* Create an xfce header with icon and title + This returns NULL if the desktop is not Xfce */ + if (sokoke_get_desktop () == SOKOKE_DESKTOP_XFCE) + { + GtkWidget* entry; + gchar* markup; + GtkWidget* xfce_heading; + GtkWidget* hbox; + GtkWidget* image; + GtkWidget* label; + GtkWidget* vbox; + GtkWidget* separator; + + xfce_heading = gtk_event_box_new (); + entry = gtk_entry_new (); + gtk_widget_modify_bg (xfce_heading, GTK_STATE_NORMAL, + &entry->style->base[GTK_STATE_NORMAL]); + hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); + if (icon) + image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG); + else + image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, + GTK_ICON_SIZE_DIALOG); + gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); + label = gtk_label_new (NULL); + gtk_widget_modify_fg (label, GTK_STATE_NORMAL + , &entry->style->text[GTK_STATE_NORMAL]); + markup = g_strdup_printf ("%s", + title); + gtk_label_set_markup (GTK_LABEL (label), markup); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (xfce_heading), hbox); + g_free (markup); + gtk_widget_destroy (entry); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), xfce_heading, FALSE, FALSE, 0); + + separator = gtk_hseparator_new (); + gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0); + + return vbox; + } + return NULL; +} + +GtkWidget* +sokoke_superuser_warning_new (void) +{ + /* Create a horizontal bar with a security warning + This returns NULL if the user is no superuser */ + #if HAVE_UNISTD_H + if (G_UNLIKELY (!geteuid ())) /* effective superuser? */ + { + GtkWidget* hbox; + GtkWidget* label; + + hbox = gtk_event_box_new (); + gtk_widget_modify_bg (hbox, GTK_STATE_NORMAL, + &hbox->style->bg[GTK_STATE_SELECTED]); + /* i18n: A superuser, or system administrator, may not be 'root' */ + label = gtk_label_new (_("Warning: You are using a superuser account!")); + gtk_misc_set_padding (GTK_MISC (label), 0, 2); + gtk_widget_modify_fg (GTK_WIDGET (label), GTK_STATE_NORMAL, + >K_WIDGET (label)->style->fg[GTK_STATE_SELECTED]); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (hbox), GTK_WIDGET (label)); + gtk_widget_show (hbox); + return hbox; + } + #endif + return NULL; +} + +GtkWidget* +sokoke_hig_frame_new (const gchar* title) +{ + /* Create a frame with no actual frame but a bold label and indentation */ + GtkWidget* frame = gtk_frame_new (NULL); + gchar* title_bold = g_strdup_printf ("%s", title); + GtkWidget* label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), title_bold); + g_free (title_bold); + gtk_frame_set_label_widget (GTK_FRAME (frame), label); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE); + return frame; +} + +void +sokoke_widget_set_pango_font_style (GtkWidget* widget, + PangoStyle style) +{ + /* Conveniently change the pango font style + For some reason we need to reset if we actually want the normal style */ + if (style == PANGO_STYLE_NORMAL) + gtk_widget_modify_font (widget, NULL); + else + { + PangoFontDescription* font_description = pango_font_description_new (); + pango_font_description_set_style (font_description, PANGO_STYLE_ITALIC); + gtk_widget_modify_font (widget, font_description); + pango_font_description_free (font_description); + } +} + +static gboolean +sokoke_on_entry_focus_in_event (GtkEntry* entry, + GdkEventFocus* event, + gpointer userdata) +{ + gint has_default = GPOINTER_TO_INT ( + g_object_get_data (G_OBJECT (entry), "sokoke_has_default")); + if (has_default) + { + gtk_entry_set_text (entry, ""); + g_object_set_data (G_OBJECT (entry), "sokoke_has_default", + GINT_TO_POINTER (0)); + sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), + PANGO_STYLE_NORMAL); + } + return FALSE; +} + +static gboolean +sokoke_on_entry_focus_out_event (GtkEntry* entry, + GdkEventFocus* event, + gpointer userdata) +{ + const gchar* text = gtk_entry_get_text (entry); + if (text && !*text) + { + const gchar* default_text = (const gchar*)g_object_get_data ( + G_OBJECT (entry), "sokoke_default_text"); + gtk_entry_set_text (entry, default_text); + g_object_set_data (G_OBJECT (entry), + "sokoke_has_default", GINT_TO_POINTER (1)); + sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), + PANGO_STYLE_ITALIC); + } + return FALSE; +} + +void +sokoke_entry_set_default_text (GtkEntry* entry, + const gchar* default_text) +{ + /* Note: The default text initially overwrites any previous text */ + gchar* old_value = g_object_get_data (G_OBJECT (entry), + "sokoke_default_text"); + if (!old_value) + { + g_object_set_data (G_OBJECT (entry), "sokoke_has_default", + GINT_TO_POINTER (1)); + sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), + PANGO_STYLE_ITALIC); + gtk_entry_set_text (entry, default_text); + } + else if (!GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (entry))) + { + gint has_default = GPOINTER_TO_INT ( + g_object_get_data (G_OBJECT (entry), "sokoke_has_default")); + if (has_default) + { + gtk_entry_set_text (entry, default_text); + sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), + PANGO_STYLE_ITALIC); + } + } + g_object_set_data (G_OBJECT (entry), "sokoke_default_text", + (gpointer)default_text); + g_signal_connect (entry, "focus-in-event", + G_CALLBACK (sokoke_on_entry_focus_in_event), NULL); + g_signal_connect (entry, "focus-out-event", + G_CALLBACK (sokoke_on_entry_focus_out_event), NULL); +} + +gchar* +sokoke_key_file_get_string_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + const gchar* default_value, + GError** error) +{ + gchar* value = g_key_file_get_string (key_file, group, key, error); + return value == NULL ? g_strdup (default_value) : value; +} + +gint +sokoke_key_file_get_integer_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + const gint default_value, + GError** error) +{ + if (!g_key_file_has_key (key_file, group, key, NULL)) + return default_value; + return g_key_file_get_integer (key_file, group, key, error); +} + +gdouble +sokoke_key_file_get_double_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + const gdouble default_value, + GError** error) +{ + if (!g_key_file_has_key (key_file, group, key, NULL)) + return default_value; + return g_key_file_get_double (key_file, group, key, error); +} + +gboolean +sokoke_key_file_get_boolean_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + const gboolean default_value, + GError** error) +{ + if (!g_key_file_has_key (key_file, group, key, NULL)) + return default_value; + return g_key_file_get_boolean (key_file, group, key, error); +} + +gboolean +sokoke_key_file_save_to_file (GKeyFile* key_file, + const gchar* filename, + GError** error) +{ + gchar* data; + FILE* fp; + + data = g_key_file_to_data (key_file, NULL, error); + if (!data) + return FALSE; + + if (!(fp = fopen (filename, "w"))) + { + *error = g_error_new (G_FILE_ERROR, G_FILE_ERROR_ACCES, + _("Writing failed.")); + return FALSE; + } + fputs (data, fp); + fclose (fp); + g_free (data); + return TRUE; +} + +void +sokoke_widget_get_text_size (GtkWidget* widget, + const gchar* text, + gint* width, + gint* height) +{ + PangoLayout* layout = gtk_widget_create_pango_layout (widget, text); + pango_layout_get_pixel_size (layout, width, height); + g_object_unref (layout); +} + +/** + * sokoke_action_create_popup_menu_item: + * @action: a #GtkAction + * + * Creates a menu item from an action, just like + * gtk_action_create_menu_item(), but it won't + * display an accelerator. + * + * Note: This menu item is not a proxy and will + * not reflect any changes to the action. + * + * Return value: a new #GtkMenuItem + **/ +GtkWidget* +sokoke_action_create_popup_menu_item (GtkAction* action) +{ + GtkWidget* menuitem; + GtkWidget* icon; + gchar* label; + gchar* stock_id; + gchar* icon_name; + gboolean sensitive; + gboolean visible; + + g_return_val_if_fail (GTK_IS_ACTION (action), NULL); + + g_object_get (action, + "label", &label, + "stock-id", &stock_id, + "icon-name", &icon_name, + "sensitive", &sensitive, + "visible", &visible, + NULL); + if (GTK_IS_TOGGLE_ACTION (action)) + { + menuitem = gtk_check_menu_item_new_with_mnemonic (label); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), + gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); + } + else if (stock_id) + { + if (label) + { + menuitem = gtk_image_menu_item_new_with_mnemonic (label); + icon = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + } + else + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + } + else + { + menuitem = gtk_image_menu_item_new_with_mnemonic (label); + if (icon_name) + { + icon = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), icon); + } + } + gtk_widget_set_sensitive (menuitem, sensitive); + sokoke_widget_set_visible (menuitem, visible); + g_signal_connect_swapped (menuitem, "activate", + G_CALLBACK (gtk_action_activate), action); + + return menuitem; +} + +/** + * sokoke_image_menu_item_new_ellipsized: + * @label: the text of the menu item + * + * Creates a new #GtkImageMenuItem containing an ellipsized label. + * + * Return value: a new #GtkImageMenuItem + **/ +GtkWidget* +sokoke_image_menu_item_new_ellipsized (const gchar* label) +{ + return katze_image_menu_item_new_ellipsized (label); +} + +/** + * sokoke_time_t_to_julian: + * @timestamp: a time_t timestamp value + * + * Calculates a unix timestamp to a julian day value. + * + * Return value: an integer. + **/ +gint64 +sokoke_time_t_to_julian (const time_t* timestamp) +{ + GDate* date; + gint64 julian; + + date = g_date_new (); + + g_date_set_time_t (date, *timestamp); + julian = (gint64)g_date_get_julian (date); + + g_date_free (date); + + return julian; +} + +/** + * sokoke_register_stock_items: + * + * Registers several custom stock items used throughout Midori. + **/ +void +sokoke_register_stock_items (void) +{ + typedef struct + { + const gchar* stock_id; + const gchar* label; + GdkModifierType modifier; + guint keyval; + const gchar* fallback; + } FatStockItem; + GtkIconSource* icon_source; + GtkIconSet* icon_set; + GtkIconFactory* factory = gtk_icon_factory_new (); + gsize i; + + static FatStockItem items[] = + { + { STOCK_EXTENSION, NULL, 0, 0, GTK_STOCK_CONVERT }, + { STOCK_IMAGE, NULL, 0, 0, GTK_STOCK_ORIENTATION_PORTRAIT }, + { STOCK_NEWS_FEED, NULL, 0, 0, GTK_STOCK_INDEX }, + { STOCK_SCRIPT, NULL, 0, 0, GTK_STOCK_EXECUTE }, + { STOCK_STYLE, NULL, 0, 0, GTK_STOCK_SELECT_COLOR }, + { STOCK_TRANSFER, NULL, 0, 0, GTK_STOCK_SAVE }, + + { STOCK_BOOKMARK, N_("_Bookmark"), 0, 0, GTK_STOCK_FILE }, + { STOCK_BOOKMARKS, N_("_Bookmarks"), 0, 0, GTK_STOCK_DIRECTORY }, + { STOCK_BOOKMARK_ADD, N_("_Add Bookmark"), 0, 0, GTK_STOCK_ADD }, + { STOCK_CONSOLE, N_("_Console"), 0, 0, GTK_STOCK_DIALOG_WARNING }, + { STOCK_EXTENSIONS, N_("_Extensions"), 0, 0, GTK_STOCK_CONVERT }, + { STOCK_HISTORY, N_("_History"), 0, 0, GTK_STOCK_SORT_ASCENDING }, + { STOCK_HOMEPAGE, N_("_Homepage"), 0, 0, GTK_STOCK_HOME }, + { STOCK_SCRIPTS, N_("_Userscripts"), 0, 0, GTK_STOCK_EXECUTE }, + { STOCK_STYLES, N_("User_styles"), 0, 0, GTK_STOCK_SELECT_COLOR }, + { STOCK_TAB_NEW, N_("New _Tab"), 0, 0, GTK_STOCK_ADD }, + { STOCK_TRANSFERS, N_("_Transfers"), 0, 0, GTK_STOCK_SAVE }, + { STOCK_PLUGINS, N_("P_lugins"), 0, 0, GTK_STOCK_CONVERT }, + { STOCK_USER_TRASH, N_("_Closed Tabs and Windows"), 0, 0, "gtk-undo-ltr" }, + { STOCK_WINDOW_NEW, N_("New _Window"), 0, 0, GTK_STOCK_ADD }, + }; + + for (i = 0; i < G_N_ELEMENTS (items); i++) + { + icon_set = gtk_icon_set_new (); + icon_source = gtk_icon_source_new (); + if (items[i].fallback) + { + gtk_icon_source_set_icon_name (icon_source, items[i].fallback); + items[i].fallback = NULL; + gtk_icon_set_add_source (icon_set, icon_source); + } + gtk_icon_source_set_icon_name (icon_source, items[i].stock_id); + gtk_icon_set_add_source (icon_set, icon_source); + gtk_icon_source_free (icon_source); + gtk_icon_factory_add (factory, items[i].stock_id, icon_set); + gtk_icon_set_unref (icon_set); + } + gtk_stock_add ((GtkStockItem*)items, G_N_ELEMENTS (items)); + gtk_icon_factory_add_default (factory); + g_object_unref (factory); +} + +/** + * sokoke_set_config_dir: + * @new_config_dir: an absolute path, or %NULL + * + * Retrieves and/ or sets the base configuration folder. + * + * Return value: the configuration folder, or %NULL + **/ +const gchar* +sokoke_set_config_dir (const gchar* new_config_dir) +{ + static gchar* config_dir = NULL; + + if (config_dir) + return config_dir; + + if (!new_config_dir) + config_dir = g_build_filename (g_get_user_config_dir (), + PACKAGE_NAME, NULL); + else + { + g_return_val_if_fail (g_path_is_absolute (new_config_dir), NULL); + katze_assign (config_dir, g_strdup (new_config_dir)); + } + + return config_dir; +} + +/** + * sokoke_remove_path: + * @path: an absolute path + * @ignore_errors: keep removing even if an error occurred + * + * Removes the file at @path or the folder including any + * child folders and files if @path is a folder. + * + * If @ignore_errors is %TRUE and @path is a folder with + * children, one of which can't be removed, remaining + * children will be deleted nevertheless + * If @ignore_errors is %FALSE and @path is a folder, the + * removal process will cancel immediately. + * + * Return value: %TRUE on success, %FALSE if an error occurred + **/ +gboolean +sokoke_remove_path (const gchar* path, + gboolean ignore_errors) +{ + GDir* dir = g_dir_open (path, 0, NULL); + const gchar* name; + + if (!dir) + return g_remove (path) == 0; + + while ((name = g_dir_read_name (dir))) + { + gchar* sub_path = g_build_filename (path, name, NULL); + if (!sokoke_remove_path (sub_path, ignore_errors) && !ignore_errors) + return FALSE; + g_free (sub_path); + } + + g_dir_close (dir); + g_rmdir (path); + return TRUE; +} diff --git a/midori/sokoke.h b/midori/sokoke.h new file mode 100644 index 00000000..0360ab1f --- /dev/null +++ b/midori/sokoke.h @@ -0,0 +1,137 @@ +/* + Copyright (C) 2007-2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __SOKOKE_H__ +#define __SOKOKE_H__ 1 + +#include + +#include + +#include + +gchar* +sokoke_js_script_eval (JSContextRef js_context, + const gchar* script, + gchar** exception); + +/* Many themes need this hack for small toolbars to work */ +#define GTK_ICON_SIZE_SMALL_TOOLBAR GTK_ICON_SIZE_BUTTON + +gboolean +sokoke_spawn_program (const gchar* command, + const gchar* argument); + +gchar* +sokoke_magic_uri (const gchar* uri, + KatzeArray* search_engines); + +typedef enum { + SOKOKE_MENU_POSITION_CURSOR = 0, + SOKOKE_MENU_POSITION_LEFT, + SOKOKE_MENU_POSITION_RIGHT +} SokokeMenuPos; + +void +sokoke_combo_box_add_strings (GtkComboBox* combobox, + const gchar* label_first, + ...); + +void +sokoke_widget_set_visible (GtkWidget* widget, + gboolean visible); + +void +sokoke_container_show_children (GtkContainer* container); + +void +sokoke_widget_popup (GtkWidget* widget, + GtkMenu* menu, + GdkEventButton* event, + SokokeMenuPos pos); + +GtkWidget* +sokoke_xfce_header_new (const gchar* icon, + const gchar* title); + +GtkWidget* +sokoke_superuser_warning_new (void); + +GtkWidget* +sokoke_hig_frame_new (const gchar* title); + +void +sokoke_widget_set_pango_font_style (GtkWidget* widget, + PangoStyle style); + +void +sokoke_entry_set_default_text (GtkEntry* entry, + const gchar* default_text); + +gchar* +sokoke_key_file_get_string_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + const gchar* default_value, + GError** error); + +gint +sokoke_key_file_get_integer_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + const gint default_value, + GError** error); + +gdouble +sokoke_key_file_get_double_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + gdouble default_value, + GError** error); + +gboolean +sokoke_key_file_get_boolean_default (GKeyFile* key_file, + const gchar* group, + const gchar* key, + gboolean default_value, + GError** error); + +gboolean +sokoke_key_file_save_to_file (GKeyFile* key_file, + const gchar* filename, + GError** error); + +void +sokoke_widget_get_text_size (GtkWidget* widget, + const gchar* text, + gint* width, + gint* height); + +GtkWidget* +sokoke_action_create_popup_menu_item (GtkAction* action); + +GtkWidget* +sokoke_image_menu_item_new_ellipsized (const gchar* label); + +gint64 +sokoke_time_t_to_julian (const time_t* timestamp); + +void +sokoke_register_stock_items (void); + +const gchar* +sokoke_set_config_dir (const gchar* new_config_dir); + +gboolean +sokoke_remove_path (const gchar* path, + gboolean ignore_errors); + +#endif /* !__SOKOKE_H__ */ diff --git a/midori/wscript_build b/midori/wscript_build new file mode 100644 index 00000000..87eba0ea --- /dev/null +++ b/midori/wscript_build @@ -0,0 +1,31 @@ +#! /usr/bin/env python +# WAF build script for midori +# This file is licensed under the terms of the expat license, see the file EXPAT. + +import platform + +obj = bld.new_task_gen ('cc', 'staticlib') +obj.name = 'midori' +obj.target = 'midori' +obj.includes = '. ..' +obj.find_sources_in_dirs ('.', excludes=['main.c']) +obj.add_marshal_file ('marshal.list', 'midori_cclosure_marshal') +obj.uselib = 'UNIQUE LIBSOUP LIBIDN GIO GTK SQLITE WEBKIT LIBXML HILDON' +obj.uselib_local = 'katze' +obj.install_path = None + +obj = bld.new_task_gen ('cc', 'staticlib') +obj.name = 'panels' +obj.target = 'panels' +obj.includes = '. ..' +obj.find_sources_in_dirs ('../panels') +obj.uselib = 'UNIQUE LIBSOUP GMODULE GTHREAD GIO GTK SQLITE WEBKIT LIBXML' +obj.uselib_local = 'midori' +obj.install_path = None + +obj = bld.new_task_gen ('cc', 'program') +obj.target = 'midori' +obj.includes = '. .. ../panels' +obj.source = 'main.c' +obj.uselib = 'UNIQUE LIBSOUP GMODULE GTHREAD GIO GTK SQLITE WEBKIT LIBXML' +obj.uselib_local = 'panels' diff --git a/panels/midori-addons.c b/panels/midori-addons.c new file mode 100644 index 00000000..4faa69e1 --- /dev/null +++ b/panels/midori-addons.c @@ -0,0 +1,1081 @@ +/* + Copyright (C) 2008 Christian Dywan + Copyright (C) 2008 Arnaud Renevier + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori-addons.h" +#include "midori-stock.h" + +#include "sokoke.h" + +#include +#include +#include +#include +#include + +struct _MidoriAddons +{ + GtkVBox parent_instance; + + MidoriAddonKind kind; + GtkWidget* web_widget; + GtkWidget* toolbar; + GtkWidget* treeview; + + GSList* elements; +}; + +struct _MidoriAddonsClass +{ + GtkVBoxClass parent_class; +}; + +struct AddonElement +{ + gchar *fullpath; + gchar *name; + gchar *description; + gboolean enabled; + gboolean broken; + + GSList* includes; + GSList* excludes; +}; + +static void +midori_addons_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriAddons, midori_addons, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_addons_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_KIND, + PROP_WEB_WIDGET +}; + +static void +midori_addons_finalize (GObject* object); + +static void +midori_addons_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_addons_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +GType +midori_addon_kind_get_type (void) +{ + static GType type = 0; + if (!type) + { + static const GEnumValue values[] = { + { MIDORI_ADDON_NONE, "MIDORI_ADDON_NONE", N_("None") }, + { MIDORI_ADDON_USER_SCRIPTS, "MIDORI_USER_SCRIPTS", N_("Userscripts") }, + { MIDORI_ADDON_USER_STYLES, "MIDORI_USER_STYLES", N_("Userstyles") }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MidoriAddonKind", values); + } + return type; +} + +static void +midori_addons_class_init (MidoriAddonsClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_addons_finalize; + gobject_class->set_property = midori_addons_set_property; + gobject_class->get_property = midori_addons_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_KIND, + g_param_spec_enum ( + "kind", + "Kind", + "The kind of addons", + MIDORI_TYPE_ADDON_KIND, + MIDORI_ADDON_NONE, + flags)); + + g_object_class_install_property (gobject_class, + PROP_WEB_WIDGET, + g_param_spec_object ( + "web-widget", + "Web Widget", + "The assigned web widget", + GTK_TYPE_WIDGET, + G_PARAM_READWRITE)); +} + +static const gchar* +midori_addons_get_label (MidoriViewable* viewable) +{ + if (MIDORI_ADDONS (viewable)->kind == MIDORI_ADDON_USER_SCRIPTS) + return _("Userscripts"); + else if (MIDORI_ADDONS (viewable)->kind == MIDORI_ADDON_USER_STYLES) + return _("Userstyles"); + else + return NULL; +} + +static const gchar* +midori_addons_get_stock_id (MidoriViewable* viewable) +{ + if (MIDORI_ADDONS (viewable)->kind == MIDORI_ADDON_USER_SCRIPTS) + return STOCK_SCRIPTS; + else if (MIDORI_ADDONS (viewable)->kind == MIDORI_ADDON_USER_STYLES) + return STOCK_STYLES; + else + return NULL; +} + +static void +midori_addons_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_addons_get_stock_id; + iface->get_label = midori_addons_get_label; + iface->get_toolbar = midori_addons_get_toolbar; +} + +static void +midori_addons_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriAddons* addons = MIDORI_ADDONS (object); + + switch (prop_id) + { + case PROP_KIND: + addons->kind = g_value_get_enum (value); + break; + case PROP_WEB_WIDGET: + katze_object_assign (addons->web_widget, g_value_dup_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_addons_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriAddons* addons = MIDORI_ADDONS (object); + + switch (prop_id) + { + case PROP_KIND: + g_value_set_enum (value, addons->kind); + break; + case PROP_WEB_WIDGET: + g_value_set_object (value, addons->web_widget); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static const gchar* +_addons_get_folder (MidoriAddons* addons) +{ + switch (addons->kind) + { + case MIDORI_ADDON_USER_SCRIPTS: + return "scripts"; + case MIDORI_ADDON_USER_STYLES: + return "styles"; + default: + return NULL; + } +} + +static const gchar* +_addons_get_extension (MidoriAddons* addons) +{ + switch (addons->kind) + { + case MIDORI_ADDON_USER_SCRIPTS: + return ".js"; + case MIDORI_ADDON_USER_STYLES: + return ".css"; + default: + return NULL; + } +} + +static GSList* +_addons_get_directories (MidoriAddons* addons) +{ + GSList *directories; + const char* const* datadirs; + const gchar* folder; + gchar* path; + + folder = _addons_get_folder (addons); + + /* user data dir */ + path = g_build_path (G_DIR_SEPARATOR_S, g_get_user_data_dir (), + PACKAGE_NAME, folder, NULL); + directories = g_slist_prepend (NULL, path); + + /* system data dirs */ + datadirs = g_get_system_data_dirs (); + while (*datadirs) + { + path = g_build_path (G_DIR_SEPARATOR_S, *datadirs, + PACKAGE_NAME, folder, NULL); + directories = g_slist_prepend (directories, path); + datadirs++; + } + + return directories; +} + +static GSList* +_addons_get_files (MidoriAddons* addons) +{ + GSList* files; + GDir* addon_dir; + const gchar* folder; + const gchar* extension; + GSList* list; + GSList* directories; + const gchar* filename; + gchar* dirname; + gchar* fullname; + + files = NULL; + folder = _addons_get_folder (addons); + extension = _addons_get_extension (addons); + + directories = _addons_get_directories (addons); + list = directories; + while (directories) + { + dirname = directories->data; + if ((addon_dir = g_dir_open (dirname, 0, NULL))) + { + while ((filename = g_dir_read_name (addon_dir))) + { + if (g_str_has_suffix (filename, extension)) + { + fullname = g_build_filename (dirname, filename, NULL); + files = g_slist_prepend (files, fullname); + } + } + g_dir_close (addon_dir); + } + g_free (dirname); + directories = g_slist_next (directories); + } + g_slist_free (list); + + return files; +} + +static GtkTreePath* +_treeview_first_selected_path (GtkTreeView *treeview) +{ + GtkTreeSelection* selection; + GList* tree_paths; + + selection = gtk_tree_view_get_selection (treeview); + if (!selection) + return NULL; + + if (gtk_tree_selection_get_selected (selection, NULL, NULL)) + { + GtkTreePath* result; + tree_paths = gtk_tree_selection_get_selected_rows (selection, NULL); + result = gtk_tree_path_copy (g_list_nth_data (tree_paths, 0)); + g_list_foreach (tree_paths, (GFunc)gtk_tree_path_free, NULL); + g_list_free (tree_paths); + return result; + } + else + return NULL; +} + +static void +_addons_toggle_enable_button (MidoriAddons* addons, + gboolean sensitive) +{ + GtkToolItem* button; + + button = gtk_toolbar_get_nth_item (GTK_TOOLBAR (addons->toolbar), 1); + gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive); +} + +static void +_addons_toggle_disable_button (MidoriAddons* addons, + gboolean sensitive) +{ + GtkToolItem* button; + + button = gtk_toolbar_get_nth_item (GTK_TOOLBAR (addons->toolbar), 2); + gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive); +} + +static void +midori_addons_directory_monitor_changed (GFileMonitor* monitor, + GFile* child, + GFile* other_file, + GFileMonitorEvent flags, + MidoriAddons* addons) +{ + midori_addons_update_elements (addons); +} + +static void +midori_addons_treeview_cursor_changed (GtkTreeView* treeview, + MidoriAddons* addons) +{ + struct AddonElement* element; + GtkTreeModel* model; + GtkTreeIter iter; + GtkTreePath *path; + + path = _treeview_first_selected_path (treeview); + + model = gtk_tree_view_get_model (treeview); + if (path && gtk_tree_model_get_iter (model, &iter, path)) + { + gtk_tree_model_get (model, &iter, 0, &element, -1); + if (element->broken) + { + _addons_toggle_enable_button (addons, FALSE); + _addons_toggle_disable_button (addons, FALSE); + } else + { + _addons_toggle_enable_button (addons, !element->enabled); + _addons_toggle_disable_button (addons, element->enabled); + } + } +} + +static void +midori_addons_button_status_clicked_cb (GtkToolItem* toolitem, + MidoriAddons* addons) +{ + GtkTreeView* treeview; + struct AddonElement* element; + GtkTreeModel* model; + GtkTreeIter iter; + GtkTreePath* path; + + treeview = GTK_TREE_VIEW (addons->treeview); + + path = _treeview_first_selected_path (treeview); + model = gtk_tree_view_get_model (treeview); + if (gtk_tree_model_get_iter (model, &iter, path)) + { + gtk_tree_model_get (model, &iter, 0, &element, -1); + if (toolitem == gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (addons->toolbar), 2)) /* disable button */ + element->enabled = FALSE; + else if (toolitem == gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (addons->toolbar), 1)) /* enable button */ + element->enabled = TRUE; + + _addons_toggle_enable_button (addons, !element->enabled); + _addons_toggle_disable_button (addons, element->enabled); + + /* After enabling or disabling an element, the tree view + is not updated automatically; we need to notify tree model + in order to take the modification into account */ + gtk_tree_model_row_changed (model, path, &iter); + } +} + +static void +midori_addons_button_add_clicked_cb (GtkToolItem* toolitem, + MidoriAddons* addons) +{ + GtkWidget* dialog = gtk_message_dialog_new ( + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (addons))), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, + "Put scripts in the folder ~/.local/share/midori/%s", + _addons_get_folder (addons)); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); +} + +static void +midori_addons_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + struct AddonElement *element; + + gtk_tree_model_get (model, iter, 0, &element, -1); + + if (element->broken) + g_object_set (renderer, "stock-id", GTK_STOCK_STOP, NULL); + else + g_object_set (renderer, "stock-id", GTK_STOCK_FILE, NULL); +} + +static void +midori_addons_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + struct AddonElement *element; + + gtk_tree_model_get (model, iter, 0, &element, -1); + + g_object_set (renderer, "text", element->name, NULL); + if (!element->enabled) + g_object_set (renderer, "sensitive", false, NULL); + else + g_object_set (renderer, "sensitive", true, NULL); +} + +static void +midori_addons_treeview_row_activated_cb (GtkTreeView* treeview, + GtkTreePath* path, + GtkTreeViewColumn* column, + MidoriAddons* addons) +{ + /*GtkTreeModel* model = gtk_tree_view_get_model (treeview); + GtkTreeIter iter; + if (gtk_tree_model_get_iter (model, &iter, path)) + { + gchar* b; + gtk_tree_model_get (model, &iter, 2, &b, -1); + g_free (b); + }*/ +} + +static void +midori_addons_init (MidoriAddons* addons) +{ + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_text; + GtkCellRenderer* renderer_pixbuf; + + addons->web_widget = NULL; + addons->elements = NULL; + + addons->treeview = gtk_tree_view_new (); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (addons->treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_addons_treeview_render_icon_cb, + addons->treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_addons_treeview_render_text_cb, + addons->treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (addons->treeview), column); + g_signal_connect (addons->treeview, "row-activated", + G_CALLBACK (midori_addons_treeview_row_activated_cb), + addons); + gtk_widget_show (addons->treeview); + gtk_box_pack_start (GTK_BOX (addons), addons->treeview, TRUE, TRUE, 0); +} + +static void +midori_addons_finalize (GObject* object) +{ + MidoriAddons* addons = MIDORI_ADDONS (object); + + katze_object_assign (addons->web_widget, NULL); + + g_slist_free (addons->elements); +} + +static gboolean +_metadata_from_file (const gchar* filename, + GSList** includes, + GSList** excludes, + gchar** name, + gchar** description) +{ + GIOChannel* channel; + gboolean found_meta; + gchar* line; + gchar* rest_of_line; + + if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) + return FALSE; + + channel = g_io_channel_new_file (filename, "r", 0); + if (!channel) + return FALSE; + + found_meta = FALSE; + + while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL) + == G_IO_STATUS_NORMAL) + { + if (g_str_has_prefix (line, "// ==UserScript==")) + found_meta = TRUE; + else if (found_meta) + { + if (g_str_has_prefix (line, "// ==/UserScript==")) + found_meta = FALSE; + else if (g_str_has_prefix (line, "// @require ") || + g_str_has_prefix (line, "// @resource ")) + { + /* We don't support these, so abort here */ + g_free (line); + g_io_channel_shutdown (channel, false, 0); + g_slist_free (*includes); + g_slist_free (*excludes); + *includes = NULL; + *excludes = NULL; + return FALSE; + } + else if (includes && g_str_has_prefix (line, "// @include ")) + { + rest_of_line = g_strdup (line + strlen ("// @include ")); + rest_of_line = g_strstrip (rest_of_line); + *includes = g_slist_prepend (*includes, rest_of_line); + } + else if (excludes && g_str_has_prefix (line, "// @exclude ")) + { + rest_of_line = g_strdup (line + strlen ("// @exclude ")); + rest_of_line = g_strstrip (rest_of_line); + *excludes = g_slist_prepend (*excludes, rest_of_line); + } + else if (name && g_str_has_prefix (line, "// @name ")) + { + rest_of_line = g_strdup (line + strlen ("// @name ")); + rest_of_line = g_strstrip (rest_of_line); + *name = rest_of_line; + } + else if (description && g_str_has_prefix (line, "// @description ")) + { + rest_of_line = g_strdup (line + strlen ("// @description ")); + rest_of_line = g_strstrip (rest_of_line); + *description = rest_of_line; + } + } + g_free (line); + } + g_io_channel_shutdown (channel, false, 0); + g_io_channel_unref (channel); + + return TRUE; +} + +static gchar* +_convert_to_simple_regexp (const gchar* pattern) +{ + guint len; + gchar* dest; + guint pos; + guint i; + gchar c; + + len = strlen (pattern); + dest = g_malloc0 (len * 2 + 1); + dest[0] = '^'; + pos = 1; + + for (i = 0; i < len; i++) + { + c = pattern[i]; + switch (c) + { + case '*': + dest[pos] = '.'; + dest[pos + 1] = c; + pos++; + pos++; + break; + case '.' : + case '?' : + case '^' : + case '$' : + case '+' : + case '{' : + case '[' : + case '|' : + case '(' : + case ')' : + case ']' : + case '\\' : + dest[pos] = '\\'; + dest[pos + 1] = c; + pos++; + pos++; + break; + case ' ' : + break; + default: + dest[pos] = pattern[i]; + pos ++; + } + } + return dest; +} + +static gboolean +_may_load_script (const gchar* uri, + GSList** includes, + GSList** excludes) +{ + gboolean match; + GSList* list; + gchar* re; + + if (*includes) + match = FALSE; + else + match = TRUE; + + list = *includes; + while (list) + { + re = _convert_to_simple_regexp (list->data); + if (g_regex_match_simple (re, uri, 0, 0)) + { + match = TRUE; + break; + } + g_free (re); + list = g_slist_next (list); + } + if (!match) + { + return FALSE; + } + list = *excludes; + while (list) + { + re = _convert_to_simple_regexp (list->data); + if (g_regex_match_simple (re, uri, 0, 0)) + { + match = FALSE; + break; + } + g_free (re); + list = g_slist_next (list); + } + return match; +} + +static gboolean +_js_script_from_file (JSContextRef js_context, + const gchar* filename, + gchar** exception) +{ + gboolean result = FALSE; + gchar* script; + GError* error = NULL; + gchar* wrapped_script; + + if (g_file_get_contents (filename, &script, NULL, &error)) + { + /* Wrap the script to prevent global variables */ + wrapped_script = g_strdup_printf ( + "window.addEventListener ('DOMContentLoaded'," + "function () { %s }, true);", script); + if (sokoke_js_script_eval (js_context, wrapped_script, exception)) + result = TRUE; + g_free (wrapped_script); + g_free (script); + } + else + { + *exception = g_strdup (error->message); + g_error_free (error); + } + return result; +} + +static gboolean +_js_style_from_file (JSContextRef js_context, + const gchar* filename, + gchar** exception) +{ + gboolean result; + gchar* style; + GError* error; + guint i, n; + gchar* style_script; + + result = FALSE; + error = NULL; + if (g_file_get_contents (filename, &style, NULL, &error)) + { + n = strlen (style); + for (i = 0; i < n; i++) + { + /* Replace line breaks with spaces */ + if (style[i] == '\n' || style[i] == '\r') + style[i] = ' '; + /* Change all single quotes to double quotes */ + if (style[i] == '\'') + style[i] = '\"'; + } + style_script = g_strdup_printf ( + "window.addEventListener ('DOMContentLoaded'," + "function () {" + "var mystyle = document.createElement(\"style\");" + "mystyle.setAttribute(\"type\", \"text/css\");" + "mystyle.appendChild(document.createTextNode('%s'));" + "var head = document.getElementsByTagName(\"head\")[0];" + "if (head) head.appendChild(mystyle);" + "else document.documentElement.insertBefore(mystyle, document.documentElement.firstChild);" + "}, true);", + style); + if (sokoke_js_script_eval (js_context, style_script, exception)) + result = TRUE; + g_free (style_script); + g_free (style); + } + else + { + *exception = g_strdup (error->message); + g_error_free (error); + } + return result; +} + +static void +midori_web_widget_context_ready_cb (GtkWidget* web_widget, + JSGlobalContextRef js_context, + MidoriAddons* addons) +{ + const gchar* uri; + GSList* elements; + struct AddonElement* element; + gchar* fullname; + gchar* exception; + gchar* message; + + uri = katze_object_get_string (web_widget, "uri"); + if (!uri) + return; + + elements = addons->elements; + while (elements) + { + element = elements->data; + if (!element->enabled || element->broken) + { + elements = g_slist_next (elements); + continue; + } + + fullname = element->fullpath; + + if (element->includes || element->excludes) + if (!_may_load_script (uri, &element->includes, &element->excludes)) + { + elements = g_slist_next (elements); + continue; + } + + exception = NULL; + if (addons->kind == MIDORI_ADDON_USER_SCRIPTS && + !_js_script_from_file (js_context, fullname, &exception)) + { + message = g_strdup_printf ("console.error ('%s');", exception); + sokoke_js_script_eval (js_context, message, NULL); + g_free (message); + g_free (exception); + } + else if (addons->kind == MIDORI_ADDON_USER_STYLES && + !_js_style_from_file (js_context, fullname, &exception)) + { + message = g_strdup_printf ("console.error ('%s');", exception); + sokoke_js_script_eval (js_context, message, NULL); + g_free (message); + g_free (exception); + } + + elements = g_slist_next (elements); + } +} + +/** + * midori_addons_new: + * @kind: the kind of addon + * @web_widget: a web widget + * + * Creates a new addons widget. + * + * @web_widget can be one of the following: + * %MidoriBrowser, %MidoriWebView, %WebKitWebView + * + * Return value: a new #MidoriAddons + **/ +GtkWidget* +midori_addons_new (MidoriAddonKind kind, + GtkWidget* web_widget) +{ + MidoriAddons* addons; + GSList* directories; + GSList* list; + GFile* directory; + GError* error; + GFileMonitor* monitor; + + g_return_val_if_fail (GTK_IS_WIDGET (web_widget), NULL); + + addons = g_object_new (MIDORI_TYPE_ADDONS, + "kind", kind, + "web-widget", web_widget, + NULL); + + if (kind == MIDORI_ADDON_USER_SCRIPTS || kind == MIDORI_ADDON_USER_STYLES) + g_signal_connect (addons->web_widget, "context-ready", + G_CALLBACK (midori_web_widget_context_ready_cb), addons); + + midori_addons_update_elements (addons); + + directories = _addons_get_directories (addons); + list = directories; + while (directories) + { + directory = g_file_new_for_path (directories->data); + directories = g_slist_next (directories); + error = NULL; + monitor = g_file_monitor_directory (directory, + G_FILE_MONITOR_NONE, + NULL, &error); + if (!monitor) + { + g_warning ("could not monitor %s: %s", g_file_get_parse_name (directory), + error->message); + g_error_free (error); + } + g_signal_connect (monitor, "changed", + G_CALLBACK (midori_addons_directory_monitor_changed), addons); + g_object_unref (directory); + } + g_slist_free (list); + + return GTK_WIDGET (addons); +} + +/** + * midori_addons_get_toolbar: + * @addons: a #MidoriAddons + * + * Retrieves the toolbar of the addons. A new widget + * is created on the first call of this function. + * + * Return value: a toolbar widget + * + * Deprecated: 0.1.2: Use midori_viewable_get_toolbar() instead. + **/ +GtkWidget* +midori_addons_get_toolbar (MidoriViewable* addons) +{ + GtkWidget* toolbar; + GtkToolItem* toolitem; + + g_return_val_if_fail (MIDORI_IS_ADDONS (addons), NULL); + + if (!MIDORI_ADDONS (addons)->toolbar) + { + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + toolitem = gtk_tool_item_new (); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + + /* enable button */ + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_YES); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("_Enable")); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), _("Enable")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_addons_button_status_clicked_cb), addons); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_set_sensitive (GTK_WIDGET (toolitem), FALSE); + gtk_widget_show (GTK_WIDGET (toolitem)); + + /* disable button */ + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_NO); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("_Disable")); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), _("Disable")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_addons_button_status_clicked_cb), addons); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_set_sensitive (GTK_WIDGET (toolitem), FALSE); + gtk_widget_show (GTK_WIDGET (toolitem)); + + /* separator */ + toolitem = gtk_separator_tool_item_new (); + gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), + FALSE); + gtk_tool_item_set_expand (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + + /* add button */ + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_ADD); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_addons_button_add_clicked_cb), addons); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + MIDORI_ADDONS (addons)->toolbar = toolbar; + + g_signal_connect (MIDORI_ADDONS (addons)->treeview, "cursor-changed", + G_CALLBACK (midori_addons_treeview_cursor_changed), + addons); + + g_signal_connect (toolbar, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &MIDORI_ADDONS (addons)->toolbar); + } + + return MIDORI_ADDONS (addons)->toolbar; +} + +/** + * midori_addons_update_elements: + * @addons: a #MidoriAddons + * + * Updates all addons elements (file paths and metadata). + * + **/ +void +midori_addons_update_elements (MidoriAddons* addons) +{ + GTree* disabled; + GSList* elements; + gboolean broken; + gchar* fullname; + gchar* displayname; + gchar* name; + gchar* description; + GSList* includes; + GSList* excludes; + GtkListStore* liststore; + GtkTreeIter iter; + GSList* addon_files; + GSList* list; + struct AddonElement* element; + + g_return_if_fail (MIDORI_IS_ADDONS (addons)); + g_return_if_fail (addons->kind != MIDORI_ADDON_NONE); + + /* FIXME: would GHashTable be better? */ + disabled = g_tree_new ((GCompareFunc)strcmp); + elements = addons->elements; + while (elements) + { + element = elements->data; + if (!element->enabled) + g_tree_insert (disabled, element->fullpath, NULL); + elements = g_slist_next (elements); + } + + g_slist_free (addons->elements); + addons->elements = NULL; + + liststore = gtk_list_store_new (3, G_TYPE_POINTER, + G_TYPE_INT, + G_TYPE_STRING); + + addon_files = _addons_get_files (addons); + list = addon_files; + while (addon_files) + { + fullname = addon_files->data; + displayname = g_filename_display_basename (fullname); + description = NULL; + includes = NULL; + excludes = NULL; + broken = FALSE; + + if (addons->kind == MIDORI_ADDON_USER_SCRIPTS) + { + name = NULL; + if (!_metadata_from_file (fullname, &includes, &excludes, + &name, &description)) + broken = TRUE; + + if (name) + { + g_free (displayname); + displayname = name; + } + } + + element = g_new (struct AddonElement, 1); + element->name = displayname; + element->description = description; + element->fullpath = fullname; + + if (g_tree_lookup_extended (disabled, fullname, NULL, NULL)) + element->enabled = FALSE; + else + element->enabled = TRUE; + element->broken = broken; + element->includes = includes; + element->excludes = excludes; + addons->elements = g_slist_prepend (addons->elements, element); + + gtk_list_store_append (liststore, &iter); + gtk_list_store_set (liststore, &iter, + 0, element, 1, 0, 2, "", -1); + + addon_files = g_slist_next (addon_files); + } + addons->elements = g_slist_reverse (addons->elements); + + g_tree_destroy (disabled); + g_slist_free (list); + + gtk_tree_view_set_model (GTK_TREE_VIEW (addons->treeview), + GTK_TREE_MODEL (liststore)); + + /* In case a row was selected, that selection will be cancelled + when calling gtk_tree_view_set_model. So, we need to make sure + that the buttons are insensitive. */ + if (addons->toolbar) + { + _addons_toggle_enable_button (addons, FALSE); + _addons_toggle_disable_button (addons, FALSE); + } +} diff --git a/panels/midori-addons.h b/panels/midori-addons.h new file mode 100644 index 00000000..662745ab --- /dev/null +++ b/panels/midori-addons.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_ADDONS_H__ +#define __MIDORI_ADDONS_H__ + +#include + +#include + +#include "midori-viewable.h" + +G_BEGIN_DECLS + +#define MIDORI_TYPE_ADDONS \ + (midori_addons_get_type ()) +#define MIDORI_ADDONS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_ADDONS, MidoriAddons)) +#define MIDORI_ADDONS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_ADDONS, MidoriAddonsClass)) +#define MIDORI_IS_ADDONS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_ADDONS)) +#define MIDORI_IS_ADDONS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_ADDONS)) +#define MIDORI_ADDONS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_ADDONS, MidoriAddonsClass)) + +typedef struct _MidoriAddons MidoriAddons; +typedef struct _MidoriAddonsClass MidoriAddonsClass; + +typedef enum +{ + MIDORI_ADDON_NONE, + MIDORI_ADDON_USER_SCRIPTS, + MIDORI_ADDON_USER_STYLES +} MidoriAddonKind; + +GType +midori_addon_kind_get_type (void) G_GNUC_CONST; + +#define MIDORI_TYPE_ADDON_KIND \ + (midori_addon_kind_get_type ()) + +GType +midori_addons_get_type (void); + +GtkWidget* +midori_addons_new (MidoriAddonKind kind, + GtkWidget* web_widget); + +GtkWidget* +midori_addons_get_toolbar (MidoriViewable* addons); + +void +midori_addons_update_elements (MidoriAddons* addons); + +G_END_DECLS + +#endif /* __MIDORI_ADDONS_H__ */ diff --git a/panels/midori-bookmarks.c b/panels/midori-bookmarks.c new file mode 100644 index 00000000..a1de10d5 --- /dev/null +++ b/panels/midori-bookmarks.c @@ -0,0 +1,959 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-bookmarks.h" + +#include "midori-app.h" +#include "midori-browser.h" +#include "midori-stock.h" +#include "midori-view.h" +#include "midori-viewable.h" + +#include "sokoke.h" + +#include +#include + +#include +#include + +void +midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser, + KatzeItem* bookmark, + gboolean new_bookmark, + gboolean is_folder); + +struct _MidoriBookmarks +{ + GtkVBox parent_instance; + + GtkWidget* toolbar; + GtkWidget* edit; + GtkWidget* delete; + GtkWidget* treeview; + MidoriApp* app; + KatzeArray* array; + KatzeNet* net; +}; + +struct _MidoriBookmarksClass +{ + GtkVBoxClass parent_class; +}; + +static void +midori_bookmarks_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriBookmarks, midori_bookmarks, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_bookmarks_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_APP +}; + +static void +midori_bookmarks_finalize (GObject* object); + +static void +midori_bookmarks_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_bookmarks_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_bookmarks_class_init (MidoriBookmarksClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_bookmarks_finalize; + gobject_class->set_property = midori_bookmarks_set_property; + gobject_class->get_property = midori_bookmarks_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_APP, + g_param_spec_object ( + "app", + "App", + "The app", + MIDORI_TYPE_APP, + flags)); +} + +static const gchar* +midori_bookmarks_get_label (MidoriViewable* viewable) +{ + return _("Bookmarks"); +} + +static const gchar* +midori_bookmarks_get_stock_id (MidoriViewable* viewable) +{ + return STOCK_BOOKMARKS; +} + +static void +midori_bookmarks_add_clicked_cb (GtkWidget* toolitem) +{ + GtkWidget* browser = gtk_widget_get_toplevel (toolitem); + /* FIXME: Take selected folder into account */ + midori_browser_edit_bookmark_dialog_new (MIDORI_BROWSER (browser), + NULL, TRUE, FALSE); +} + +static void +midori_bookmarks_edit_clicked_cb (GtkWidget* toolitem, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (bookmarks->treeview), + &model, &iter)) + { + KatzeItem* item; + gboolean is_separator; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + is_separator = !KATZE_IS_ARRAY (item) && !katze_item_get_uri (item); + if (!is_separator) + { + GtkWidget* browser = gtk_widget_get_toplevel (toolitem); + midori_browser_edit_bookmark_dialog_new (MIDORI_BROWSER (browser), + item, FALSE, FALSE); + } + + g_object_unref (item); + } +} + +static void +midori_bookmarks_delete_clicked_cb (GtkWidget* toolitem, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (bookmarks->treeview), + &model, &iter)) + { + KatzeItem* item; + KatzeArray* parent; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + /* FIXME: Even toplevel items should technically have a parent */ + g_return_if_fail (katze_item_get_parent (item)); + + parent = katze_item_get_parent (item); + katze_array_remove_item (parent, item); + + g_object_unref (item); + } +} + +static void +midori_bookmarks_folder_clicked_cb (GtkWidget* toolitem) +{ + GtkWidget* browser = gtk_widget_get_toplevel (toolitem); + /* FIXME: Take selected folder into account */ + midori_browser_edit_bookmark_dialog_new (MIDORI_BROWSER (browser), + NULL, TRUE, TRUE); +} + +static void +midori_bookmarks_cursor_or_row_changed_cb (GtkTreeView* treeview, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* item; + + if (!bookmarks->edit) + return; + + if (katze_tree_view_get_selected_iter (treeview, &model, &iter)) + { + gboolean is_separator; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + is_separator = !KATZE_IS_ARRAY (item) && !katze_item_get_uri (item); + gtk_widget_set_sensitive (bookmarks->edit, !is_separator); + gtk_widget_set_sensitive (bookmarks->delete, TRUE); + + g_object_unref (item); + } + else + { + gtk_widget_set_sensitive (bookmarks->edit, FALSE); + gtk_widget_set_sensitive (bookmarks->delete, FALSE); + } +} + +static GtkWidget* +midori_bookmarks_get_toolbar (MidoriViewable* viewable) +{ + MidoriBookmarks* bookmarks = MIDORI_BOOKMARKS (viewable); + + if (!bookmarks->toolbar) + { + GtkWidget* toolbar; + GtkToolItem* toolitem; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + bookmarks->toolbar = toolbar; + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_ADD); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Add a new bookmark")); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_bookmarks_add_clicked_cb), bookmarks); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_EDIT); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Edit the selected bookmark")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_bookmarks_edit_clicked_cb), bookmarks); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + bookmarks->edit = GTK_WIDGET (toolitem); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_DELETE); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Delete the selected bookmark")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_bookmarks_delete_clicked_cb), bookmarks); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + bookmarks->delete = GTK_WIDGET (toolitem); + toolitem = gtk_separator_tool_item_new (); + gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), FALSE); + gtk_tool_item_set_expand (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_DIRECTORY); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Add a new folder")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_bookmarks_folder_clicked_cb), bookmarks); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + + midori_bookmarks_cursor_or_row_changed_cb ( + GTK_TREE_VIEW (bookmarks->treeview), bookmarks); + g_signal_connect (bookmarks->edit, "destroy", + G_CALLBACK (gtk_widget_destroyed), &bookmarks->edit); + g_signal_connect (bookmarks->delete, "destroy", + G_CALLBACK (gtk_widget_destroyed), &bookmarks->delete); + } + + return bookmarks->toolbar; +} + +static void +midori_bookmarks_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_bookmarks_get_stock_id; + iface->get_label = midori_bookmarks_get_label; + iface->get_toolbar = midori_bookmarks_get_toolbar; +} + +static void +midori_bookmarks_add_item_cb (KatzeArray* array, + KatzeItem* added_item, + MidoriBookmarks* bookmarks); + +static void +midori_bookmarks_remove_item_cb (KatzeArray* array, + KatzeItem* removed_item, + MidoriBookmarks* bookmarks); + +static void +midori_bookmarks_clear_cb (KatzeArray* array, + MidoriBookmarks* bookmarks); + +static void +midori_bookmarks_disconnect_folder (MidoriBookmarks* bookmarks, + KatzeArray* array) +{ + KatzeItem* item; + guint i; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_handlers_disconnect_by_func (array, + midori_bookmarks_add_item_cb, bookmarks); + g_signal_handlers_disconnect_by_func (array, + midori_bookmarks_remove_item_cb, bookmarks); + g_signal_handlers_disconnect_by_func (array, + midori_bookmarks_clear_cb, bookmarks); + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + { + if (KATZE_IS_ARRAY (item)) + midori_bookmarks_disconnect_folder (bookmarks, KATZE_ARRAY (item)); + g_object_unref (item); + } +} + +static void +midori_bookmarks_add_item_cb (KatzeArray* array, + KatzeItem* added_item, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + guint i; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + g_return_if_fail (KATZE_IS_ITEM (added_item)); + + if (KATZE_IS_ARRAY (added_item)) + { + g_signal_connect (added_item, "add-item", + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); + g_signal_connect (added_item, "remove-item", + G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); + g_signal_connect (added_item, "clear", + G_CALLBACK (midori_bookmarks_clear_cb), bookmarks); + } + + g_object_ref (added_item); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); + + if (array == bookmarks->array) + { + gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), + &iter, NULL, G_MAXINT, 0, added_item, -1); + return; + } + + i = 0; + /* FIXME: Recurse over children of folders, too */ + while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i)) + { + KatzeItem* item; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + if (item == (KatzeItem*)array) + { + GtkTreeIter child_iter; + + gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), + &child_iter, &iter, G_MAXINT, 0, added_item, -1); + break; + } + g_object_unref (item); + + i++; + } +} + +static void +midori_bookmarks_remove_iter (GtkTreeModel* model, + GtkTreeIter* parent, + KatzeItem* removed_item) +{ + guint i; + GtkTreeIter iter; + + i = 0; + while (gtk_tree_model_iter_nth_child (model, &iter, parent, i)) + { + KatzeItem* item; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + if (item == removed_item) + { + gtk_tree_store_remove (GTK_TREE_STORE (model), &iter); + g_object_unref (item); + break; + } + + if (KATZE_IS_ARRAY (item)) + midori_bookmarks_remove_iter (model, &iter, removed_item); + + g_object_unref (item); + i++; + } +} + +static void +midori_bookmarks_remove_item_cb (KatzeArray* array, + KatzeItem* removed_item, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + g_return_if_fail (KATZE_IS_ITEM (removed_item)); + + if (KATZE_IS_ARRAY (removed_item)) + midori_bookmarks_disconnect_folder (bookmarks, KATZE_ARRAY (removed_item)); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); + midori_bookmarks_remove_iter (model, NULL, removed_item); + g_object_unref (removed_item); +} + +static void +midori_bookmarks_clear_cb (KatzeArray* array, + MidoriBookmarks* bookmarks) +{ + GtkTreeView* treeview; + GtkTreeStore* store; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + + if (array == bookmarks->array) + { + treeview = GTK_TREE_VIEW (bookmarks->treeview); + store = GTK_TREE_STORE (gtk_tree_view_get_model (treeview)); + gtk_tree_store_clear (store); + } + else + { + KatzeItem* item; + guint i; + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + midori_bookmarks_remove_item_cb (array, item, bookmarks); + } +} + +static void +midori_bookmarks_insert_folder (MidoriBookmarks* bookmarks, + GtkTreeStore* treestore, + GtkTreeIter* parent, + KatzeArray* array) +{ + KatzeItem* item; + guint i; + GtkTreeIter iter; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_connect (array, "add-item", + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); + g_signal_connect (array, "remove-item", + G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); + g_signal_connect (array, "clear", + G_CALLBACK (midori_bookmarks_clear_cb), bookmarks); + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + { + g_object_ref (item); + gtk_tree_store_insert_with_values (treestore, &iter, parent, i, + 0, item, -1); + if (KATZE_IS_ARRAY (item)) + midori_bookmarks_insert_folder (bookmarks, treestore, + &iter, KATZE_ARRAY (item)); + } +} + +static void +midori_bookmarks_set_app (MidoriBookmarks* bookmarks, + MidoriApp* app) +{ + GtkTreeModel* model; + + if (bookmarks->array) + { + midori_bookmarks_disconnect_folder (bookmarks, bookmarks->array); + g_object_unref (bookmarks->array); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); + gtk_tree_store_clear (GTK_TREE_STORE (model)); + } + katze_assign (bookmarks->app, app); + if (!app) + return; + + g_object_ref (app); + bookmarks->array = katze_object_get_object (app, "bookmarks"); + if (bookmarks->array) + { + /* FIXME: Dereference the app on finalization */ + model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); + midori_bookmarks_insert_folder (bookmarks, GTK_TREE_STORE (model), + NULL, g_object_ref (bookmarks->array)); + } +} + +static void +midori_bookmarks_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriBookmarks* bookmarks = MIDORI_BOOKMARKS (object); + + switch (prop_id) + { + case PROP_APP: + midori_bookmarks_set_app (bookmarks, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_bookmarks_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriBookmarks* bookmarks = MIDORI_BOOKMARKS (object); + + switch (prop_id) + { + case PROP_APP: + g_value_set_object (value, bookmarks->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_bookmarks_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + GdkPixbuf* pixbuf; + + gtk_tree_model_get (model, iter, 0, &item, -1); + + /* TODO: Would it be better to not do this on every redraw? */ + pixbuf = NULL; + if (KATZE_IS_ARRAY (item)) + pixbuf = gtk_widget_render_icon (treeview, GTK_STOCK_DIRECTORY, + GTK_ICON_SIZE_MENU, NULL); + else if (katze_item_get_uri (item)) + pixbuf = katze_net_load_icon ( + MIDORI_BOOKMARKS (gtk_widget_get_parent (treeview))->net, + katze_item_get_uri (item), NULL, treeview, NULL); + g_object_set (renderer, "pixbuf", pixbuf, NULL); + + if (pixbuf) + g_object_unref (pixbuf); + + g_object_unref (item); +} + +static void +midori_bookmarks_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + + gtk_tree_model_get (model, iter, 0, &item, -1); + + if (KATZE_IS_ARRAY (item) || katze_item_get_uri (item)) + g_object_set (renderer, "markup", NULL, + "text", katze_item_get_name (item), NULL); + else + g_object_set (renderer, "markup", _("Separator"), NULL); + + g_object_unref (item); +} + +static void +midori_bookmarks_row_activated_cb (GtkTreeView* treeview, + GtkTreePath* path, + GtkTreeViewColumn* column, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* item; + const gchar* uri; + + model = gtk_tree_view_get_model (treeview); + + if (gtk_tree_model_get_iter (model, &iter, path)) + { + gtk_tree_model_get (model, &iter, 0, &item, -1); + uri = katze_item_get_uri (item); + if (uri && *uri) + { + GtkWidget* browser; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (bookmarks)); + midori_browser_set_current_uri (MIDORI_BROWSER (browser), uri); + } + + g_object_unref (item); + } +} + +static void +midori_bookmarks_popup_item (GtkWidget* menu, + const gchar* stock_id, + const gchar* label, + KatzeItem* item, + gpointer callback, + MidoriBookmarks* bookmarks) +{ + const gchar* uri; + GtkWidget* menuitem; + + uri = katze_item_get_uri (item); + + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + if (label) + gtk_label_set_text_with_mnemonic (GTK_LABEL (gtk_bin_get_child ( + GTK_BIN (menuitem))), label); + if (!strcmp (stock_id, GTK_STOCK_EDIT)) + gtk_widget_set_sensitive (menuitem, + KATZE_IS_ARRAY (item) || uri != NULL); + else if (!KATZE_IS_ARRAY (item) && strcmp (stock_id, GTK_STOCK_DELETE)) + gtk_widget_set_sensitive (menuitem, uri != NULL); + g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item); + g_signal_connect (menuitem, "activate", G_CALLBACK (callback), bookmarks); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); +} + +static void +midori_bookmarks_open_activate_cb (GtkWidget* menuitem, + MidoriBookmarks* bookmarks) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (bookmarks)); + midori_browser_set_current_uri (MIDORI_BROWSER (browser), uri); + } +} + +static void +midori_bookmarks_open_in_tab_activate_cb (GtkWidget* menuitem, + MidoriBookmarks* bookmarks) +{ + KatzeItem* item; + const gchar* uri; + guint n; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + if (KATZE_IS_ARRAY (item)) + { + KatzeItem* child; + guint i = 0; + + while ((child = katze_array_get_nth_item (KATZE_ARRAY (item), i))) + { + if ((uri = katze_item_get_uri (child)) && *uri) + { + GtkWidget* browser; + MidoriWebSettings* settings; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (bookmarks)); + n = midori_browser_add_item (MIDORI_BROWSER (browser), child); + settings = katze_object_get_object (browser, "settings"); + if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) + midori_browser_set_current_page (MIDORI_BROWSER (browser), n); + g_object_unref (settings); + } + i++; + } + } + else + { + if ((uri = katze_item_get_uri (item)) && *uri) + { + GtkWidget* browser; + MidoriWebSettings* settings; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (bookmarks)); + n = midori_browser_add_item (MIDORI_BROWSER (browser), item); + settings = katze_object_get_object (browser, "settings"); + if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) + midori_browser_set_current_page (MIDORI_BROWSER (browser), n); + g_object_unref (settings); + } + } +} + +static void +midori_bookmarks_open_in_window_activate_cb (GtkWidget* menuitem, + MidoriBookmarks* bookmarks) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (bookmarks)); + g_signal_emit_by_name (browser, "new-window", uri); + } +} + +static void +midori_bookmarks_edit_activate_cb (GtkWidget* menuitem, + MidoriBookmarks* bookmarks) +{ + KatzeItem* item; + gboolean is_separator; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + is_separator = !KATZE_IS_ARRAY (item) && !katze_item_get_uri (item); + + if (!is_separator) + { + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (bookmarks)); + midori_browser_edit_bookmark_dialog_new (MIDORI_BROWSER (browser), item, FALSE, FALSE); + } +} + +static void +midori_bookmarks_delete_activate_cb (GtkWidget* menuitem, + MidoriBookmarks* bookmarks) +{ + KatzeItem* item; + KatzeArray* parent; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + + /* FIXME: Even toplevel items should technically have a parent */ + g_return_if_fail (katze_item_get_parent (item)); + + parent = katze_item_get_parent (item); + katze_array_remove_item (parent, item); +} + +static void +midori_bookmarks_popup (GtkWidget* widget, + GdkEventButton* event, + KatzeItem* item, + MidoriBookmarks* bookmarks) +{ + GtkWidget* menu; + GtkWidget* menuitem; + + menu = gtk_menu_new (); + if (KATZE_IS_ARRAY (item)) + midori_bookmarks_popup_item (menu, + STOCK_TAB_NEW, _("Open all in _Tabs"), + item, midori_bookmarks_open_in_tab_activate_cb, bookmarks); + else + { + midori_bookmarks_popup_item (menu, GTK_STOCK_OPEN, NULL, + item, midori_bookmarks_open_activate_cb, bookmarks); + midori_bookmarks_popup_item (menu, STOCK_TAB_NEW, _("Open in New _Tab"), + item, midori_bookmarks_open_in_tab_activate_cb, bookmarks); + midori_bookmarks_popup_item (menu, STOCK_WINDOW_NEW, _("Open in New _Window"), + item, midori_bookmarks_open_in_window_activate_cb, bookmarks); + } + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + midori_bookmarks_popup_item (menu, GTK_STOCK_EDIT, NULL, + item, midori_bookmarks_edit_activate_cb, bookmarks); + midori_bookmarks_popup_item (menu, GTK_STOCK_DELETE, NULL, + item, midori_bookmarks_delete_activate_cb, bookmarks); + + sokoke_widget_popup (widget, GTK_MENU (menu), + event, SOKOKE_MENU_POSITION_CURSOR); +} + +static gboolean +midori_bookmarks_button_release_event_cb (GtkWidget* widget, + GdkEventButton* event, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (event->button != 2 && event->button != 3) + return FALSE; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter)) + { + KatzeItem* item; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + if (event->button == 2) + { + const gchar* uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser; + gint n; + + browser = gtk_widget_get_toplevel (widget); + n = midori_browser_add_uri (MIDORI_BROWSER (browser), uri); + midori_browser_set_current_page (MIDORI_BROWSER (browser), n); + } + } + else + midori_bookmarks_popup (widget, event, item, bookmarks); + + g_object_unref (item); + return TRUE; + } + return FALSE; +} + +static gboolean +midori_bookmarks_key_release_event_cb (GtkWidget* widget, + GdkEventKey* event, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (event->keyval != GDK_Delete) + return FALSE; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter)) + { + KatzeItem* item; + KatzeArray* parent; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + parent = katze_item_get_parent (item); + katze_array_remove_item (parent, item); + + g_object_unref (item); + } + + return FALSE; +} + +static void +midori_bookmarks_popup_menu_cb (GtkWidget* widget, + MidoriBookmarks* bookmarks) +{ + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* item; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter)) + { + gtk_tree_model_get (model, &iter, 0, &item, -1); + midori_bookmarks_popup (widget, NULL, item, bookmarks); + g_object_unref (item); + } +} + +static void +midori_bookmarks_init (MidoriBookmarks* bookmarks) +{ + GtkTreeStore* model; + GtkWidget* treeview; + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_pixbuf; + GtkCellRenderer* renderer_text; + + bookmarks->net = katze_net_new (); + + /* Create the treeview */ + model = gtk_tree_store_new (1, KATZE_TYPE_ITEM); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_bookmarks_treeview_render_icon_cb, + treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_bookmarks_treeview_render_text_cb, + treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + g_object_unref (model); + g_object_connect (treeview, + "signal::row-activated", + midori_bookmarks_row_activated_cb, bookmarks, + "signal::cursor-changed", + midori_bookmarks_cursor_or_row_changed_cb, bookmarks, + "signal::columns-changed", + midori_bookmarks_cursor_or_row_changed_cb, bookmarks, + "signal::button-release-event", + midori_bookmarks_button_release_event_cb, bookmarks, + "signal::key-release-event", + midori_bookmarks_key_release_event_cb, bookmarks, + "signal::popup-menu", + midori_bookmarks_popup_menu_cb, bookmarks, + NULL); + gtk_widget_show (treeview); + gtk_box_pack_start (GTK_BOX (bookmarks), treeview, TRUE, TRUE, 0); + bookmarks->treeview = treeview; +} + +static void +midori_bookmarks_finalize (GObject* object) +{ + MidoriBookmarks* bookmarks = MIDORI_BOOKMARKS (object); + + if (bookmarks->app) + g_object_unref (bookmarks->app); + g_object_unref (bookmarks->net); +} + +/** + * midori_bookmarks_new: + * + * Creates a new empty bookmarks. + * + * Return value: a new #MidoriBookmarks + * + * Since: 0.1.3 + **/ +GtkWidget* +midori_bookmarks_new (void) +{ + MidoriBookmarks* bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, NULL); + + return GTK_WIDGET (bookmarks); +} diff --git a/panels/midori-bookmarks.h b/panels/midori-bookmarks.h new file mode 100644 index 00000000..96797183 --- /dev/null +++ b/panels/midori-bookmarks.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_BOOKMARKS_H__ +#define __MIDORI_BOOKMARKS_H__ + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_BOOKMARKS \ + (midori_bookmarks_get_type ()) +#define MIDORI_BOOKMARKS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_BOOKMARKS, MidoriBookmarks)) +#define MIDORI_BOOKMARKS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_BOOKMARKS, MidoriBookmarksClass)) +#define MIDORI_IS_BOOKMARKS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_BOOKMARKS)) +#define MIDORI_IS_BOOKMARKS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_BOOKMARKS)) +#define MIDORI_BOOKMARKS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_BOOKMARKS, MidoriBookmarksClass)) + +typedef struct _MidoriBookmarks MidoriBookmarks; +typedef struct _MidoriBookmarksClass MidoriBookmarksClass; + +GType +midori_bookmarks_get_type (void); + +GtkWidget* +midori_bookmarks_new (void); + +G_END_DECLS + +#endif /* __MIDORI_BOOKMARKS_H__ */ diff --git a/panels/midori-console.c b/panels/midori-console.c new file mode 100644 index 00000000..0f662ca5 --- /dev/null +++ b/panels/midori-console.c @@ -0,0 +1,362 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-console.h" + +#include "midori-app.h" +#include "midori-browser.h" +#include "midori-stock.h" +#include "midori-view.h" + +#include "sokoke.h" +#include + +struct _MidoriConsole +{ + GtkVBox parent_instance; + + GtkWidget* toolbar; + GtkWidget* treeview; + MidoriApp* app; +}; + +struct _MidoriConsoleClass +{ + GtkVBoxClass parent_class; +}; + +static void +midori_console_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriConsole, midori_console, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_console_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_APP +}; + +static void +midori_console_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_console_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_console_class_init (MidoriConsoleClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->set_property = midori_console_set_property; + gobject_class->get_property = midori_console_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_APP, + g_param_spec_object ( + "app", + "App", + "The app", + MIDORI_TYPE_APP, + flags)); +} + +static const gchar* +midori_console_get_label (MidoriViewable* viewable) +{ + return _("Console"); +} + +static const gchar* +midori_console_get_stock_id (MidoriViewable* viewable) +{ + return STOCK_CONSOLE; +} + +static void +midori_console_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_console_get_stock_id; + iface->get_label = midori_console_get_label; + iface->get_toolbar = midori_console_get_toolbar; +} + +static void +midori_view_console_message_cb (GtkWidget* view, + const gchar* message, + gint line, + const gchar* source_id, + MidoriConsole* console) +{ + midori_console_add (console, message, line, source_id); +} + +static void +midori_console_browser_add_tab_cb (MidoriBrowser* browser, + MidoriView* view, + MidoriConsole* console) +{ + g_signal_connect (view, "console-message", + G_CALLBACK (midori_view_console_message_cb), console); +} + +static void +midori_console_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriConsole* console = MIDORI_CONSOLE (object); + + switch (prop_id) + { + case PROP_APP: + console->app = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_console_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriConsole* console = MIDORI_CONSOLE (object); + + switch (prop_id) + { + case PROP_APP: + g_value_set_object (value, console->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_console_button_copy_clicked_cb (GtkToolItem* toolitem, + MidoriConsole* console) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (console->treeview), + &model, &iter)) + { + GdkDisplay* display; + GtkClipboard* clipboard; + gchar* text; + gchar* message; + gint line; + gchar* source_id; + + display = gtk_widget_get_display (GTK_WIDGET (console)); + clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD); + gtk_tree_model_get (model, &iter, 0, &message, 1, &line, 2, &source_id, -1); + text = g_strdup_printf ("%d @ %s: %s", line, source_id, message); + g_free (source_id); + g_free (message); + gtk_clipboard_set_text (clipboard, text, -1); + g_free (text); + } +} + +static void +midori_console_button_clear_clicked_cb (GtkToolItem* toolitem, + MidoriConsole* console) +{ + GtkTreeModel* model = gtk_tree_view_get_model ( + GTK_TREE_VIEW (console->treeview)); + gtk_tree_store_clear (GTK_TREE_STORE (model)); +} + +static void +midori_console_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + g_object_set (renderer, "stock-id", GTK_STOCK_DIALOG_WARNING, NULL); +} + +static void +midori_console_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + gchar* message; + gint line; + gchar* source_id; + gchar* text; + + gtk_tree_model_get (model, iter, 0, &message, 1, &line, 2, &source_id, -1); + + text = g_strdup_printf ("%d @ %s\n%s", line, source_id, message); + g_object_set (renderer, "text", text, NULL); + g_free (text); + + g_free (message); + g_free (source_id); +} + +static void +midori_console_hierarchy_changed_cb (MidoriConsole* console, + GtkWidget* old_parent) +{ + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (console)); + if (GTK_WIDGET_TOPLEVEL (browser)) + g_signal_connect (browser, "add-tab", + G_CALLBACK (midori_console_browser_add_tab_cb), console); +} + +static void +midori_console_init (MidoriConsole* console) +{ + /* Create the treeview */ + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_text; + GtkCellRenderer* renderer_pixbuf; + GtkTreeStore* treestore = gtk_tree_store_new (3, G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_STRING); + console->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treestore)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (console->treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_console_treeview_render_icon_cb, + console->treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_console_treeview_render_text_cb, + console->treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (console->treeview), column); + g_object_unref (treestore); + gtk_widget_show (console->treeview); + gtk_box_pack_start (GTK_BOX (console), console->treeview, TRUE, TRUE, 0); + + g_signal_connect (console, "hierarchy-changed", + G_CALLBACK (midori_console_hierarchy_changed_cb), NULL); +} + +/** + * midori_console_new: + * + * Creates a new empty console. + * + * Return value: a new #MidoriConsole + **/ +GtkWidget* +midori_console_new (void) +{ + MidoriConsole* console = g_object_new (MIDORI_TYPE_CONSOLE, + NULL); + + return GTK_WIDGET (console); +} + +/** + * midori_console_get_toolbar: + * @console: a #MidoriConsole + * + * Retrieves the toolbar of the console. A new widget is created on + * the first call of this function. + * + * Return value: a toolbar widget + * + * Deprecated: 0.1.2: Use midori_viewable_get_toolbar() instead. + **/ +GtkWidget* +midori_console_get_toolbar (MidoriViewable* console) +{ + g_return_val_if_fail (MIDORI_IS_CONSOLE (console), NULL); + + if (!MIDORI_CONSOLE (console)->toolbar) + { + GtkWidget* toolbar; + GtkToolItem* toolitem; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_COPY); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_console_button_copy_clicked_cb), console); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + /* TODO: What about a find entry here that filters e.g. by url? */ + toolitem = gtk_separator_tool_item_new (); + gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), + FALSE); + gtk_tool_item_set_expand (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_CLEAR); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_console_button_clear_clicked_cb), console); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + MIDORI_CONSOLE (console)->toolbar = toolbar; + } + + return MIDORI_CONSOLE (console)->toolbar; +} + +/** + * midori_console_add: + * @console: a #MidoriConsole + * @message: a descriptive message + * @line: the line in the source file + * @source_id: the source + * + * Adds a new message to the console. + **/ +void +midori_console_add (MidoriConsole* console, + const gchar* message, + gint line, + const gchar* source_id) +{ + GtkTreeView* treeview; + GtkTreeModel* model; + + g_return_if_fail (MIDORI_IS_CONSOLE (console)); + + treeview = GTK_TREE_VIEW (console->treeview); + model = gtk_tree_view_get_model (treeview); + gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), + NULL, NULL, G_MAXINT, + 0, message, 1, line, 2, source_id, -1); +} diff --git a/panels/midori-console.h b/panels/midori-console.h new file mode 100644 index 00000000..011837dc --- /dev/null +++ b/panels/midori-console.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_CONSOLE_H__ +#define __MIDORI_CONSOLE_H__ + +#include + +#include + +#include "midori-viewable.h" + +G_BEGIN_DECLS + +#define MIDORI_TYPE_CONSOLE \ + (midori_console_get_type ()) +#define MIDORI_CONSOLE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_CONSOLE, MidoriConsole)) +#define MIDORI_CONSOLE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_CONSOLE, MidoriConsoleClass)) +#define MIDORI_IS_CONSOLE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_CONSOLE)) +#define MIDORI_IS_CONSOLE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_CONSOLE)) +#define MIDORI_CONSOLE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_CONSOLE, MidoriConsoleClass)) + +typedef struct _MidoriConsole MidoriConsole; +typedef struct _MidoriConsoleClass MidoriConsoleClass; + +GType +midori_console_get_type (void); + +GtkWidget* +midori_console_new (void); + +GtkWidget* +midori_console_get_toolbar (MidoriViewable* console); + +void +midori_console_add (MidoriConsole* console, + const gchar* message, + gint line, + const gchar* source_id); + +G_END_DECLS + +#endif /* __MIDORI_CONSOLE_H__ */ diff --git a/panels/midori-extensions.c b/panels/midori-extensions.c new file mode 100644 index 00000000..fd4703b3 --- /dev/null +++ b/panels/midori-extensions.c @@ -0,0 +1,390 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-extensions.h" + +#include "midori-app.h" +#include "midori-extension.h" +#include "midori-stock.h" +#include "midori-viewable.h" + +#include "sokoke.h" +#include + +struct _MidoriExtensions +{ + GtkVBox parent_instance; + + GtkWidget* toolbar; + GtkWidget* treeview; + MidoriApp* app; +}; + +struct _MidoriExtensionsClass +{ + GtkVBoxClass parent_class; +}; + +static void +midori_extensions_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriExtensions, midori_extensions, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_extensions_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_APP +}; + +static void +midori_extensions_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_extensions_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_extensions_class_init (MidoriExtensionsClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->set_property = midori_extensions_set_property; + gobject_class->get_property = midori_extensions_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_APP, + g_param_spec_object ( + "app", + "App", + "The app", + MIDORI_TYPE_APP, + flags)); +} + +static const gchar* +midori_extensions_get_label (MidoriViewable* viewable) +{ + return _("Extensions"); +} + +static const gchar* +midori_extensions_get_stock_id (MidoriViewable* viewable) +{ + return STOCK_EXTENSIONS; +} + +static void +midori_extensions_button_status_clicked_cb (GtkToolItem* toolitem, + MidoriExtensions* extensions) +{ + GtkTreeView* treeview; + GtkTreeModel* model; + GtkTreeIter iter; + MidoriExtension* extension; + + treeview = GTK_TREE_VIEW (extensions->treeview); + + if (katze_tree_view_get_selected_iter (treeview, &model, &iter)) + { + GtkToolItem* button_enable = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (extensions->toolbar), 1); + GtkToolItem* button_disable = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (extensions->toolbar), 2); + + gtk_tree_model_get (model, &iter, 0, &extension, -1); + if (toolitem == button_enable) + g_signal_emit_by_name (extension, "activate", extensions->app); + else if (toolitem == button_disable) + midori_extension_deactivate (extension); + + gtk_widget_set_sensitive (GTK_WIDGET (button_enable), + !midori_extension_is_active (extension)); + gtk_widget_set_sensitive (GTK_WIDGET (button_disable), + midori_extension_is_active (extension)); + } +} + +static GtkWidget* +midori_extensions_get_toolbar (MidoriViewable* extensions) +{ + if (!MIDORI_EXTENSIONS (extensions)->toolbar) + { + GtkWidget* toolbar; + GtkToolItem* toolitem; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + toolitem = gtk_tool_item_new (); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + + /* enable button */ + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_YES); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("_Enable")); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), _("Enable")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_extensions_button_status_clicked_cb), extensions); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_set_sensitive (GTK_WIDGET (toolitem), FALSE); + gtk_widget_show (GTK_WIDGET (toolitem)); + + /* disable button */ + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_NO); + gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("_Disable")); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), _("Disable")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_extensions_button_status_clicked_cb), extensions); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_set_sensitive (GTK_WIDGET (toolitem), FALSE); + gtk_widget_show (GTK_WIDGET (toolitem)); + + MIDORI_EXTENSIONS (extensions)->toolbar = toolbar; + } + + return MIDORI_EXTENSIONS (extensions)->toolbar; +} + +static void +midori_extensions_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_extensions_get_stock_id; + iface->get_label = midori_extensions_get_label; + iface->get_toolbar = midori_extensions_get_toolbar; +} + +static void +midori_extensions_add_item_cb (KatzeArray* array, + MidoriExtension* extension, + MidoriExtensions* extensions) +{ + GtkTreeIter iter; + GtkTreeModel* model; + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (extensions->treeview)); + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, extension, -1); +} + +static void +midori_extensions_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriExtensions* extensions = MIDORI_EXTENSIONS (object); + + switch (prop_id) + { + case PROP_APP: + { + KatzeArray* array; + guint i, n; + + /* FIXME: Handle NULL and subsequent assignments */ + extensions->app = g_value_get_object (value); + array = katze_object_get_object (extensions->app, "extensions"); + g_signal_connect (array, "add-item", + G_CALLBACK (midori_extensions_add_item_cb), extensions); + + if ((n = katze_array_get_length (array))) + for (i = 0; i < n; i++) + midori_extensions_add_item_cb (array, + katze_array_get_nth_item (array, i), extensions); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_extensions_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriExtensions* extensions = MIDORI_EXTENSIONS (object); + + switch (prop_id) + { + case PROP_APP: + g_value_set_object (value, extensions->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_extensions_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + g_object_set (renderer, "stock-id", GTK_STOCK_EXECUTE, NULL); +} + +static void +midori_extensions_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + MidoriExtension* extension; + gchar* name; + gchar* version; + gchar* desc; + gchar* text; + + gtk_tree_model_get (model, iter, 0, &extension, -1); + + name = katze_object_get_string (extension, "name"); + version = katze_object_get_string (extension, "version"); + desc = katze_object_get_string (extension, "description"); + text = g_strdup_printf ("%s %s\n%s", name, version, desc); + g_free (name); + g_free (version); + g_free (desc); + g_object_set (renderer, "text", text, NULL); + g_free (text); +} + +static void +midori_extensions_treeview_row_activated_cb (GtkTreeView* treeview, + GtkTreePath* path, + GtkTreeViewColumn* column, + MidoriExtensions* extensions) +{ + GtkToolItem* button_enable; + GtkToolItem* button_disable; + GtkTreeModel* model; + GtkTreeIter iter; + + model = gtk_tree_view_get_model (treeview); + button_enable = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (extensions->toolbar), 1); + button_disable = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (extensions->toolbar), 2); + if (gtk_tree_model_get_iter (model, &iter, path)) + { + MidoriExtension* extension; + + gtk_tree_model_get (model, &iter, 0, &extension, -1); + if (midori_extension_is_active (extension)) + midori_extension_deactivate (extension); + else + g_signal_emit_by_name (extension, "activate", extensions->app); + gtk_widget_set_sensitive (GTK_WIDGET (button_enable), + !midori_extension_is_active (extension)); + gtk_widget_set_sensitive (GTK_WIDGET (button_disable), + midori_extension_is_active (extension)); + } +} + +static void +midori_extensions_treeview_cursor_changed_cb (GtkTreeView* treeview, + MidoriExtensions* extensions) +{ + GtkTreeModel* model; + GtkTreePath* path; + GtkTreeIter iter; + GtkToolItem* button_enable; + GtkToolItem* button_disable; + + gtk_tree_view_get_cursor (treeview, &path, NULL); + model = gtk_tree_view_get_model (treeview); + button_enable = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (extensions->toolbar), 1); + button_disable = gtk_toolbar_get_nth_item ( + GTK_TOOLBAR (extensions->toolbar), 2); + if (gtk_tree_model_get_iter (model, &iter, path)) + { + MidoriExtension* extension; + + if (katze_tree_view_get_selected_iter (treeview, &model, &iter)) + { + gtk_tree_model_get (model, &iter, 0, &extension, -1); + gtk_widget_set_sensitive (GTK_WIDGET (button_enable), + !midori_extension_is_active (extension)); + gtk_widget_set_sensitive (GTK_WIDGET (button_disable), + midori_extension_is_active (extension)); + } + } + return; +} + +static void +midori_extensions_init (MidoriExtensions* extensions) +{ + /* Create the treeview */ + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_text; + GtkCellRenderer* renderer_pixbuf; + GtkListStore* liststore = gtk_list_store_new (1, G_TYPE_OBJECT); + extensions->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (extensions->treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_extensions_treeview_render_icon_cb, + extensions->treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_extensions_treeview_render_text_cb, + extensions->treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (extensions->treeview), column); + g_object_unref (liststore); + g_signal_connect (extensions->treeview, "row-activated", + G_CALLBACK (midori_extensions_treeview_row_activated_cb), + extensions); + g_signal_connect (extensions->treeview, "cursor-changed", + G_CALLBACK (midori_extensions_treeview_cursor_changed_cb), + extensions); + gtk_widget_show (extensions->treeview); + gtk_box_pack_start (GTK_BOX (extensions), extensions->treeview, TRUE, TRUE, 0); +} + +/** + * midori_extensions_new: + * + * Creates a new empty extensions. + * + * Return value: a new #MidoriExtensions + * + * Since: 0.1.2 + **/ +GtkWidget* +midori_extensions_new (void) +{ + MidoriExtensions* extensions = g_object_new (MIDORI_TYPE_EXTENSIONS, + NULL); + + return GTK_WIDGET (extensions); +} diff --git a/panels/midori-extensions.h b/panels/midori-extensions.h new file mode 100644 index 00000000..58de7d02 --- /dev/null +++ b/panels/midori-extensions.h @@ -0,0 +1,45 @@ +/* + Copyright (C) 2008 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_EXTENSIONS_H__ +#define __MIDORI_EXTENSIONS_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_EXTENSIONS \ + (midori_extensions_get_type ()) +#define MIDORI_EXTENSIONS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_EXTENSIONS, MidoriExtensions)) +#define MIDORI_EXTENSIONS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_EXTENSIONS, MidoriExtensionsClass)) +#define MIDORI_IS_EXTENSIONS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_EXTENSIONS)) +#define MIDORI_IS_EXTENSIONS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_EXTENSIONS)) +#define MIDORI_EXTENSIONS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_EXTENSIONS, MidoriExtensionsClass)) + +typedef struct _MidoriExtensions MidoriExtensions; +typedef struct _MidoriExtensionsClass MidoriExtensionsClass; + +GType +midori_extensions_get_type (void); + +GtkWidget* +midori_extensions_new (void); + +G_END_DECLS + +#endif /* __MIDORI_EXTENSIONS_H__ */ diff --git a/panels/midori-history.c b/panels/midori-history.c new file mode 100644 index 00000000..f528d4d6 --- /dev/null +++ b/panels/midori-history.c @@ -0,0 +1,988 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-history.h" + +#include "midori-app.h" +#include "midori-browser.h" +#include "midori-stock.h" +#include "midori-view.h" +#include "midori-viewable.h" + +#include "sokoke.h" + +#include +#include + +#include +#include + +void +midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser, + KatzeItem* bookmark, + gboolean new_bookmark, + gboolean is_folder); + +struct _MidoriHistory +{ + GtkVBox parent_instance; + + GtkWidget* toolbar; + GtkWidget* bookmark; + GtkWidget* delete; + GtkWidget* clear; + GtkWidget* treeview; + MidoriApp* app; + KatzeArray* array; + KatzeNet* net; +}; + +struct _MidoriHistoryClass +{ + GtkVBoxClass parent_class; +}; + +static void +midori_history_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriHistory, midori_history, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_history_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_APP +}; + +static void +midori_history_finalize (GObject* object); + +static void +midori_history_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_history_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_history_class_init (MidoriHistoryClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->finalize = midori_history_finalize; + gobject_class->set_property = midori_history_set_property; + gobject_class->get_property = midori_history_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_APP, + g_param_spec_object ( + "app", + "App", + "The app", + MIDORI_TYPE_APP, + flags)); +} + +static const gchar* +midori_history_get_label (MidoriViewable* viewable) +{ + return _("History"); +} + +static const gchar* +midori_history_get_stock_id (MidoriViewable* viewable) +{ + return STOCK_HISTORY; +} + +static void +midori_history_add_clicked_cb (GtkWidget* toolitem) +{ + GtkWidget* browser = gtk_widget_get_toplevel (toolitem); + /* FIXME: Take selected folder into account */ + midori_browser_edit_bookmark_dialog_new (MIDORI_BROWSER (browser), + NULL, TRUE, FALSE); +} + +static void +midori_history_delete_clicked_cb (GtkWidget* toolitem, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (history->treeview), + &model, &iter)) + { + KatzeItem* item; + KatzeArray* parent; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + /* FIXME: Even toplevel items should technically have a parent */ + g_return_if_fail (katze_item_get_parent (item)); + + parent = katze_item_get_parent (item); + katze_array_remove_item (parent, item); + + g_object_unref (item); + } +} + +static void +midori_history_clear_clicked_cb (GtkWidget* toolitem, + MidoriHistory* history) +{ + GtkWidget* browser; + GtkWidget* dialog; + gint result; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + dialog = gtk_message_dialog_new (GTK_WINDOW (browser), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, + _("Are you sure you want to remove all history items?")); + result = gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + if (result != GTK_RESPONSE_YES) + return; + + katze_array_clear (history->array); +} + +static void +midori_history_cursor_or_row_changed_cb (GtkTreeView* treeview, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* item; + + if (!history->bookmark) + return; + + if (katze_tree_view_get_selected_iter (treeview, &model, &iter)) + { + gboolean is_page; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + is_page = !KATZE_IS_ARRAY (item) && katze_item_get_uri (item); + gtk_widget_set_sensitive (history->bookmark, is_page); + gtk_widget_set_sensitive (history->delete, TRUE); + + g_object_unref (item); + } + else + { + gtk_widget_set_sensitive (history->bookmark, FALSE); + gtk_widget_set_sensitive (history->delete, FALSE); + } +} + +static GtkWidget* +midori_history_get_toolbar (MidoriViewable* viewable) +{ + MidoriHistory* history = MIDORI_HISTORY (viewable); + + if (!history->toolbar) + { + GtkWidget* toolbar; + GtkToolItem* toolitem; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + history->toolbar = toolbar; + toolitem = gtk_tool_button_new_from_stock (STOCK_BOOKMARK_ADD); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Bookmark the selected history item")); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_history_add_clicked_cb), history); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + history->bookmark = GTK_WIDGET (toolitem); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_DELETE); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Delete the selected history item")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_history_delete_clicked_cb), history); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + history->delete = GTK_WIDGET (toolitem); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_CLEAR); + gtk_widget_set_tooltip_text (GTK_WIDGET (toolitem), + _("Clear the entire history")); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_history_clear_clicked_cb), history); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + history->clear = GTK_WIDGET (toolitem); + midori_history_cursor_or_row_changed_cb ( + GTK_TREE_VIEW (history->treeview), history); + g_signal_connect (history->bookmark, "destroy", + G_CALLBACK (gtk_widget_destroyed), &history->bookmark); + g_signal_connect (history->delete, "destroy", + G_CALLBACK (gtk_widget_destroyed), &history->delete); + g_signal_connect (history->clear, "destroy", + G_CALLBACK (gtk_widget_destroyed), &history->clear); + } + + return history->toolbar; +} + +static void +midori_history_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_history_get_stock_id; + iface->get_label = midori_history_get_label; + iface->get_toolbar = midori_history_get_toolbar; +} + +static void +midori_history_add_item_cb (KatzeArray* array, + KatzeItem* added_item, + MidoriHistory* history); + +static void +midori_history_remove_item_cb (KatzeArray* array, + KatzeItem* removed_item, + MidoriHistory* history); + +static void +midori_history_clear_cb (KatzeArray* array, + MidoriHistory* history); + +static void +midori_history_disconnect_folder (MidoriHistory* history, + KatzeArray* array) +{ + KatzeItem* item; + guint i; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + + g_signal_handlers_disconnect_by_func (array, + midori_history_add_item_cb, history); + g_signal_handlers_disconnect_by_func (array, + midori_history_remove_item_cb, history); + g_signal_handlers_disconnect_by_func (array, + midori_history_clear_cb, history); + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + { + if (KATZE_IS_ARRAY (item)) + midori_history_disconnect_folder (history, KATZE_ARRAY (item)); + g_object_unref (item); + } +} + +static void +midori_history_add_item_cb (KatzeArray* array, + KatzeItem* added_item, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + guint i; + + g_return_if_fail (KATZE_IS_ARRAY (array)); + g_return_if_fail (KATZE_IS_ITEM (added_item)); + + if (KATZE_IS_ARRAY (added_item)) + { + g_signal_connect (added_item, "add-item", + G_CALLBACK (midori_history_add_item_cb), history); + g_signal_connect (added_item, "remove-item", + G_CALLBACK (midori_history_remove_item_cb), history); + g_signal_connect (added_item, "clear", + G_CALLBACK (midori_history_clear_cb), history); + } + + g_object_ref (added_item); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview)); + + if (array == history->array) + { + gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), + &iter, NULL, G_MAXINT, 0, added_item, -1); + return; + } + + i = 0; + /* FIXME: Recurse over children of folders, too */ + while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i)) + { + KatzeItem* item; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + if (item == (KatzeItem*)array) + { + GtkTreeIter child_iter; + + gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), + &child_iter, &iter, G_MAXINT, 0, added_item, -1); + break; + } + g_object_unref (item); + + i++; + } +} + +static void +midori_history_remove_iter (GtkTreeModel* model, + GtkTreeIter* parent, + KatzeItem* removed_item) +{ + guint i; + GtkTreeIter iter; + + i = 0; + while (gtk_tree_model_iter_nth_child (model, &iter, parent, i)) + { + KatzeItem* item; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + if (item == removed_item) + { + gtk_tree_store_remove (GTK_TREE_STORE (model), &iter); + g_object_unref (item); + break; + } + + if (KATZE_IS_ARRAY (item)) + midori_history_remove_iter (model, &iter, removed_item); + + g_object_unref (item); + i++; + } +} + +static void +midori_history_remove_item_cb (KatzeArray* array, + KatzeItem* removed_item, + MidoriHistory* history) +{ + GtkTreeModel* model; + + g_assert (KATZE_IS_ARRAY (array)); + g_assert (KATZE_IS_ITEM (removed_item)); + + if (KATZE_IS_ARRAY (removed_item)) + midori_history_disconnect_folder (history, KATZE_ARRAY (removed_item)); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview)); + midori_history_remove_iter (model, NULL, removed_item); + g_object_unref (removed_item); +} + +static void +midori_history_clear_cb (KatzeArray* array, + MidoriHistory* history) +{ + GtkTreeView* treeview; + GtkTreeStore* store; + + g_assert (KATZE_IS_ARRAY (array)); + + if (array == history->array) + { + treeview = GTK_TREE_VIEW (history->treeview); + store = GTK_TREE_STORE (gtk_tree_view_get_model (treeview)); + gtk_tree_store_clear (store); + } + else + { + KatzeItem* item; + guint i; + + i = 0; + while ((item = katze_array_get_nth_item (array, i++))) + midori_history_remove_item_cb (array, item, history); + } + + midori_history_disconnect_folder (history, array); +} + +static void +midori_history_insert_item (MidoriHistory* history, + GtkTreeStore* treestore, + GtkTreeIter* parent, + KatzeItem* item, + gint64 day) +{ + GtkTreeIter iter; + gint64 age = -1; + + g_return_if_fail (KATZE_IS_ITEM (item)); + + if (KATZE_IS_ARRAY (item)) + { + GtkTreeIter* piter; + gint64 pday; + guint i; + KatzeItem* child; + + g_signal_connect (item, "add-item", + G_CALLBACK (midori_history_add_item_cb), history); + g_signal_connect (item, "remove-item", + G_CALLBACK (midori_history_remove_item_cb), history); + g_signal_connect (item, "clear", + G_CALLBACK (midori_history_clear_cb), history); + + piter = parent; + if ((pday = katze_item_get_added (item))) + { + age = day - pday; + gtk_tree_store_insert_with_values (treestore, &iter, parent, + 0, 0, item, 1, age, -1); + g_object_unref (item); + piter = &iter; + } + i = 0; + while ((child = katze_array_get_nth_item (KATZE_ARRAY (item), i++))) + midori_history_insert_item (history, treestore, piter, child, day); + } + else + { + gtk_tree_store_insert_with_values (treestore, &iter, parent, + 0, 0, item, 1, age, -1); + } +} + +static void +midori_history_set_app (MidoriHistory* history, + MidoriApp* app) +{ + GtkTreeModel* model; + + if (history->array) + { + midori_history_disconnect_folder (history, history->array); + g_object_unref (history->array); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview)); + gtk_tree_store_clear (GTK_TREE_STORE (model)); + } + katze_assign (history->app, app); + if (!app) + return; + + g_object_ref (app); + history->array = katze_object_get_object (app, "history"); + if (history->array) + { + time_t now = time (NULL); + gint64 day = sokoke_time_t_to_julian (&now); + + model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview)); + midori_history_insert_item (history, GTK_TREE_STORE (model), + NULL, KATZE_ITEM (g_object_ref (history->array)), day); + } +} + +static void +midori_history_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriHistory* history = MIDORI_HISTORY (object); + + switch (prop_id) + { + case PROP_APP: + midori_history_set_app (history, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_history_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriHistory* history = MIDORI_HISTORY (object); + + switch (prop_id) + { + case PROP_APP: + g_value_set_object (value, history->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_history_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + GdkPixbuf* pixbuf = NULL; + + gtk_tree_model_get (model, iter, 0, &item, -1); + + g_assert (KATZE_IS_ITEM (item)); + + if (KATZE_IS_ARRAY (item)) + pixbuf = gtk_widget_render_icon (treeview, GTK_STOCK_DIRECTORY, + GTK_ICON_SIZE_MENU, NULL); + else + pixbuf = katze_net_load_icon ( + MIDORI_HISTORY (gtk_widget_get_parent (treeview))->net, + katze_item_get_uri (item), NULL, treeview, NULL); + + g_object_set (renderer, "pixbuf", pixbuf, NULL); + + if (pixbuf) + g_object_unref (pixbuf); + + g_object_unref (item); +} + +static void +midori_history_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + KatzeItem* item; + gint64 age; + + gtk_tree_model_get (model, iter, 0, &item, 1, &age, -1); + + g_assert (KATZE_IS_ITEM (item)); + + if (KATZE_IS_ARRAY (item)) + { + gchar* sdate; + + g_assert (age >= 0); + + if (age > 7) + { + g_object_set (renderer, "text", katze_item_get_name (item), NULL); + } + else if (age > 6) + { + sdate = g_strdup_printf (_("A week ago")); + g_object_set (renderer, "text", sdate, NULL); + g_free (sdate); + } + else if (age > 1) + { + sdate = g_strdup_printf (_("%d days ago"), (gint)age); + g_object_set (renderer, "text", sdate, NULL); + g_free (sdate); + } + else + { + if (age == 0) + sdate = _("Today"); + else + sdate = _("Yesterday"); + g_object_set (renderer, "text", sdate, NULL); + } + } + else + g_object_set (renderer, "text", katze_item_get_name (item), NULL); + + g_object_unref (item); +} + +static void +midori_history_row_activated_cb (GtkTreeView* treeview, + GtkTreePath* path, + GtkTreeViewColumn* column, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* item; + const gchar* uri; + + model = gtk_tree_view_get_model (treeview); + + if (gtk_tree_model_get_iter (model, &iter, path)) + { + gtk_tree_model_get (model, &iter, 0, &item, -1); + uri = katze_item_get_uri (item); + if (uri && *uri) + { + GtkWidget* browser; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + midori_browser_set_current_uri (MIDORI_BROWSER (browser), uri); + } + + g_object_unref (item); + } +} + +static void +midori_history_popup_item (GtkWidget* menu, + const gchar* stock_id, + const gchar* label, + KatzeItem* item, + gpointer callback, + MidoriHistory* history) +{ + const gchar* uri; + GtkWidget* menuitem; + + uri = katze_item_get_uri (item); + + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + if (label) + gtk_label_set_text_with_mnemonic (GTK_LABEL (gtk_bin_get_child ( + GTK_BIN (menuitem))), label); + if (!strcmp (stock_id, GTK_STOCK_EDIT)) + gtk_widget_set_sensitive (menuitem, + KATZE_IS_ARRAY (item) || uri != NULL); + else if (!KATZE_IS_ARRAY (item) && strcmp (stock_id, GTK_STOCK_DELETE)) + gtk_widget_set_sensitive (menuitem, uri != NULL); + g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item); + g_signal_connect (menuitem, "activate", G_CALLBACK (callback), history); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); +} + +static void +midori_history_open_activate_cb (GtkWidget* menuitem, + MidoriHistory* history) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + midori_browser_set_current_uri (MIDORI_BROWSER (browser), uri); + } +} + +static void +midori_history_open_in_tab_activate_cb (GtkWidget* menuitem, + MidoriHistory* history) +{ + KatzeItem* item; + const gchar* uri; + guint n; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + if (KATZE_IS_ARRAY (item)) + { + KatzeItem* child; + guint i = 0; + + while ((child = katze_array_get_nth_item (KATZE_ARRAY (item), i))) + { + if ((uri = katze_item_get_uri (child)) && *uri) + { + GtkWidget* browser; + MidoriWebSettings* settings; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + n = midori_browser_add_item (MIDORI_BROWSER (browser), child); + settings = katze_object_get_object (browser, "settings"); + if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) + midori_browser_set_current_page (MIDORI_BROWSER (browser), n); + g_object_unref (settings); + } + i++; + } + } + else + { + if ((uri = katze_item_get_uri (item)) && *uri) + { + GtkWidget* browser; + MidoriWebSettings* settings; + + browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + n = midori_browser_add_item (MIDORI_BROWSER (browser), item); + settings = katze_object_get_object (browser, "settings"); + if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) + midori_browser_set_current_page (MIDORI_BROWSER (browser), n); + g_object_unref (settings); + } + } +} + +static void +midori_history_open_in_window_activate_cb (GtkWidget* menuitem, + MidoriHistory* history) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + g_signal_emit_by_name (browser, "new-window", uri); + } +} + +static void +midori_history_bookmark_activate_cb (GtkWidget* menuitem, + MidoriHistory* history) +{ + KatzeItem* item; + const gchar* uri; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (history)); + midori_browser_edit_bookmark_dialog_new (MIDORI_BROWSER (browser), item, TRUE, FALSE); + } +} + +static void +midori_history_delete_activate_cb (GtkWidget* menuitem, + MidoriHistory* history) +{ + KatzeItem* item; + KatzeArray* parent; + + item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); + + /* FIXME: Even toplevel items should technically have a parent */ + g_return_if_fail (katze_item_get_parent (item)); + + parent = katze_item_get_parent (item); + katze_array_remove_item (parent, item); +} + +static void +midori_history_popup (GtkWidget* widget, + GdkEventButton* event, + KatzeItem* item, + MidoriHistory* history) +{ + GtkWidget* menu; + GtkWidget* menuitem; + + menu = gtk_menu_new (); + if (KATZE_IS_ARRAY (item)) + midori_history_popup_item (menu, + STOCK_TAB_NEW, _("Open all in _Tabs"), + item, midori_history_open_in_tab_activate_cb, history); + else + { + midori_history_popup_item (menu, GTK_STOCK_OPEN, NULL, + item, midori_history_open_activate_cb, history); + midori_history_popup_item (menu, STOCK_TAB_NEW, _("Open in New _Tab"), + item, midori_history_open_in_tab_activate_cb, history); + midori_history_popup_item (menu, STOCK_WINDOW_NEW, _("Open in New _Window"), + item, midori_history_open_in_window_activate_cb, history); + midori_history_popup_item (menu, STOCK_BOOKMARK_ADD, NULL, + item, midori_history_bookmark_activate_cb, history); + } + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + midori_history_popup_item (menu, GTK_STOCK_DELETE, NULL, + item, midori_history_delete_activate_cb, history); + + sokoke_widget_popup (widget, GTK_MENU (menu), + event, SOKOKE_MENU_POSITION_CURSOR); +} + +static gboolean +midori_history_button_release_event_cb (GtkWidget* widget, + GdkEventButton* event, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (event->button != 2 && event->button != 3) + return FALSE; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter)) + { + KatzeItem* item; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + if (event->button == 2) + { + const gchar* uri = katze_item_get_uri (item); + + if (uri && *uri) + { + GtkWidget* browser; + gint n; + + browser = gtk_widget_get_toplevel (widget); + n = midori_browser_add_uri (MIDORI_BROWSER (browser), uri); + midori_browser_set_current_page (MIDORI_BROWSER (browser), n); + } + } + else + midori_history_popup (widget, event, item, history); + + g_object_unref (item); + return TRUE; + } + return FALSE; +} + +static gboolean +midori_history_key_release_event_cb (GtkWidget* widget, + GdkEventKey* event, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + + if (event->keyval != GDK_Delete) + return FALSE; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter)) + { + KatzeItem* item; + KatzeArray* parent; + + gtk_tree_model_get (model, &iter, 0, &item, -1); + + parent = katze_item_get_parent (item); + katze_array_remove_item (parent, item); + + g_object_unref (item); + } + + return FALSE; +} + +static void +midori_history_popup_menu_cb (GtkWidget* widget, + MidoriHistory* history) +{ + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* item; + + if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter)) + { + gtk_tree_model_get (model, &iter, 0, &item, -1); + midori_history_popup (widget, NULL, item, history); + g_object_unref (item); + } +} + +static void +midori_history_init (MidoriHistory* history) +{ + GtkTreeStore* model; + GtkWidget* treeview; + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_pixbuf; + GtkCellRenderer* renderer_text; + + history->net = katze_net_new (); + /* FIXME: Dereference the net on finalization */ + + /* Create the treeview */ + model = gtk_tree_store_new (2, KATZE_TYPE_ITEM, G_TYPE_INT64); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_history_treeview_render_icon_cb, + treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_history_treeview_render_text_cb, + treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + g_object_unref (model); + g_object_connect (treeview, + "signal::row-activated", + midori_history_row_activated_cb, history, + "signal::cursor-changed", + midori_history_cursor_or_row_changed_cb, history, + "signal::columns-changed", + midori_history_cursor_or_row_changed_cb, history, + "signal::button-release-event", + midori_history_button_release_event_cb, history, + "signal::key-release-event", + midori_history_key_release_event_cb, history, + "signal::popup-menu", + midori_history_popup_menu_cb, history, + NULL); + gtk_widget_show (treeview); + gtk_box_pack_start (GTK_BOX (history), treeview, TRUE, TRUE, 0); + history->treeview = treeview; +} + +static void +midori_history_finalize (GObject* object) +{ + MidoriHistory* history = MIDORI_HISTORY (object); + + if (history->app) + g_object_unref (history->app); + g_object_unref (history->array); +} + +/** + * midori_history_new: + * + * Creates a new empty history. + * + * Return value: a new #MidoriHistory + * + * Since: 0.1.3 + **/ +GtkWidget* +midori_history_new (void) +{ + MidoriHistory* history = g_object_new (MIDORI_TYPE_HISTORY, NULL); + + return GTK_WIDGET (history); +} diff --git a/panels/midori-history.h b/panels/midori-history.h new file mode 100644 index 00000000..fc496eee --- /dev/null +++ b/panels/midori-history.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_HISTORY_H__ +#define __MIDORI_HISTORY_H__ + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_HISTORY \ + (midori_history_get_type ()) +#define MIDORI_HISTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_HISTORY, MidoriHistory)) +#define MIDORI_HISTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_HISTORY, MidoriHistoryClass)) +#define MIDORI_IS_HISTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_HISTORY)) +#define MIDORI_IS_HISTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_HISTORY)) +#define MIDORI_HISTORY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_HISTORY, MidoriHistoryClass)) + +typedef struct _MidoriHistory MidoriHistory; +typedef struct _MidoriHistoryClass MidoriHistoryClass; + +GType +midori_history_get_type (void); + +GtkWidget* +midori_history_new (void); + +G_END_DECLS + +#endif /* __MIDORI_HISTORY_H__ */ diff --git a/panels/midori-plugins.c b/panels/midori-plugins.c new file mode 100644 index 00000000..f2938164 --- /dev/null +++ b/panels/midori-plugins.c @@ -0,0 +1,329 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-plugins.h" + +#include "midori-app.h" +#include "midori-stock.h" +#include "midori-viewable.h" + +#include "sokoke.h" +#include +#include + +struct _MidoriPlugins +{ + GtkVBox parent_instance; + + GtkWidget* toolbar; + GtkWidget* treeview; + MidoriApp* app; +}; + +struct _MidoriPluginsClass +{ + GtkVBoxClass parent_class; +}; + +static void +midori_plugins_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriPlugins, midori_plugins, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_plugins_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_APP +}; + +static void +midori_plugins_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_plugins_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_plugins_class_init (MidoriPluginsClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->set_property = midori_plugins_set_property; + gobject_class->get_property = midori_plugins_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_APP, + g_param_spec_object ( + "app", + "App", + "The app", + MIDORI_TYPE_APP, + flags)); +} + +static const gchar* +midori_plugins_get_label (MidoriViewable* viewable) +{ + return _("Plugins"); +} + +static const gchar* +midori_plugins_get_stock_id (MidoriViewable* viewable) +{ + return STOCK_PLUGINS; +} + +static GtkWidget* +midori_plugins_get_toolbar (MidoriViewable* plugins) +{ + if (!MIDORI_PLUGINS (plugins)->toolbar) + { + GtkWidget* toolbar; + GtkToolItem* toolitem; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + toolitem = gtk_tool_item_new (); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + + MIDORI_PLUGINS (plugins)->toolbar = toolbar; + } + + return MIDORI_PLUGINS (plugins)->toolbar; +} + +static void +midori_plugins_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_plugins_get_stock_id; + iface->get_label = midori_plugins_get_label; + iface->get_toolbar = midori_plugins_get_toolbar; +} + +static void +midori_plugins_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriPlugins* plugins = MIDORI_PLUGINS (object); + + switch (prop_id) + { + case PROP_APP: + plugins->app = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_plugins_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriPlugins* plugins = MIDORI_PLUGINS (object); + + switch (prop_id) + { + case PROP_APP: + g_value_set_object (value, plugins->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_plugins_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + g_object_set (renderer, "stock-id", GTK_STOCK_EXECUTE, NULL); +} + +static void +midori_plugins_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + gchar* name; + gchar* text; + gchar* description; + + gtk_tree_model_get (model, iter, 0, &name, 1, &description, -1); + + text = g_strdup_printf ("%s\n%s", name, description); + g_free (name); + g_free (description); + g_object_set (renderer, "text", text, NULL); + g_free (text); +} + +static void +midori_plugins_add_item (MidoriPlugins* plugins, + const gchar* name, + const gchar* description) +{ + gchar* desc; + GtkTreeIter iter; + GtkTreeModel* model; + + desc = g_strdup (description); + if (desc) + { + gsize i, n; + + n = strlen (desc); + for (i = 0; i < n; i++) + if (desc[i] == ';') + desc[i] = '\n'; + } + model = gtk_tree_view_get_model (GTK_TREE_VIEW (plugins->treeview)); + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + 0, name, 1, desc, -1); + g_free (desc); +} + +static void +midori_plugins_init (MidoriPlugins* plugins) +{ + /* Create the treeview */ + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_text; + GtkCellRenderer* renderer_pixbuf; + GtkListStore* liststore = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + plugins->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (plugins->treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_plugins_treeview_render_icon_cb, + plugins->treeview, NULL); + renderer_text = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer_text, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_plugins_treeview_render_text_cb, + plugins->treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (plugins->treeview), column); + g_object_unref (liststore); + gtk_widget_show (plugins->treeview); + gtk_box_pack_start (GTK_BOX (plugins), plugins->treeview, TRUE, TRUE, 0); + + /* FIXME: Monitor folders for newly added and removes files */ + if (g_module_supported ()) + { + /* FIXME: WebKit is also looking in legacy folders, + we should have API to obtain that same list. */ + gchar** plugin_dirs; + gsize i = 0; + + if (g_getenv ("MOZ_PLUGIN_PATH")) + plugin_dirs = g_strsplit (g_getenv ("MOZ_PLUGIN_PATH"), ":", 0); + else + plugin_dirs = g_strsplit ("/usr/lib/mozilla/plugins", ":", 0); + + while (plugin_dirs[i]) + { + gchar* plugin_path; + GDir* plugin_dir; + + plugin_path = g_build_filename (plugin_dirs[i], NULL); + plugin_dir = g_dir_open (plugin_path, 0, NULL); + if (plugin_dir != 0) + { + const gchar* filename; + + while ((filename = g_dir_read_name (plugin_dir))) + { + gchar* fullname; + GModule* module; + typedef int (*NP_GetValue_func)(void* instance, + int variable, + void* value); + NP_GetValue_func NP_GetValue; + const gchar* plugin_name; + const gchar* plugin_description; + + fullname = g_build_filename (plugin_path, filename, NULL); + module = g_module_open (fullname, G_MODULE_BIND_LOCAL); + g_free (fullname); + + if (module && g_module_symbol (module, "NP_GetValue", + (gpointer) &NP_GetValue)) + { + typedef const gchar* (*NP_GetMIMEDescription_func)(void); + NP_GetMIMEDescription_func NP_GetMIMEDescription; + + NP_GetValue (NULL, 2, &plugin_name); + if (g_module_symbol (module, "NP_GetMIMEDescription", + (gpointer) &NP_GetMIMEDescription)) + plugin_description = NP_GetMIMEDescription (); + else + plugin_description = g_module_error (); + } + else + { + plugin_name = filename; + plugin_description = g_module_error (); + } + + midori_plugins_add_item (plugins, plugin_name, plugin_description); + } + g_dir_close (plugin_dir); + } + g_free (plugin_path); + i++; + } + g_strfreev (plugin_dirs); + } +} + +/** + * midori_plugins_new: + * + * Creates a new empty plugins. + * + * Return value: a new #MidoriPlugins + * + * Since: 0.1.3 + **/ +GtkWidget* +midori_plugins_new (void) +{ + MidoriPlugins* plugins = g_object_new (MIDORI_TYPE_PLUGINS, NULL); + + return GTK_WIDGET (plugins); +} diff --git a/panels/midori-plugins.h b/panels/midori-plugins.h new file mode 100644 index 00000000..00ee00c3 --- /dev/null +++ b/panels/midori-plugins.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_PLUGINS_H__ +#define __MIDORI_PLUGINS_H__ + +#include + +G_BEGIN_DECLS + +#define MIDORI_TYPE_PLUGINS \ + (midori_plugins_get_type ()) +#define MIDORI_PLUGINS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_PLUGINS, MidoriPlugins)) +#define MIDORI_PLUGINS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_PLUGINS, MidoriPluginsClass)) +#define MIDORI_IS_PLUGINS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_PLUGINS)) +#define MIDORI_IS_PLUGINS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_PLUGINS)) +#define MIDORI_PLUGINS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_PLUGINS, MidoriPluginsClass)) + +typedef struct _MidoriPlugins MidoriPlugins; +typedef struct _MidoriPluginsClass MidoriPluginsClass; + +GType +midori_plugins_get_type (void); + +GtkWidget* +midori_plugins_new (void); + +G_END_DECLS + +#endif /* __MIDORI_PLUGINS_H__ */ diff --git a/panels/midori-transfers.c b/panels/midori-transfers.c new file mode 100644 index 00000000..43434a05 --- /dev/null +++ b/panels/midori-transfers.c @@ -0,0 +1,417 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#include "midori-transfers.h" + +#include "midori-app.h" +#include "midori-browser.h" +#include "midori-stock.h" +#include "midori-view.h" + +#include "sokoke.h" +#include "compat.h" +#include + +struct _MidoriTransfers +{ + GtkVBox parent_instance; + + GtkWidget* toolbar; + GtkWidget* treeview; + MidoriApp* app; +}; + +struct _MidoriTransfersClass +{ + GtkVBoxClass parent_class; +}; + +static void +midori_transfers_viewable_iface_init (MidoriViewableIface* iface); + +G_DEFINE_TYPE_WITH_CODE (MidoriTransfers, midori_transfers, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (MIDORI_TYPE_VIEWABLE, + midori_transfers_viewable_iface_init)); + +enum +{ + PROP_0, + + PROP_APP +}; + +static void +midori_transfers_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec); + +static void +midori_transfers_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec); + +static void +midori_transfers_class_init (MidoriTransfersClass* class) +{ + GObjectClass* gobject_class; + GParamFlags flags; + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->set_property = midori_transfers_set_property; + gobject_class->get_property = midori_transfers_get_property; + + flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; + + g_object_class_install_property (gobject_class, + PROP_APP, + g_param_spec_object ( + "app", + "App", + "The app", + MIDORI_TYPE_APP, + flags)); +} + +static const gchar* +midori_transfers_get_label (MidoriViewable* viewable) +{ + return _("Transfers"); +} + +static const gchar* +midori_transfers_get_stock_id (MidoriViewable* viewable) +{ + return STOCK_TRANSFERS; +} + +static void +midori_transfers_button_clear_clicked_cb (GtkToolItem* toolitem, + MidoriTransfers* transfers) +{ + GtkTreeModel* model = gtk_tree_view_get_model ( + GTK_TREE_VIEW (transfers->treeview)); + /* FIXME: Clear only finished and cancelled downloads */ + gtk_tree_store_clear (GTK_TREE_STORE (model)); +} + +static GtkWidget* +midori_transfers_get_toolbar (MidoriViewable* transfers) +{ + if (!MIDORI_TRANSFERS (transfers)->toolbar) + { + GtkWidget* toolbar; + GtkToolItem* toolitem; + + toolbar = gtk_toolbar_new (); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); + toolitem = gtk_tool_item_new (); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + toolitem = gtk_separator_tool_item_new (); + gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), + FALSE); + gtk_tool_item_set_expand (toolitem, TRUE); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_CLEAR); + gtk_tool_item_set_is_important (toolitem, TRUE); + g_signal_connect (toolitem, "clicked", + G_CALLBACK (midori_transfers_button_clear_clicked_cb), transfers); + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); + gtk_widget_show (GTK_WIDGET (toolitem)); + MIDORI_TRANSFERS (transfers)->toolbar = toolbar; + } + + return MIDORI_TRANSFERS (transfers)->toolbar; +} + +static void +midori_transfers_viewable_iface_init (MidoriViewableIface* iface) +{ + iface->get_stock_id = midori_transfers_get_stock_id; + iface->get_label = midori_transfers_get_label; + iface->get_toolbar = midori_transfers_get_toolbar; +} + +#if WEBKIT_CHECK_VERSION (1, 1, 3) +static void +midori_transfers_download_notify_progress_cb (WebKitDownload* download, + GParamSpec* pspec, + MidoriTransfers* transfers) +{ + /* FIXME: Update only the appropriate row */ + gtk_widget_queue_draw (transfers->treeview); +} + +static void +midori_transfers_download_notify_status_cb (WebKitDownload* download, + GParamSpec* pspec, + MidoriTransfers* transfers) +{ + /* FIXME: Update only the appropriate row */ + gtk_widget_queue_draw (transfers->treeview); +} + +static void +midori_transfers_browser_add_download_cb (MidoriBrowser* browser, + WebKitDownload* download, + MidoriTransfers* transfers) +{ + GtkTreeView* treeview; + GtkTreeModel* model; + + treeview = GTK_TREE_VIEW (transfers->treeview); + model = gtk_tree_view_get_model (treeview); + gtk_tree_store_insert_with_values (GTK_TREE_STORE (model), + NULL, NULL, G_MAXINT, + 0, NULL, 1, download, -1); + g_signal_connect (download, "notify::progress", + G_CALLBACK (midori_transfers_download_notify_progress_cb), transfers); + g_signal_connect (download, "notify::status", + G_CALLBACK (midori_transfers_download_notify_status_cb), transfers); +} +#endif + +static void +midori_transfers_set_property (GObject* object, + guint prop_id, + const GValue* value, + GParamSpec* pspec) +{ + MidoriTransfers* transfers = MIDORI_TRANSFERS (object); + + switch (prop_id) + { + case PROP_APP: + transfers->app = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_transfers_get_property (GObject* object, + guint prop_id, + GValue* value, + GParamSpec* pspec) +{ + MidoriTransfers* transfers = MIDORI_TRANSFERS (object); + + switch (prop_id) + { + case PROP_APP: + g_value_set_object (value, transfers->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +midori_transfers_treeview_render_icon_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + g_object_set (renderer, "stock-id", STOCK_TRANSFER, + "stock-size", GTK_ICON_SIZE_DND, + "xpad", 1, "ypad", 12, NULL); +} + +static void +midori_transfers_treeview_render_text_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + #if WEBKIT_CHECK_VERSION (1, 1, 3) + WebKitDownload* download; + gchar* current; + gchar* total; + gchar* size_text; + gchar* text; + gdouble progress; + + gtk_tree_model_get (model, iter, 1, &download, -1); + + /* FIXME: Ellipsize filename */ + current = g_format_size_for_display (webkit_download_get_current_size (download)); + total = g_format_size_for_display (webkit_download_get_total_size (download)); + size_text = g_strdup_printf (_("%s of %s"), current, total); + g_free (current); + g_free (total); + text = g_strdup_printf ("%s\n%s", + webkit_download_get_suggested_filename (download), size_text); + g_free (size_text); + /* Avoid a bug in WebKit */ + if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_CREATED) + progress = webkit_download_get_progress (download); + else + progress = 0.0; + g_object_set (renderer, "text", text, + "value", (gint)(progress * 100), + "xpad", 1, "ypad", 6, NULL); + g_free (text); + g_object_unref (download); + #endif +} + +static void +midori_transfers_treeview_render_button_cb (GtkTreeViewColumn* column, + GtkCellRenderer* renderer, + GtkTreeModel* model, + GtkTreeIter* iter, + GtkWidget* treeview) +{ + #if WEBKIT_CHECK_VERSION (1, 1, 3) + WebKitDownload* download; + const gchar* stock_id; + + gtk_tree_model_get (model, iter, 1, &download, -1); + + switch (webkit_download_get_status (download)) + { + case WEBKIT_DOWNLOAD_STATUS_STARTED: + stock_id = GTK_STOCK_CANCEL; + break; + case WEBKIT_DOWNLOAD_STATUS_FINISHED: + stock_id = GTK_STOCK_OPEN; + break; + default: + stock_id = GTK_STOCK_CLEAR; + } + g_object_set (renderer, "stock-id", stock_id, + "stock-size", GTK_ICON_SIZE_MENU, NULL); + + g_object_unref (download); + #endif +} + +static void +midori_transfers_treeview_row_activated_cb (GtkTreeView* treeview, + GtkTreePath* path, + GtkTreeViewColumn* column, + MidoriTransfers* transfers) +{ + GtkTreeModel* model = gtk_tree_view_get_model (treeview); + GtkTreeIter iter; + if (gtk_tree_model_get_iter (model, &iter, path)) + { + #if WEBKIT_CHECK_VERSION (1, 1, 3) + WebKitDownload* download; + + gtk_tree_model_get (model, &iter, 1, &download, -1); + + switch (webkit_download_get_status (download)) + { + case WEBKIT_DOWNLOAD_STATUS_STARTED: + webkit_download_cancel (download); + break; + case WEBKIT_DOWNLOAD_STATUS_FINISHED: + { + const gchar* uri; + gboolean success; + + uri = webkit_download_get_destination_uri (download); + success = gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET ( + treeview)), uri, gtk_get_current_event_time (), NULL); + if (!success) + { + gchar* command = g_strconcat ("exo-open ", uri, NULL); + success = g_spawn_command_line_async (command, NULL); + g_free (command); + } + break; + } + case WEBKIT_DOWNLOAD_STATUS_CANCELLED: + /* FIXME: Remove this item from the model */ + default: + break; + } + g_object_unref (download); + #endif + } +} + +static void +midori_transfers_hierarchy_changed_cb (MidoriTransfers* transfers, + GtkWidget* old_parent) +{ + #if WEBKIT_CHECK_VERSION (1, 1, 3) + GtkWidget* browser = gtk_widget_get_toplevel (GTK_WIDGET (transfers)); + if (GTK_WIDGET_TOPLEVEL (browser)) + g_signal_connect (browser, "add-download", + G_CALLBACK (midori_transfers_browser_add_download_cb), transfers); + #endif +} + +static void +midori_transfers_init (MidoriTransfers* transfers) +{ + /* Create the treeview */ + GtkTreeViewColumn* column; + GtkCellRenderer* renderer_pixbuf; + GtkCellRenderer* renderer_text; + GtkTreeStore* treestore = gtk_tree_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_OBJECT); + transfers->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treestore)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (transfers->treeview), FALSE); + column = gtk_tree_view_column_new (); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_transfers_treeview_render_icon_cb, + transfers->treeview, NULL); + renderer_text = gtk_cell_renderer_progress_new (); + gtk_tree_view_column_pack_start (column, renderer_text, TRUE); + gtk_tree_view_column_set_cell_data_func (column, renderer_text, + (GtkTreeCellDataFunc)midori_transfers_treeview_render_text_cb, + transfers->treeview, NULL); + renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); + gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, + (GtkTreeCellDataFunc)midori_transfers_treeview_render_button_cb, + transfers->treeview, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (transfers->treeview), column); + g_object_unref (treestore); + g_signal_connect (transfers->treeview, "row-activated", + G_CALLBACK (midori_transfers_treeview_row_activated_cb), + transfers); + gtk_widget_show (transfers->treeview); + gtk_box_pack_start (GTK_BOX (transfers), transfers->treeview, TRUE, TRUE, 0); + + g_signal_connect (transfers, "hierarchy-changed", + G_CALLBACK (midori_transfers_hierarchy_changed_cb), NULL); +} + +/** + * midori_transfers_new: + * + * Creates a new empty transfers. + * + * Return value: a new #MidoriTransfers + * + * Since 0.1.5 + **/ +GtkWidget* +midori_transfers_new (void) +{ + MidoriTransfers* transfers = g_object_new (MIDORI_TYPE_TRANSFERS, NULL); + + return GTK_WIDGET (transfers); +} diff --git a/panels/midori-transfers.h b/panels/midori-transfers.h new file mode 100644 index 00000000..97787115 --- /dev/null +++ b/panels/midori-transfers.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#ifndef __MIDORI_TRANSFERS_H__ +#define __MIDORI_TRANSFERS_H__ + +#include + +#include + +#include "midori-viewable.h" + +G_BEGIN_DECLS + +#define MIDORI_TYPE_TRANSFERS \ + (midori_transfers_get_type ()) +#define MIDORI_TRANSFERS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIDORI_TYPE_TRANSFERS, MidoriTransfers)) +#define MIDORI_TRANSFERS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), MIDORI_TYPE_TRANSFERS, MidoriTransfersClass)) +#define MIDORI_IS_TRANSFERS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIDORI_TYPE_TRANSFERS)) +#define MIDORI_IS_TRANSFERS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), MIDORI_TYPE_TRANSFERS)) +#define MIDORI_TRANSFERS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), MIDORI_TYPE_TRANSFERS, MidoriTransfersClass)) + +typedef struct _MidoriTransfers MidoriTransfers; +typedef struct _MidoriTransfersClass MidoriTransfersClass; + +GType +midori_transfers_get_type (void); + +GtkWidget* +midori_transfers_new (void); + +G_END_DECLS + +#endif /* __MIDORI_TRANSFERS_H__ */ diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 00000000..acd91948 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,2 @@ +# set of available languages (in alphabetic order) +da de el en_GB es et fi fr gl he hu id it ja nl pl pt_PT ru sv tr uk zh_CN zh_TW diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 00000000..3aa6f688 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,31 @@ +# List of source files containing translatable strings. + +data/midori.desktop.in +midori/main.c +midori/midori-app.c +midori/midori-array.c +midori/midori-browser.c +midori/midori-panel.c +midori/midori-websettings.c +midori/midori-view.c +midori/midori-preferences.c +midori/midori-searchaction.c +midori/sokoke.c +panels/midori-addons.c +panels/midori-bookmarks.c +panels/midori-console.c +panels/midori-extensions.c +panels/midori-history.c +panels/midori-plugins.c +panels/midori-transfers.c +katze/katze-http-auth.c +katze/katze-throbber.c +katze/katze-utils.c +katze/katze-item.c +katze/katze-array.c +katze/katze-arrayaction.c +extensions/colorful-tabs.c +extensions/cookie-manager.c +extensions/mouse-gestures/main.c +extensions/page-holder.c +extensions/statusbar-features.c diff --git a/po/POTFILES.skip b/po/POTFILES.skip new file mode 100644 index 00000000..8468b7fe --- /dev/null +++ b/po/POTFILES.skip @@ -0,0 +1,2 @@ +# List of source files containing translatable strings but should be ignored. +midori/gtkiconentry.c diff --git a/po/da.po b/po/da.po new file mode 100644 index 00000000..07421041 --- /dev/null +++ b/po/da.po @@ -0,0 +1,1712 @@ +# Danish translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Per Kongstad 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-03-22 22:19+0100\n" +"PO-Revision-Date: 2009-03-28 21:59+0100\n" +"Last-Translator: Per Kongstad \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Letvægts-webbrowser" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1580 +#: ../midori/main.c:1672 +#: ../midori/main.c:1681 +#: ../midori/main.c:1692 +#: ../midori/midori-websettings.c:269 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Webbrowser" + +#: ../midori/main.c:103 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Indstillingen kunne ikke indlæses: %s\n" + +#: ../midori/main.c:158 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Værdien '%s' er ikke gyldig til %s" + +#: ../midori/main.c:165 +#: ../midori/main.c:235 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Ugyldig indstillingsværdi '%s'" + +#: ../midori/main.c:477 +msgid "File not found." +msgstr "Fil blev ikke fundet." + +#: ../midori/main.c:485 +#: ../midori/main.c:494 +msgid "Malformed document." +msgstr "Misdannet dokument." + +#: ../midori/main.c:516 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Kunne ikke åbne databasen: %s\n" + +#: ../midori/main.c:548 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Kunne ikke køre databaseudtryk: %s\n" + +#: ../midori/main.c:602 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Kunne ikke fjerne historikelementet: %s\n" + +#: ../midori/main.c:626 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Kunne ikke rydde historikken: %s\n" + +#: ../midori/main.c:649 +#: ../midori/main.c:683 +#: ../midori/main.c:699 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Kunne ikke tilføje historikelementet: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:879 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Kunne ikke fjerne gamle historikelementer: %s\n" + +#: ../midori/main.c:907 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Indstillingen kunne ikke gemmes. %s" + +#: ../midori/main.c:936 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Søgemaskinerne kunne ikke gemmes. %s" + +#: ../midori/main.c:1066 +#: ../midori/sokoke.c:617 +#, c-format +msgid "Writing failed." +msgstr "Skrivning fejlede." + +#: ../midori/main.c:1087 +#: ../midori/main.c:1114 +#: ../midori/main.c:1142 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Bogmærkerne kunne ikke gemmes. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1166 +#: ../midori/main.c:1190 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Papirkurven kunne ikke fyldes. %s" + +#: ../midori/main.c:1261 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Sessionen kunne ikke gemmes. %s" + +#: ../midori/main.c:1377 +msgid "Midori seems to have crashed the last time it was opened. If this happened repeatedly, try one of the following options to solve the problem." +msgstr "Midori ser ud til at være gået ned efter det var åbnet sidste gang. Hvis dette er sket gentagne gange, foreslås det at prøve de følgende muligheder for at løse problemet." + +#: ../midori/main.c:1392 +msgid "Modify _preferences" +msgstr "Ændre _indstillinger" + +#: ../midori/main.c:1396 +msgid "Reset the last _session" +msgstr "Nulstil den sidste _session" + +#: ../midori/main.c:1401 +msgid "Disable all _extensions" +msgstr "Slå alle _udvidelser fra" + +#: ../midori/main.c:1580 +msgid "No filename specified" +msgstr "Intet filnavn angivet" + +#: ../midori/main.c:1603 +#: ../midori/gjs.c:515 +msgid "An unknown error occured." +msgstr "En ukendt fejl opstod." + +#: ../midori/main.c:1626 +msgid "Run the specified filename as javascript" +msgstr "Kør det angivne filnavn som javascript" + +#: ../midori/main.c:1628 +msgid "Display program version" +msgstr "Vis programversion" + +#: ../midori/main.c:1630 +msgid "Addresses" +msgstr "Adresser" + +#: ../midori/main.c:1669 +msgid "[Addresses]" +msgstr "[Adresser]" + +#: ../midori/main.c:1693 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Rapportér venligst kommentarer, forslag og fejl til:" + +#: ../midori/main.c:1695 +msgid "Check for new versions at:" +msgstr "Tjek for nye versioner hos:" + +#: ../midori/main.c:1722 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "En instans af Midori kører allerede men reagerer ikke.\n" + +#: ../midori/main.c:1772 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "Søgemaskinerne kunne ikke indlæses. %s\n" + +#: ../midori/main.c:1784 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Bogmærkerne kunne ikke indlæses: %s\n" + +#: ../midori/main.c:1799 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Sessionen kunne ikke indlæses: %s\n" + +#: ../midori/main.c:1812 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Papirkurven kunne ikke indlæses: %s\n" + +#: ../midori/main.c:1825 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Historikken kunne ikke indlæses: %s\n" + +#: ../midori/main.c:1837 +msgid "The following errors occured:" +msgstr "De følgende fejl opstod:" + +#: ../midori/main.c:1853 +msgid "_Ignore" +msgstr "_Ignorér" + +#: ../midori/midori-browser.c:278 +#: ../midori/midori-browser.c:3262 +#: ../midori/midori-browser.c:3268 +msgid "Reload the current page" +msgstr "Genindlæs den nuværende side" + +#: ../midori/midori-browser.c:289 +#: ../midori/midori-browser.c:3265 +msgid "Stop loading the current page" +msgstr "Stop indlæsning af nuværende side" + +#: ../midori/midori-browser.c:351 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% indlæst" + +#: ../midori/midori-browser.c:376 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Uventet handling '%s'." + +#: ../midori/midori-browser.c:553 +msgid "New folder" +msgstr "Ny mappe" + +#: ../midori/midori-browser.c:553 +msgid "Edit folder" +msgstr "Redigér mappe" + +#: ../midori/midori-browser.c:555 +msgid "New bookmark" +msgstr "Nyt bogmærke" + +#: ../midori/midori-browser.c:555 +msgid "Edit bookmark" +msgstr "Redigér bogmærke" + +#: ../midori/midori-browser.c:585 +msgid "_Title:" +msgstr "_Titel:" + +#: ../midori/midori-browser.c:598 +#: ../midori/midori-searchaction.c:855 +msgid "_Description:" +msgstr "_Beskrivelse:" + +#: ../midori/midori-browser.c:617 +#: ../midori/midori-searchaction.c:869 +msgid "_Address:" +msgstr "_Adresse:" + +#: ../midori/midori-browser.c:636 +msgid "_Folder:" +msgstr "_Mappe:" + +#: ../midori/midori-browser.c:641 +#: ../midori/midori-browser.c:682 +msgid "Toplevel folder" +msgstr "Øverste mappe" + +#: ../midori/midori-browser.c:762 +msgid "Save file as" +msgstr "Gem fil som" + +#: ../midori/midori-browser.c:1538 +msgid "Open file" +msgstr "Åbn fil" + +#: ../midori/midori-browser.c:2837 +#: ../panels/midori-bookmarks.c:776 +#: ../panels/midori-history.c:810 +msgid "Open all in _Tabs" +msgstr "Åbn alt i _faneblade" + +#: ../midori/midori-browser.c:2844 +#: ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:816 +msgid "Open in New _Tab" +msgstr "Åbn i nyt _faneblad" + +#: ../midori/midori-browser.c:2847 +#: ../panels/midori-bookmarks.c:784 +#: ../panels/midori-history.c:818 +msgid "Open in New _Window" +msgstr "Åbn i nyt _vindue" + +#: ../midori/midori-browser.c:3001 +msgid "A lightweight web browser." +msgstr "En letvægt-webbrowser." + +#: ../midori/midori-browser.c:3009 +msgid "translator-credits" +msgstr "" +"Per Kongstad \n" +"\n" +"Dansk-gruppen \n" +"Mere info: http://www.dansk-gruppen.dk" + +#: ../midori/midori-browser.c:3196 +msgid "_File" +msgstr "_Fil" + +#: ../midori/midori-browser.c:3199 +msgid "Open a new window" +msgstr "Åbn et nyt vindue" + +#: ../midori/midori-browser.c:3202 +msgid "Open a new tab" +msgstr "Åbn et nyt faneblad" + +#: ../midori/midori-browser.c:3205 +msgid "Open a file" +msgstr "Åbn en fil" + +#: ../midori/midori-browser.c:3208 +msgid "Save to a file" +msgstr "Gem til en fil" + +#: ../midori/midori-browser.c:3210 +msgid "_Close Tab" +msgstr "_Luk faneblad" + +#: ../midori/midori-browser.c:3211 +msgid "Close the current tab" +msgstr "Luk nuværende faneblad" + +#: ../midori/midori-browser.c:3213 +msgid "C_lose Window" +msgstr "Lu_k vinduet" + +#: ../midori/midori-browser.c:3214 +msgid "Close this window" +msgstr "Luk dette vindue" + +#: ../midori/midori-browser.c:3217 +msgid "Print the current page" +msgstr "Udskriv nuværende side" + +#: ../midori/midori-browser.c:3220 +msgid "Quit the application" +msgstr "Afslut programmet" + +#: ../midori/midori-browser.c:3222 +msgid "_Edit" +msgstr "_Redigér" + +#: ../midori/midori-browser.c:3225 +msgid "Cut the selected text" +msgstr "Udklip markeret tekst" + +#: ../midori/midori-browser.c:3228 +#: ../midori/midori-browser.c:3231 +msgid "Copy the selected text" +msgstr "Kopiér markeret tekst" + +#: ../midori/midori-browser.c:3234 +msgid "Paste text from the clipboard" +msgstr "Indsæt tekst fra klippebordet" + +#: ../midori/midori-browser.c:3237 +msgid "Delete the selected text" +msgstr "Slet markeret tekst" + +#: ../midori/midori-browser.c:3240 +msgid "Select all text" +msgstr "Markér hele teksten" + +#: ../midori/midori-browser.c:3243 +msgid "Find a word or phrase in the page" +msgstr "Find et ord eller sætning på siden" + +#: ../midori/midori-browser.c:3245 +msgid "Find _Next" +msgstr "Find _næste" + +#: ../midori/midori-browser.c:3246 +msgid "Find the next occurrence of a word or phrase" +msgstr "Find næste forekomst af et ord eller sætning" + +#: ../midori/midori-browser.c:3248 +msgid "Find _Previous" +msgstr "Find _forrige" + +#: ../midori/midori-browser.c:3249 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Find forrige forekomst af et ord eller sætning" + +#: ../midori/midori-browser.c:3252 +msgid "_Quick Find" +msgstr "_Find hurtigt" + +#: ../midori/midori-browser.c:3253 +msgid "Quickly jump to a word or phrase" +msgstr "Hop hurtigt til et ord eller sætning" + +#: ../midori/midori-browser.c:3256 +msgid "Configure the application preferences" +msgstr "Indstil programindstillingerne" + +#: ../midori/midori-browser.c:3258 +msgid "_View" +msgstr "_Vis" + +#: ../midori/midori-browser.c:3259 +msgid "_Toolbars" +msgstr "_Værktøjsbjælker" + +#: ../midori/midori-browser.c:3271 +msgid "Increase the zoom level" +msgstr "Forøg forstørrelsesniveauet" + +#: ../midori/midori-browser.c:3274 +msgid "Decrease the zoom level" +msgstr "Formindsk forstørrelsesniveauet" + +#: ../midori/midori-browser.c:3277 +msgid "Reset the zoom level" +msgstr "Nulstil forstørrelsesniveauet" + +#: ../midori/midori-browser.c:3278 +msgid "_Encoding" +msgstr "_Kodning" + +#: ../midori/midori-browser.c:3280 +msgid "_Automatic" +msgstr "_Automatisk" + +#: ../midori/midori-browser.c:3283 +#: ../midori/midori-websettings.c:196 +msgid "Chinese (BIG5)" +msgstr "Kinesisk (BIG5)" + +#: ../midori/midori-browser.c:3286 +#: ../midori/midori-websettings.c:197 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japansk (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3289 +#: ../midori/midori-websettings.c:198 +msgid "Russian (KOI8-R)" +msgstr "Russisk (KOI8-R)" + +#: ../midori/midori-browser.c:3292 +#: ../midori/midori-websettings.c:199 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3295 +#: ../midori/midori-websettings.c:200 +msgid "Western (ISO-8859-1)" +msgstr "Vestlig (ISO-8859-1)" + +#: ../midori/midori-browser.c:3298 +#: ../midori/midori-websettings.c:201 +#: ../midori/midori-websettings.c:273 +msgid "Custom..." +msgstr "Tilpasset..." + +#: ../midori/midori-browser.c:3301 +#: ../midori/midori-view.c:1111 +msgid "View _Source" +msgstr "Vis _kilde" + +#: ../midori/midori-browser.c:3302 +msgid "View the source code of the page" +msgstr "Vis kildekode for siden" + +#: ../midori/midori-browser.c:3304 +msgid "View Selection Source" +msgstr "Vis kilde for markerede" + +#: ../midori/midori-browser.c:3305 +msgid "View the source code of the selection" +msgstr "Vis kildekode for markering" + +#: ../midori/midori-browser.c:3309 +msgid "Toggle fullscreen view" +msgstr "Slå fuldskærmstilstande til/fra" + +#: ../midori/midori-browser.c:3311 +msgid "_Go" +msgstr "_Gå til" + +#: ../midori/midori-browser.c:3314 +msgid "Go back to the previous page" +msgstr "Gå til forrige side" + +#: ../midori/midori-browser.c:3317 +msgid "Go forward to the next page" +msgstr "Gå til næste side" + +#: ../midori/midori-browser.c:3320 +msgid "Go to your homepage" +msgstr "Gå til din hjemmeside" + +#: ../midori/midori-browser.c:3322 +msgid "Empty Trash" +msgstr "Tøm papirkurven" + +#: ../midori/midori-browser.c:3323 +msgid "Delete the contents of the trash" +msgstr "Slet indhold af papirkurven" + +#: ../midori/midori-browser.c:3325 +#: ../midori/midori-view.c:1083 +msgid "Undo Close Tab" +msgstr "Fortryd luk faneblad" + +#: ../midori/midori-browser.c:3326 +msgid "Open the last closed tab" +msgstr "Åbn sidste lukkede faneblad" + +#: ../midori/midori-browser.c:3330 +#: ../panels/midori-bookmarks.c:228 +msgid "Add a new bookmark" +msgstr "Tilføj et nyt bogmærke" + +#: ../midori/midori-browser.c:3331 +msgid "_Tools" +msgstr "Værk_tøjer" + +#: ../midori/midori-browser.c:3333 +#: ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "_Håndtér søgemaskiner" + +#: ../midori/midori-browser.c:3334 +msgid "Add, edit and remove search engines..." +msgstr "Tilføj, redigér og fjern søgemaskiner..." + +#: ../midori/midori-browser.c:3338 +msgid "_Previous Tab" +msgstr "_Forrige faneblad" + +#: ../midori/midori-browser.c:3339 +msgid "Switch to the previous tab" +msgstr "Skift til det forrige faneblad" + +#: ../midori/midori-browser.c:3341 +msgid "_Next Tab" +msgstr "_Næste faneblad" + +#: ../midori/midori-browser.c:3342 +msgid "Switch to the next tab" +msgstr "Skift til det næste faneblad" + +#: ../midori/midori-browser.c:3344 +msgid "_Help" +msgstr "_Hjælp" + +#: ../midori/midori-browser.c:3346 +msgid "_Contents" +msgstr "_Indhold" + +#: ../midori/midori-browser.c:3347 +msgid "Show the documentation" +msgstr "Vis dokumentationen" + +#: ../midori/midori-browser.c:3349 +msgid "_Frequent Questions" +msgstr "_Ofte stillede spørgsmål" + +#: ../midori/midori-browser.c:3350 +msgid "Show the Frequently Asked Questions" +msgstr "Vis ofte stillede spørgsmål" + +#: ../midori/midori-browser.c:3352 +msgid "_Report a Bug" +msgstr "_Rapportér en fejl" + +#: ../midori/midori-browser.c:3353 +msgid "Open Midori's bug tracker" +msgstr "Åbn Midoris fejlsystem" + +#: ../midori/midori-browser.c:3356 +msgid "Show information about the program" +msgstr "Vis information om dette program" + +#: ../midori/midori-browser.c:3363 +msgid "P_rivate Browsing" +msgstr "P_rivat browsing" + +#: ../midori/midori-browser.c:3364 +msgid "Don't save any private data while browsing" +msgstr "Undlad at gemme private data under browsing" + +#: ../midori/midori-browser.c:3369 +msgid "_Menubar" +msgstr "_Menubjælke" + +#: ../midori/midori-browser.c:3370 +msgid "Show menubar" +msgstr "Vis menubjælke" + +#: ../midori/midori-browser.c:3373 +msgid "_Navigationbar" +msgstr "_Navigeringsbjælke" + +#: ../midori/midori-browser.c:3374 +msgid "Show navigationbar" +msgstr "Vis navigeringsbjælke" + +#: ../midori/midori-browser.c:3377 +msgid "Side_panel" +msgstr "Side_panel" + +#: ../midori/midori-browser.c:3378 +msgid "Show sidepanel" +msgstr "Vis sidepanel" + +#: ../midori/midori-browser.c:3381 +msgid "_Bookmarkbar" +msgstr "_Bogmærkebjælke" + +#: ../midori/midori-browser.c:3382 +msgid "Show bookmarkbar" +msgstr "Vis bogmærkebjælke" + +#: ../midori/midori-browser.c:3385 +msgid "_Transferbar" +msgstr "_Overførselsstatus" + +#: ../midori/midori-browser.c:3386 +msgid "Show transferbar" +msgstr "Vis overførselsstatus" + +#: ../midori/midori-browser.c:3389 +msgid "_Statusbar" +msgstr "_Statusbjælke" + +#: ../midori/midori-browser.c:3390 +msgid "Show statusbar" +msgstr "Vis statusbjælke" + +#: ../midori/midori-browser.c:3821 +msgid "_Separator" +msgstr "_Separator" + +#: ../midori/midori-browser.c:3828 +msgid "_Location..." +msgstr "_Sted..." + +#: ../midori/midori-browser.c:3830 +msgid "Open a particular location" +msgstr "Åbn et særligt sted" + +#: ../midori/midori-browser.c:3854 +msgid "_Web Search..." +msgstr "_Websøgning..." + +#: ../midori/midori-browser.c:3856 +msgid "Run a web search" +msgstr "Kør en websøgnig" + +#: ../midori/midori-browser.c:3875 +msgid "Reopen a previously closed tab or window" +msgstr "Genåbn et tidligere lukket faneblad eller vindue" + +#: ../midori/midori-browser.c:3888 +msgid "_Recently visited pages" +msgstr "_Nyligt besøgte sider" + +#: ../midori/midori-browser.c:3890 +msgid "Reopen pages that you visited earlier" +msgstr "Genåbn sider som du tidligere har besøgt" + +#: ../midori/midori-browser.c:3903 +#: ../midori/sokoke.c:772 +msgid "_Bookmarks" +msgstr "_Bogmærker" + +#: ../midori/midori-browser.c:3905 +msgid "Show the saved bookmarks" +msgstr "Vis de gemte bogmærker" + +#: ../midori/midori-browser.c:3918 +msgid "_Window" +msgstr "Vin_due" + +#: ../midori/midori-browser.c:3920 +msgid "Show a list of all open tabs" +msgstr "Vis en liste med alle åbne faneblade" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4085 +msgid "_Inline Find:" +msgstr "_Indlejret søgning:" + +#: ../midori/midori-browser.c:4110 +msgid "Previous" +msgstr "Forrige" + +#: ../midori/midori-browser.c:4115 +msgid "Next" +msgstr "Næste" + +#: ../midori/midori-browser.c:4120 +msgid "Match Case" +msgstr "Versalfølsom" + +#: ../midori/midori-browser.c:4128 +msgid "Highlight Matches" +msgstr "Fremhæv fundne" + +#: ../midori/midori-browser.c:4138 +msgid "Close Findbar" +msgstr "Luk søgebjælke" + +#: ../midori/midori-browser.c:4444 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Uventet indstilling '%s'" + +#: ../midori/midori-panel.c:229 +#: ../midori/midori-websettings.c:511 +msgid "Align sidepanel on the right" +msgstr "Opstil sidepanel til højre" + +#: ../midori/midori-panel.c:231 +#: ../midori/midori-websettings.c:512 +msgid "Whether to align the sidepanel on the right" +msgstr "Om sidepanelet skal være opstilles til højre" + +#: ../midori/midori-panel.c:241 +#: ../midori/midori-panel.c:242 +msgid "Close panel" +msgstr "Luk panel" + +#: ../midori/midori-websettings.c:179 +#: ../midori/midori-view.c:1888 +msgid "Blank page" +msgstr "Blank side" + +#: ../midori/midori-websettings.c:180 +#: ../midori/midori-websettings.c:531 +msgid "Homepage" +msgstr "Hjemmeside" + +#: ../midori/midori-websettings.c:181 +msgid "Last open pages" +msgstr "Sidste åbne sider" + +#: ../midori/midori-websettings.c:216 +msgid "New tab" +msgstr "Nyt faneblad" + +#: ../midori/midori-websettings.c:217 +msgid "New window" +msgstr "Nyt vindue" + +#: ../midori/midori-websettings.c:218 +msgid "Current tab" +msgstr "Nuværende faneblad" + +#: ../midori/midori-websettings.c:233 +msgid "Default" +msgstr "Standard" + +#: ../midori/midori-websettings.c:234 +msgid "Icons" +msgstr "Ikoner" + +#: ../midori/midori-websettings.c:235 +msgid "Text" +msgstr "Tekst" + +#: ../midori/midori-websettings.c:236 +msgid "Both" +msgstr "Begge" + +#: ../midori/midori-websettings.c:237 +msgid "Both horizontal" +msgstr "Begge vandrette" + +#: ../midori/midori-websettings.c:252 +msgid "All cookies" +msgstr "Alle cookies" + +#: ../midori/midori-websettings.c:253 +msgid "Session cookies" +msgstr "Session-cookies" + +#: ../midori/midori-websettings.c:254 +#: ../panels/midori-addons.c:94 +msgid "None" +msgstr "Ingen" + +#: ../midori/midori-websettings.c:270 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:271 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:272 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:325 +msgid "Remember last window size" +msgstr "Husk sidste vinduesstørrelse" + +#: ../midori/midori-websettings.c:326 +msgid "Whether to save the last window size" +msgstr "Skal sidste vinduesstørrelse gemmes" + +#: ../midori/midori-websettings.c:334 +msgid "Last window width" +msgstr "Sidste vinduesbredde" + +#: ../midori/midori-websettings.c:335 +msgid "The last saved window width" +msgstr "Sidste gemte vinduesbredde" + +#: ../midori/midori-websettings.c:343 +msgid "Last window height" +msgstr "Sidste vindueshøjde" + +#: ../midori/midori-websettings.c:344 +msgid "The last saved window height" +msgstr "Sidste gemte vindueshøjde" + +#: ../midori/midori-websettings.c:369 +msgid "Last panel position" +msgstr "Sidste panelplacering" + +#: ../midori/midori-websettings.c:370 +msgid "The last saved panel position" +msgstr "Sidste gemte panelplacering" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:379 +msgid "Last panel page" +msgstr "Sidste panelside" + +#: ../midori/midori-websettings.c:380 +msgid "The last saved panel page" +msgstr "Sidste gemte panelside" + +#: ../midori/midori-websettings.c:388 +msgid "Last Web search" +msgstr "Sidste websøgning" + +#: ../midori/midori-websettings.c:389 +msgid "The last saved Web search" +msgstr "Den sidste gemte websøgning" + +#: ../midori/midori-websettings.c:398 +msgid "Show Menubar" +msgstr "Vis menubjælke" + +#: ../midori/midori-websettings.c:399 +msgid "Whether to show the menubar" +msgstr "Om menubjælke vises" + +#: ../midori/midori-websettings.c:407 +msgid "Show Navigationbar" +msgstr "Vis navigeringsbjælke" + +#: ../midori/midori-websettings.c:408 +msgid "Whether to show the navigationbar" +msgstr "Om navigeringsbjælke vises" + +#: ../midori/midori-websettings.c:416 +msgid "Show Bookmarkbar" +msgstr "Vis bogmærkebjælke" + +#: ../midori/midori-websettings.c:417 +msgid "Whether to show the bookmarkbar" +msgstr "Om bogmærkebjælke vises" + +#: ../midori/midori-websettings.c:425 +msgid "Show Panel" +msgstr "Vis panel" + +#: ../midori/midori-websettings.c:426 +msgid "Whether to show the panel" +msgstr "Om panel vises" + +#: ../midori/midori-websettings.c:441 +msgid "Show Transferbar" +msgstr "Vis overførselsstatus" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to show the transferbar" +msgstr "Om overførselsstatus skal vises" + +#: ../midori/midori-websettings.c:450 +msgid "Show Statusbar" +msgstr "Vis statusbjælke" + +#: ../midori/midori-websettings.c:451 +msgid "Whether to show the statusbar" +msgstr "Om statusbjælke vises" + +#: ../midori/midori-websettings.c:460 +msgid "Toolbar Style" +msgstr "Værktøjsbjælkestil" + +#: ../midori/midori-websettings.c:461 +msgid "The style of the toolbar" +msgstr "Stilen for værktøjsbjælke" + +#: ../midori/midori-websettings.c:477 +msgid "Show progress in location entry" +msgstr "Vis fremgang i placeringindgang" + +#: ../midori/midori-websettings.c:478 +msgid "Whether to show loading progress in the location entry" +msgstr "Om visning af indlæsningsfremgang i placeringsindgang" + +#: ../midori/midori-websettings.c:486 +msgid "Toolbar Items" +msgstr "Værktøjsbjælkes elementer" + +#: ../midori/midori-websettings.c:487 +msgid "The items to show on the toolbar" +msgstr "Elementer der vises på værktøjsbjælken" + +#: ../midori/midori-websettings.c:495 +msgid "Compact Sidepanel" +msgstr "Kompakt sidepanel" + +#: ../midori/midori-websettings.c:496 +msgid "Whether to make the sidepanel compact" +msgstr "Om sidepanelet skal være kompakt" + +#: ../midori/midori-websettings.c:521 +msgid "Load on Startup" +msgstr "Indlæs ved opstart" + +#: ../midori/midori-websettings.c:522 +msgid "What to load on startup" +msgstr "Hvad der skal indlæses under opstart" + +#: ../midori/midori-websettings.c:532 +msgid "The homepage" +msgstr "Hjemmesiden" + +#: ../midori/midori-websettings.c:547 +msgid "Show crash dialog" +msgstr "Vis nedbrudsdialog" + +#: ../midori/midori-websettings.c:548 +msgid "Show a dialog after Midori crashed" +msgstr "Vis en dialog efter nedbrud af Midori" + +#: ../midori/midori-websettings.c:556 +msgid "Download Folder" +msgstr "Nedhentning-mappen" + +#: ../midori/midori-websettings.c:557 +msgid "The folder downloaded files are saved to" +msgstr "Mappen hvor nedhentede filer skal gemmes" + +#: ../midori/midori-websettings.c:569 +msgid "Download Manager" +msgstr "Håndtering af hentning" + +#: ../midori/midori-websettings.c:570 +msgid "An external download manager" +msgstr "En ekstern håndtering for nedhentning" + +#: ../midori/midori-websettings.c:578 +msgid "Text Editor" +msgstr "Tekstbehandler" + +#: ../midori/midori-websettings.c:579 +msgid "An external text editor" +msgstr "En ekstern tekstbehandler" + +#: ../midori/midori-websettings.c:587 +msgid "Location entry Search" +msgstr "Søg for stedindgang" + +#: ../midori/midori-websettings.c:588 +msgid "The search to perform inside the location entry" +msgstr "Søgningen som skal foretages i placeringsindgang" + +#: ../midori/midori-websettings.c:596 +msgid "Preferred Encoding" +msgstr "Foretrukne tegnsæt" + +#: ../midori/midori-websettings.c:597 +msgid "The preferred character encoding" +msgstr "Foretrukne tegnsæt" + +#: ../midori/midori-websettings.c:607 +msgid "Always Show Tabbar" +msgstr "Vis altid fanebladsbjælke" + +#: ../midori/midori-websettings.c:608 +msgid "Always show the tabbar" +msgstr "Vis altid fanebladsbjælken" + +#: ../midori/midori-websettings.c:616 +msgid "Close Buttons on Tabs" +msgstr "Lukkeknapper på faneblade" + +#: ../midori/midori-websettings.c:617 +msgid "Whether tabs have close buttons" +msgstr "Om faneblade har lukkeknapper" + +#: ../midori/midori-websettings.c:625 +msgid "Open new pages in" +msgstr "Åbn nye vinduer i" + +#: ../midori/midori-websettings.c:626 +msgid "Where to open new pages" +msgstr "Hvor skal nye sider åbnes" + +#: ../midori/midori-websettings.c:635 +msgid "Open external pages in" +msgstr "Åbn eksterne sider i" + +#: ../midori/midori-websettings.c:636 +msgid "Where to open externally opened pages" +msgstr "Hvor skal eksterne sider åbnes" + +#: ../midori/midori-websettings.c:649 +msgid "Middle click opens Selection" +msgstr "Midterklik åbner for markering" + +#: ../midori/midori-websettings.c:650 +msgid "Load an address from the selection via middle click" +msgstr "Indlæs en adresse fra markeringen med midterklik" + +#: ../midori/midori-websettings.c:658 +msgid "Open tabs in the background" +msgstr "Åbn faneblade i baggrunden" + +#: ../midori/midori-websettings.c:659 +msgid "Whether to open new tabs in the background" +msgstr "Om nye faneblade skal åbnes i baggrunden" + +#: ../midori/midori-websettings.c:667 +msgid "Open Tabs next to Current" +msgstr "Åbn faneblad ved siden af nuværende" + +#: ../midori/midori-websettings.c:668 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Om åbning af faneblade skal ske ved siden af nuværende eller efter sidste faneblad" + +#: ../midori/midori-websettings.c:676 +msgid "Open popups in tabs" +msgstr "Åbn pop op i faneblade" + +#: ../midori/midori-websettings.c:677 +msgid "Whether to open popup windows in tabs" +msgstr "Om pop op-vinduer skal åbnes i faneblade" + +#: ../midori/midori-websettings.c:693 +msgid "Zoom Text and Images" +msgstr "Zoom tekst og billeder" + +#: ../midori/midori-websettings.c:694 +msgid "Whether to zoom text and images" +msgstr "Om zoom af tekst og billeder" + +#: ../midori/midori-websettings.c:709 +msgid "Find inline while typing" +msgstr "Find indlejret mens du taster" + +#: ../midori/midori-websettings.c:710 +msgid "Whether to automatically find inline while typing" +msgstr "Om indlejret skal findes automatisk, mens du taster" + +#: ../midori/midori-websettings.c:718 +msgid "Accept cookies" +msgstr "Tillad cookies" + +#: ../midori/midori-websettings.c:719 +msgid "What type of cookies to accept" +msgstr "Hvilke typer af cookes skal tillades" + +#: ../midori/midori-websettings.c:728 +msgid "Original cookies only" +msgstr "Kun for originale cookies" + +#: ../midori/midori-websettings.c:729 +msgid "Accept cookies from the original website only" +msgstr "Tillad kun cookies fra original web-side" + +#: ../midori/midori-websettings.c:737 +msgid "Maximum cookie age" +msgstr "Maksimal cookie-levetid" + +#: ../midori/midori-websettings.c:738 +msgid "The maximum number of days to save cookies for" +msgstr "Maksimal antal dage cookies skal gemmes" + +#: ../midori/midori-websettings.c:748 +msgid "Remember last visited pages" +msgstr "Husk sidste besøgte sider" + +#: ../midori/midori-websettings.c:749 +msgid "Whether the last visited pages are saved" +msgstr "Om sidste besøgte sider skal gemmes" + +#: ../midori/midori-websettings.c:757 +msgid "Maximum history age" +msgstr "Maksimal historik-levetid" + +#: ../midori/midori-websettings.c:758 +msgid "The maximum number of days to save the history for" +msgstr "Maksimale antal dage som historik skal gemmes" + +#: ../midori/midori-websettings.c:766 +msgid "Remember last form inputs" +msgstr "Husk sidste formularindtastninger" + +#: ../midori/midori-websettings.c:767 +msgid "Whether the last form inputs are saved" +msgstr "Om sidste formularindtastninger skal gemmes" + +#: ../midori/midori-websettings.c:775 +msgid "Remember last downloaded files" +msgstr "Husk sidste hentede filer" + +#: ../midori/midori-websettings.c:776 +msgid "Whether the last downloaded files are saved" +msgstr "Om sidste hentede filer skal gemmes" + +#: ../midori/midori-websettings.c:786 +msgid "Proxy Server" +msgstr "Proxyserver" + +#: ../midori/midori-websettings.c:787 +msgid "The proxy server used for HTTP connections" +msgstr "Proxyserveren som bruges til HTTP-forbindelser" + +#: ../midori/midori-websettings.c:802 +msgid "Detect proxy server automatically" +msgstr "Genkend automatisk proxyserver" + +#: ../midori/midori-websettings.c:803 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "Om proxyserveren genkendes automatisk fra miljøet" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:819 +msgid "Identify as" +msgstr "Identificér som" + +#: ../midori/midori-websettings.c:820 +msgid "What to identify as to web pages" +msgstr "Hvad skal genkendes som web-sider" + +#: ../midori/midori-websettings.c:836 +msgid "Identification string" +msgstr "Identifikationsstreng" + +#: ../midori/midori-websettings.c:837 +msgid "The application identification string" +msgstr "Programmets identifikationsstreng" + +#: ../midori/midori-websettings.c:845 +msgid "Cache size" +msgstr "Størrelse af mellemlager" + +#: ../midori/midori-websettings.c:846 +msgid "The allowed size of the cache" +msgstr "Den tilladte størrelse af mellemlager" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:656 +#, c-format +msgid "Not found - %s" +msgstr "Ikke fundet - %s" + +#: ../midori/midori-view.c:988 +msgid "Open _Link" +msgstr "Åbn _henvisning" + +#: ../midori/midori-view.c:990 +msgid "Open Link in New _Tab" +msgstr "Åbn henvisning i nyt _faneblad" + +#: ../midori/midori-view.c:1007 +msgid "Open Link in New _Window" +msgstr "Åbn henvisning i nyt _vindue" + +#: ../midori/midori-view.c:1016 +#: ../midori/midori-view.c:1030 +msgid "_Download Link destination" +msgstr "_Hent henvisningsadressen" + +#: ../midori/midori-view.c:1022 +msgid "_Save Link destination" +msgstr "_Gem henvisningsadresse" + +#: ../midori/midori-view.c:1053 +msgid "_Search the Web" +msgstr "_Søg internettet" + +#: ../midori/midori-view.c:1062 +msgid "Open Address in New _Tab" +msgstr "Åbn adresse i nyt _faneblad" + +#: ../midori/midori-view.c:1201 +msgid "Open or download file" +msgstr "Åbn eller hent fil" + +#: ../midori/midori-view.c:1210 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "Filtype: %s ('%s')" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1214 +#, c-format +msgid "Open %s" +msgstr "Åbn %s" + +#: ../midori/midori-view.c:1610 +#, c-format +msgid "Inspect page - %s" +msgstr "Undersøg side - %s" + +#: ../midori/midori-view.c:1755 +#, c-format +msgid "Document cannot be displayed" +msgstr "Dokument kan ikke vises" + +#: ../midori/midori-view.c:1771 +#, c-format +msgid "No documentation installed" +msgstr "Ingen dokumentation installeret" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Indstillinger for %s" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "Generel" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "Opstart" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "Brug nuværende side som hjemmeside" + +#: ../midori/midori-preferences.c:423 +#: ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "Overførsler" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:462 +msgid "Appearance" +msgstr "Udseende" + +#: ../midori/midori-preferences.c:463 +msgid "Font settings" +msgstr "Indstillinger for skrifttype" + +#: ../midori/midori-preferences.c:465 +msgid "Default Font Family" +msgstr "Standard for skrifttypefamilie" + +#: ../midori/midori-preferences.c:471 +msgid "The default font size used to display text" +msgstr "Størrelse af standardskriftstype er brugt til at vise tekst" + +#: ../midori/midori-preferences.c:474 +msgid "Minimum Font Size" +msgstr "Minimal skriftstørrelse" + +#: ../midori/midori-preferences.c:477 +msgid "The minimum font size used to display text" +msgstr "Minimum størrelse af skrifttype til at vise tekst" + +#: ../midori/midori-preferences.c:484 +msgid "Encoding" +msgstr "Tegnsæt" + +#: ../midori/midori-preferences.c:487 +msgid "The character encoding to use by default" +msgstr "Tegnsæt som bruges standard" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:494 +msgid "Behavior" +msgstr "Opførsel" + +#: ../midori/midori-preferences.c:495 +msgid "Features" +msgstr "Funktionalitet" + +#: ../midori/midori-preferences.c:498 +#: ../extensions/statusbar-features.c:42 +msgid "Load images automatically" +msgstr "Indlæs billeder automatisk" + +#: ../midori/midori-preferences.c:499 +msgid "Load and display images automatically" +msgstr "Indlæs og vis billeder automatisk" + +#: ../midori/midori-preferences.c:502 +msgid "Shrink images automatically" +msgstr "Formindsk billeder automatisk" + +#: ../midori/midori-preferences.c:503 +msgid "Automatically shrink standalone images to fit" +msgstr "Minimér enkeltstående billeder til at passe" + +#: ../midori/midori-preferences.c:506 +msgid "Print background images" +msgstr "Udskriv baggrundsbilleder" + +#: ../midori/midori-preferences.c:507 +msgid "Whether background images should be printed" +msgstr "Om baggrundsbilleder skal udskrives" + +#: ../midori/midori-preferences.c:510 +msgid "Resizable text areas" +msgstr "Justerbare tekstområder" + +#: ../midori/midori-preferences.c:511 +msgid "Whether text areas are resizable" +msgstr "Om tekstområder kan ændre størrelse" + +#: ../midori/midori-preferences.c:514 +#: ../extensions/statusbar-features.c:49 +msgid "Enable scripts" +msgstr "Brug skripter" + +#: ../midori/midori-preferences.c:515 +msgid "Enable embedded scripting languages" +msgstr "Slå indlejret skriptsprog til" + +#: ../midori/midori-preferences.c:518 +#: ../extensions/statusbar-features.c:56 +msgid "Enable plugins" +msgstr "Slå udvidelsesmoduler til" + +#: ../midori/midori-preferences.c:519 +msgid "Enable embedded plugin objects" +msgstr "Slå indlejrede udvidelsesobjekter til" + +#: ../midori/midori-preferences.c:522 +msgid "Enforce 96 dots per inch" +msgstr "Gennemtving 96 dots per tomme" + +#: ../midori/midori-preferences.c:523 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Gennemtving tæthed af videopunkt på 96 DPI" + +#: ../midori/midori-preferences.c:526 +msgid "Enable developer tools" +msgstr "Brug udvikler-værktøjer" + +#: ../midori/midori-preferences.c:527 +msgid "Enable special extensions for developers" +msgstr "Slå specielle udvidelser til udviklere til" + +#. Page "Interface" +#: ../midori/midori-preferences.c:539 +msgid "Interface" +msgstr "Grænseflade" + +#: ../midori/midori-preferences.c:540 +msgid "Navigationbar" +msgstr "Navigeringsbjælke" + +#: ../midori/midori-preferences.c:549 +msgid "Browsing" +msgstr "Browsing" + +#. Page "Network" +#: ../midori/midori-preferences.c:579 +#: ../midori/midori-preferences.c:580 +msgid "Network" +msgstr "Netværk" + +#: ../midori/midori-preferences.c:607 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:612 +msgid "Privacy" +msgstr "Beskyttelse af privatliv" + +#: ../midori/midori-preferences.c:613 +msgid "Web Cookies" +msgstr "Web-cookies" + +#: ../midori/midori-preferences.c:626 +#: ../midori/midori-preferences.c:636 +msgid "days" +msgstr "dage" + +#: ../midori/midori-preferences.c:629 +#: ../panels/midori-history.c:104 +msgid "History" +msgstr "Historik" + +#: ../midori/midori-searchaction.c:455 +#: ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "Tom" + +#: ../midori/midori-searchaction.c:811 +msgid "Add search engine" +msgstr "Tilføj søgemaskine" + +#: ../midori/midori-searchaction.c:811 +msgid "Edit search engine" +msgstr "Redigér søgemaskine" + +#: ../midori/midori-searchaction.c:839 +msgid "_Name:" +msgstr "_Navn:" + +#: ../midori/midori-searchaction.c:883 +msgid "_Icon:" +msgstr "_Ikon:" + +#: ../midori/midori-searchaction.c:897 +msgid "_Token:" +msgstr "_Symbol:" + +#: ../midori/midori-searchaction.c:1077 +msgid "Manage Search Engines" +msgstr "Håndtér søgemaskiner" + +#: ../midori/sokoke.c:109 +#: ../midori/sokoke.c:121 +msgid "Could not run external program." +msgstr "Kunne ikke køre eksternt program." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:440 +msgid "Warning: You are using a superuser account!" +msgstr "Advarsel: Du bruger en superbruger-konto!" + +#: ../midori/sokoke.c:771 +msgid "_Bookmark" +msgstr "_Bogmærke" + +#: ../midori/sokoke.c:773 +msgid "_Add Bookmark" +msgstr "_Tilføj bogmærke" + +#: ../midori/sokoke.c:774 +msgid "_Console" +msgstr "_Konsol" + +#: ../midori/sokoke.c:775 +msgid "_Extensions" +msgstr "_Udvidelser" + +#: ../midori/sokoke.c:776 +msgid "_History" +msgstr "Hi_storik" + +#: ../midori/sokoke.c:777 +msgid "_Homepage" +msgstr "_Hjemmeside" + +#: ../midori/sokoke.c:778 +msgid "_Userscripts" +msgstr "Brugerskri_pter" + +#: ../midori/sokoke.c:779 +msgid "User_styles" +msgstr "Bruger_grænseflader" + +#: ../midori/sokoke.c:780 +msgid "New _Tab" +msgstr "Nyt _faneblad" + +#: ../midori/sokoke.c:781 +msgid "_Transfers" +msgstr "_Overførsler" + +#: ../midori/sokoke.c:782 +msgid "_Closed Tabs and Windows" +msgstr "_Lukkede faneblade og vinduer" + +#: ../midori/sokoke.c:783 +msgid "New _Window" +msgstr "Nyt _vindue" + +#: ../midori/gjs.c:743 +#: ../midori/gjs.c:833 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s har ingen egenskab '%s'" + +#: ../midori/gjs.c:879 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s kan ikke blive tildelt til %s.%s" + +#: ../midori/gjs.c:889 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s kan ikke tilgås" + +#: ../panels/midori-addons.c:95 +#: ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "Brugerskripter" + +#: ../panels/midori-addons.c:96 +#: ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "Brugerstile" + +#: ../panels/midori-addons.c:922 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Slå til" + +#: ../panels/midori-addons.c:923 +#: ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "Slå til" + +#: ../panels/midori-addons.c:932 +#: ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "_Slå fra" + +#: ../panels/midori-addons.c:933 +#: ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "Slå fra" + +#: ../panels/midori-bookmarks.c:103 +msgid "Bookmarks" +msgstr "Bogmærker" + +#: ../panels/midori-bookmarks.c:236 +msgid "Edit the selected bookmark" +msgstr "Redigér det valgte bogmærke" + +#: ../panels/midori-bookmarks.c:244 +msgid "Delete the selected bookmark" +msgstr "Slet det valgte bogmærke" + +#: ../panels/midori-bookmarks.c:257 +msgid "Add a new folder" +msgstr "Tilføj en ny mappe" + +#: ../panels/midori-bookmarks.c:589 +msgid "Separator" +msgstr "Separator" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsol" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Udvidelser" + +#: ../panels/midori-history.c:159 +msgid "Are you sure you want to remove all history items?" +msgstr "Er du sikker på, at du ønsker at fjerne alle historikelementer?" + +#: ../panels/midori-history.c:216 +msgid "Bookmark the selected history item" +msgstr "Bogmærk det valgte historikelement" + +#: ../panels/midori-history.c:225 +msgid "Delete the selected history item" +msgstr "Slet det valgte historikelement" + +#: ../panels/midori-history.c:233 +msgid "Clear the entire history" +msgstr "Ryd hele historikken" + +#: ../panels/midori-history.c:603 +#, c-format +msgid "A week ago" +msgstr "For en uge siden" + +#: ../panels/midori-history.c:609 +#, c-format +msgid "%d days ago" +msgstr "For %d dage siden" + +#: ../panels/midori-history.c:616 +msgid "Today" +msgstr "I dag" + +#: ../panels/midori-history.c:618 +msgid "Yesterday" +msgstr "I går" + +#: ../panels/midori-plugins.c:87 +#: ../extensions/statusbar-features.c:54 +msgid "Plugins" +msgstr "Udvidelsesmoduler" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "%s af %s" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "Godkendelse påkrævet" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Et brugernavn samt en adgangskode er påkrævet\n" +"for at åbne dette sted:" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "Brugernavn" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "Adgangskode" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Angivet ikon '%s' blev ikke indlæst" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Lagerikon '%s' kunne ikke indlæses" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Animeringsrammer er ødelagt" + +#: ../katze/katze-utils.c:180 +#: ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Egenskab '%s' er ikke gyldig for %s" + +#: ../katze/katze-utils.c:209 +#: ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "Vælg fil" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "Vælg mappe" + +#: ../extensions/colorful-tabs.c:97 +msgid "Tint tabs distinctly" +msgstr "Ton faneblade tydeligt" + +#: ../extensions/colorful-tabs.c:133 +msgid "Colorful Tabs" +msgstr "Farvefulde faneblade" + +#: ../extensions/colorful-tabs.c:134 +msgid "Tint each tab distinctly" +msgstr "Ton hvert faneblad tydeligt" + +#: ../extensions/mouse-gestures/main.c:176 +msgid "Mouse Gestures" +msgstr "Musebevægelser" + +#: ../extensions/mouse-gestures/main.c:177 +msgid "Control Midori by moving the mouse" +msgstr "Styr Midori ved at flytte musen" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 +#: ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "Sideholder" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "_Sideholder" + +#: ../extensions/statusbar-features.c:40 +msgid "Images" +msgstr "Billeder" + +#: ../extensions/statusbar-features.c:47 +msgid "Scripts" +msgstr "Skripter" + +#~ msgid "Source" +#~ msgstr "Kilde" + diff --git a/po/de.po b/po/de.po new file mode 100644 index 00000000..6daa9d24 --- /dev/null +++ b/po/de.po @@ -0,0 +1,1852 @@ +# German translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Enrico Tröger 2008 +# Christian Dywan 2008-2009 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-19 16:44+0200\n" +"PO-Revision-Date: 2009-04-19 15:34+0100\n" +"Last-Translator: Christian Dywan \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Schlanker Internetbetrachter" + +#: ../data/midori.desktop.in.h:2 ../midori/main.c:1288 ../midori/main.c:1388 +#: ../midori/main.c:1396 ../midori/main.c:1407 +#: ../midori/midori-websettings.c:273 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Internetbetrachter" + +#: ../midori/main.c:94 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Die Konfiguration konnte nicht geladen werden: %s\n" + +#: ../midori/main.c:149 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Wert »%s« ist ungültig für %s" + +#: ../midori/main.c:156 ../midori/main.c:228 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Ungültiger Einstellungswert »%s«" + +#: ../midori/main.c:332 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Datenbank konnte nicht geöffnet werden: %s\n" + +#: ../midori/main.c:364 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Datenbankabfrage konnte nicht ausgeführt werden: %s\n" + +#: ../midori/main.c:418 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Verlaufseintrag konnte nicht entfernt werden: %s\n" + +#: ../midori/main.c:442 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Verlaufseintrag konnte nicht entfernt werden: %s\n" + +#: ../midori/main.c:465 ../midori/main.c:499 ../midori/main.c:515 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Verlaufseintrag konnte nicht entfernt werden: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:694 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Verlaufseintrag konnte nicht entfernt werden: %s\n" + +#: ../midori/main.c:722 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Die Konfiguration konnte nicht geladen werden. %s" + +#: ../midori/main.c:751 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Die Suchmaschinen konnten nicht geladen werden. %s" + +#: ../midori/main.c:770 ../midori/main.c:798 ../midori/main.c:827 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Die Lesezeichen konnten nicht geladen werden. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:850 ../midori/main.c:873 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Der Papierkorb konnte nicht gespeichert werden. %s" + +#: ../midori/main.c:946 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Die Sitzung konnte nicht geladen werden. %s" + +#: ../midori/main.c:1073 +msgid "" +"Midori seems to have crashed the last time it was opened. If this happened " +"repeatedly, try one of the following options to solve the problem." +msgstr "" +"Midori ist offenbar abgestürzt nachdem es das letzte Mal geöffnet wurde. " +"Probieren Sie folgende Möglichkeiten falls dies vermehrt vorkommt." + +#: ../midori/main.c:1088 +msgid "Modify _preferences" +msgstr "_Einstellungen bearbeiten" + +#: ../midori/main.c:1092 +msgid "Reset the last _session" +msgstr "Die letzte _Sitzung zurücksetzen" + +#: ../midori/main.c:1097 +msgid "Disable all _extensions" +msgstr "Alle Er_weiterungen ausschalten" + +#: ../midori/main.c:1288 +msgid "No filename specified" +msgstr "Kein Dateiname angegeben" + +#: ../midori/main.c:1311 +msgid "An unknown error occured." +msgstr "Ein unbekannter Fehler ist aufgetreten." + +#: ../midori/main.c:1336 +msgid "Run ADDRESS as a web application" +msgstr "ADRESSE als Internetanwendung starten" + +#: ../midori/main.c:1336 +msgid "ADDRESS" +msgstr "ADRESSE" + +#: ../midori/main.c:1338 +msgid "Use FOLDER as configuration folder" +msgstr "ORDNER als Konfigurationsordner benutzen" + +#: ../midori/main.c:1338 +msgid "FOLDER" +msgstr "ORDNER" + +#: ../midori/main.c:1340 +msgid "Run the specified filename as javascript" +msgstr "Angegebenen Dateinamen als Javaskript ausführen" + +#: ../midori/main.c:1342 +msgid "Display program version" +msgstr "Programmversion anzeigen" + +#: ../midori/main.c:1344 +msgid "Addresses" +msgstr "Adressen" + +#: ../midori/main.c:1385 +msgid "[Addresses]" +msgstr "[Adressen]" + +#: ../midori/main.c:1408 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Kommentare, Vorschläge und Fehlerberichte senden an:" + +#: ../midori/main.c:1410 +msgid "Check for new versions at:" +msgstr "Informieren Sie sich über neue Versionen unter:" + +#: ../midori/main.c:1454 +msgid "The specified configuration folder is invalid." +msgstr "Der angegebene Konfigurationsordner konnte nicht geladen werden." + +#: ../midori/main.c:1489 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Eine Instanz von Midori läuft bereits, reagiert aber nicht.\n" + +#: ../midori/main.c:1539 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "Die Suchmaschinen konnten nicht geladen werden. %s\n" + +#: ../midori/main.c:1551 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Die Lesezeichen konnten nicht geladen werden: %s\n" + +#: ../midori/main.c:1566 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Die Sitzung konnte nicht geladen werden: %s\n" + +#: ../midori/main.c:1579 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Der Papierkorb konnte nicht geladen werden: %s\n" + +#: ../midori/main.c:1592 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Der Verlauf konnte nicht geladen werden: %s\n" + +#: ../midori/main.c:1604 +msgid "The following errors occured:" +msgstr "Folgende Fehler sind aufgetreten:" + +#: ../midori/main.c:1620 +msgid "_Ignore" +msgstr "_Ignorieren" + +#: ../midori/midori-array.c:195 +msgid "File not found." +msgstr "Datei nicht gefunden." + +#: ../midori/midori-array.c:203 ../midori/midori-array.c:212 +msgid "Malformed document." +msgstr "Fehlerhaftes Dokument" + +#: ../midori/midori-array.c:338 ../midori/sokoke.c:625 +#, c-format +msgid "Writing failed." +msgstr "Schreiben fehlgeschlagen." + +#: ../midori/midori-browser.c:280 ../midori/midori-browser.c:3368 +#: ../midori/midori-browser.c:3374 +msgid "Reload the current page" +msgstr "Diese Seite neu laden" + +#: ../midori/midori-browser.c:291 ../midori/midori-browser.c:3371 +msgid "Stop loading the current page" +msgstr "Laden dieser Seite abbrechen" + +#: ../midori/midori-browser.c:353 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% geladen" + +#: ../midori/midori-browser.c:378 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Unerwartete Aktion »%s«." + +#: ../midori/midori-browser.c:541 +msgid "New folder" +msgstr "Neuer Ordner" + +#: ../midori/midori-browser.c:541 +msgid "Edit folder" +msgstr "Ordner bearbeiten" + +#: ../midori/midori-browser.c:543 +msgid "New bookmark" +msgstr "Neues Lesezeichen" + +#: ../midori/midori-browser.c:543 +msgid "Edit bookmark" +msgstr "Lesezeichen bearbeiten" + +#: ../midori/midori-browser.c:573 +msgid "_Title:" +msgstr "_Titel:" + +#: ../midori/midori-browser.c:586 ../midori/midori-searchaction.c:948 +msgid "_Description:" +msgstr "_Beschreibung:" + +#: ../midori/midori-browser.c:605 ../midori/midori-searchaction.c:962 +msgid "_Address:" +msgstr "_Adresse:" + +#: ../midori/midori-browser.c:624 +msgid "_Folder:" +msgstr "_Ordner:" + +#: ../midori/midori-browser.c:629 ../midori/midori-browser.c:670 +msgid "Toplevel folder" +msgstr "Oberster Ordner" + +#: ../midori/midori-browser.c:746 +msgid "Save file as" +msgstr "Datei speichern unter" + +#: ../midori/midori-browser.c:1523 +msgid "Open file" +msgstr "Datei öffnen" + +#: ../midori/midori-browser.c:2803 ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:809 +msgid "Open all in _Tabs" +msgstr "Alle in neuen _Reitern öffnen" + +#: ../midori/midori-browser.c:2810 ../panels/midori-bookmarks.c:788 +#: ../panels/midori-history.c:815 +msgid "Open in New _Tab" +msgstr "In neuem _Reiter öffnen" + +#: ../midori/midori-browser.c:2813 ../panels/midori-bookmarks.c:790 +#: ../panels/midori-history.c:817 +msgid "Open in New _Window" +msgstr "In neuem _Fenster öffnen" + +#: ../midori/midori-browser.c:2974 +msgid "Clear Private Data" +msgstr "Private Daten löschen" + +#: ../midori/midori-browser.c:2977 +msgid "_Clear private data" +msgstr "_Private Daten löschen" + +#: ../midori/midori-browser.c:2990 +msgid "Clear the following data:" +msgstr "Folgende Daten löschen:" + +#: ../midori/midori-browser.c:2998 ../midori/midori-preferences.c:640 +#: ../panels/midori-history.c:108 +msgid "History" +msgstr "Verlauf" + +#: ../midori/midori-browser.c:3001 +msgid "Cookies" +msgstr "Benutzerprofile/ Cookies" + +#: ../midori/midori-browser.c:3004 +msgid "'Flash' Cookies" +msgstr "«Flash» Cookies" + +#: ../midori/midori-browser.c:3007 +msgid "Website icons" +msgstr "Symbole von Internetseiten" + +#: ../midori/midori-browser.c:3093 +msgid "A lightweight web browser." +msgstr "Ein schlanker Internetbetrachter." + +#: ../midori/midori-browser.c:3101 +msgid "translator-credits" +msgstr "" +"Enrico Tröger \n" +"Christian Dywan " + +#: ../midori/midori-browser.c:3302 +msgid "_File" +msgstr "_Datei" + +#: ../midori/midori-browser.c:3305 +msgid "Open a new window" +msgstr "Ein neues Fenster öffnen" + +#: ../midori/midori-browser.c:3308 +msgid "Open a new tab" +msgstr "Einen neuen Reiter öffnen" + +#: ../midori/midori-browser.c:3311 +msgid "Open a file" +msgstr "Eine Datei öffnen" + +#: ../midori/midori-browser.c:3314 +msgid "Save to a file" +msgstr "In Datei speichern" + +#: ../midori/midori-browser.c:3316 +msgid "_Close Tab" +msgstr "Reiter s_chließen" + +#: ../midori/midori-browser.c:3317 +msgid "Close the current tab" +msgstr "Den aktuellen Reiter schließen" + +#: ../midori/midori-browser.c:3319 +msgid "C_lose Window" +msgstr "_Fenster schließen" + +#: ../midori/midori-browser.c:3320 +msgid "Close this window" +msgstr "Dieses Fenster schließen" + +#: ../midori/midori-browser.c:3323 +msgid "Print the current page" +msgstr "Aktuelle Seite ausdrucken" + +#: ../midori/midori-browser.c:3326 +msgid "Quit the application" +msgstr "Programm beenden" + +#: ../midori/midori-browser.c:3328 +msgid "_Edit" +msgstr "_Bearbeiten" + +#: ../midori/midori-browser.c:3331 +msgid "Cut the selected text" +msgstr "Markierten Text ausschneiden" + +#: ../midori/midori-browser.c:3334 ../midori/midori-browser.c:3337 +msgid "Copy the selected text" +msgstr "Markierten Text kopieren" + +#: ../midori/midori-browser.c:3340 +msgid "Paste text from the clipboard" +msgstr "Text aus der Zwischenablage einfügen" + +#: ../midori/midori-browser.c:3343 +msgid "Delete the selected text" +msgstr "Markierten Text löschen" + +#: ../midori/midori-browser.c:3346 +msgid "Select all text" +msgstr "Gesamten Text auswählen" + +#: ../midori/midori-browser.c:3349 +msgid "Find a word or phrase in the page" +msgstr "Finde ein Wort oder einen Satz auf der Seite" + +#: ../midori/midori-browser.c:3351 +msgid "Find _Next" +msgstr "_Nächstes suchen" + +#: ../midori/midori-browser.c:3352 +msgid "Find the next occurrence of a word or phrase" +msgstr "Finde das nächste Auftreten eines Wortes oder Satzes" + +#: ../midori/midori-browser.c:3354 +msgid "Find _Previous" +msgstr "_Vorheriges suchen" + +#: ../midori/midori-browser.c:3355 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Finde das voherige Auftreten eines Wortes oder Satzes" + +#: ../midori/midori-browser.c:3358 +msgid "_Quick Find" +msgstr "_Schnellsuche" + +#: ../midori/midori-browser.c:3359 +msgid "Quickly jump to a word or phrase" +msgstr "Schnell zu einem Wort oder Satz springen" + +#: ../midori/midori-browser.c:3362 +msgid "Configure the application preferences" +msgstr "Anwedungseinstellungen anpassen" + +#: ../midori/midori-browser.c:3364 +msgid "_View" +msgstr "_Ansicht" + +#: ../midori/midori-browser.c:3365 +msgid "_Toolbars" +msgstr "_Werkzeugleisten" + +#: ../midori/midori-browser.c:3377 +msgid "Increase the zoom level" +msgstr "Erhöhe die Vergrößerungsstufe" + +#: ../midori/midori-browser.c:3380 +msgid "Decrease the zoom level" +msgstr "Verringere die Vergrößerungsstufe" + +#: ../midori/midori-browser.c:3383 +msgid "Reset the zoom level" +msgstr "Setzte die Vergrößerungsstufe zurück" + +#: ../midori/midori-browser.c:3384 +msgid "_Encoding" +msgstr "_Zeichensatz" + +#: ../midori/midori-browser.c:3386 +msgid "_Automatic" +msgstr "_Automatisch" + +#: ../midori/midori-browser.c:3389 ../midori/midori-websettings.c:200 +msgid "Chinese (BIG5)" +msgstr "Chinesisch (BIG5)" + +#: ../midori/midori-browser.c:3392 ../midori/midori-websettings.c:201 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japanisch (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3395 ../midori/midori-websettings.c:202 +msgid "Russian (KOI8-R)" +msgstr "Russisch (KOI8-R)" + +#: ../midori/midori-browser.c:3398 ../midori/midori-websettings.c:203 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3401 ../midori/midori-websettings.c:204 +msgid "Western (ISO-8859-1)" +msgstr "Westlich (ISO-8859-1)" + +#: ../midori/midori-browser.c:3404 ../midori/midori-websettings.c:205 +#: ../midori/midori-websettings.c:277 +msgid "Custom..." +msgstr "Benutzerdefiniert…" + +#: ../midori/midori-browser.c:3407 ../midori/midori-view.c:1138 +msgid "View _Source" +msgstr "_Quelltext anzeigen" + +#: ../midori/midori-browser.c:3408 +msgid "View the source code of the page" +msgstr "Zeige den Quelltext der Seite an" + +#: ../midori/midori-browser.c:3410 +msgid "View Selection Source" +msgstr "Quelltext der Markierung anzeigen" + +#: ../midori/midori-browser.c:3411 +msgid "View the source code of the selection" +msgstr "Zeige den Quelltext der Markierung an" + +#: ../midori/midori-browser.c:3415 +msgid "Toggle fullscreen view" +msgstr "Vollbildmodus ein-/ ausschalten" + +#: ../midori/midori-browser.c:3417 +msgid "_Go" +msgstr "_Gehe zu" + +#: ../midori/midori-browser.c:3420 +msgid "Go back to the previous page" +msgstr "Gehe zur voherigen Seite zurück" + +#: ../midori/midori-browser.c:3423 +msgid "Go forward to the next page" +msgstr "Gehe weiter zur nächsten Seite" + +#: ../midori/midori-browser.c:3426 +msgid "Go to your homepage" +msgstr "Gehe zu Deiner Startseite" + +#: ../midori/midori-browser.c:3428 +msgid "Empty Trash" +msgstr "Papierkorb leeren" + +#: ../midori/midori-browser.c:3429 +msgid "Delete the contents of the trash" +msgstr "Inhalt des Papierkorbs löschen" + +#: ../midori/midori-browser.c:3431 ../midori/midori-view.c:1110 +msgid "Undo Close Tab" +msgstr "Reiter zurückholen" + +#: ../midori/midori-browser.c:3432 +msgid "Open the last closed tab" +msgstr "Zuletzt geschlossenen Reiter öffnen" + +#: ../midori/midori-browser.c:3436 ../panels/midori-bookmarks.c:232 +msgid "Add a new bookmark" +msgstr "Ein neues Lesezeichen hinzufügen" + +#: ../midori/midori-browser.c:3438 ../panels/midori-bookmarks.c:261 +msgid "Add a new folder" +msgstr "Einen neuen Ordner hinzufügen" + +#: ../midori/midori-browser.c:3439 +msgid "Add a new bookmark folder" +msgstr "Einen neuen Lesezeichenordner hinzufügen" + +#: ../midori/midori-browser.c:3440 +msgid "_Tools" +msgstr "_Extras" + +#: ../midori/midori-browser.c:3442 ../midori/midori-searchaction.c:493 +msgid "_Manage Search Engines" +msgstr "_Suchmaschinen verwalten" + +#: ../midori/midori-browser.c:3443 +msgid "Add, edit and remove search engines..." +msgstr "Suchmaschinen hinzufügen, bearbeiten und löschen…" + +#: ../midori/midori-browser.c:3446 +msgid "_Clear Private Data" +msgstr "_Private Daten löschen" + +#: ../midori/midori-browser.c:3447 +msgid "Clear private data..." +msgstr "Private Daten löschen..." + +#: ../midori/midori-browser.c:3451 +msgid "_Previous Tab" +msgstr "_Vorheriger Reiter" + +#: ../midori/midori-browser.c:3452 +msgid "Switch to the previous tab" +msgstr "Zum voherigen Reiter wechseln" + +#: ../midori/midori-browser.c:3454 +msgid "_Next Tab" +msgstr "_Nächster Reiter" + +#: ../midori/midori-browser.c:3455 +msgid "Switch to the next tab" +msgstr "Zum nächsten Reiter wechseln" + +#: ../midori/midori-browser.c:3457 +msgid "_Help" +msgstr "_Hilfe" + +#: ../midori/midori-browser.c:3459 +msgid "_Contents" +msgstr "_Inhalt" + +#: ../midori/midori-browser.c:3460 +msgid "Show the documentation" +msgstr "Zeige die Dokumentation" + +#: ../midori/midori-browser.c:3462 +msgid "_Frequent Questions" +msgstr "_Häufige Fragen" + +#: ../midori/midori-browser.c:3463 +msgid "Show the Frequently Asked Questions" +msgstr "Häufig gestellte Fragen anzeigen" + +#: ../midori/midori-browser.c:3465 +msgid "_Report a Bug" +msgstr "Fehler _berichten" + +#: ../midori/midori-browser.c:3466 +msgid "Open Midori's bug tracker" +msgstr "Midoris Fehlerverfolgung öffnen" + +#: ../midori/midori-browser.c:3469 +msgid "Show information about the program" +msgstr "Zeige Informationen über das Programm" + +#: ../midori/midori-browser.c:3476 +msgid "P_rivate Browsing" +msgstr "_Privat navigieren" + +#: ../midori/midori-browser.c:3477 +msgid "Don't save any private data while browsing" +msgstr "Keinerlei private Daten während des Navigierens speichern" + +#: ../midori/midori-browser.c:3482 +msgid "_Menubar" +msgstr "_Menüleiste" + +#: ../midori/midori-browser.c:3483 +msgid "Show menubar" +msgstr "Menüleiste anzeigen" + +#: ../midori/midori-browser.c:3486 +msgid "_Navigationbar" +msgstr "_Navigationsleiste" + +#: ../midori/midori-browser.c:3487 +msgid "Show navigationbar" +msgstr "Navigationsleiste anzeigen" + +#: ../midori/midori-browser.c:3490 +msgid "Side_panel" +msgstr "Seiten_leiste" + +#: ../midori/midori-browser.c:3491 +msgid "Show sidepanel" +msgstr "Seitenleiste anzeigen" + +#: ../midori/midori-browser.c:3494 +msgid "_Bookmarkbar" +msgstr "_Lesezeichenleiste" + +#: ../midori/midori-browser.c:3495 +msgid "Show bookmarkbar" +msgstr "Lesezeichenleiste anzeigen" + +#: ../midori/midori-browser.c:3498 +msgid "_Transferbar" +msgstr "_Übertragungsleiste" + +#: ../midori/midori-browser.c:3499 +msgid "Show transferbar" +msgstr "Übertragungsleiste anzeigen" + +#: ../midori/midori-browser.c:3502 +msgid "_Statusbar" +msgstr "_Statusleiste" + +#: ../midori/midori-browser.c:3503 +msgid "Show statusbar" +msgstr "Statusleiste anzeigen" + +#: ../midori/midori-browser.c:3937 +msgid "_Separator" +msgstr "_Trennlinie" + +#: ../midori/midori-browser.c:3944 +msgid "_Location..." +msgstr "_Ort…" + +#: ../midori/midori-browser.c:3946 +msgid "Open a particular location" +msgstr "Öffne einen bestimmten Ort" + +#: ../midori/midori-browser.c:3970 +msgid "_Web Search..." +msgstr "Im _Netz suchen…" + +#: ../midori/midori-browser.c:3972 +msgid "Run a web search" +msgstr "Starte eine Suche im Netz" + +#: ../midori/midori-browser.c:3993 +msgid "Reopen a previously closed tab or window" +msgstr "Reiter oder Fenster zurückholen" + +#: ../midori/midori-browser.c:4006 +msgid "_Recently visited pages" +msgstr "_Zuletzt besuchte Seiten" + +#: ../midori/midori-browser.c:4008 +msgid "Reopen pages that you visited earlier" +msgstr "Bereits besuchte Seiten erneut öffnen" + +#: ../midori/midori-browser.c:4021 ../midori/sokoke.c:781 +msgid "_Bookmarks" +msgstr "_Lesezeichen" + +#: ../midori/midori-browser.c:4023 +msgid "Show the saved bookmarks" +msgstr "Die gespeicherten Lesezeichen anzeigen" + +#: ../midori/midori-browser.c:4036 +msgid "_Window" +msgstr "_Fenster" + +#: ../midori/midori-browser.c:4038 +msgid "Show a list of all open tabs" +msgstr "Zeige eine Übersicht aller offenen Reiter" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4205 +msgid "_Inline Find:" +msgstr "_Inkrementelle Suche:" + +#: ../midori/midori-browser.c:4230 +msgid "Previous" +msgstr "Zurück" + +#: ../midori/midori-browser.c:4235 +msgid "Next" +msgstr "Weiter" + +#: ../midori/midori-browser.c:4240 +msgid "Match Case" +msgstr "Groß-/ Kleinschreibung" + +#: ../midori/midori-browser.c:4248 +msgid "Highlight Matches" +msgstr "Treffer hervorheben" + +#: ../midori/midori-browser.c:4258 +msgid "Close Findbar" +msgstr "Suchleiste schließen" + +#: ../midori/midori-browser.c:4598 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Unerwartete Einstellung »%s«" + +#: ../midori/midori-panel.c:309 +msgid "Detach chosen panel from the window" +msgstr "Gewählte Leiste vom Fenster ablösen" + +#: ../midori/midori-panel.c:311 +msgid "Whether to detach the chosen panel from the window" +msgstr "Die gewählte Seitenleiste vom Fenster ablösen" + +#: ../midori/midori-panel.c:321 ../midori/midori-websettings.c:531 +msgid "Align sidepanel on the right" +msgstr "Seitenleiste rechts anordnen" + +#: ../midori/midori-panel.c:323 ../midori/midori-websettings.c:532 +msgid "Whether to align the sidepanel on the right" +msgstr "Die Seitenleiste auf der rechten Seite anordnen" + +#: ../midori/midori-panel.c:333 ../midori/midori-panel.c:334 +msgid "Close panel" +msgstr "Leiste schließen" + +#: ../midori/midori-websettings.c:183 ../midori/midori-view.c:1949 +msgid "Blank page" +msgstr "Leere Seite" + +#: ../midori/midori-websettings.c:184 ../midori/midori-websettings.c:551 +msgid "Homepage" +msgstr "Startseite" + +#: ../midori/midori-websettings.c:185 +msgid "Last open pages" +msgstr "Zuletzt geöffnete Seiten" + +#: ../midori/midori-websettings.c:220 +msgid "New tab" +msgstr "Neuer Reiter" + +#: ../midori/midori-websettings.c:221 +msgid "New window" +msgstr "Neues Fenster" + +#: ../midori/midori-websettings.c:222 +msgid "Current tab" +msgstr "Aktueller Reiter" + +#: ../midori/midori-websettings.c:237 +msgid "Default" +msgstr "Standard" + +#: ../midori/midori-websettings.c:238 +msgid "Icons" +msgstr "Symbole" + +#: ../midori/midori-websettings.c:239 +msgid "Text" +msgstr "Text" + +#: ../midori/midori-websettings.c:240 +msgid "Both" +msgstr "Beides" + +#: ../midori/midori-websettings.c:241 +msgid "Both horizontal" +msgstr "Beides horizontal" + +#: ../midori/midori-websettings.c:256 +msgid "All cookies" +msgstr "Alle Profildateien" + +#: ../midori/midori-websettings.c:257 +msgid "Session cookies" +msgstr "Sitzungsprofile" + +#: ../midori/midori-websettings.c:258 ../panels/midori-addons.c:94 +msgid "None" +msgstr "Keine" + +#: ../midori/midori-websettings.c:274 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:275 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:276 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:329 +msgid "Remember last window size" +msgstr "Letzte Fenstergröße merken" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to save the last window size" +msgstr "Die letzte Fenstergröße speichern oder nicht" + +#: ../midori/midori-websettings.c:338 +msgid "Last window width" +msgstr "Letzte Fensterbreite" + +#: ../midori/midori-websettings.c:339 +msgid "The last saved window width" +msgstr "Die zuletzt gespeicherte Fensterbreite" + +#: ../midori/midori-websettings.c:347 +msgid "Last window height" +msgstr "Letzte Fensterhöhe" + +#: ../midori/midori-websettings.c:348 +msgid "The last saved window height" +msgstr "Die zuletzt gespeicherte Fensterhöhe" + +#: ../midori/midori-websettings.c:373 +msgid "Last panel position" +msgstr "Letzte Leistenposition" + +#: ../midori/midori-websettings.c:374 +msgid "The last saved panel position" +msgstr "Die zuletzt gespeicherte Leistenposition" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:383 +msgid "Last panel page" +msgstr "Letzte Leistenseite" + +#: ../midori/midori-websettings.c:384 +msgid "The last saved panel page" +msgstr "Die zuletzt gespeicherte Leistenseite" + +#: ../midori/midori-websettings.c:392 +msgid "Last Web search" +msgstr "Letzte Suche im Netz" + +#: ../midori/midori-websettings.c:393 +msgid "The last saved Web search" +msgstr "Die zuletzt gespeicherte Suche im Netz" + +#: ../midori/midori-websettings.c:402 +msgid "Show Menubar" +msgstr "Menüleiste anzeigen" + +#: ../midori/midori-websettings.c:403 +msgid "Whether to show the menubar" +msgstr "Die Menüleiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:411 +msgid "Show Navigationbar" +msgstr "Navigationsleiste anzeigen" + +#: ../midori/midori-websettings.c:412 +msgid "Whether to show the navigationbar" +msgstr "Die Navigationsleiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:420 +msgid "Show Bookmarkbar" +msgstr "Lesezeichenleiste anzeigen" + +#: ../midori/midori-websettings.c:421 +msgid "Whether to show the bookmarkbar" +msgstr "Die Lesezeichenleiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:429 +msgid "Show Panel" +msgstr "Leiste anzeigen" + +#: ../midori/midori-websettings.c:430 +msgid "Whether to show the panel" +msgstr "Die Leiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:445 +msgid "Show Transferbar" +msgstr "Übertragungsleiste anzeigen" + +#: ../midori/midori-websettings.c:446 +msgid "Whether to show the transferbar" +msgstr "Die Übertragungsleiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:454 +msgid "Show Statusbar" +msgstr "Statusleiste anzeigen" + +#: ../midori/midori-websettings.c:455 +msgid "Whether to show the statusbar" +msgstr "Die Statusleiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:464 +msgid "Toolbar Style" +msgstr "Werkzeugleistenstil" + +#: ../midori/midori-websettings.c:465 +msgid "The style of the toolbar" +msgstr "Der Stil der Werkzeugleiste" + +#: ../midori/midori-websettings.c:481 +msgid "Show progress in location entry" +msgstr "Fortschritt im Adressfeld anzeigen" + +#: ../midori/midori-websettings.c:482 +msgid "Whether to show loading progress in the location entry" +msgstr "Aktuellen Ladefortschritt im Adressfeld anzeigen" + +#: ../midori/midori-websettings.c:497 +msgid "Search engines in location completion" +msgstr "Suchmaschinen in Vervollständigung" + +#: ../midori/midori-websettings.c:498 +msgid "Whether to show search engines in the location completion" +msgstr "Verfügbare Suchmaschinen in der Adressvervollständigung anzeigen" + +#: ../midori/midori-websettings.c:506 +msgid "Toolbar Items" +msgstr "Werkzeugleistenelemente" + +#: ../midori/midori-websettings.c:507 +msgid "The items to show on the toolbar" +msgstr "Die in der Werkzeugleiste anzuzeigenden Elemente" + +#: ../midori/midori-websettings.c:515 +msgid "Compact Sidepanel" +msgstr "Kompakte Seitenleiste" + +#: ../midori/midori-websettings.c:516 +msgid "Whether to make the sidepanel compact" +msgstr "Die Seitenleiste anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:541 +msgid "Load on Startup" +msgstr "Beim Programmstart öffnen" + +#: ../midori/midori-websettings.c:542 +msgid "What to load on startup" +msgstr "Was beim Programmstart geöffnet werden soll" + +#: ../midori/midori-websettings.c:552 +msgid "The homepage" +msgstr "Die Startseite" + +#: ../midori/midori-websettings.c:567 +msgid "Show crash dialog" +msgstr "Absturzdialog anzeigen" + +#: ../midori/midori-websettings.c:568 +msgid "Show a dialog after Midori crashed" +msgstr "Absturzdialog anzeigen nachdem Midori abgestürzt ist" + +#: ../midori/midori-websettings.c:576 +msgid "Download Folder" +msgstr "Dateispeicherordner" + +#: ../midori/midori-websettings.c:577 +msgid "The folder downloaded files are saved to" +msgstr "Der Ordner, in dem heruntergeladene Dateien gespeichert werden" + +#: ../midori/midori-websettings.c:589 +msgid "Download Manager" +msgstr "Übertragungsmanager" + +#: ../midori/midori-websettings.c:590 +msgid "An external download manager" +msgstr "Ein externer Übertragungsmanager" + +#: ../midori/midori-websettings.c:598 +msgid "Text Editor" +msgstr "Texteditor" + +#: ../midori/midori-websettings.c:599 +msgid "An external text editor" +msgstr "Ein externer Texteditor" + +#: ../midori/midori-websettings.c:614 +msgid "News Aggregator" +msgstr "Nachrichtenaggregator" + +#: ../midori/midori-websettings.c:615 +msgid "An external news aggregator" +msgstr "Ein externer Nachrichtenaggregator" + +#: ../midori/midori-websettings.c:623 +msgid "Location entry Search" +msgstr "Adressfeldsuche" + +#: ../midori/midori-websettings.c:624 +msgid "The search to perform inside the location entry" +msgstr "Die Suche, die über das Adressfeld ausgeführt wird" + +#: ../midori/midori-websettings.c:632 +msgid "Preferred Encoding" +msgstr "Bevorzugter Zeichensatz" + +#: ../midori/midori-websettings.c:633 +msgid "The preferred character encoding" +msgstr "Der bevorzugte Zeichensatz" + +#: ../midori/midori-websettings.c:643 +msgid "Always Show Tabbar" +msgstr "Reiterleiste immer anzeigen" + +#: ../midori/midori-websettings.c:644 +msgid "Always show the tabbar" +msgstr "Die Reiterleiste immer anzeigen" + +#: ../midori/midori-websettings.c:652 +msgid "Close Buttons on Tabs" +msgstr "Schließenschaltflächen auf Reitern" + +#: ../midori/midori-websettings.c:653 +msgid "Whether tabs have close buttons" +msgstr "Schließenschaltflächen auf Reitern anzeigen oder verbergen" + +#: ../midori/midori-websettings.c:661 +msgid "Open new pages in" +msgstr "Öffne neue Seiten in" + +#: ../midori/midori-websettings.c:662 +msgid "Where to open new pages" +msgstr "Wo neue Seiten geöffnet werden sollen" + +#: ../midori/midori-websettings.c:671 +msgid "Open external pages in" +msgstr "Öffne Seiten von außerhalb in" + +#: ../midori/midori-websettings.c:672 +msgid "Where to open externally opened pages" +msgstr "Wo Seiten von außerhalb geöffnet werden sollen" + +#: ../midori/midori-websettings.c:685 +msgid "Middle click opens Selection" +msgstr "Mittelklick öffnet Markierung" + +#: ../midori/midori-websettings.c:686 +msgid "Load an address from the selection via middle click" +msgstr "Lade eine markierte Adresse mit der mittleren Maustaste" + +#: ../midori/midori-websettings.c:694 +msgid "Open tabs in the background" +msgstr "Reiter im Hintergrund öffnen" + +#: ../midori/midori-websettings.c:695 +msgid "Whether to open new tabs in the background" +msgstr "Neue Reiter im Hintergrund öffnen" + +#: ../midori/midori-websettings.c:703 +msgid "Open Tabs next to Current" +msgstr "Reiter neben aktuellem öffnen" + +#: ../midori/midori-websettings.c:704 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Neue Reiter neben dem aktuellen Reiter oder nach dem letzten öffnen" + +#: ../midori/midori-websettings.c:712 +msgid "Open popups in tabs" +msgstr "Aufklappfenster in Reitern öffnen" + +#: ../midori/midori-websettings.c:713 +msgid "Whether to open popup windows in tabs" +msgstr "Aufklappfenster in neuen Reitern öffnen" + +#: ../midori/midori-websettings.c:729 +msgid "Zoom Text and Images" +msgstr "Text und Bilder vergrößern" + +#: ../midori/midori-websettings.c:730 +msgid "Whether to zoom text and images" +msgstr "Ob Text und Bilder gleichermaßen vergrößert werden sollen" + +#: ../midori/midori-websettings.c:745 +msgid "Find inline while typing" +msgstr "Inkrementelle Suche beim Eintippen" + +#: ../midori/midori-websettings.c:746 +msgid "Whether to automatically find inline while typing" +msgstr "Ob die inkrementelle Suche automatisch beim Eintippen starten soll" + +#: ../midori/midori-websettings.c:754 +msgid "Accept cookies" +msgstr "Cookies annehmen" + +#: ../midori/midori-websettings.c:755 +msgid "What type of cookies to accept" +msgstr "Welche Art von Profildateien (Cookies) angenommen werden" + +#: ../midori/midori-websettings.c:764 +msgid "Original cookies only" +msgstr "Nur ursprüngliche Profildateien" + +#: ../midori/midori-websettings.c:765 +msgid "Accept cookies from the original website only" +msgstr "Nur Profildateien von der ursprünglichen Seite annehmen" + +#: ../midori/midori-websettings.c:773 +msgid "Maximum cookie age" +msgstr "Maximales Alter von Cookiedaten" + +#: ../midori/midori-websettings.c:774 +msgid "The maximum number of days to save cookies for" +msgstr "Die maximale Anzahl an Tagen, für die Profildateien gespeichert werden" + +#: ../midori/midori-websettings.c:784 +msgid "Remember last visited pages" +msgstr "Zuletzt besuchte Seiten merken" + +#: ../midori/midori-websettings.c:785 +msgid "Whether the last visited pages are saved" +msgstr "Die zuletzt besuchten Seiten speichern" + +#: ../midori/midori-websettings.c:793 +msgid "Maximum history age" +msgstr "Maximales Verlaufsalter" + +#: ../midori/midori-websettings.c:794 +msgid "The maximum number of days to save the history for" +msgstr "Die maximale Anzahl an Tagen, für die der Verlauf gepseichert wird" + +#: ../midori/midori-websettings.c:802 +msgid "Remember last form inputs" +msgstr "Zuletzt eingegebene Formulareingaben merken" + +#: ../midori/midori-websettings.c:803 +msgid "Whether the last form inputs are saved" +msgstr "Die letzten Formulareingaben speichern" + +#: ../midori/midori-websettings.c:811 +msgid "Remember last downloaded files" +msgstr "Zuletzt heruntergeladene Dateien merken" + +#: ../midori/midori-websettings.c:812 +msgid "Whether the last downloaded files are saved" +msgstr "Die zuletzt heruntegeladenen Dateien speichern" + +#: ../midori/midori-websettings.c:822 +msgid "Proxy Server" +msgstr "Zwischenrechner (Proxy)" + +#: ../midori/midori-websettings.c:823 +msgid "The proxy server used for HTTP connections" +msgstr "Der Zwischenrechner für HTTP-Verbindungen" + +#: ../midori/midori-websettings.c:838 +msgid "Detect proxy server automatically" +msgstr "Proxyrechner automatisch erkennen" + +#: ../midori/midori-websettings.c:839 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "Zwischenrechner automatisch über die Umgebung erkennen" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:855 +msgid "Identify as" +msgstr "Ausgeben als" + +#: ../midori/midori-websettings.c:856 +msgid "What to identify as to web pages" +msgstr "Wie gegenüber Seiten im Internet identifiziert werden soll" + +#: ../midori/midori-websettings.c:872 +msgid "Identification string" +msgstr "Identifikationskennung" + +#: ../midori/midori-websettings.c:873 +msgid "The application identification string" +msgstr "Die Identifikationskennung der Anwedung" + +#: ../midori/midori-websettings.c:881 +msgid "Cache size" +msgstr "Zwischenspeichergröße" + +#: ../midori/midori-websettings.c:882 +msgid "The allowed size of the cache" +msgstr "Die erlaubte Zwischenspeichergröße" + +#. i18n: The title of the 404 - Not found error page +#. Error pages are special, we want to try loading the destination +#. again, not the error page which isn't even a proper page +#: ../midori/midori-view.c:637 ../midori/midori-view.c:2473 +#, c-format +msgid "Not found - %s" +msgstr "Nicht gefunden - %s" + +#: ../midori/midori-view.c:976 +msgid "Open _Link" +msgstr "Verweis ö_ffnen" + +#: ../midori/midori-view.c:978 +msgid "Open Link in New _Tab" +msgstr "Verweis in neuem _Reiter öffnen" + +#: ../midori/midori-view.c:995 +msgid "Open Link in New _Window" +msgstr "Verweis in neuem _Fenster öffnen" + +#: ../midori/midori-view.c:1004 +msgid "_Download Link destination" +msgstr "Verweisziel herunter_laden" + +#: ../midori/midori-view.c:1010 +msgid "_Save Link destination" +msgstr "Verweisziel _speichern" + +#: ../midori/midori-view.c:1019 +msgid "Download with Download _Manager" +msgstr "Mit Übertragungs_manager herunterladen" + +#: ../midori/midori-view.c:1048 +msgid "Search _with" +msgstr "Suchen _mit" + +#: ../midori/midori-view.c:1076 +msgid "_Search the Web" +msgstr "Im Netz _suchen" + +#: ../midori/midori-view.c:1086 +msgid "Open Address in New _Tab" +msgstr "Adresse in neuem _Reiter öffnen" + +#: ../midori/midori-view.c:1234 +msgid "Open or download file" +msgstr "Datei öffnen oder herunterladen" + +#: ../midori/midori-view.c:1251 +#, c-format +msgid "File Type: '%s'" +msgstr "Dateityp: «%s»" + +#: ../midori/midori-view.c:1254 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "Dateityp: %s («%s»)" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1258 +#, c-format +msgid "Open %s" +msgstr "%s öffnen" + +#: ../midori/midori-view.c:1661 +#, c-format +msgid "Inspect page - %s" +msgstr "Seite untersuchen - %s" + +#: ../midori/midori-view.c:1806 +#, c-format +msgid "Document cannot be displayed" +msgstr "Dokument kann nicht angezeigt werden" + +#: ../midori/midori-view.c:1822 +#, c-format +msgid "No documentation installed" +msgstr "Keine Dokumentation installiert" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Einstellungen für %s" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "Allgemein" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "Programmstart" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "Aktuelle Seite als Startseite benutzen" + +#: ../midori/midori-preferences.c:423 ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "Übertragungen" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:475 +msgid "Appearance" +msgstr "Erscheinungsbild" + +#: ../midori/midori-preferences.c:476 +msgid "Font settings" +msgstr "Schrifteinstellungen" + +#: ../midori/midori-preferences.c:478 +msgid "Default Font Family" +msgstr "Standardschriftart" + +#: ../midori/midori-preferences.c:484 +msgid "The default font size used to display text" +msgstr "Die Standardschriftgröße, in der Text angezeigt wird" + +#: ../midori/midori-preferences.c:487 +msgid "Minimum Font Size" +msgstr "Mindestschriftgröße" + +#: ../midori/midori-preferences.c:490 +msgid "The minimum font size used to display text" +msgstr "Die Mindestschriftgröße, in der Text angezeigt wird" + +#: ../midori/midori-preferences.c:497 +msgid "Encoding" +msgstr "Zeichensatz" + +#: ../midori/midori-preferences.c:500 +msgid "The character encoding to use by default" +msgstr "Der voreingestellte Zeichensatz" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:507 +msgid "Behavior" +msgstr "Verhalten" + +#: ../midori/midori-preferences.c:508 +msgid "Features" +msgstr "Inhalte" + +#: ../midori/midori-preferences.c:511 ../extensions/statusbar-features.c:54 +msgid "Load images automatically" +msgstr "Bilder automatisch laden" + +#: ../midori/midori-preferences.c:512 +msgid "Load and display images automatically" +msgstr "Bilder automatisch laden und anzeigen" + +#: ../midori/midori-preferences.c:515 +msgid "Shrink images automatically" +msgstr "Bilder automatisch verkleinern" + +#: ../midori/midori-preferences.c:516 +msgid "Automatically shrink standalone images to fit" +msgstr "Einzelne Bilder automatisch angemessen verkleinern" + +#: ../midori/midori-preferences.c:519 +msgid "Print background images" +msgstr "Hintergrundbilder drucken" + +#: ../midori/midori-preferences.c:520 +msgid "Whether background images should be printed" +msgstr "Sollen Hintergrundbilder gedruckt werden oder nicht" + +#: ../midori/midori-preferences.c:523 +msgid "Resizable text areas" +msgstr "Vergrößerbare Textfelder" + +#: ../midori/midori-preferences.c:524 +msgid "Whether text areas are resizable" +msgstr "Sollen Textfelder vergrößerbar sein oder nicht" + +#: ../midori/midori-preferences.c:527 ../extensions/statusbar-features.c:63 +msgid "Enable scripts" +msgstr "Skripte einschalten" + +#: ../midori/midori-preferences.c:528 +msgid "Enable embedded scripting languages" +msgstr "Eingebettete Skriptsprachen einschalten" + +#: ../midori/midori-preferences.c:531 ../extensions/statusbar-features.c:72 +msgid "Enable plugins" +msgstr "Zusatzmodule einschalten" + +#: ../midori/midori-preferences.c:532 +msgid "Enable embedded plugin objects" +msgstr "Eingebettete Zusatzmodule einschalten" + +#: ../midori/midori-preferences.c:535 +msgid "Enforce 96 dots per inch" +msgstr "Erzwinge 96 Punkte pro Zoll" + +#: ../midori/midori-preferences.c:536 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Erzwinge eine Punktdichte von 96 DPI" + +#: ../midori/midori-preferences.c:539 +msgid "Enable developer tools" +msgstr "Entwicklerwerkzeuge einschalten" + +#: ../midori/midori-preferences.c:540 +msgid "Enable special extensions for developers" +msgstr "Besondere Erweiterungen für Entwickler einschalten" + +#. Page "Interface" +#: ../midori/midori-preferences.c:548 +msgid "Interface" +msgstr "Oberfläche" + +#: ../midori/midori-preferences.c:549 +msgid "Navigationbar" +msgstr "Navigationsleiste" + +#: ../midori/midori-preferences.c:560 +msgid "Browsing" +msgstr "Navigation" + +#. Page "Network" +#: ../midori/midori-preferences.c:590 ../midori/midori-preferences.c:591 +msgid "Network" +msgstr "Netzwerk" + +#: ../midori/midori-preferences.c:618 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:623 +msgid "Privacy" +msgstr "Privatssphäre" + +#: ../midori/midori-preferences.c:624 +msgid "Web Cookies" +msgstr "Benutzerprofile" + +#: ../midori/midori-preferences.c:637 ../midori/midori-preferences.c:647 +msgid "days" +msgstr "Tage" + +#: ../midori/midori-searchaction.c:484 ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "Leer" + +#: ../midori/midori-searchaction.c:904 +msgid "Add search engine" +msgstr "Suchmaschine hinzufügen" + +#: ../midori/midori-searchaction.c:904 +msgid "Edit search engine" +msgstr "Suchmaschine bearbeiten" + +#: ../midori/midori-searchaction.c:932 +msgid "_Name:" +msgstr "_Name:" + +#: ../midori/midori-searchaction.c:976 +msgid "_Icon:" +msgstr "_Symbol:" + +#: ../midori/midori-searchaction.c:990 +msgid "_Token:" +msgstr "_Kürzel:" + +#: ../midori/midori-searchaction.c:1195 +msgid "Manage Search Engines" +msgstr "Suchmaschinen verwalten" + +#: ../midori/midori-searchaction.c:1292 +msgid "Use as _default" +msgstr "Als _Standard" + +#: ../midori/sokoke.c:117 ../midori/sokoke.c:129 +msgid "Could not run external program." +msgstr "Konnte externes Programm nicht ausführen." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:448 +msgid "Warning: You are using a superuser account!" +msgstr "Warnung: Sie benutzen ein Administratorkonto!" + +#: ../midori/sokoke.c:780 +msgid "_Bookmark" +msgstr "_Lesezeichen" + +#: ../midori/sokoke.c:782 +msgid "_Add Bookmark" +msgstr "Lesezeichen _hinzufügen" + +#: ../midori/sokoke.c:783 +msgid "_Console" +msgstr "_Konsole" + +#: ../midori/sokoke.c:784 +msgid "_Extensions" +msgstr "_Erweiterungen" + +#: ../midori/sokoke.c:785 +msgid "_History" +msgstr "_Verlauf" + +#: ../midori/sokoke.c:786 +msgid "_Homepage" +msgstr "_Startseite" + +#: ../midori/sokoke.c:787 +msgid "_Userscripts" +msgstr "_Benutzerskripte" + +#: ../midori/sokoke.c:788 +msgid "User_styles" +msgstr "Benutzer_stile" + +#: ../midori/sokoke.c:789 +msgid "New _Tab" +msgstr "Neuer _Reiter" + +#: ../midori/sokoke.c:790 +msgid "_Transfers" +msgstr "Über_tragungen" + +#: ../midori/sokoke.c:791 +msgid "P_lugins" +msgstr "Zusatz_module" + +#: ../midori/sokoke.c:792 +msgid "_Closed Tabs and Windows" +msgstr "_Geschlossene Reiter und Fenster" + +#: ../midori/sokoke.c:793 +msgid "New _Window" +msgstr "Neues _Fenster" + +#: ../panels/midori-addons.c:95 ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "Benutzerskripte" + +#: ../panels/midori-addons.c:96 ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "Benutzerstile" + +#: ../panels/midori-addons.c:927 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Einschalten" + +#: ../panels/midori-addons.c:928 ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "_Einschalten" + +#: ../panels/midori-addons.c:937 ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "_Auschalten" + +#: ../panels/midori-addons.c:938 ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "_Auschalten" + +#: ../panels/midori-bookmarks.c:107 +msgid "Bookmarks" +msgstr "Lesezeichen" + +#: ../panels/midori-bookmarks.c:240 +msgid "Edit the selected bookmark" +msgstr "Markiertes Lesezeichen bearbeiten" + +#: ../panels/midori-bookmarks.c:248 +msgid "Delete the selected bookmark" +msgstr "Markiertes Lesezeichen löschen" + +#: ../panels/midori-bookmarks.c:593 +msgid "Separator" +msgstr "Trennlinie" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsole" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Erweiterungen" + +#: ../panels/midori-history.c:163 +msgid "Are you sure you want to remove all history items?" +msgstr "Sind Sie sicher, dass alle Verlaufseinträge entfernt werden sollen?" + +#: ../panels/midori-history.c:218 +msgid "Bookmark the selected history item" +msgstr "Lesezeichen für ausgewählten Verlaufseintrag hinzufügen" + +#: ../panels/midori-history.c:227 +msgid "Delete the selected history item" +msgstr "Ausgewählten Verlaufseintrag löschen" + +#: ../panels/midori-history.c:235 +msgid "Clear the entire history" +msgstr "Den gesamten Verlauf löschen" + +#: ../panels/midori-history.c:600 +#, c-format +msgid "A week ago" +msgstr "Vor einer Woche" + +#: ../panels/midori-history.c:606 +#, c-format +msgid "%d days ago" +msgstr "vor %d Tagen" + +#: ../panels/midori-history.c:613 +msgid "Today" +msgstr "Heute" + +#: ../panels/midori-history.c:615 +msgid "Yesterday" +msgstr "Gestern" + +#: ../panels/midori-plugins.c:87 +msgid "Plugins" +msgstr "Zusatzmodule" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "%s von %s" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "Authentifizierung erforderlich" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Ein Benutzername und ein Kennwort\n" +"werden zum Öffnen dieses Ortes benötigt:" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "Benutzername" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "Kennwort" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Das benannte Symbol »%s« konnte nicht geladen werden" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Das Bestandssymbol »%s« konnte nicht geladen werden" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Animationsbilder sind fehlerhaft" + +#: ../katze/katze-utils.c:183 ../katze/katze-utils.c:395 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Eigenschaft »%s« ist ungültig für %s" + +#: ../katze/katze-utils.c:215 ../katze/katze-utils.c:254 +msgid "Choose file" +msgstr "Datei wählen" + +#: ../katze/katze-utils.c:235 +msgid "Choose folder" +msgstr "Dateispeicherordner auswählen" + +#: ../extensions/colorful-tabs.c:104 +msgid "Tint tabs distinctly" +msgstr "Reiter unterschiedlich einfärben" + +#: ../extensions/colorful-tabs.c:140 +msgid "Colorful Tabs" +msgstr "Farbige Reiter" + +#: ../extensions/colorful-tabs.c:141 +msgid "Tint each tab distinctly" +msgstr "Alle Reiter unterschiedlich einfärben" + +#: ../extensions/cookie-manager.c:201 +msgid "At the end of the session" +msgstr "Am Ende der Sitzung" + +#: ../extensions/cookie-manager.c:204 +#, c-format +msgid "" +"Host: %s\n" +"Name: %s\n" +"Value: %s\n" +"Path: %s\n" +"Secure: %s\n" +"Expires: %s" +msgstr "" +"Domäne: %s\n" +"Name: %s\n" +"Wert: %s\n" +"Pfad: %s\n" +"Sicher: %s\n" +"Verfällt: %s" + +#: ../extensions/cookie-manager.c:210 +msgid "Yes" +msgstr "Ja" + +#: ../extensions/cookie-manager.c:210 +msgid "No" +msgstr "Nein" + +#: ../extensions/cookie-manager.c:491 +msgid "Do you really want to delete all cookies?" +msgstr "Sind Sie sicher, dass alle Profildateien entfernt werden sollen?" + +#: ../extensions/cookie-manager.c:493 +msgid "Question" +msgstr "Frage" + +#: ../extensions/cookie-manager.c:501 +msgid "" +"Only the visible cookies are deleted which match the entered filter string." +msgstr "" +"Nur die sichtbaren Profildateien, die auf den eigegebenen Filter passen, " +"werden gelöscht." + +#: ../extensions/cookie-manager.c:679 +msgid "Name" +msgstr "Name" + +#: ../extensions/cookie-manager.c:739 +msgid "_Expand All" +msgstr "Alle _ausklappen" + +#: ../extensions/cookie-manager.c:747 +msgid "_Collapse All" +msgstr "Alle _einklappen" + +#: ../extensions/cookie-manager.c:818 +msgid "Delete All" +msgstr "Alle löschen" + +#: ../extensions/cookie-manager.c:820 +msgid "" +"Deletes all shown cookies. If a filter is set, only those cookies are " +"deleted which match the filter." +msgstr "" +"Sichtbare Profildateien löschen. Wenn ein Filter gesetzt ist werden nur jene " +"Einträge gelöscht, die auf den Filter passen" + +#: ../extensions/cookie-manager.c:835 +msgid "Expand All" +msgstr "Alle ausklappen" + +#: ../extensions/cookie-manager.c:842 +msgid "Collapse All" +msgstr "Alle einklappen" + +#: ../extensions/cookie-manager.c:873 +msgid "Filter:" +msgstr "Filter:" + +#: ../extensions/cookie-manager.c:878 +msgid "" +"Enter a filter string to show only cookies whose name or domain field match " +"the entered filter" +msgstr "" +"Gib einen Filter ein, um nur Profildateien anzuzeigen, deren Name oder " +"Domöne auf den eingegebenen Filter passt." + +#: ../extensions/cookie-manager.c:913 ../extensions/cookie-manager.c:961 +msgid "Cookie Manager" +msgstr "Cookieverwaltung" + +#: ../extensions/cookie-manager.c:945 +msgid "_Cookie Manager" +msgstr "_Cookieverwaltung" + +#: ../extensions/cookie-manager.c:962 +msgid "List, view and delete cookies" +msgstr "Profildateien auflisten, anzeigen und löschen" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "Mausgesten" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "Steuere Midori durch Bewegen der Maus" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:129 ../extensions/page-holder.c:177 +msgid "Pageholder" +msgstr "Seitenhalter" + +#: ../extensions/page-holder.c:161 +msgid "_Pageholder" +msgstr "_Seitenhalter" + +#~ msgid "Images" +#~ msgstr "Bilder" + +#~ msgid "Scripts" +#~ msgstr "Skripte" + +#~ msgid "%s has no property '%s'" +#~ msgstr "%s hat keine Eigenschaft »%s«" + +#~ msgid "%s cannot be assigned to %s.%s" +#~ msgstr "%s kann %s.%s nicht zugewiesen werden" + +#~ msgid "%s.%s cannot be accessed" +#~ msgstr "Auf %s.%s kann nicht zugegriffen werden" + +#~ msgid "Source" +#~ msgstr "Quelltext" diff --git a/po/el.po b/po/el.po new file mode 100644 index 00000000..16c51151 --- /dev/null +++ b/po/el.po @@ -0,0 +1,1358 @@ +# Greek translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Evaggelos Balaskas 2008 +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:50+0100\n" +"PO-Revision-Date: 2008-12-06 09:57+0200\n" +"Last-Translator: Evaggelos Balaskas \n" +"Language-Team: Greek \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Ελαφρύς περιηγητής ιστού" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Μιντόρι" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Περιηγητής Ιστού" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Σελιδοδείκτης" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Σελιδοδείκτες" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Προσθήκη σελιδοδείκτη" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Τερματικό" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Επεκτάσεις" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Ιστορικό" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Αρχική σελίδα" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Σενάρια χρήστη" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "_Θέματα χρήστη" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Νέα _καρτέλα" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Μεταφορές" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Κλείσιμο των καρτέλων και των παραθύρων" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Νέο _παράθυρο" + +#: ../midori/main.c:143 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Οι ρυθμίσεις δεν μπορούν να φορτωθούν: %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Η τιμή '%s' δεν είναι έγκυρη για το %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Μη έγκυρη τιμή ρύθμισης '%s'" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Το αρχείο δεν βρέθηκε." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Κακοσχηματισμένο έγγραφο." + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Αποτυχία κατά το άνοιγμα της βάσης: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Αποτυχία στην διαγραφή του αντικειμένου από το ιστορικό: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Αποτυχία στον καθαρισμό του ιστορικού: %s\n" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Αποτυχία στην προσθήκη ενός αντικειμένου στο ιστορικό: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Αποτυχία στην διαγραφή των παλιών αντικειμένων από το ιστορικό: %s\n" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Αποτυχία εγγραφής." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Μεταφορές" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Η συνεδρία δεν μπορεί να αποθηκευτεί. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "Τρέξε το συγκεκριμένο όνομα αρχείου ως javascript" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Προβολή έκδοσης προγράμματος" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "URIs" + +#: ../midori/main.c:1335 +msgid "[URIs]" +msgstr "[URIs]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Παρακαλώ αναφέρατε σχόλια, προτάσεις και σφάλματα στο:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Έλεγχος για νέα έκδοση στο:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "Δεν ορίστηκε όνομα αρχείου" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Όλα τα στιγμιότυπα του Μιντόρι τρέχουν ήδη αλλά δεν ανταποκρίνονται.\n" + +#: ../midori/main.c:1447 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Οι σελιδοδείκτες δεν μπορούν να φορτωθούν: %s\n" + +#: ../midori/main.c:1463 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Η συνεδρία δεν μπορεί να φορτωθεί: %s\n" + +#: ../midori/main.c:1477 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Τα απορρίματα δεν μπορούν να φορτωθούν: %s\n" + +#: ../midori/main.c:1491 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Το ιστορικό δεν μπορεί να φορτωθεί: %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Δημιουργήθηκαν τα ακόλουθα σφάλματα:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "Α_γνόησε" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Οι μηχανές αναζήτησης δεν μπορούν να αποθηκευτούν. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Οι σελιδοδείκτες δεν μπορούν να αποθηκευτούν. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Τα απορρίματα δεν μπορούν να αποθηκευτούν. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Οι ρυθμίσεις δεν μπορούν να αποθηκευτούν. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Ανανέωση της τρέχουσας σελίδας" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Σταμάτημα φόρτωσης της τρέχουσας σελίδας" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% φορτώθηκε" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Αναπάντεχη ενέργεια '%s'." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Νέος σελιδοδείκτης" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Επεξεργασία σελιδοδείκτη" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Τίτλος:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Περιγραφή:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_Διεύθυνση:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Φάκελος:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Ρίζα" + +#: ../midori/midori-browser.c:668 +msgid "Save file as" +msgstr "Αποθήκευση αρχείου ως" + +#: ../midori/midori-browser.c:1248 +msgid "Open file" +msgstr "Άνοιγμα αρχείου" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Άνοιγμα σε νέα_καρτέλα" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Άνοιγμα σε νέο _παραθύρο" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Διαχωριστικό" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "Μια βδομάδα πριν" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "%d μέρες πριν" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "Σήμερα" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "Χτές" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Ένας ελαφρύς περιηγητής ιστού" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Ευάγγελος Μπαλάσκας 2008" + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "" +"Είστε σίγουροι ότι θέλετε να διαγράψετε όλα τα αντικείμενα του ιστορικού;" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Αρχείο" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Άνοιγμα ενός νέου παραθύρου" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Άνοιγμα μίας νέας καρτέλας" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Άνοιγμα αρχείου" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Αποθήκευση σε αρχείου" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Κλείσιμο καρτέλας" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Κλείσιμο της τρέχουσας καρτέλας" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "Κ_λείσιμο παραθύρου" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Κλείσιμο αυτού του παραθύρου" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Εκτύπωση της τρέχουσας σελίδας" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Έξοδος από την εφαρμογή" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Επεξεργασία" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Αποκοπή επιλεγμένου κειμένου" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Αντιγραφή επιλεγμένου κειμένου" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Επικόλληση κειμένου από το πρόχειρο" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Διαγραφή του επιλεγμένου κειμένου" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Επιλογή όλου του κειμένου" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Αναζήτηση μίας λέξης ή φράσης στην σελίδα" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Εύρεση επ_όμενο" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Εύρεση της επόμενης ύπαρξης της λέξης ή της φράσης" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Εύρεση _προηγούμενο" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Εύρεση της προηγούμενης ύπαρξης της λέξης ή της φράσης" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Έξοδος αναζήτησης" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Γρήγορα μεταπήδησε στον λέξη ή στην φράση" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Παραμετροποίηση των ρυθμίσεων της εφαρμογής" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Εμφάνιση" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Εργαλειοθήκες" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Αύξηση του επίπεδου εστίασης" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Μείωση του επιπέδου εστίασης" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Επαναφορά του επιπέδου εστίασης" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Προβολή _κώδικα" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Προβολή του πηγαίου κώδικα αυτής της σελίδας" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Προβολή του επιλεγμένου κώδικα" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Προβολή του πηγαίου κώδικα του επιλεγμένου" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Εναλλαγή σε πλήρη οθόνη" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Μετάβαση" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Μετάβαση στην προηγούμενη σελίδα" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Μετάβαση στην επόμενη σελίδα" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Μετάβαση στην αρχική σελίδα" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Άδειασμα αποριμμάτων" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Διαγραφή των περιεχομένων των απορριμάτων" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Αναίρεση κλείσιμο καρτέλας" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Άνοιγμα της τελευταίας καρτέλας που έκλεισε" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Προσθήκη ενός νέου σελιδοδείκτη" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Επεξεργασία του επιλεγμένου σελιδοδείκτη" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Διαγραφή του επιλεγμένου σελιδοδείκτη" + +#: ../midori/midori-browser.c:3185 +msgid "Delete the selected history item" +msgstr "Διαγραφή του επιλεγμένου αντικειμένου από το ιστορικό" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "Καθαρισμός ολόκληρου του ιστορικού" + +#: ../midori/midori-browser.c:3191 +msgid "Bookmark the selected history item" +msgstr "Σελιδοποίησε το επιλεγμένο αντικείμενο του ιστορικού" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Εργαλεία" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Διαχείριση των μηχανών αναζήτησης" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Προσθήξη, επεξεργασία και διαγραφή των μηχανών αναζήτησης..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Προηγούμενη καρτέλα" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Μετάβαση στην προηγούμενη καρτέλα" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "Επόμε_νη καρτέλα" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Μετάβαση στην επόμενη καρτέλα" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Βοήθεια" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Περιεχόμενα" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Εμφάνιση της τεκμηρίωσης" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "_Συχνές ερωτήσεις" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "Εμφάνιση των συχνών απαντημένων ερωτήσεων" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "Αποστολή α_ναφοράς σφάλματος" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "Άνοιγμα καταγραφής σφαλμάτων midori" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Εμφάνιση πληροφοριών σχετικά με την εφαρμογή" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "Π_ροσωπική περιήγηση" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Να μην γίνει αποθήκευση προσωπικών δεδομένων κατά την περιήγηση" + +#: ../midori/midori-browser.c:3231 +msgid "_Menubar" +msgstr "_Μπάρα μενού" + +#: ../midori/midori-browser.c:3232 +msgid "Show menubar" +msgstr "Προβολή μπάρας μενού" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "_Μπάρα περιήγησης" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Εμφάνιση περιήγησης" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Πλαϊνό _ταμπλό" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Εμφάνιση πλαϊνού ταμπλό" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "_Μπάρα σελιδοδείκτη" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Εμφάνιση μπάρα σελιδοδείκτη" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "_Μπάρα μεταφορών" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Εμφάνιση μπάρα μεταφορών" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "_Γραμμή κατάστασης" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Εμφάνιση γραμμής κατάστασης" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Τοποθεσία:" + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Άνοιγμα συγκεκριμένης τοποθεσίας" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_Αναζήτηση ιστού..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Εκκίνηση μίας αναζήτησης ιστού" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Ξανα-άνοιγμα προηγούμενης καρτέλας ή παράθυρο που έχει κλείσει" + +#: ../midori/midori-browser.c:3729 +msgid "_Recently visited pages" +msgstr "_Πρόσφατες επισκεπτόμενες σελίδες " + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "Ξανα-άνοιγμα σελίδεων που έχετε επισκεφτεί νωρίτερα" + +#: ../midori/midori-browser.c:3746 +msgid "Show the saved bookmarks" +msgstr "Εμφάνιση των αποθηκευμένων σελιδοδεικτών" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Παράθυρο" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "Εμφάνιση μίας λίστας με όλα τις ανοιχτές καρτέλες" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Σελιδοδείκτες" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Ιστορικό" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "Εν_σωματωμένη εύρεση:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Ταίριασμα πεζών" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "Τονισμός των ταιριασμάτων" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Κλείσιμο μπάρας εύρεσης" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Αναπάντεχη ρύθμιση '%s'" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Κλείσιμο ταμπλού" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Κενή σελίδα" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Αρχική σελίδα" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Άνοιγμα τελευταίων σελίδων" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Κινέζικα (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Ιαπωνικά (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Ρωσικά (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Δυτικά (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Προσαρμογή..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Νέα καρτέλα" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Νέο παράθυρο" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Τρέχον καρτέλα" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Προκαθορισμένο" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Εικονίδια" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Κείμενο" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Και τα δύο" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Και τα δύο οριζόντια" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Όλα τα cookies" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Cookies συνεδρίας" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Κανένα" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Απομνημόνευση μεγέθους τελευταίου παραθύρου" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Αποθήκευση του μεγέθους του τελευταίου παραθύρου όπως και να έχει" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Πλάτος τελευταίου παραθύρου" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Το τελευταίο αποθηκευμένο πλάτος παραθύρου" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Ύψος τελευταίου παραθύρου" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Το τελευταίο ύψος αποθηκευμένου παραθύρου" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Θέση τελευταίου ταμπλό" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Η τελευταία αποθηκευμένη θέση ταμπλό" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Τελευταία σελίδα ταμπλό" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Η τελευταία αποθηκευμένη σελίδα ταμπλό" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Τελευταία αναζήτηση ιστού" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Η τελευταία αποθηκευμένη αναζήτηση ιστού" + +#: ../midori/midori-websettings.c:302 +msgid "Show Menubar" +msgstr "Εμφάνιση γραμμής μενού" + +#: ../midori/midori-websettings.c:303 +msgid "Whether to show the menubar" +msgstr "Εμφάνιση της μπάρας μενού όπως και να 'χει" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Εμφάνιση της γραμμής πλοήγησης" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Εμφάνιση της γραμμής πλοήγησης όπως και να 'χει" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Εμφάνιση μπάρας σελιδοδεικτών" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Εμφάνιση μπάρας σελιλοδεικτών όπως και να 'χει" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Εμφάνιση ταμπλό" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Εμφάνιση ταμπλό όπως και να 'χει" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Εμφάνιση γραμμής κατάστασης" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Εμφάνιση γραμμής κατάστασης όπως και να 'χει" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Στυλ εργαλειοθήκης" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Το στυλ της εργαλειοθήκης" + +#: ../midori/midori-websettings.c:358 +msgid "Toolbar Items" +msgstr "Αντικείμενα εργαλειοθήκης" + +#: ../midori/midori-websettings.c:359 +msgid "The items to show on the toolbar" +msgstr "Τι αντικειμένα να εμφανίζονται στην εργαλειοθήκη" + +#: ../midori/midori-websettings.c:367 +msgid "Compact Sidepanel" +msgstr "Σύμπτυξη πλαϊνού ταμπλό" + +#: ../midori/midori-websettings.c:368 +msgid "Whether to make the sidepanel compact" +msgstr "Δημιουργία σύμπτυξης πλαϊνού ταμπλό όπως και να 'χει" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Να φορτώνεται στην εκκίνηση" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Τι να φορτώνει κατά την εκκίνηση" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Η αρχική σελίδα" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Φάκελος μεταφορών" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "Ο κατάλογος στον οποίο αποθηκεύονται τα αρχεία που κατεβαίνουν" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "Διαχειριστής μεταφορών" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Εξωτερικός διαχειριστής μεταφορών" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "Κειμενογράφος" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "Εξωτερικός κειμενογράφος" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Διεύθυνση για αναζήτηση" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "Η αναζήτηση να πραγματοποιηθεί εσωτερικά της τοποθεσίας εισαγωγής" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Προτιμώμενη κωδικοποίηση" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Η προτιμώμενη κωδικοποίηση χαρακτήρων" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "Εμφάνιση πάντα της γραμμής καρτέλων" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "Εμφάνιση πάντα της γραμμής καρτέλων" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Κουμπιά κλεισίματος σε καρτέλες" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Οι καρτέλες έχουν κουμπιά κλεισίματος όπως και να 'χει" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Άνοιγμα νέων σελίδων σε" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Που να ανοίγουν οι νέες σελίδες" + +#: ../midori/midori-websettings.c:473 +msgid "Open external pages in" +msgstr "Άνοιγμα εξωτερικών σελίδων σε" + +#: ../midori/midori-websettings.c:474 +msgid "Where to open externally opened pages" +msgstr "Που να ανοίγουν οι εξωτερικές ανοιγμένες σελίδες" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Το μεσαίο κλικ ανοίγει την Επιλογή" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Φόρτωση ενός URL από την επιλογή μέσω του μεσαίου κλικ" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Άνοιγμα καρτέλων στο παρασκήνιο" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Άνοιγμα νέων καρτέλων στο παρασκήνιο όπως και να 'χει" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "Άνοιγμα καρτέλων δίπλα στο τρέχων" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" +"Άνοιγμα νέων καρτέλων δίπλα στην τρέχων καρτέλα ή πίσω από το τελευταίο όπως " +"και να 'χει" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Άνοιγμα αναδυόμενων παραθύρων σε καρτέλες" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Άνοιγμα αναδυόμενων παραθύρων σε καρτέλες όπως και να 'χει" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Αποδοχή cookies" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Τι τύπο cookies να γίνονται αποδεκτά" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Πρωτότυπα cookies μόνο" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Αποδοχή cookies μόνο από πρωτότυπους ιστότοπους" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Μέγιστος χρόνος cookie" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Το μέγιστο σε μέρες για να αποθηκεύονται τα cookies " + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Απομνημόνευση των τελευταίων επισκεπτόμενων σελίδων" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Απομνημόνευση των τελευταίων επισκεπτόμενων σελίδων όπως και να 'χει" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Μέγιστο χρόνος ιστορικού" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Ο μέγιστος χρόνος σε μέρες για την αποθήκευση του ιστορικού" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Απομνημόνευση των τελευταίων εισαγωγών" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Απομνημόνευση των τελευταίων εισαγωγών όπως και να 'χει" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Απομνημόνευση των τελευταίων αρχείων που κατέβηκαν" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Που αποθηκεύτηκαν τα τελευταία αρχεία που κατέβηκαν" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "Μεσολαβητής http" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "Χρησιμοποιείται μεσολαβητής για http συνδέσεις" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Μέγεθος προσωρινής μνήμης" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Το επιτρεπόμενο μέγεθος της προσωρινής μνήμης" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "Δεν βρέθηκε - %s" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Άνοιγμα συνδέσμου σε νέα κ_αρτέλα" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "Απ_οθήκευση συνδέσμου προορισμού" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "Κ_ατέβασμα συνδέσμου προορισμού" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Άνοιγμα URL σε νέα κ_αρτέλα" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "Εξέταση σελίδα -%s" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Πηγή" + +#: ../midori/midori-view.c:1527 +#, c-format +msgid "No documentation installed" +msgstr "Δεν έχει εγκατασταθεί τεκμηρίωση" + +#: ../midori/midori-preferences.c:87 +#, c-format +msgid "Preferences for %s" +msgstr "Προτιμήσεις για %s" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Γενικά" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Εκκίνηση" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Εμφάνιση" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Ρυθμίσεις γραμματοσειράς" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "Προεπιλεγμένη οικογένεια γραμματοσειράς" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "Ελάχιστο μέγεθος γραμματοσειράς" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Συμπεριφορά" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Χαρακτηριστικά" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "Αυτόματη φόρτωση εικόνων" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "Αυτόματη σμίκρυνσης εικόνων" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "Εκτύπωση εικόνων παρασκηνίου" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "Αυξομείωση περιοχών κειμένου" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "Ενεργοποίηση σεναρίων" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "Ενεργοποίηση αρθρωμάτων" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "Ενεργοποίηση εργαλείων ανάπτυξης" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Διεπαφή" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Γραμμή πλοηγήσης" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Περιήγηση" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Δίκτυο" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "ΜΒ" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "Προσωπικό απόρρητο" + +#: ../midori/midori-preferences.c:500 +msgid "Web Cookies" +msgstr "Cookies ιστού" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "ημέρες" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Άδειο" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Προσθήκη μηχανής αναζήτησης" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Επεξεργασία μηχανής αναζήτησης" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Όνομα:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "Ει_κονίδιο (όνομα ή αρχείο):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "_Μορφότυπο:" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Διαχείριση μηχανών αναζήτησης" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Δεν μπορεί να εκτελεστεί το εξωτερικό πρόγραμμα." + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Προειδοποίηση: Χρησιμοποιείται λογαριασμό με δικαιώματα διαχειριστή" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Συνέβει ένα άγνωστο σφάλμα." + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s δεν έχει ιδιότητα '%s'" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s δεν μπορεί να οριστεί στο %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s δεν μποορεί να προσπελαστεί" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Σενάρια χρηστών" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Θέματα χρήστη" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Ενεργοποίηση" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Απενεργοποίηση" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Τερματικό" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Επεκτάσεις" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Το εικονίδο Named '%s' δεν μπορεί να φορτωθεί" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Το εικονίδο Stock '%s' δεν μπορεί να φορτωθεί" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Τα κινούμενα γραφικά πλαίσια δεν λειτουργούν" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Η ιδιότητα '%s' δεν είναι έγκυρη για το %s" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Επιλογή αρχείου" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Επιλογή φακέλου" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Αποθήκευση Σελίδων" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Αποθήκευση σελίδων" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "Εικόνες" + +#: ../extensions/statusbar-features.c:37 +msgid "Scripts" +msgstr "Σενάρια" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "Αρθρώματα" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 00000000..0a928471 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,1559 @@ +# British English translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Bastien Nocera 2008 +# Abigail Brady 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-01 20:25+0100\n" +"PO-Revision-Date: 2008-11-29 23:39+0100\n" +"Last-Translator: Abigail Brady \n" +"Language-Team: British English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Lightweight web browser" + +#: ../data/midori.desktop.in.h:2 ../midori/main.c:1950 ../midori/main.c:2056 +#: ../midori/main.c:2065 ../midori/main.c:2076 +#: ../midori/midori-websettings.c:259 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Web Browser" + +#: ../midori/main.c:90 +msgid "_Bookmark" +msgstr "_Bookmark" + +#: ../midori/main.c:91 ../midori/midori-browser.c:3830 +msgid "_Bookmarks" +msgstr "_Bookmarks" + +#: ../midori/main.c:92 +msgid "_Add Bookmark" +msgstr "_Add Bookmark" + +#: ../midori/main.c:93 +msgid "_Console" +msgstr "_Console" + +#: ../midori/main.c:94 +msgid "_Extensions" +msgstr "_Extensions" + +#: ../midori/main.c:95 +msgid "_History" +msgstr "_History" + +#: ../midori/main.c:96 +msgid "_Homepage" +msgstr "_Homepage" + +#: ../midori/main.c:97 +msgid "_Userscripts" +msgstr "_Userscripts" + +#: ../midori/main.c:98 +msgid "User_styles" +msgstr "User_styles" + +#: ../midori/main.c:99 +msgid "New _Tab" +msgstr "New _Tab" + +#: ../midori/main.c:100 +msgid "_Transfers" +msgstr "_Transfers" + +#: ../midori/main.c:101 +msgid "_Closed Tabs and Windows" +msgstr "_Closed Tabs and Windows" + +#: ../midori/main.c:102 +msgid "New _Window" +msgstr "New _Window" + +#: ../midori/main.c:158 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "The configuration couldn't be loaded: %s\n" + +#: ../midori/main.c:213 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Value '%s' is invalid for %s" + +#: ../midori/main.c:220 ../midori/main.c:290 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Invalid configuration value '%s'" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "File not found." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Malformed document." + +#: ../midori/main.c:571 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Failed to open database: %s\n" + +#: ../midori/main.c:603 +#, fuzzy, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Failed to open database: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Failed to remove history item: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Failed to clear history: %s\n" + +#: ../midori/main.c:704 ../midori/main.c:738 ../midori/main.c:754 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Failed to add history item: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:934 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Failed to remove old history items: %s\n" + +#: ../midori/main.c:962 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "The configuration couldn't be saved. %s" + +#: ../midori/main.c:991 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "The search engines couldn't be saved. %s" + +#: ../midori/main.c:1121 ../midori/sokoke.c:531 +#, c-format +msgid "Writing failed." +msgstr "Writing failed." + +#: ../midori/main.c:1142 ../midori/main.c:1169 ../midori/main.c:1197 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "The bookmarks couldn't be saved. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1221 ../midori/main.c:1245 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "The wastebasket couldn't be saved. %s" + +#: ../midori/main.c:1271 ../midori/midori-preferences.c:386 +msgid "Transfers" +msgstr "Transfers" + +#: ../midori/main.c:1312 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "The session couldn't be saved. %s" + +#: ../midori/main.c:1636 +msgid "Authentication Required" +msgstr "Authentication Required" + +#: ../midori/main.c:1652 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"A username and a password are required\n" +"to open this location:" + +#: ../midori/main.c:1666 +msgid "Username" +msgstr "Username" + +#: ../midori/main.c:1677 +msgid "Password" +msgstr "Password" + +#: ../midori/main.c:1783 +msgid "" +"Midori seems to have crashed the last time it was opened. If this " +"happened repeatedly, try one of the following options to solve the problem." +msgstr "" +"Midori seems to have crashed the last time it was opened. If this " +"happened repeatedly, try one of the following options to solve the problem." + +#: ../midori/main.c:1798 +msgid "Modify _preferences" +msgstr "Modify _preferences" + +#: ../midori/main.c:1802 +msgid "Reset the last _session" +msgstr "Reset the last _session" + +#: ../midori/main.c:1807 +msgid "Disable all _extensions" +msgstr "Disable all _extensions" + +#: ../midori/main.c:1950 +msgid "No filename specified" +msgstr "No filename specified" + +#: ../midori/main.c:1982 ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "An unknown error occured." + +#: ../midori/main.c:2005 +msgid "Run the specified filename as javascript" +msgstr "Run the specified filename as javascript" + +#: ../midori/main.c:2007 +msgid "Display program version" +msgstr "Display program version" + +#: ../midori/main.c:2009 +msgid "Addresses" +msgstr "Addresses" + +#: ../midori/main.c:2053 +msgid "[Addresses]" +msgstr "[Addresses]" + +#: ../midori/main.c:2077 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Please report comments, suggestions and bugs to:" + +#: ../midori/main.c:2079 +msgid "Check for new versions at:" +msgstr "Check for new versions at:" + +#: ../midori/main.c:2106 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "An instance of Midori is already running but not responding.\n" + +#: ../midori/main.c:2184 +#, fuzzy, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "The search engines couldn't be saved. %s" + +#: ../midori/main.c:2196 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "The bookmarks couldn't be loaded: %s\n" + +#: ../midori/main.c:2211 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "The session couldn't be loaded: %s\n" + +#: ../midori/main.c:2224 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "The wastebasket couldn't be loaded: %s\n" + +#: ../midori/main.c:2237 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "The history couldn't be loaded: %s\n" + +#: ../midori/main.c:2249 +msgid "The following errors occured:" +msgstr "The following errors occured:" + +#: ../midori/main.c:2265 +msgid "_Ignore" +msgstr "_Ignore" + +#: ../midori/midori-browser.c:258 ../midori/midori-browser.c:3164 +#: ../midori/midori-browser.c:3170 +msgid "Reload the current page" +msgstr "Reload the current page" + +#: ../midori/midori-browser.c:270 ../midori/midori-browser.c:3167 +msgid "Stop loading the current page" +msgstr "Stop loading the current page" + +#: ../midori/midori-browser.c:328 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% loaded" + +#: ../midori/midori-browser.c:351 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Unexpected action '%s'." + +#: ../midori/midori-browser.c:524 +msgid "New bookmark" +msgstr "New bookmark" + +#: ../midori/midori-browser.c:524 +msgid "Edit bookmark" +msgstr "Edit bookmark" + +#: ../midori/midori-browser.c:546 +msgid "_Title:" +msgstr "_Title:" + +#: ../midori/midori-browser.c:559 ../midori/midori-searchaction.c:836 +msgid "_Description:" +msgstr "_Description:" + +#: ../midori/midori-browser.c:578 ../midori/midori-searchaction.c:850 +msgid "_Address:" +msgstr "_Address:" + +#: ../midori/midori-browser.c:596 +msgid "_Folder:" +msgstr "_Folder:" + +#: ../midori/midori-browser.c:601 ../midori/midori-browser.c:638 +msgid "Toplevel folder" +msgstr "Toplevel folder" + +#: ../midori/midori-browser.c:713 +msgid "Save file as" +msgstr "Save file as" + +#: ../midori/midori-browser.c:1302 +msgid "Open file" +msgstr "Open file" + +#: ../midori/midori-browser.c:2524 ../panels/midori-bookmarks.c:690 +msgid "Open in New _Tab" +msgstr "Open in New _Tab" + +#: ../midori/midori-browser.c:2526 ../panels/midori-bookmarks.c:692 +msgid "Open in New _Window" +msgstr "Open in New _Window" + +#: ../midori/midori-browser.c:2788 +#, c-format +msgid "A week ago" +msgstr "A week ago" + +#: ../midori/midori-browser.c:2794 +#, c-format +msgid "%d days ago" +msgstr "%d days ago" + +#: ../midori/midori-browser.c:2801 +msgid "Today" +msgstr "Today" + +#: ../midori/midori-browser.c:2803 +msgid "Yesterday" +msgstr "Yesterday" + +#: ../midori/midori-browser.c:2892 +msgid "A lightweight web browser." +msgstr "A lightweight web browser." + +#: ../midori/midori-browser.c:2900 +msgid "translator-credits" +msgstr "" +"Bastien Nocera \n" +"Abigail Brady " + +#: ../midori/midori-browser.c:3044 +msgid "Are you sure you want to remove all history items?" +msgstr "Are you sure you want to remove all history items?" + +#: ../midori/midori-browser.c:3098 +msgid "_File" +msgstr "_File" + +#: ../midori/midori-browser.c:3101 +msgid "Open a new window" +msgstr "Open a new window" + +#: ../midori/midori-browser.c:3104 +msgid "Open a new tab" +msgstr "Open a new tab" + +#: ../midori/midori-browser.c:3107 +msgid "Open a file" +msgstr "Open a file" + +#: ../midori/midori-browser.c:3110 +msgid "Save to a file" +msgstr "Save to a file" + +#: ../midori/midori-browser.c:3112 +msgid "_Close Tab" +msgstr "_Close Tab" + +#: ../midori/midori-browser.c:3113 +msgid "Close the current tab" +msgstr "Close the current tab" + +#: ../midori/midori-browser.c:3115 +msgid "C_lose Window" +msgstr "C_lose Window" + +#: ../midori/midori-browser.c:3116 +msgid "Close this window" +msgstr "Close this window" + +#: ../midori/midori-browser.c:3119 +msgid "Print the current page" +msgstr "Print the current page" + +#: ../midori/midori-browser.c:3122 +msgid "Quit the application" +msgstr "Quit the application" + +#: ../midori/midori-browser.c:3124 +msgid "_Edit" +msgstr "_Edit" + +#: ../midori/midori-browser.c:3127 +msgid "Cut the selected text" +msgstr "Cut the selected text" + +#: ../midori/midori-browser.c:3130 ../midori/midori-browser.c:3133 +msgid "Copy the selected text" +msgstr "Copy the selected text" + +#: ../midori/midori-browser.c:3136 +msgid "Paste text from the clipboard" +msgstr "Paste text from the clipboard" + +#: ../midori/midori-browser.c:3139 +msgid "Delete the selected text" +msgstr "Delete the selected text" + +#: ../midori/midori-browser.c:3142 +msgid "Select all text" +msgstr "Select all text" + +#: ../midori/midori-browser.c:3145 +msgid "Find a word or phrase in the page" +msgstr "Find a word or phrase in the page" + +#: ../midori/midori-browser.c:3147 +msgid "Find _Next" +msgstr "Find _Next" + +#: ../midori/midori-browser.c:3148 +msgid "Find the next occurrence of a word or phrase" +msgstr "Find the next occurrence of a word or phrase" + +#: ../midori/midori-browser.c:3150 +msgid "Find _Previous" +msgstr "Find _Previous" + +#: ../midori/midori-browser.c:3151 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Find the previous occurrence of a word or phrase" + +#: ../midori/midori-browser.c:3154 +msgid "_Quick Find" +msgstr "_Quick Find" + +#: ../midori/midori-browser.c:3155 +msgid "Quickly jump to a word or phrase" +msgstr "Quickly jump to a word or phrase" + +#: ../midori/midori-browser.c:3158 +msgid "Configure the application preferences" +msgstr "Configure the application preferences" + +#: ../midori/midori-browser.c:3160 +msgid "_View" +msgstr "_View" + +#: ../midori/midori-browser.c:3161 +msgid "_Toolbars" +msgstr "_Toolbars" + +#: ../midori/midori-browser.c:3173 +msgid "Increase the zoom level" +msgstr "Increase the zoom level" + +#: ../midori/midori-browser.c:3176 +msgid "Decrease the zoom level" +msgstr "Decrease the zoom level" + +#: ../midori/midori-browser.c:3179 +msgid "Reset the zoom level" +msgstr "Reset the zoom level" + +#: ../midori/midori-browser.c:3181 ../midori/midori-view.c:984 +msgid "View _Source" +msgstr "View _Source" + +#: ../midori/midori-browser.c:3182 +msgid "View the source code of the page" +msgstr "View the source code of the page" + +#: ../midori/midori-browser.c:3184 +msgid "View Selection Source" +msgstr "View Selection Source" + +#: ../midori/midori-browser.c:3185 +msgid "View the source code of the selection" +msgstr "View the source code of the selection" + +#: ../midori/midori-browser.c:3189 +msgid "Toggle fullscreen view" +msgstr "Toggle fullscreen view" + +#: ../midori/midori-browser.c:3191 +msgid "_Go" +msgstr "_Go" + +#: ../midori/midori-browser.c:3194 +msgid "Go back to the previous page" +msgstr "Go back to the previous page" + +#: ../midori/midori-browser.c:3197 +msgid "Go forward to the next page" +msgstr "Go forward to the next page" + +#: ../midori/midori-browser.c:3200 +msgid "Go to your homepage" +msgstr "Go to your homepage" + +#: ../midori/midori-browser.c:3202 +msgid "Empty Trash" +msgstr "Empty Wastebasket" + +#: ../midori/midori-browser.c:3203 +msgid "Delete the contents of the trash" +msgstr "Delete the contents of the wastebasket" + +#: ../midori/midori-browser.c:3205 ../midori/midori-view.c:956 +msgid "Undo Close Tab" +msgstr "Undo Close Tab" + +#: ../midori/midori-browser.c:3206 +msgid "Open the last closed tab" +msgstr "Open the last closed tab" + +#: ../midori/midori-browser.c:3210 ../panels/midori-bookmarks.c:209 +msgid "Add a new bookmark" +msgstr "Add a new bookmark" + +#: ../midori/midori-browser.c:3213 +msgid "Delete the selected history item" +msgstr "Delete the selected history item" + +#: ../midori/midori-browser.c:3216 +msgid "Clear the entire history" +msgstr "Clear the entire history" + +#: ../midori/midori-browser.c:3219 +msgid "Bookmark the selected history item" +msgstr "Bookmark the selected history item" + +#: ../midori/midori-browser.c:3221 +msgid "_Tools" +msgstr "_Tools" + +#: ../midori/midori-browser.c:3223 ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "_Manage Search Engines" + +#: ../midori/midori-browser.c:3224 +msgid "Add, edit and remove search engines..." +msgstr "Add, edit and remove search engines..." + +#: ../midori/midori-browser.c:3228 +msgid "_Previous Tab" +msgstr "_Previous Tab" + +#: ../midori/midori-browser.c:3229 +msgid "Switch to the previous tab" +msgstr "Switch to the previous tab" + +#: ../midori/midori-browser.c:3231 +msgid "_Next Tab" +msgstr "_Next Tab" + +#: ../midori/midori-browser.c:3232 +msgid "Switch to the next tab" +msgstr "Switch to the next tab" + +#: ../midori/midori-browser.c:3234 +msgid "_Help" +msgstr "_Help" + +#: ../midori/midori-browser.c:3236 +msgid "_Contents" +msgstr "_Contents" + +#: ../midori/midori-browser.c:3237 +msgid "Show the documentation" +msgstr "Show the documentation" + +#: ../midori/midori-browser.c:3239 +#, fuzzy +msgid "_Frequent Questions" +msgstr "_Frequent questions" + +#: ../midori/midori-browser.c:3240 +msgid "Show the Frequently Asked Questions" +msgstr "Show the Frequently Asked Questions" + +#: ../midori/midori-browser.c:3242 +#, fuzzy +msgid "_Report a Bug" +msgstr "_Report a bug" + +#: ../midori/midori-browser.c:3243 +msgid "Open Midori's bug tracker" +msgstr "Open Midori's bug tracker" + +#: ../midori/midori-browser.c:3246 +msgid "Show information about the program" +msgstr "Show information about the program" + +#: ../midori/midori-browser.c:3253 +msgid "P_rivate Browsing" +msgstr "P_rivate Browsing" + +#: ../midori/midori-browser.c:3254 +msgid "Don't save any private data while browsing" +msgstr "Don't save any private data while browsing" + +#: ../midori/midori-browser.c:3259 +msgid "_Menubar" +msgstr "_Menubar" + +#: ../midori/midori-browser.c:3260 +msgid "Show menubar" +msgstr "Show menubar" + +#: ../midori/midori-browser.c:3263 +msgid "_Navigationbar" +msgstr "_Navigationbar" + +#: ../midori/midori-browser.c:3264 +msgid "Show navigationbar" +msgstr "Show navigationbar" + +#: ../midori/midori-browser.c:3267 +msgid "Side_panel" +msgstr "Side_panel" + +#: ../midori/midori-browser.c:3268 +msgid "Show sidepanel" +msgstr "Show sidepanel" + +#: ../midori/midori-browser.c:3271 +msgid "_Bookmarkbar" +msgstr "_Bookmarkbar" + +#: ../midori/midori-browser.c:3272 +msgid "Show bookmarkbar" +msgstr "Show bookmarkbar" + +#: ../midori/midori-browser.c:3275 +msgid "_Transferbar" +msgstr "_Transferbar" + +#: ../midori/midori-browser.c:3276 +msgid "Show transferbar" +msgstr "Show transferbar" + +#: ../midori/midori-browser.c:3279 +msgid "_Statusbar" +msgstr "_Statusbar" + +#: ../midori/midori-browser.c:3280 +msgid "Show statusbar" +msgstr "Show statusbar" + +#: ../midori/midori-browser.c:3748 +#, fuzzy +msgid "_Separator" +msgstr "Separator" + +#: ../midori/midori-browser.c:3755 +msgid "_Location..." +msgstr "_Location..." + +#: ../midori/midori-browser.c:3757 +msgid "Open a particular location" +msgstr "Open a particular location" + +#: ../midori/midori-browser.c:3781 +msgid "_Web Search..." +msgstr "_Web Search..." + +#: ../midori/midori-browser.c:3783 +msgid "Run a web search" +msgstr "Run a web search" + +#: ../midori/midori-browser.c:3802 +msgid "Reopen a previously closed tab or window" +msgstr "Reopen a previously closed tab or window" + +#: ../midori/midori-browser.c:3815 +msgid "_Recently visited pages" +msgstr "_Recently visited pages" + +#: ../midori/midori-browser.c:3817 +msgid "Reopen pages that you visited earlier" +msgstr "Reopen pages that you visited earlier" + +#: ../midori/midori-browser.c:3832 +msgid "Show the saved bookmarks" +msgstr "Show the saved bookmarks" + +#: ../midori/midori-browser.c:3845 +msgid "_Window" +msgstr "_Window" + +#: ../midori/midori-browser.c:3847 +msgid "Show a list of all open tabs" +msgstr "Show a list of all open tabs" + +#: ../midori/midori-browser.c:4001 ../midori/midori-preferences.c:597 +msgid "History" +msgstr "History" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4050 +#, fuzzy +msgid "_Inline Find:" +msgstr "_Inline find:" + +#: ../midori/midori-browser.c:4071 +#, fuzzy +msgid "Previous" +msgstr "_Previous Tab" + +#: ../midori/midori-browser.c:4076 +#, fuzzy +msgid "Next" +msgstr "Text" + +#: ../midori/midori-browser.c:4081 +msgid "Match Case" +msgstr "Match Case" + +#: ../midori/midori-browser.c:4089 +msgid "Highlight Matches" +msgstr "Highlight Matches" + +#: ../midori/midori-browser.c:4098 +msgid "Close Findbar" +msgstr "Close Findbar" + +#: ../midori/midori-browser.c:4379 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Unexpected setting '%s'" + +#: ../midori/midori-panel.c:199 ../midori/midori-panel.c:200 +msgid "Close panel" +msgstr "Close panel" + +#: ../midori/midori-websettings.c:169 ../midori/midori-view.c:1719 +msgid "Blank page" +msgstr "Blank page" + +#: ../midori/midori-websettings.c:170 ../midori/midori-websettings.c:461 +msgid "Homepage" +msgstr "Homepage" + +#: ../midori/midori-websettings.c:171 +msgid "Last open pages" +msgstr "Last open pages" + +#: ../midori/midori-websettings.c:186 +msgid "Chinese (BIG5)" +msgstr "Chinese (BIG5)" + +#: ../midori/midori-websettings.c:187 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japanese (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:188 +msgid "Russian (KOI8-R)" +msgstr "Russian (KOI8-R)" + +#: ../midori/midori-websettings.c:189 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:190 +msgid "Western (ISO-8859-1)" +msgstr "Western (ISO-8859-1)" + +#: ../midori/midori-websettings.c:191 ../midori/midori-websettings.c:263 +msgid "Custom..." +msgstr "Custom..." + +#: ../midori/midori-websettings.c:206 +msgid "New tab" +msgstr "New tab" + +#: ../midori/midori-websettings.c:207 +msgid "New window" +msgstr "New window" + +#: ../midori/midori-websettings.c:208 +msgid "Current tab" +msgstr "Current tab" + +#: ../midori/midori-websettings.c:223 +msgid "Default" +msgstr "Default" + +#: ../midori/midori-websettings.c:224 +msgid "Icons" +msgstr "Icons" + +#: ../midori/midori-websettings.c:225 +msgid "Text" +msgstr "Text" + +#: ../midori/midori-websettings.c:226 +msgid "Both" +msgstr "Both" + +#: ../midori/midori-websettings.c:227 +msgid "Both horizontal" +msgstr "Both horizontal" + +#: ../midori/midori-websettings.c:242 +msgid "All cookies" +msgstr "All cookies" + +#: ../midori/midori-websettings.c:243 +msgid "Session cookies" +msgstr "Session cookies" + +#: ../midori/midori-websettings.c:244 ../panels/midori-addons.c:96 +msgid "None" +msgstr "None" + +#: ../midori/midori-websettings.c:260 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:261 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:262 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:303 +msgid "Remember last window size" +msgstr "Remember last window size" + +#: ../midori/midori-websettings.c:304 +msgid "Whether to save the last window size" +msgstr "Whether to save the last window size" + +#: ../midori/midori-websettings.c:312 +msgid "Last window width" +msgstr "Last window width" + +#: ../midori/midori-websettings.c:313 +msgid "The last saved window width" +msgstr "The last saved window width" + +#: ../midori/midori-websettings.c:321 +msgid "Last window height" +msgstr "Last window height" + +#: ../midori/midori-websettings.c:322 +msgid "The last saved window height" +msgstr "The last saved window height" + +#: ../midori/midori-websettings.c:347 +msgid "Last panel position" +msgstr "Last panel position" + +#: ../midori/midori-websettings.c:348 +msgid "The last saved panel position" +msgstr "The last saved panel position" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:357 +msgid "Last panel page" +msgstr "Last panel page" + +#: ../midori/midori-websettings.c:358 +msgid "The last saved panel page" +msgstr "The last saved panel page" + +#: ../midori/midori-websettings.c:366 +msgid "Last Web search" +msgstr "Last Web search" + +#: ../midori/midori-websettings.c:367 +msgid "The last saved Web search" +msgstr "The last saved Web search" + +#: ../midori/midori-websettings.c:376 +msgid "Show Menubar" +msgstr "Show Menubar" + +#: ../midori/midori-websettings.c:377 +msgid "Whether to show the menubar" +msgstr "Whether to show the menubar" + +#: ../midori/midori-websettings.c:385 +msgid "Show Navigationbar" +msgstr "Show Navigationbar" + +#: ../midori/midori-websettings.c:386 +msgid "Whether to show the navigationbar" +msgstr "Whether to show the navigationbar" + +#: ../midori/midori-websettings.c:394 +msgid "Show Bookmarkbar" +msgstr "Show Bookmarkbar" + +#: ../midori/midori-websettings.c:395 +msgid "Whether to show the bookmarkbar" +msgstr "Whether to show the bookmarkbar" + +#: ../midori/midori-websettings.c:403 +msgid "Show Panel" +msgstr "Show Panel" + +#: ../midori/midori-websettings.c:404 +msgid "Whether to show the panel" +msgstr "Whether to show the panel" + +#: ../midori/midori-websettings.c:412 +msgid "Show Statusbar" +msgstr "Show Statusbar" + +#: ../midori/midori-websettings.c:413 +msgid "Whether to show the statusbar" +msgstr "Whether to show the statusbar" + +#: ../midori/midori-websettings.c:422 +msgid "Toolbar Style" +msgstr "Toolbar Style" + +#: ../midori/midori-websettings.c:423 +msgid "The style of the toolbar" +msgstr "The style of the toolbar" + +#: ../midori/midori-websettings.c:432 +msgid "Toolbar Items" +msgstr "Toolbar Items" + +#: ../midori/midori-websettings.c:433 +msgid "The items to show on the toolbar" +msgstr "The items to show on the toolbar" + +#: ../midori/midori-websettings.c:441 +msgid "Compact Sidepanel" +msgstr "Compact Sidepanel" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to make the sidepanel compact" +msgstr "Whether to make the sidepanel compact" + +#: ../midori/midori-websettings.c:451 +msgid "Load on Startup" +msgstr "Load on Startup" + +#: ../midori/midori-websettings.c:452 +msgid "What to load on startup" +msgstr "What to load on startup" + +#: ../midori/midori-websettings.c:462 +msgid "The homepage" +msgstr "The homepage" + +#: ../midori/midori-websettings.c:477 +msgid "Show crash dialog" +msgstr "Show crash dialogue" + +#: ../midori/midori-websettings.c:478 +msgid "Show a dialog after Midori crashed" +msgstr "Show a dialogue after Midori crashed" + +#: ../midori/midori-websettings.c:486 +msgid "Download Folder" +msgstr "Download Folder" + +#: ../midori/midori-websettings.c:487 +msgid "The folder downloaded files are saved to" +msgstr "The folder downloaded files are saved to" + +#: ../midori/midori-websettings.c:495 +msgid "Download Manager" +msgstr "Download Manager" + +#: ../midori/midori-websettings.c:496 +msgid "An external download manager" +msgstr "An external download manager" + +#: ../midori/midori-websettings.c:504 +msgid "Text Editor" +msgstr "Text Editor" + +#: ../midori/midori-websettings.c:505 +msgid "An external text editor" +msgstr "An external text editor" + +#: ../midori/midori-websettings.c:513 +msgid "Location entry Search" +msgstr "Location entry Search" + +#: ../midori/midori-websettings.c:514 +msgid "The search to perform inside the location entry" +msgstr "The search to perform inside the location entry" + +#: ../midori/midori-websettings.c:522 +msgid "Preferred Encoding" +msgstr "Preferred Encoding" + +#: ../midori/midori-websettings.c:523 +msgid "The preferred character encoding" +msgstr "The preferred character encoding" + +#: ../midori/midori-websettings.c:533 +msgid "Always Show Tabbar" +msgstr "Always Show Tabbar" + +#: ../midori/midori-websettings.c:534 +msgid "Always show the tabbar" +msgstr "Always show the tabbar" + +#: ../midori/midori-websettings.c:542 +msgid "Close Buttons on Tabs" +msgstr "Close Buttons on Tabs" + +#: ../midori/midori-websettings.c:543 +msgid "Whether tabs have close buttons" +msgstr "Whether tabs have close buttons" + +#: ../midori/midori-websettings.c:552 +msgid "Open new pages in" +msgstr "Open new pages in" + +#: ../midori/midori-websettings.c:553 +msgid "Where to open new pages" +msgstr "Where to open new pages" + +#: ../midori/midori-websettings.c:563 +msgid "Open external pages in" +msgstr "Open external pages in" + +#: ../midori/midori-websettings.c:564 +msgid "Where to open externally opened pages" +msgstr "Where to open externally opened pages" + +#: ../midori/midori-websettings.c:577 +msgid "Middle click opens Selection" +msgstr "Middle click opens Selection" + +#: ../midori/midori-websettings.c:578 +msgid "Load an address from the selection via middle click" +msgstr "Load an address from the selection via middle click" + +#: ../midori/midori-websettings.c:586 +msgid "Open tabs in the background" +msgstr "Open tabs in the background" + +#: ../midori/midori-websettings.c:587 +msgid "Whether to open new tabs in the background" +msgstr "Whether to open new tabs in the background" + +#: ../midori/midori-websettings.c:595 +msgid "Open Tabs next to Current" +msgstr "Open Tabs next to Current" + +#: ../midori/midori-websettings.c:596 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Whether to open new tabs next to the current tab or after the last one" + +#: ../midori/midori-websettings.c:604 +msgid "Open popups in tabs" +msgstr "Open popups in tabs" + +#: ../midori/midori-websettings.c:605 +msgid "Whether to open popup windows in tabs" +msgstr "Whether to open popup windows in tabs" + +#: ../midori/midori-websettings.c:656 +msgid "Zoom Text and Images" +msgstr "Zoom Text and Images" + +#: ../midori/midori-websettings.c:657 +msgid "Whether to zoom text and images" +msgstr "Whether to zoom text and images" + +#: ../midori/midori-websettings.c:667 +msgid "Accept cookies" +msgstr "Accept cookies" + +#: ../midori/midori-websettings.c:668 +msgid "What type of cookies to accept" +msgstr "What type of cookies to accept" + +#: ../midori/midori-websettings.c:681 +msgid "Original cookies only" +msgstr "Original cookies only" + +#: ../midori/midori-websettings.c:682 +msgid "Accept cookies from the original website only" +msgstr "Accept cookies from the original website only" + +#: ../midori/midori-websettings.c:690 +msgid "Maximum cookie age" +msgstr "Maximum cookie age" + +#: ../midori/midori-websettings.c:691 +msgid "The maximum number of days to save cookies for" +msgstr "The maximum number of days to save cookies for" + +#: ../midori/midori-websettings.c:701 +msgid "Remember last visited pages" +msgstr "Remember last visited pages" + +#: ../midori/midori-websettings.c:702 +msgid "Whether the last visited pages are saved" +msgstr "Whether the last visited pages are saved" + +#: ../midori/midori-websettings.c:710 +msgid "Maximum history age" +msgstr "Maximum history age" + +#: ../midori/midori-websettings.c:711 +msgid "The maximum number of days to save the history for" +msgstr "The maximum number of days to save the history for" + +#: ../midori/midori-websettings.c:719 +msgid "Remember last form inputs" +msgstr "Remember last form inputs" + +#: ../midori/midori-websettings.c:720 +msgid "Whether the last form inputs are saved" +msgstr "Whether the last form inputs are saved" + +#: ../midori/midori-websettings.c:728 +msgid "Remember last downloaded files" +msgstr "Remember last downloaded files" + +#: ../midori/midori-websettings.c:729 +msgid "Whether the last downloaded files are saved" +msgstr "Whether the last downloaded files are saved" + +#: ../midori/midori-websettings.c:739 +msgid "Proxy Server" +msgstr "Proxy Server" + +#: ../midori/midori-websettings.c:740 +msgid "The proxy server used for HTTP connections" +msgstr "The proxy server used for HTTP connections" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:760 +msgid "Identify as" +msgstr "Identify as" + +#: ../midori/midori-websettings.c:761 +msgid "What to identify as to web pages" +msgstr "What to identify as to web pages" + +#: ../midori/midori-websettings.c:781 +msgid "Identification string" +msgstr "Identification string" + +#: ../midori/midori-websettings.c:782 +msgid "The application identification string" +msgstr "The application identification string" + +#: ../midori/midori-websettings.c:794 +msgid "Cache size" +msgstr "Cache size" + +#: ../midori/midori-websettings.c:795 +msgid "The allowed size of the cache" +msgstr "The allowed size of the cache" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:608 +#, c-format +msgid "Not found - %s" +msgstr "Not found - %s" + +#: ../midori/midori-view.c:888 +msgid "Open Link in New _Tab" +msgstr "Open Link in New _Tab" + +#: ../midori/midori-view.c:911 +msgid "_Save Link destination" +msgstr "_Save Link destination" + +#: ../midori/midori-view.c:919 +msgid "_Download Link destination" +msgstr "_Download Link destination" + +#: ../midori/midori-view.c:941 +msgid "Open Address in New _Tab" +msgstr "Open Address in New _Tab" + +#: ../midori/midori-view.c:1411 +#, c-format +msgid "Inspect page - %s" +msgstr "Inspect page - %s" + +#: ../midori/midori-view.c:1562 +msgid "Source" +msgstr "Source" + +#: ../midori/midori-view.c:1586 +#, c-format +msgid "Document cannot be displayed" +msgstr "Document cannot be displayed" + +#: ../midori/midori-view.c:1602 +#, c-format +msgid "No documentation installed" +msgstr "No documentation installed" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Preferences for %s" + +#. Page "General" +#: ../midori/midori-preferences.c:372 +msgid "General" +msgstr "General" + +#: ../midori/midori-preferences.c:373 +msgid "Startup" +msgstr "Startup" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:422 +msgid "Appearance" +msgstr "Appearance" + +#: ../midori/midori-preferences.c:423 +msgid "Font settings" +msgstr "Font settings" + +#: ../midori/midori-preferences.c:425 +msgid "Default Font Family" +msgstr "Default Font Family" + +#: ../midori/midori-preferences.c:431 +msgid "The default font size used to display text" +msgstr "The default font size used to display text" + +#: ../midori/midori-preferences.c:434 +msgid "Minimum Font Size" +msgstr "Minimum Font Size" + +#: ../midori/midori-preferences.c:437 +msgid "The minimum font size used to display text" +msgstr "The minimum font size used to display text" + +#: ../midori/midori-preferences.c:444 +msgid "Encoding" +msgstr "Encoding" + +#: ../midori/midori-preferences.c:447 +msgid "The character encoding to use by default" +msgstr "The character encoding to use by default" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:454 +msgid "Behavior" +msgstr "Behaviour" + +#: ../midori/midori-preferences.c:455 +msgid "Features" +msgstr "Features" + +#: ../midori/midori-preferences.c:458 ../extensions/statusbar-features.c:40 +msgid "Load images automatically" +msgstr "Load images automatically" + +#: ../midori/midori-preferences.c:459 +msgid "Load and display images automatically" +msgstr "Load and display images automatically" + +#: ../midori/midori-preferences.c:462 +msgid "Shrink images automatically" +msgstr "Shrink images automatically" + +#: ../midori/midori-preferences.c:463 +msgid "Automatically shrink standalone images to fit" +msgstr "Automatically shrink standalone images to fit" + +#: ../midori/midori-preferences.c:466 +msgid "Print background images" +msgstr "Print background images" + +#: ../midori/midori-preferences.c:467 +msgid "Whether background images should be printed" +msgstr "Whether background images should be printed" + +#: ../midori/midori-preferences.c:470 +msgid "Resizable text areas" +msgstr "Resizable text areas" + +#: ../midori/midori-preferences.c:471 +msgid "Whether text areas are resizable" +msgstr "Whether text areas are resizable" + +#: ../midori/midori-preferences.c:474 ../extensions/statusbar-features.c:47 +msgid "Enable scripts" +msgstr "Enable scripts" + +#: ../midori/midori-preferences.c:475 +msgid "Enable embedded scripting languages" +msgstr "Enable embedded scripting languages" + +#: ../midori/midori-preferences.c:478 ../extensions/statusbar-features.c:54 +msgid "Enable plugins" +msgstr "Enable plugins" + +#: ../midori/midori-preferences.c:479 +msgid "Enable embedded plugin objects" +msgstr "Enable embedded plugin objects" + +#: ../midori/midori-preferences.c:482 +msgid "Enforce 96 dots per inch" +msgstr "Enforce 96 dots per inch" + +#: ../midori/midori-preferences.c:483 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Enforce a video dot density of 96 DPI" + +#: ../midori/midori-preferences.c:486 +msgid "Enable developer tools" +msgstr "Enable developer tools" + +#: ../midori/midori-preferences.c:487 +msgid "Enable special extensions for developers" +msgstr "Enable special extensions for developers" + +#. Page "Interface" +#: ../midori/midori-preferences.c:497 +msgid "Interface" +msgstr "Interface" + +#: ../midori/midori-preferences.c:499 +msgid "Navigationbar" +msgstr "Navigationbar" + +#: ../midori/midori-preferences.c:505 +msgid "Browsing" +msgstr "Browsing" + +#: ../midori/midori-preferences.c:542 ../midori/midori-preferences.c:543 +msgid "Network" +msgstr "Network" + +#: ../midori/midori-preferences.c:565 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:572 +msgid "Privacy" +msgstr "Privacy" + +#: ../midori/midori-preferences.c:579 +msgid "Web Cookies" +msgstr "Web Cookies" + +#: ../midori/midori-preferences.c:592 ../midori/midori-preferences.c:604 +msgid "days" +msgstr "days" + +#: ../midori/midori-searchaction.c:455 ../katze/katze-arrayaction.c:279 +msgid "Empty" +msgstr "Empty" + +#: ../midori/midori-searchaction.c:792 +msgid "Add search engine" +msgstr "Add search engine" + +#: ../midori/midori-searchaction.c:792 +msgid "Edit search engine" +msgstr "Edit search engine" + +#: ../midori/midori-searchaction.c:820 +msgid "_Name:" +msgstr "_Name:" + +#: ../midori/midori-searchaction.c:864 +msgid "_Icon (name or file):" +msgstr "_Icon (name or file):" + +#: ../midori/midori-searchaction.c:878 +msgid "_Token:" +msgstr "_Token:" + +#: ../midori/midori-searchaction.c:1055 +#, fuzzy +msgid "Manage Search Engines" +msgstr "_Manage Search Engines" + +#: ../midori/sokoke.c:101 ../midori/sokoke.c:113 +msgid "Could not run external program." +msgstr "Could not run external program." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:354 +msgid "Warning: You are using a superuser account!" +msgstr "Warning: You are using a superuser account!" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s has no property '%s'" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s cannot be assigned to %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s cannot be accessed" + +#: ../panels/midori-addons.c:97 ../panels/midori-addons.c:143 +msgid "Userscripts" +msgstr "Userscripts" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:145 +msgid "Userstyles" +msgstr "Userstyles" + +#: ../panels/midori-addons.c:1005 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Enable" + +#: ../panels/midori-addons.c:1014 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Disable" + +#: ../panels/midori-bookmarks.c:100 +msgid "Bookmarks" +msgstr "Bookmarks" + +#: ../panels/midori-bookmarks.c:217 +msgid "Edit the selected bookmark" +msgstr "Edit the selected bookmark" + +#: ../panels/midori-bookmarks.c:225 +msgid "Delete the selected bookmark" +msgstr "Delete the selected bookmark" + +#: ../panels/midori-bookmarks.c:529 +msgid "Separator" +msgstr "Separator" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Console" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Extensions" + +#: ../panels/midori-plugins.c:87 ../extensions/statusbar-features.c:52 +msgid "Plugins" +msgstr "Plugins" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Named icon '%s' couldn't be loaded" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Stock icon '%s' couldn't be loaded" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Animation frames are broken" + +#: ../katze/katze-utils.c:180 ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Property '%s' is invalid for %s" + +#: ../katze/katze-utils.c:209 ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "Choose file" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "Choose folder" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "Mouse Gestures" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "Control Midori by moving the mouse" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "Pageholder" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "_Pageholder" + +#: ../extensions/statusbar-features.c:38 +msgid "Images" +msgstr "Images" + +#: ../extensions/statusbar-features.c:45 +msgid "Scripts" +msgstr "Scripts" + +#~ msgid "Manage search engines" +#~ msgstr "Manage search engines" + +#~ msgid "Root" +#~ msgstr "Root" + +#~ msgid "[URIs]" +#~ msgstr "[URIs]" + +#~ msgid "HTTP Proxy" +#~ msgstr "HTTP Proxy" + +#~ msgid "URIs" +#~ msgstr "URIs" + +#~ msgid "_URL:" +#~ msgstr "_URL:" + +#~ msgid "Open URL in New _Tab" +#~ msgstr "Open URL in New _Tab" diff --git a/po/es.po b/po/es.po new file mode 100644 index 00000000..a089e1a6 --- /dev/null +++ b/po/es.po @@ -0,0 +1,1598 @@ +# Spanish translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Miguel Anxo Bouzada 2008 +# Antonio Sanchez 2008 +# Christian Dywan 2008 +# Elega 2009 +# Guillermo Iguarán 2009 +# + +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-01 20:25+0100\n" +"PO-Revision-Date: 2009-03-29 16:02-0500\n" +"Last-Translator: Guillermo Iguarán \n" +"Language-Team: GALPon MiniNo \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Navegador ligero" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1950 +#: ../midori/main.c:2056 +#: ../midori/main.c:2065 +#: ../midori/main.c:2076 +#: ../midori/midori-websettings.c:259 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Navegador" + +#: ../midori/main.c:90 +msgid "_Bookmark" +msgstr "_Marcador" + +#: ../midori/main.c:91 +#: ../midori/midori-browser.c:3830 +msgid "_Bookmarks" +msgstr "_Marcadores" + +#: ../midori/main.c:92 +msgid "_Add Bookmark" +msgstr "_Añadir Marcador" + +#: ../midori/main.c:93 +msgid "_Console" +msgstr "_Consola" + +#: ../midori/main.c:94 +msgid "_Extensions" +msgstr "_Extensiones" + +#: ../midori/main.c:95 +msgid "_History" +msgstr "_Historial" + +#: ../midori/main.c:96 +msgid "_Homepage" +msgstr "_Página de inicio" + +#: ../midori/main.c:97 +msgid "_Userscripts" +msgstr "_Scripts de usuario" + +#: ../midori/main.c:98 +msgid "User_styles" +msgstr "_Estilos de usuario" + +#: ../midori/main.c:99 +msgid "New _Tab" +msgstr "Nueva _pestaña" + +#: ../midori/main.c:100 +msgid "_Transfers" +msgstr "_Transferencias" + +#: ../midori/main.c:101 +msgid "_Closed Tabs and Windows" +msgstr "_Pestañas y ventanas cerradas" + +#: ../midori/main.c:102 +msgid "New _Window" +msgstr "Nueva _ventana" + +#: ../midori/main.c:158 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "No se pudo cargar la configuración: %s\n" + +#: ../midori/main.c:213 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "El valor «%s» no es válido para %s" + +#: ../midori/main.c:220 +#: ../midori/main.c:290 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Valor de configuración inválido «%s»" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Archivo no encontrado." + +#: ../midori/main.c:540 +#: ../midori/main.c:549 +msgid "Malformed document." +msgstr "Documento defectuoso." + +#: ../midori/main.c:571 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "No se ha podido abrir la base de datos: %s\n" + +#: ../midori/main.c:603 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "No se ha podido ejecutar sentencia en base de datos: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "No se ha podido quitar los elementos del historial: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "No se ha podido vaciar el historial: %s\n" + +#: ../midori/main.c:704 +#: ../midori/main.c:738 +#: ../midori/main.c:754 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "No se ha podido añadir un elemento al historial: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:934 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "No se ha podido quitar elementos antiguos del historial: %s\n" + +#: ../midori/main.c:962 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "No se pudo guardar la configuración. %s" + +#: ../midori/main.c:991 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "No se pudo guardar los motores de búsqueda. %s" + +#: ../midori/main.c:1121 +#: ../midori/sokoke.c:531 +#, c-format +msgid "Writing failed." +msgstr "Falló la escritura." + +#: ../midori/main.c:1142 +#: ../midori/main.c:1169 +#: ../midori/main.c:1197 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "No se pudieron guardar los marcadores. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1221 +#: ../midori/main.c:1245 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "No se pudo guardar la papelera. %s" + +#: ../midori/main.c:1271 +#: ../midori/midori-preferences.c:386 +msgid "Transfers" +msgstr "Transferencias" + +#: ../midori/main.c:1312 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "No se pudo guardar la sesión. %s" + +#: ../midori/main.c:1636 +msgid "Authentication Required" +msgstr "Se requiere autentificación" + +#: ../midori/main.c:1652 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Nombre de usuario y contraseña son requeridos\n" +"para abrir ésta ubicación:" + +#: ../midori/main.c:1666 +msgid "Username" +msgstr "Nombre de usuario" + +#: ../midori/main.c:1677 +msgid "Password" +msgstr "Contraseña" + +#: ../midori/main.c:1783 +msgid "Midori seems to have crashed the last time it was opened. If this happened repeatedly, try one of the following options to solve the problem." +msgstr "Parece que Midori se cerró insperadamente la última vez. Si esto sucede repetidamente, pruebe una de las siguientes opciones para resolver el problema." + +#: ../midori/main.c:1798 +msgid "Modify _preferences" +msgstr "Modificar _preferencias" + +#: ../midori/main.c:1802 +msgid "Reset the last _session" +msgstr "Restaurar la última _sesión" + +#: ../midori/main.c:1807 +msgid "Disable all _extensions" +msgstr "Deshabilitar todas las _extensiones" + +#: ../midori/main.c:1950 +msgid "No filename specified" +msgstr "No se especificó el nombre del archivo" + +#: ../midori/main.c:1982 +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Se produjo un error desconocido." + +#: ../midori/main.c:2005 +msgid "Run the specified filename as javascript" +msgstr "Ejecute el nombre de archivo especificado como javascript" + +#: ../midori/main.c:2007 +msgid "Display program version" +msgstr "Mostrar la versión del programa" + +#: ../midori/main.c:2009 +msgid "Addresses" +msgstr "Direcciones" + +#: ../midori/main.c:2053 +msgid "[Addresses]" +msgstr "[Direcciones]" + +#: ../midori/main.c:2077 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Por favor envíe comentarios, sugerencias y errores a:" + +#: ../midori/main.c:2079 +msgid "Check for new versions at:" +msgstr "Buscar nuevas versiones en:" + +#: ../midori/main.c:2106 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Una instancia de Midori ya se está ejecutando pero no responde.\n" + +#: ../midori/main.c:2184 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "No se pudieron cargar los motores de búsqueda. %s\n" + +#: ../midori/main.c:2196 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Los marcadores no pudieron ser cargados: %s\n" + +#: ../midori/main.c:2211 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "No se pudo cargar la sesión: %s\n" + +#: ../midori/main.c:2224 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "No se pudo cargar la papelera: %s\n" + +#: ../midori/main.c:2237 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "No se pudo cargar el historial: %s\n" + +#: ../midori/main.c:2249 +msgid "The following errors occured:" +msgstr "Se produjeron los siguientes errores:" + +#: ../midori/main.c:2265 +msgid "_Ignore" +msgstr "_Ignorar" + +#: ../midori/midori-browser.c:258 +#: ../midori/midori-browser.c:3164 +#: ../midori/midori-browser.c:3170 +msgid "Reload the current page" +msgstr "Recargar la página actual" + +#: ../midori/midori-browser.c:270 +#: ../midori/midori-browser.c:3167 +msgid "Stop loading the current page" +msgstr "Detener la carga de la página" + +#: ../midori/midori-browser.c:328 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% cargado" + +#: ../midori/midori-browser.c:351 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Acción inesperada «%s»." + +#: ../midori/midori-browser.c:524 +msgid "New bookmark" +msgstr "Nuevo marcador" + +#: ../midori/midori-browser.c:524 +msgid "Edit bookmark" +msgstr "Editar marcador" + +#: ../midori/midori-browser.c:546 +msgid "_Title:" +msgstr "_Título:" + +#: ../midori/midori-browser.c:559 +#: ../midori/midori-searchaction.c:836 +msgid "_Description:" +msgstr "_Descripción:" + +#: ../midori/midori-browser.c:578 +#: ../midori/midori-searchaction.c:850 +msgid "_Address:" +msgstr "_Dirección:" + +#: ../midori/midori-browser.c:596 +msgid "_Folder:" +msgstr "_Carpeta:" + +#: ../midori/midori-browser.c:601 +#: ../midori/midori-browser.c:638 +msgid "Toplevel folder" +msgstr "Carpeta de nivel superior" + +#: ../midori/midori-browser.c:713 +msgid "Save file as" +msgstr "Guardar archivo como" + +#: ../midori/midori-browser.c:1302 +msgid "Open file" +msgstr "Abrir archivo" + +#: ../midori/midori-browser.c:2524 +#: ../panels/midori-bookmarks.c:690 +msgid "Open in New _Tab" +msgstr "Abrir en una nueva _pestaña " + +#: ../midori/midori-browser.c:2526 +#: ../panels/midori-bookmarks.c:692 +msgid "Open in New _Window" +msgstr "Abrir en una nueva _ventana" + +#: ../midori/midori-browser.c:2788 +#, c-format +msgid "A week ago" +msgstr "Hace una semana" + +#: ../midori/midori-browser.c:2794 +#, c-format +msgid "%d days ago" +msgstr "Hace %d días" + +#: ../midori/midori-browser.c:2801 +msgid "Today" +msgstr "Hoy" + +#: ../midori/midori-browser.c:2803 +msgid "Yesterday" +msgstr "Ayer" + +#: ../midori/midori-browser.c:2892 +msgid "A lightweight web browser." +msgstr "Un navegador muy ligero" + +#: ../midori/midori-browser.c:2900 +msgid "translator-credits" +msgstr "" +"Miguel Anxo Bouzada \n" +"Antonio Sanchez \n" +"Christian Dywan \n" +"Elega \n" +"Guillermo Iguarán " + +#: ../midori/midori-browser.c:3044 +msgid "Are you sure you want to remove all history items?" +msgstr "¿Estás seguro de que quieres quitar todos los elementos del historial?" + +#: ../midori/midori-browser.c:3098 +msgid "_File" +msgstr "_Archivo" + +#: ../midori/midori-browser.c:3101 +msgid "Open a new window" +msgstr "Abrir una nueva ventana" + +#: ../midori/midori-browser.c:3104 +msgid "Open a new tab" +msgstr "Abrir una nueva pestaña" + +#: ../midori/midori-browser.c:3107 +msgid "Open a file" +msgstr "Abrir un archivo" + +#: ../midori/midori-browser.c:3110 +msgid "Save to a file" +msgstr "Guardar en un archivo" + +#: ../midori/midori-browser.c:3112 +msgid "_Close Tab" +msgstr "_Cerrar pestaña" + +#: ../midori/midori-browser.c:3113 +msgid "Close the current tab" +msgstr "Cerrar la pestaña actual" + +#: ../midori/midori-browser.c:3115 +msgid "C_lose Window" +msgstr "_Cerrar ventana" + +#: ../midori/midori-browser.c:3116 +msgid "Close this window" +msgstr "Cerrar esta ventana" + +#: ../midori/midori-browser.c:3119 +msgid "Print the current page" +msgstr "Imprimir la página actual" + +#: ../midori/midori-browser.c:3122 +msgid "Quit the application" +msgstr "Salir de la aplicación" + +#: ../midori/midori-browser.c:3124 +msgid "_Edit" +msgstr "_Editar" + +#: ../midori/midori-browser.c:3127 +msgid "Cut the selected text" +msgstr "Cortar el texto seleccionado" + +#: ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3133 +msgid "Copy the selected text" +msgstr "Copiar el texto seleccionado" + +#: ../midori/midori-browser.c:3136 +msgid "Paste text from the clipboard" +msgstr "Pegar texto del portapapeles" + +#: ../midori/midori-browser.c:3139 +msgid "Delete the selected text" +msgstr "Borrar el texto seleccionado" + +#: ../midori/midori-browser.c:3142 +msgid "Select all text" +msgstr "Seleccionar todo el texto" + +#: ../midori/midori-browser.c:3145 +msgid "Find a word or phrase in the page" +msgstr "Buscar una palabra o frase en la página" + +#: ../midori/midori-browser.c:3147 +msgid "Find _Next" +msgstr "Buscar _siguiente" + +#: ../midori/midori-browser.c:3148 +msgid "Find the next occurrence of a word or phrase" +msgstr "Buscar la siguiente aparición de una palabra o una frase" + +#: ../midori/midori-browser.c:3150 +msgid "Find _Previous" +msgstr "Buscar _anterior" + +#: ../midori/midori-browser.c:3151 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Buscar la anterior aparición de una palabra o una frase" + +#: ../midori/midori-browser.c:3154 +msgid "_Quick Find" +msgstr "Búsqueda _rápida" + +#: ../midori/midori-browser.c:3155 +msgid "Quickly jump to a word or phrase" +msgstr "Saltar rápidamente a una palabra o una frase" + +#: ../midori/midori-browser.c:3158 +msgid "Configure the application preferences" +msgstr "Configurar las preferencias de la aplicación" + +#: ../midori/midori-browser.c:3160 +msgid "_View" +msgstr "_Ver" + +#: ../midori/midori-browser.c:3161 +msgid "_Toolbars" +msgstr "_Barra de herramientas" + +#: ../midori/midori-browser.c:3173 +msgid "Increase the zoom level" +msgstr "Aumentar el nivel de zoom" + +#: ../midori/midori-browser.c:3176 +msgid "Decrease the zoom level" +msgstr "Disminuir el nivel de zoom" + +#: ../midori/midori-browser.c:3179 +msgid "Reset the zoom level" +msgstr "Restablecer el nivel de zoom" + +#: ../midori/midori-browser.c:3181 +#: ../midori/midori-view.c:984 +msgid "View _Source" +msgstr "Ver _código fuente" + +#: ../midori/midori-browser.c:3182 +msgid "View the source code of the page" +msgstr "Ver el código fuente de la página" + +#: ../midori/midori-browser.c:3184 +msgid "View Selection Source" +msgstr "Ver código fuente de la selección" + +#: ../midori/midori-browser.c:3185 +msgid "View the source code of the selection" +msgstr "Ver el código fuente de la selección" + +#: ../midori/midori-browser.c:3189 +msgid "Toggle fullscreen view" +msgstr "Activar/desactivar pantalla completa" + +#: ../midori/midori-browser.c:3191 +msgid "_Go" +msgstr "_Ir" + +#: ../midori/midori-browser.c:3194 +msgid "Go back to the previous page" +msgstr "Retroceder una página" + +#: ../midori/midori-browser.c:3197 +msgid "Go forward to the next page" +msgstr "Avanzar una página" + +#: ../midori/midori-browser.c:3200 +msgid "Go to your homepage" +msgstr "Abrir página de inicio" + +#: ../midori/midori-browser.c:3202 +msgid "Empty Trash" +msgstr "Vaciar la papelera" + +#: ../midori/midori-browser.c:3203 +msgid "Delete the contents of the trash" +msgstr "Borrar el contenido de la papelera" + +#: ../midori/midori-browser.c:3205 +#: ../midori/midori-view.c:956 +msgid "Undo Close Tab" +msgstr "Deshacer el cierre de pestaña" + +#: ../midori/midori-browser.c:3206 +msgid "Open the last closed tab" +msgstr "Abrir la última pestaña cerrada" + +#: ../midori/midori-browser.c:3210 +#: ../panels/midori-bookmarks.c:209 +msgid "Add a new bookmark" +msgstr "Añadir un nuevo marcador" + +#: ../midori/midori-browser.c:3213 +msgid "Delete the selected history item" +msgstr "Borrar del historial el elemento seleccionado" + +#: ../midori/midori-browser.c:3216 +msgid "Clear the entire history" +msgstr "Vaciar el historial completo" + +#: ../midori/midori-browser.c:3219 +msgid "Bookmark the selected history item" +msgstr "Añadir a marcadores el elemento seleccionado del historial" + +#: ../midori/midori-browser.c:3221 +msgid "_Tools" +msgstr "_Herramientas" + +#: ../midori/midori-browser.c:3223 +#: ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "_Administrar los motores de búsqueda" + +#: ../midori/midori-browser.c:3224 +msgid "Add, edit and remove search engines..." +msgstr "Añadir, editar y quitar motores de búsqueda..." + +#: ../midori/midori-browser.c:3228 +msgid "_Previous Tab" +msgstr "_Pestaña anterior" + +#: ../midori/midori-browser.c:3229 +msgid "Switch to the previous tab" +msgstr "Cambiar a la pestaña anterior" + +#: ../midori/midori-browser.c:3231 +msgid "_Next Tab" +msgstr "_Pestaña siguiente" + +#: ../midori/midori-browser.c:3232 +msgid "Switch to the next tab" +msgstr "Cambiar a la pestaña siguiente" + +#: ../midori/midori-browser.c:3234 +msgid "_Help" +msgstr "_Ayuda" + +#: ../midori/midori-browser.c:3236 +msgid "_Contents" +msgstr "_Contenido" + +#: ../midori/midori-browser.c:3237 +msgid "Show the documentation" +msgstr "Mostrar la documentación" + +#: ../midori/midori-browser.c:3239 +msgid "_Frequent Questions" +msgstr "_Preguntas frecuentes" + +#: ../midori/midori-browser.c:3240 +msgid "Show the Frequently Asked Questions" +msgstr "Mostrar las preguntas más frecuentes" + +#: ../midori/midori-browser.c:3242 +msgid "_Report a Bug" +msgstr "_Reportar un error" + +#: ../midori/midori-browser.c:3243 +msgid "Open Midori's bug tracker" +msgstr "Abrir el rastreador de errores de Midori" + +#: ../midori/midori-browser.c:3246 +msgid "Show information about the program" +msgstr "Mostrar información sobre el programa" + +#: ../midori/midori-browser.c:3253 +msgid "P_rivate Browsing" +msgstr "_Navegación privada" + +#: ../midori/midori-browser.c:3254 +msgid "Don't save any private data while browsing" +msgstr "No guardar datos durante la navegación privada" + +#: ../midori/midori-browser.c:3259 +msgid "_Menubar" +msgstr "_Barra de menú" + +#: ../midori/midori-browser.c:3260 +msgid "Show menubar" +msgstr "Mostrar la barra de menú" + +#: ../midori/midori-browser.c:3263 +msgid "_Navigationbar" +msgstr "_Barra de navegación" + +#: ../midori/midori-browser.c:3264 +msgid "Show navigationbar" +msgstr "Mostrar la barra de navegación" + +#: ../midori/midori-browser.c:3267 +msgid "Side_panel" +msgstr "_Panel lateral" + +#: ../midori/midori-browser.c:3268 +msgid "Show sidepanel" +msgstr "Mostrar el panel lateral" + +#: ../midori/midori-browser.c:3271 +msgid "_Bookmarkbar" +msgstr "_Barra de marcadores" + +#: ../midori/midori-browser.c:3272 +msgid "Show bookmarkbar" +msgstr "Mostrar la barra de marcadores" + +#: ../midori/midori-browser.c:3275 +msgid "_Transferbar" +msgstr "_Barra de transferencias" + +#: ../midori/midori-browser.c:3276 +msgid "Show transferbar" +msgstr "Mostrar la barra de transferencias" + +#: ../midori/midori-browser.c:3279 +msgid "_Statusbar" +msgstr "_Barra de estado" + +#: ../midori/midori-browser.c:3280 +msgid "Show statusbar" +msgstr "Mostrar la barra de estado" + +#: ../midori/midori-browser.c:3748 +msgid "_Separator" +msgstr "_Separador" + +#: ../midori/midori-browser.c:3755 +msgid "_Location..." +msgstr "_Ubicación..." + +#: ../midori/midori-browser.c:3757 +msgid "Open a particular location" +msgstr "Abrir un lugar" + +#: ../midori/midori-browser.c:3781 +msgid "_Web Search..." +msgstr "_Buscar en la red..." + +#: ../midori/midori-browser.c:3783 +msgid "Run a web search" +msgstr "Realizar una búsqueda en la red" + +#: ../midori/midori-browser.c:3802 +msgid "Reopen a previously closed tab or window" +msgstr "Volver a abrir ventanas o pestañas cerradas" + +#: ../midori/midori-browser.c:3815 +msgid "_Recently visited pages" +msgstr "_Últimas páginas visitadas" + +#: ../midori/midori-browser.c:3817 +msgid "Reopen pages that you visited earlier" +msgstr "Vuelve a abrir las páginas que usted visitó anteriormente" + +#: ../midori/midori-browser.c:3832 +msgid "Show the saved bookmarks" +msgstr "Mostrar los marcadores guardados." + +#: ../midori/midori-browser.c:3845 +msgid "_Window" +msgstr "_Ventana" + +#: ../midori/midori-browser.c:3847 +msgid "Show a list of all open tabs" +msgstr "Mostrar una lista de todas las pesañas abiertas" + +#: ../midori/midori-browser.c:4001 +#: ../midori/midori-preferences.c:597 +msgid "History" +msgstr "Historial" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4050 +msgid "_Inline Find:" +msgstr "_Búsqueda en línea:" + +#: ../midori/midori-browser.c:4071 +msgid "Previous" +msgstr "Anterior" + +#: ../midori/midori-browser.c:4076 +msgid "Next" +msgstr "Siguiente" + +#: ../midori/midori-browser.c:4081 +msgid "Match Case" +msgstr "Sensible mayúsculas " + +#: ../midori/midori-browser.c:4089 +msgid "Highlight Matches" +msgstr "Destacar coincidencias" + +#: ../midori/midori-browser.c:4098 +msgid "Close Findbar" +msgstr "Cerrar la barra de búsqueda" + +#: ../midori/midori-browser.c:4379 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Ajuste no esperado «%s»" + +#: ../midori/midori-panel.c:199 +#: ../midori/midori-panel.c:200 +msgid "Close panel" +msgstr "Cerrar panel" + +#: ../midori/midori-websettings.c:169 +#: ../midori/midori-view.c:1719 +msgid "Blank page" +msgstr "Página en blanco" + +#: ../midori/midori-websettings.c:170 +#: ../midori/midori-websettings.c:461 +msgid "Homepage" +msgstr "Página de inicio" + +#: ../midori/midori-websettings.c:171 +msgid "Last open pages" +msgstr "Últimas páginas visitadas" + +#: ../midori/midori-websettings.c:186 +msgid "Chinese (BIG5)" +msgstr "Chino (BIG5)" + +#: ../midori/midori-websettings.c:187 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japonés (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:188 +msgid "Russian (KOI8-R)" +msgstr "Ruso (KOI8-R)" + +#: ../midori/midori-websettings.c:189 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:190 +msgid "Western (ISO-8859-1)" +msgstr "Occidental (ISO-8859-1)" + +#: ../midori/midori-websettings.c:191 +#: ../midori/midori-websettings.c:263 +msgid "Custom..." +msgstr "Personalizado..." + +#: ../midori/midori-websettings.c:206 +msgid "New tab" +msgstr "Nueva pestaña" + +#: ../midori/midori-websettings.c:207 +msgid "New window" +msgstr "Nueva ventana" + +#: ../midori/midori-websettings.c:208 +msgid "Current tab" +msgstr "Pestaña actual" + +#: ../midori/midori-websettings.c:223 +msgid "Default" +msgstr "Predeterminado" + +#: ../midori/midori-websettings.c:224 +msgid "Icons" +msgstr "Iconos" + +#: ../midori/midori-websettings.c:225 +msgid "Text" +msgstr "Texto" + +#: ../midori/midori-websettings.c:226 +msgid "Both" +msgstr "Ambos" + +#: ../midori/midori-websettings.c:227 +msgid "Both horizontal" +msgstr "Ambos en horizontal" + +#: ../midori/midori-websettings.c:242 +msgid "All cookies" +msgstr "Todas las galletas" + +#: ../midori/midori-websettings.c:243 +msgid "Session cookies" +msgstr "Galletas de la sesión" + +#: ../midori/midori-websettings.c:244 +#: ../panels/midori-addons.c:96 +msgid "None" +msgstr "Ninguna" + +#: ../midori/midori-websettings.c:260 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:261 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:262 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:303 +msgid "Remember last window size" +msgstr "Recordar el tamaño de la última ventana" + +#: ../midori/midori-websettings.c:304 +msgid "Whether to save the last window size" +msgstr "Si se desea recordar el tamaño de la última ventana" + +#: ../midori/midori-websettings.c:312 +msgid "Last window width" +msgstr "Última anchura de la ventana" + +#: ../midori/midori-websettings.c:313 +msgid "The last saved window width" +msgstr "Última anchura de la ventana guardada" + +#: ../midori/midori-websettings.c:321 +msgid "Last window height" +msgstr "Última altura de la ventana" + +#: ../midori/midori-websettings.c:322 +msgid "The last saved window height" +msgstr "Última altura guardada de la ventana " + +#: ../midori/midori-websettings.c:347 +msgid "Last panel position" +msgstr "Última posición del panel" + +#: ../midori/midori-websettings.c:348 +msgid "The last saved panel position" +msgstr "Ultima posición guardada del panel" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:357 +msgid "Last panel page" +msgstr "Última página del panel" + +#: ../midori/midori-websettings.c:358 +msgid "The last saved panel page" +msgstr "Última página guardada del panel" + +#: ../midori/midori-websettings.c:366 +msgid "Last Web search" +msgstr "Última búsqueda en la red" + +#: ../midori/midori-websettings.c:367 +msgid "The last saved Web search" +msgstr "Última búsqueda red guardada" + +#: ../midori/midori-websettings.c:376 +msgid "Show Menubar" +msgstr "Mostrar barra de menú" + +#: ../midori/midori-websettings.c:377 +msgid "Whether to show the menubar" +msgstr "Si se desea mostrar la barra de menú" + +#: ../midori/midori-websettings.c:385 +msgid "Show Navigationbar" +msgstr "Mostrar la barra de navegación" + +#: ../midori/midori-websettings.c:386 +msgid "Whether to show the navigationbar" +msgstr "Si se desea mostrar la barra de navegación" + +#: ../midori/midori-websettings.c:394 +msgid "Show Bookmarkbar" +msgstr "Mostrar la barra de marcadores" + +#: ../midori/midori-websettings.c:395 +msgid "Whether to show the bookmarkbar" +msgstr "Si se desea mostrar la barra de marcadores" + +#: ../midori/midori-websettings.c:403 +msgid "Show Panel" +msgstr "Mostrar el panel" + +#: ../midori/midori-websettings.c:404 +msgid "Whether to show the panel" +msgstr "Si se desea mostrar el panel" + +#: ../midori/midori-websettings.c:412 +msgid "Show Statusbar" +msgstr "Mostrar la barra de estado" + +#: ../midori/midori-websettings.c:413 +msgid "Whether to show the statusbar" +msgstr "Si se desea mostrar la barra de estado" + +#: ../midori/midori-websettings.c:422 +msgid "Toolbar Style" +msgstr "Estilo de la barra de herramientas" + +#: ../midori/midori-websettings.c:423 +msgid "The style of the toolbar" +msgstr "Estilo de la barra de herramientas" + +#: ../midori/midori-websettings.c:432 +msgid "Toolbar Items" +msgstr "Elementos de la barra de herramientas" + +#: ../midori/midori-websettings.c:433 +msgid "The items to show on the toolbar" +msgstr "Los elementos a mostrar en la barra de herramientas" + +#: ../midori/midori-websettings.c:441 +msgid "Compact Sidepanel" +msgstr "Panel lateral compacto" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to make the sidepanel compact" +msgstr "Si se desea hacer compacto el panel lateral" + +#: ../midori/midori-websettings.c:451 +msgid "Load on Startup" +msgstr "Al iniciar Midor cargar:" + +#: ../midori/midori-websettings.c:452 +msgid "What to load on startup" +msgstr "Página que se carga al inicio" + +#: ../midori/midori-websettings.c:462 +msgid "The homepage" +msgstr "Página de inicio" + +#: ../midori/midori-websettings.c:477 +msgid "Show crash dialog" +msgstr "Mostrar diálogo de cuelgue" + +#: ../midori/midori-websettings.c:478 +msgid "Show a dialog after Midori crashed" +msgstr "Mostrar un dialogo despues de que Midori se cuelgue" + +#: ../midori/midori-websettings.c:486 +msgid "Download Folder" +msgstr "Carpeta de descargas" + +#: ../midori/midori-websettings.c:487 +msgid "The folder downloaded files are saved to" +msgstr "Carpeta donde se guardan los archivos descargados" + +#: ../midori/midori-websettings.c:495 +msgid "Download Manager" +msgstr "Gestor de descargas" + +#: ../midori/midori-websettings.c:496 +msgid "An external download manager" +msgstr "Gestor de descargas externo" + +#: ../midori/midori-websettings.c:504 +msgid "Text Editor" +msgstr "Editor de texto" + +#: ../midori/midori-websettings.c:505 +msgid "An external text editor" +msgstr "Editor de textos externo" + +#: ../midori/midori-websettings.c:513 +msgid "Location entry Search" +msgstr "Búsqueda en la barra" + +#: ../midori/midori-websettings.c:514 +msgid "The search to perform inside the location entry" +msgstr "Hacer una búsqueda a partir del contenido de la barra de direcciones" + +#: ../midori/midori-websettings.c:522 +msgid "Preferred Encoding" +msgstr "Codificación preferida" + +#: ../midori/midori-websettings.c:523 +msgid "The preferred character encoding" +msgstr "Codificación de caracteres preferida" + +#: ../midori/midori-websettings.c:533 +msgid "Always Show Tabbar" +msgstr "Siempre mostrar la barra de pestañas" + +#: ../midori/midori-websettings.c:534 +msgid "Always show the tabbar" +msgstr "Siempre mostrar la barra de pestañas" + +#: ../midori/midori-websettings.c:542 +msgid "Close Buttons on Tabs" +msgstr "Botón de cerrar en las pestañas" + +#: ../midori/midori-websettings.c:543 +msgid "Whether tabs have close buttons" +msgstr "Si se desea que las pestañas tengan el botón de cerrar" + +#: ../midori/midori-websettings.c:552 +msgid "Open new pages in" +msgstr "Abrir páginas nuevas en" + +#: ../midori/midori-websettings.c:553 +msgid "Where to open new pages" +msgstr "Donde abrir las páginas nuevas" + +#: ../midori/midori-websettings.c:563 +msgid "Open external pages in" +msgstr "Abrir las páginas externas en" + +#: ../midori/midori-websettings.c:564 +msgid "Where to open externally opened pages" +msgstr "Donde abrir las páginas externas" + +#: ../midori/midori-websettings.c:577 +msgid "Middle click opens Selection" +msgstr "Clic del medio abre la selección" + +#: ../midori/midori-websettings.c:578 +msgid "Load an address from the selection via middle click" +msgstr "Cargar una dirección desde la selección a través del botón del medio del ratón" + +#: ../midori/midori-websettings.c:586 +msgid "Open tabs in the background" +msgstr "Abrir pestañas en segundo plano" + +#: ../midori/midori-websettings.c:587 +msgid "Whether to open new tabs in the background" +msgstr "Si se desea que las nuevas pestañas se abran en segundo plano" + +#: ../midori/midori-websettings.c:595 +msgid "Open Tabs next to Current" +msgstr "Abrir pestañas junto a la actual" + +#: ../midori/midori-websettings.c:596 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Si se desea que las nuevas pestañas se abran al lado de la pestaña actual o después de la última" + +#: ../midori/midori-websettings.c:604 +msgid "Open popups in tabs" +msgstr "Abrir emergentes en pestañas" + +#: ../midori/midori-websettings.c:605 +msgid "Whether to open popup windows in tabs" +msgstr "Si se desea abrir las ventanas emergentes en pestañas" + +#: ../midori/midori-websettings.c:656 +msgid "Zoom Text and Images" +msgstr "Ampliar Textos e Imágenes" + +#: ../midori/midori-websettings.c:657 +msgid "Whether to zoom text and images" +msgstr "Si se amplia texto e imágenes" + +#: ../midori/midori-websettings.c:667 +msgid "Accept cookies" +msgstr "Aceptar galletas" + +#: ../midori/midori-websettings.c:668 +msgid "What type of cookies to accept" +msgstr "Qué tipos de galletas van a ser aceptadas" + +#: ../midori/midori-websettings.c:681 +msgid "Original cookies only" +msgstr "Sólo galletas originales" + +#: ../midori/midori-websettings.c:682 +msgid "Accept cookies from the original website only" +msgstr "Sólo se aceptan las galletas del sitio red original" + +#: ../midori/midori-websettings.c:690 +msgid "Maximum cookie age" +msgstr "Duración máxima de las galletas" + +#: ../midori/midori-websettings.c:691 +msgid "The maximum number of days to save cookies for" +msgstr "Número máximo de días para conservar las galletas" + +#: ../midori/midori-websettings.c:701 +msgid "Remember last visited pages" +msgstr "Recordar las últimas páginas visitadas" + +#: ../midori/midori-websettings.c:702 +msgid "Whether the last visited pages are saved" +msgstr "Si se desea que las últimas páginas visitadas sean recordadas" + +#: ../midori/midori-websettings.c:710 +msgid "Maximum history age" +msgstr "Duración máxima del historial" + +#: ../midori/midori-websettings.c:711 +msgid "The maximum number of days to save the history for" +msgstr "Número máximo de días para conservar el historial" + +#: ../midori/midori-websettings.c:719 +msgid "Remember last form inputs" +msgstr "Recordar lo que se haya ingresado en formularios" + +#: ../midori/midori-websettings.c:720 +msgid "Whether the last form inputs are saved" +msgstr "Si se desea que las últimas entradas de formulario sean recordadas" + +#: ../midori/midori-websettings.c:728 +msgid "Remember last downloaded files" +msgstr "Recordar los últimos archivos descargados" + +#: ../midori/midori-websettings.c:729 +msgid "Whether the last downloaded files are saved" +msgstr "Si se desea que los archivos descargados sean recordados" + +#: ../midori/midori-websettings.c:739 +msgid "Proxy Server" +msgstr "Servidor proxy" + +#: ../midori/midori-websettings.c:740 +msgid "The proxy server used for HTTP connections" +msgstr "Servidor proxy utilizado para conexiones HTTP" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:760 +msgid "Identify as" +msgstr "Identificar como:" + +#: ../midori/midori-websettings.c:761 +msgid "What to identify as to web pages" +msgstr "Identificar como páginas red" + +#: ../midori/midori-websettings.c:781 +msgid "Identification string" +msgstr "Cadena de identificación" + +#: ../midori/midori-websettings.c:782 +msgid "The application identification string" +msgstr "Aplicación de identificación de cadenas" + +#: ../midori/midori-websettings.c:794 +msgid "Cache size" +msgstr "Tamaño del caché" + +#: ../midori/midori-websettings.c:795 +msgid "The allowed size of the cache" +msgstr "Tamaño asignado a la memoria caché" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:608 +#, c-format +msgid "Not found - %s" +msgstr "No se ha encontrado - %s" + +#: ../midori/midori-view.c:888 +msgid "Open Link in New _Tab" +msgstr "Abrir enlace en nueva _pestaña" + +#: ../midori/midori-view.c:911 +msgid "_Save Link destination" +msgstr "_Guardar enlace" + +#: ../midori/midori-view.c:919 +msgid "_Download Link destination" +msgstr "_Descargar enlace" + +#: ../midori/midori-view.c:941 +msgid "Open Address in New _Tab" +msgstr "Abrir dirección en una nueva _pestaña " + +#: ../midori/midori-view.c:1411 +#, c-format +msgid "Inspect page - %s" +msgstr "Inspeccionar la página - %s" + +#: ../midori/midori-view.c:1562 +msgid "Source" +msgstr "Código fuente" + +#: ../midori/midori-view.c:1586 +#, c-format +msgid "Document cannot be displayed" +msgstr "El documento no puede ser mostrado" + +#: ../midori/midori-view.c:1602 +#, c-format +msgid "No documentation installed" +msgstr "No se dispone de documentación instalada" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Preferencias de %s" + +#. Page "General" +#: ../midori/midori-preferences.c:372 +msgid "General" +msgstr "General" + +#: ../midori/midori-preferences.c:373 +msgid "Startup" +msgstr "Inicio" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:422 +msgid "Appearance" +msgstr "Apariencia" + +#: ../midori/midori-preferences.c:423 +msgid "Font settings" +msgstr "Configuración de las fuentes" + +#: ../midori/midori-preferences.c:425 +msgid "Default Font Family" +msgstr "Fuente por defecto" + +#: ../midori/midori-preferences.c:431 +msgid "The default font size used to display text" +msgstr "Tamaño de fuente predeterminado utilizado para mostrar texto" + +#: ../midori/midori-preferences.c:434 +msgid "Minimum Font Size" +msgstr "Tamaño mínimo de fuente" + +#: ../midori/midori-preferences.c:437 +msgid "The minimum font size used to display text" +msgstr "Mínimo tamaño de fuente utilizado para mostrar texto" + +#: ../midori/midori-preferences.c:444 +msgid "Encoding" +msgstr "Codificación" + +#: ../midori/midori-preferences.c:447 +msgid "The character encoding to use by default" +msgstr "Codificación de caracteres a utilizar por defecto" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:454 +msgid "Behavior" +msgstr "Comportamiento" + +#: ../midori/midori-preferences.c:455 +msgid "Features" +msgstr "Características" + +#: ../midori/midori-preferences.c:458 +#: ../extensions/statusbar-features.c:40 +msgid "Load images automatically" +msgstr "Cargar imágenes automáticamente" + +#: ../midori/midori-preferences.c:459 +msgid "Load and display images automatically" +msgstr "Cargar y mostrar imágenes automáticamente" + +#: ../midori/midori-preferences.c:462 +msgid "Shrink images automatically" +msgstr "Reducir imágenes automáticamente" + +#: ../midori/midori-preferences.c:463 +msgid "Automatically shrink standalone images to fit" +msgstr "Reducir imágenes automáticamente independientemente si caben" + +#: ../midori/midori-preferences.c:466 +msgid "Print background images" +msgstr "Imprimir imágenes de fondo" + +#: ../midori/midori-preferences.c:467 +msgid "Whether background images should be printed" +msgstr "Si se desea imprimir las imágenes de fondo" + +#: ../midori/midori-preferences.c:470 +msgid "Resizable text areas" +msgstr "Áreas de texto dimensionables" + +#: ../midori/midori-preferences.c:471 +msgid "Whether text areas are resizable" +msgstr "Si se desea que las áreas de texto sean dimensionables" + +#: ../midori/midori-preferences.c:474 +#: ../extensions/statusbar-features.c:47 +msgid "Enable scripts" +msgstr "Habilitar scripts" + +#: ../midori/midori-preferences.c:475 +msgid "Enable embedded scripting languages" +msgstr "Habilitar script de lenguajes embebidos" + +#: ../midori/midori-preferences.c:478 +#: ../extensions/statusbar-features.c:54 +msgid "Enable plugins" +msgstr "Habilitar complementos" + +#: ../midori/midori-preferences.c:479 +msgid "Enable embedded plugin objects" +msgstr "Habilitar el complemento de objetos embebidos" + +#: ../midori/midori-preferences.c:482 +msgid "Enforce 96 dots per inch" +msgstr "Aplicar 96 puntos por pulgada" + +#: ../midori/midori-preferences.c:483 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Aplicar una densidad de puntos de video de 96 DPI" + +#: ../midori/midori-preferences.c:486 +msgid "Enable developer tools" +msgstr "Habilitar herramientas desarrollado" + +#: ../midori/midori-preferences.c:487 +msgid "Enable special extensions for developers" +msgstr "Habilitar extensiones especiales para desarrolladores" + +#. Page "Interface" +#: ../midori/midori-preferences.c:497 +msgid "Interface" +msgstr "Interfaz" + +#: ../midori/midori-preferences.c:499 +msgid "Navigationbar" +msgstr "Barra de navegación" + +#: ../midori/midori-preferences.c:505 +msgid "Browsing" +msgstr "Navegación" + +#: ../midori/midori-preferences.c:542 +#: ../midori/midori-preferences.c:543 +msgid "Network" +msgstr "Red" + +#: ../midori/midori-preferences.c:565 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:572 +msgid "Privacy" +msgstr "Privacidad" + +#: ../midori/midori-preferences.c:579 +msgid "Web Cookies" +msgstr "Galletas de informacion" + +#: ../midori/midori-preferences.c:592 +#: ../midori/midori-preferences.c:604 +msgid "days" +msgstr "días" + +#: ../midori/midori-searchaction.c:455 +#: ../katze/katze-arrayaction.c:279 +msgid "Empty" +msgstr "Vacío" + +#: ../midori/midori-searchaction.c:792 +msgid "Add search engine" +msgstr "Añadir un motor de búsqueda" + +#: ../midori/midori-searchaction.c:792 +msgid "Edit search engine" +msgstr "Editar motor de búsqueda" + +#: ../midori/midori-searchaction.c:820 +msgid "_Name:" +msgstr "_Nombre:" + +#: ../midori/midori-searchaction.c:864 +msgid "_Icon (name or file):" +msgstr "_Icono (nombre o archivo):" + +#: ../midori/midori-searchaction.c:878 +msgid "_Token:" +msgstr "_Abreviatura:" + +#: ../midori/midori-searchaction.c:1055 +msgid "Manage Search Engines" +msgstr "Administrar los motores de búsqueda" + +#: ../midori/sokoke.c:101 +#: ../midori/sokoke.c:113 +msgid "Could not run external program." +msgstr "No se pudo ejecutar la aplicación externa." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:354 +msgid "Warning: You are using a superuser account!" +msgstr "Advertencia: Usted está utilizando una cuenta de superusuario!" + +#: ../midori/gjs.c:742 +#: ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s no tiene la propiedad «%s»" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s no puede ser asignado a %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s no se puede acceder" + +#: ../panels/midori-addons.c:97 +#: ../panels/midori-addons.c:143 +msgid "Userscripts" +msgstr "Scripts de usuario" + +#: ../panels/midori-addons.c:98 +#: ../panels/midori-addons.c:145 +msgid "Userstyles" +msgstr "Estilos de usuario" + +#: ../panels/midori-addons.c:1005 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Activar" + +#: ../panels/midori-addons.c:1014 +#: ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Desactivar" + +#: ../panels/midori-bookmarks.c:100 +msgid "Bookmarks" +msgstr "Marcadores" + +#: ../panels/midori-bookmarks.c:217 +msgid "Edit the selected bookmark" +msgstr "Editar el marcador seleccionado" + +#: ../panels/midori-bookmarks.c:225 +msgid "Delete the selected bookmark" +msgstr "Borrar el marcador seleccionado" + +#: ../panels/midori-bookmarks.c:529 +msgid "Separator" +msgstr "Separador" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Consola" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Extensiones" + +#: ../panels/midori-plugins.c:87 +#: ../extensions/statusbar-features.c:52 +msgid "Plugins" +msgstr "Complementos" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "No se pudo cargar el ícono llamado «%s»" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "No se pudo cargar el ícono stock «%s»" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Los cuadros de animación estan rotos" + +#: ../katze/katze-utils.c:180 +#: ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "La propiedad «%s» no es válida para %s" + +#: ../katze/katze-utils.c:209 +#: ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "Elegir archivo" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "Elegir carpeta" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "Gestos del Ratón" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "Controlar Midori moviendo el ratón" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 +#: ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "Anclar página" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "_Anclar página" + +#: ../extensions/statusbar-features.c:38 +msgid "Images" +msgstr "Imágenes" + +#: ../extensions/statusbar-features.c:45 +msgid "Scripts" +msgstr "Scripts" + +#~ msgid "Manage search engines" +#~ msgstr "Administrar los motores de búsqueda" +#~ msgid "URIs" +#~ msgstr "URIs" +#~ msgid "[URIs]" +#~ msgstr "[URIs]" +#~ msgid "_URL:" +#~ msgstr "_URL " +#~ msgid "Root" +#~ msgstr "Raíz" +#~ msgid "HTTP Proxy" +#~ msgstr "HTTP Proxy" +#~ msgid "Open URL in New _Tab" +#~ msgstr "Abrir URL en una pestaña _nueva" + diff --git a/po/et.po b/po/et.po new file mode 100644 index 00000000..577cde2d --- /dev/null +++ b/po/et.po @@ -0,0 +1,1665 @@ +# Estonian translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Kristjan Siimson 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.0.21\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: \n" +"Last-Translator: Kristjan Siimson \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Estonian\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Kergekaaluline veebibrauser" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Veebibrauser" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Järjehoidja" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "Järjehoidjad" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Lisa järjehoidja" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Konsool" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Laiendid" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Ajalugu" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Kodulehekülg" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Kasutajaskriptid" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "Kasutaja_stiilid" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Uus _kaart" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Ülekanded" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Suletud kaardid ja aknad" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Uus _aken" + +#: ../midori/main.c:143 +#, fuzzy, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Seadistust ei saanud laadida. %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "\"%s\" on vale %s väärtus" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, fuzzy, c-format +msgid "Invalid configuration value '%s'" +msgstr "Käsitlemata seadistuste väärtus \"%s\"" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Faili ei leitud." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Väärvormistatud dokument." + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Kirjutamine ei õnnestunud." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Ülekanded" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Sessiooni ei saanud salvestada. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Näita programmi versiooni" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "URI-d" + +#: ../midori/main.c:1335 +msgid "[URIs]" +msgstr "[URI-d]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Märkused, ettepanekud ja vead palun sinna:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Kontrolli uusi versioone:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Midori juba töötab, kuid ei vasta.\n" + +#: ../midori/main.c:1447 +#, fuzzy, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Järjehoidjaid ei saanud laadida. %s\n" + +#: ../midori/main.c:1463 +#, fuzzy, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Sessiooni ei saanud laadida. %s\n" + +#: ../midori/main.c:1477 +#, fuzzy, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Prügi ei saanud laadida. %s\n" + +#: ../midori/main.c:1491 +#, fuzzy, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Prügi ei saanud laadida. %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Tekkisid järgnevad vead:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Otsingumootoreid ei saanud salvestada. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Järjehoidjaid ei saanud salvestada. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Prügi ei saanud salvestada. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Seadistust ei saanud salvestada. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Laadi käesolev lehekülg uuesti" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Peata käesoleva lehekülje laadimine" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% laaditud" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Ootamatu toiming \"%s\"." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Uus järjehoidja" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Muuda järjehoidjat" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Pealkiri:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Kirjeldus:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Kataloog:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Juur" + +#: ../midori/midori-browser.c:668 +#, fuzzy +msgid "Save file as" +msgstr "Salvesta faili" + +#: ../midori/midori-browser.c:1248 +#, fuzzy +msgid "Open file" +msgstr "Ava fail" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Ava uuel _kaardil" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Ava uues _aknas" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Eraldaja" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Kergekaaluline veebibrauser." + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Kristjan Siimson " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Fail" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Ava uus aken" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Ava uus kaart" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Ava fail" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Salvesta faili" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Sulge kaart" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Sulge käesolev kaart" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "S_ulge aken" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Sulge see aken" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Trüki käesolev lehekülg" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Välju rakendusest" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Redigeerimine" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Lõika valitud tekst" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Kopeeri valitud tekst" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Aseta tekst lõikepuhvrist" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Kustuta valitud tekst" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Vali kõik tekst" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Leia leheküljelt sõna või fraas" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Otsi _järgmist" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Leia järgmine sõna või fraasi esinemine" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Otsi _eelmist" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Leia eelmine sõna või fraasi esinemine" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Kiirotsing" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Kiirelt hüppa sõna või fraasini" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Seadista rakenduse eelistused" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Vaade" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Tööriistaribad" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Tõsta suurendusastet" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Kahanda suurendusastet" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Tühista suurendusaste" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Vaata _lähtekoodi" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Vaata lehekülje lähtekoodi" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Vaata valiku lähtekoodi" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Vaata valiku lähtekoodi" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Vaheta täisekraanivaadet" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Mine" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Mine tagasi eelmisele leheküljele" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Mine edasi järgmisele leheküljele" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Mine oma koduleheküljele" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Tühjenda prügi" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Kustuta prügi sisu" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Võta tagasi kaardi sulgemine" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Ava viimati suletud kaart" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Lisa uus järjehoidja" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Muuda valitud järjehoidjat" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Kustuta valitud järjehoidja" + +#: ../midori/midori-browser.c:3185 +#, fuzzy +msgid "Delete the selected history item" +msgstr "Kustuta valitud tekst" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "" + +#: ../midori/midori-browser.c:3191 +#, fuzzy +msgid "Bookmark the selected history item" +msgstr "Kopeeri valitud tekst" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Tööriistad" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Halda otsingumootoreid" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Lisa, muuda ja eemalda otsingumootoreid" + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Eelmine kaart" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Lülitu eelmisele kaardile" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "_Järgmine kaart" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Lülitu järgmisele kaardile" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Abi" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Sisukord" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Näita dokumentatsiooni" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Näita teavet programmi kohta" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "_Isiklik lehitsemine" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Ära salvesta lehitsemisel isiklike andmeid" + +#: ../midori/midori-browser.c:3231 +#, fuzzy +msgid "_Menubar" +msgstr "Menüüriba" + +#: ../midori/midori-browser.c:3232 +#, fuzzy +msgid "Show menubar" +msgstr "Menüüriba" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "_Navigatsiooniriba" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Näita navigatsiooniriba" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Külg_paneel" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Näita külgpaneeli" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "_Järjehoidjariba" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Näita järjehoidjariba" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "_Ülekanderiba" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Näita ülekanderiba" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "_Olekuriba" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Näita olekuriba" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Asukoht..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Ava kindel asukoht" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_Veebiotsing..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Käivita veebiotsing" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Ava uuesti varem suletud kaart või aken" + +#: ../midori/midori-browser.c:3729 +#, fuzzy +msgid "_Recently visited pages" +msgstr "Jäta meelde viimati külastatud leheküljed" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "" + +#: ../midori/midori-browser.c:3746 +#, fuzzy +msgid "Show the saved bookmarks" +msgstr "Ava valitud järjehoidja" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Aken" + +#: ../midori/midori-browser.c:3761 +#, fuzzy +msgid "Show a list of all open tabs" +msgstr "Näita ülevaadet kõikidest avatud kaartidest" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Järjehoidjad" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Ajalugu" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "_Reasisene otsing:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Tõusutundlik" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "Tõsta sobivused esile" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Sulge otsinguriba" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Ootamatu seade \"%s\"" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Sulge paneel" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Tühi lehekülg" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Kodulehekülg" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Viimati avatud leheküljed" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Hiina (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Jaapani (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Vene (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Lääne (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Kohandatud..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Uus kaart" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Uus aken" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Käesolev kaart" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Vaikimisi" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Ikoonid" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Tekst" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Mõlemad" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Mõlemad rõhtsed" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Kõik küpsised" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Sessiooni küpsised" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Pole" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Jäta meelde viimane akna suurus" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Kas salvestada viimane akna suurus" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Viimane akna laius" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Viimati salvestatud akna suurus" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Viimane akna kõrgus" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Viimati salvestatud akna kõrgus" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Viimane paneeli asukoht" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Viimati salvestatud paneeli asukoht" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Viimane paneeli lehekülg" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Viimati salvestatud paneeli lehekülg" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Viimane veebiotsing" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Viimati salvestatud veebiotsing" + +#: ../midori/midori-websettings.c:302 +#, fuzzy +msgid "Show Menubar" +msgstr "Menüüriba" + +#: ../midori/midori-websettings.c:303 +#, fuzzy +msgid "Whether to show the menubar" +msgstr "Kas näidata olekuriba" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Näita navigatsiooniriba" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Kas näidata navigatsiooniriba" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Näita järjehoidjariba" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Kas näidata järjehoidjariba" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Näita paneeli" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Kas näidata paneeli" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Näita olekuriba" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Kas näidata olekuriba" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Tööriistariba stiil" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Tööriistariba stiil" + +#: ../midori/midori-websettings.c:358 +#, fuzzy +msgid "Toolbar Items" +msgstr "Tööriistariba stiil" + +#: ../midori/midori-websettings.c:359 +#, fuzzy +msgid "The items to show on the toolbar" +msgstr "Tööriistariba stiil" + +#: ../midori/midori-websettings.c:367 +#, fuzzy +msgid "Compact Sidepanel" +msgstr "Külg_paneel" + +#: ../midori/midori-websettings.c:368 +#, fuzzy +msgid "Whether to make the sidepanel compact" +msgstr "Kas näidata paneeli" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Laadi tööleminekul" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Mida tööleminekul laadida" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Kodulehekülg" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Allalaadimise kataloog" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "Kataloog kuhu salvestatakse allalaaditud failid" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "Allalaadimise haldur" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Väline allalaadimise haldur" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Asukoha sissekande otsing" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "Otsing mida viia läbi asukoha sissekandes" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Eelistatud kodeering" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Eelistatud märkide kodeering" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Sulgemisnupud kaartidel" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Kas kaartidel on sulgemisnupud" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Ava uued leheküljed" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Kus avada uued leheküljed" + +#: ../midori/midori-websettings.c:473 +#, fuzzy +msgid "Open external pages in" +msgstr "Ava uued leheküljed" + +#: ../midori/midori-websettings.c:474 +#, fuzzy +msgid "Where to open externally opened pages" +msgstr "Kus avada uued leheküljed" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Keskmine klõps avab valiku" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Laadi keskmise klõpsuga valikust URL" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Ava kaardid taustal" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Kas avada uued kaardid taustal" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "Ava kaardid käesoleva kõrval" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Kas avada uued kaardid käesoleva või viimase kaardi kõrval" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Ava hüpikaknad kaartides" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Kas avada hüpikaknad kaartides" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Võta küpsised vastu" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Mis liiki küpsised vastu võtta" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Ainult algupärased küpsised" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Võta vastu küpsised ainult algupäraselt veebileheküljelt" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Suurim küpsise vanus" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Suurim arv päevasid küpsiste salvestamiseks" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Jäta meelde viimati külastatud leheküljed" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Kas viimati külastatud leheküljed on salvestatud" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Suurim ajaloo vanus" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Suurim arv päevasid ajaloo salvestamiseks" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Jäta meelde viimased ankeedisisendid" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Kas viimased ankeedisisendid salvestatakse" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Jäta meelde viimati allalaaditud failid" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Kas viimati allalaaditud failid on salvestatud" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "HTTP proksi" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "HTTP ühendusteks kasutatav proksi" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Vahemälu suurus" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Lubatud vahemälu suurus" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Ava link uues _kaardis" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Ava URL uues _kaardis" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Lähtekood" + +#: ../midori/midori-view.c:1527 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Näita dokumentatsiooni" + +#: ../midori/midori-preferences.c:87 +#, fuzzy, c-format +msgid "Preferences for %s" +msgstr "%s eelistused" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Üldine" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Tööleminek" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Välimus" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Fondi seadistused" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Käitumine" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Võimalused" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +#, fuzzy +msgid "Enable scripts" +msgstr "Kasutajaskriptid" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Liides" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Navigatsiooniriba" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Lehitsemine" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Võrk" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "" + +#: ../midori/midori-preferences.c:500 +#, fuzzy +msgid "Web Cookies" +msgstr "Võta küpsised vastu" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Tühi" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Lisa otsingumootor" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Muuda otsingumootorit" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Nimi:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Ikoon (nimi või fail):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "_Luba:" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Halda otsingumootoreid" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Välist programmi ei saanud käivitada" + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Hoiatus: Sa kasutad superkasutaja kontot!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Juhtus tundmatu viga." + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s ei ühtegi väärtust \"%s\"" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s ei saa määrata %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s ei saa ligi" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Kasutajaskriptid" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Kasutajastiilid" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Lülita sisse" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Lülita välja" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsool" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Laiendid" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Nimetatud ikooni \"%s\" ei saanud laadida" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Varuikooni \"%s\" ei saanud laadida" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Animatsioonikaadrid on vigased" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Omadus \"%s\" ei ole õige %s jaoks" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Vali fail" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Vali kataloog" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Lehehoidja" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Lehehoidja" + +#: ../extensions/statusbar-features.c:30 +#, fuzzy +msgid "Images" +msgstr "Lehekülg" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "Kasutajaskriptid" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Select _All" +#~ msgstr "Vali _kõik" + +#~ msgid "_Fullscreen" +#~ msgstr "_Täisekraan" + +#~ msgid "_Leave Fullscreen" +#~ msgstr "_Lahku täisekraanist" + +#~ msgid "Unknown argument." +#~ msgstr "Tundmatu argument." + +#~ msgid "Failed to setup interface." +#~ msgstr "Liidese seadistamine ei õnnestunud." + +#~ msgid "Settings" +#~ msgstr "Seadistused" + +#~ msgid "The associated settings" +#~ msgstr "Seostatud seadistused" + +#~ msgid "The bookmarks folder, containing all bookmarks" +#~ msgstr "Järjehoidjate kataloog, sisaldab kõiki järjehoidjaid" + +#~ msgid "Trash" +#~ msgstr "Prügi" + +#~ msgid "The trash, collecting recently closed tabs and windows" +#~ msgstr "Prügi, kogub hiljuti suletud kaarte ja aknaid" + +#~ msgid "Search Engines" +#~ msgstr "Otsingumootorid" + +#~ msgid "The list of search engines" +#~ msgstr "Otsingumootorite loetelu" + +#~ msgid "Browser" +#~ msgstr "Brauser" + +#~ msgid "The current browser" +#~ msgstr "Praegune brauser" + +#~ msgid "Browser Count" +#~ msgstr "Brausereid" + +#~ msgid "The current number of browsers" +#~ msgstr "Praegune brauserite arv" + +#~ msgid "Web Widget" +#~ msgstr "Veebividin" + +#~ msgid "The assigned web widget" +#~ msgstr "Määratud veebividin" + +#~ msgid "Kind" +#~ msgstr "Liik" + +#~ msgid "The kind of addons" +#~ msgstr "Lisandite liik" + +#~ msgid "The navigationbar" +#~ msgstr "Navigatsiooniriba" + +#~ msgid "URI" +#~ msgstr "URI" + +#~ msgid "The current URI" +#~ msgstr "Käesolev URI" + +#~ msgid "Tab" +#~ msgstr "Kaart" + +#~ msgid "The current tab" +#~ msgstr "Käesolev kaart" + +#~ msgid "Statusbar" +#~ msgstr "Olekuriba" + +#~ msgid "The statusbar" +#~ msgstr "Olekuriba" + +#~ msgid "Statusbar Text" +#~ msgstr "Olekuriba tekst" + +#~ msgid "The text that is displayed in the statusbar" +#~ msgstr "Olekuribal näidatav tekst" + +#~ msgid "The list of search engines to be used for web search" +#~ msgstr "Loetelu veebiotsinguks kasutatavatest otsingumootoritest" + +#~ msgid "Pa_ge Setup" +#~ msgstr "Lehekülje _seadistamine" + +#~ msgid "Show a preview of the printed page" +#~ msgstr "Näita trükitava lehekülje eelvaadet" + +#~ msgid "Undo the last modification" +#~ msgstr "Võta viimane muudatus tagasi" + +#~ msgid "Redo the last modification" +#~ msgstr "Tee viimane muudatus uuesti" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Ava lehe_hoidjas..." + +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Ava käesolev lehekülg lehehoidjas" + +#~ msgid "_Manage Bookmarks" +#~ msgstr "_Halda järjehoidjaid" + +#~ msgid "Add, edit and remove bookmarks..." +#~ msgstr "Lisa, muuda ja eemalda järjehoidjaid..." + +#~ msgid "Open the selected bookmark in a new tab" +#~ msgstr "Ava valitud järjehoidja uuel kaardil" + +#~ msgid "Open the selected bookmark in a new window" +#~ msgstr "Ava valitud järjehoidja uues aknas" + +#~ msgid "Tab _Overview" +#~ msgstr "Kaardi _ülevaade" + +#~ msgid "_Work Offline" +#~ msgstr "_Tööta ühenduseta" + +#~ msgid "Work without a network connection" +#~ msgstr "Tööta ilma võrguühenduseta." + +#~ msgid "Shadow Type" +#~ msgstr "Varju liik" + +#~ msgid "Appearance of the shadow around each panel" +#~ msgstr "Varju väljanägemine iga paneeli ümber" + +#~ msgid "Menu" +#~ msgstr "Menüü" + +#~ msgid "Menu to hold panel items" +#~ msgstr "Menüü paneelielementide hoidmiseks" + +#~ msgid "The index of the current page" +#~ msgstr "Käesoleva lehekülje indeks" + +#~ msgid "Last pageholder URI" +#~ msgstr "Viimase lehehoidja URI" + +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Viimati lehehoidjas avatud URI" + +#~ msgid "Show New Tab" +#~ msgstr "Näita uut kaarti" + +#~ msgid "Show the New Tab button in the toolbar" +#~ msgstr "Näita tööriistaribas uue kaardi nuppu" + +#~ msgid "Show Homepage" +#~ msgstr "Näita kodulehekülge" + +#~ msgid "Show the Homepage button in the toolbar" +#~ msgstr "Näita tööriistaribas kodulehekülje nuppu" + +#~ msgid "Show Web search" +#~ msgstr "Näita veebiotsingut" + +#~ msgid "Show the Web search entry in the toolbar" +#~ msgstr "Näita tööriistaribas veebiotsingu sissekannet" + +#~ msgid "Show Trash" +#~ msgstr "Näita prügi" + +#~ msgid "Show the Trash button in the toolbar" +#~ msgstr "Näita tööriistaribas prügi nuppu" + +#~ msgid "Tab Label Size" +#~ msgstr "Kaardimärgendi suurus" + +#~ msgid "The desired tab label size" +#~ msgstr "Soovitud kaardimärgendi suurus" + +#~ msgid "Load Provisional" +#~ msgstr "Laadi esialgne" + +#~ msgid "Load Committed" +#~ msgstr "Laadi üleantud" + +#~ msgid "Load Finished" +#~ msgstr "Laadimine lõpetatud" + +#~ msgid "The URI of the currently loaded page" +#~ msgstr "Käesoleva laaditud lehekülje URI" + +#~ msgid "The title of the currently loaded page" +#~ msgstr "Käesoleva laaditud lehekülje pealkiri" + +#~ msgid "The current loading progress" +#~ msgstr "Käesoleva laadimise edenemine" + +#~ msgid "The current loading status" +#~ msgstr "Käesoleva laadimise olek" + +#~ msgid "Download Link with Download _Manager" +#~ msgstr "Laadi link allalaadimise halduriga" + +#~ msgid "Settings instance to provide properties" +#~ msgstr "Omadustega varustav seadistuste instants" + +#~ msgid "Current Item" +#~ msgstr "Käesolev element" + +#~ msgid "The currently selected item" +#~ msgstr "Hetkel valitud element" + +#~ msgid "Dialog" +#~ msgstr "Dialoog" + +#~ msgid "A dialog to manage search engines" +#~ msgstr "Dialoog otsingumootorite haldamiseks" + +#~ msgid "Icon size" +#~ msgstr "Ikooni suurus" + +#~ msgid "Symbolic size to use for the animation" +#~ msgstr "Sümboolne suurus animeerimisel kasutamiseks" + +#~ msgid "Icon Name" +#~ msgstr "Ikooni nimi" + +#~ msgid "The name of an icon containing animation frames" +#~ msgstr "Animatsioonikaadreid sisaldava ikooni nimi" + +#~ msgid "Pixbuf" +#~ msgstr "Pixbuf" + +#~ msgid "A GdkPixbuf containing animation frames" +#~ msgstr "Animatsioonikaadreid sisaldav GdkPixpuf" + +#~ msgid "Animated" +#~ msgstr "Animeeritud" + +#~ msgid "Whether the throbber should be animated" +#~ msgstr "Kas tuksuja peaks olema animeeritud" + +#~ msgid "Static Icon Name" +#~ msgstr "Staatilise ikooni nimi" + +#~ msgid "The name of an icon to be used as the static image" +#~ msgstr "Staatilise pildina kasutatava ikooni nimi" + +#~ msgid "Static Pixbuf" +#~ msgstr "Staatiline Pixbuf" + +#~ msgid "A GdkPixbuf to be used as the static image" +#~ msgstr "Staatilise pildina kasutatav GdkPixbuf" + +#~ msgid "Static Stock ID" +#~ msgstr "Staatilise varutunnus" + +#~ msgid "The stock ID of an icon to be used as the static image" +#~ msgstr "Staatilise pildina kasutatava ikooni varutunnus" + +#~ msgid "Icon '%s' couldn't be loaded" +#~ msgstr "Ikooni \"%s\" ei saanud laadida" + +#~ msgid "Name" +#~ msgstr "Nimi" + +#~ msgid "The name of the item" +#~ msgstr "Elemendi nimi" + +#~ msgid "The descriptive text of the item" +#~ msgstr "Elemendi kirjeldav tekst" + +#~ msgid "The URI of the item" +#~ msgstr "Elemendi URI" + +#~ msgid "Icon" +#~ msgstr "Ikoon" + +#~ msgid "The icon of the item" +#~ msgstr "Elemendi ikoon" + +#~ msgid "Token" +#~ msgstr "Luba" + +#~ msgid "The token of the item" +#~ msgstr "Elemendi luba" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 00000000..ea932e92 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,1410 @@ +# Finnish translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Elias Julkunen , 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-12-20 20:16+0200\n" +"Last-Translator: Elias Julkunen \n" +"Language-Team: Finnish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Kevyt verkkoselain" + +#: ../midori.desktop.in.h:2 +#: ../midori/main.c:1338 +#: ../midori/main.c:1347 +#: ../midori/main.c:1370 +#: ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Verkkoselain" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Kirjanmerkki" + +#: ../midori/main.c:87 +#: ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Kirjanmerkit" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Lisää kirjanmerkki" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Konsoli" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Liitännäiset" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Historia" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Kotisivu" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "Käyttäjän _skriptit" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "Käyttäjän _tyylit" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Uusi _välilehti" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Siirrot" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Suljetut välilehdet ja ikkunat" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Uusi _ikkuna" + +#: ../midori/main.c:143 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Asetuksia ei voitu ladata: %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Arvo ”%s” ei kelpaa kohteelle %s" + +#: ../midori/main.c:205 +#: ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Epäkelpo asetusarvo ”%s”" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Tiedostoa ei löytynyt" + +#: ../midori/main.c:540 +#: ../midori/main.c:549 +msgid "Malformed document." +msgstr "Virheellinen dokumentti." + +#: ../midori/main.c:571 +#: ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Tietokantaa ei voitu avata: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Historiatietuetta ei voitu poistaa: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Historiaa ei voitu tyhjentää: %s\n" + +#: ../midori/main.c:714 +#: ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Historiatietuetta ei voitu lisätä: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Vanhoja historiatietueita ei voitfu poistaa: %s\n" + +#: ../midori/main.c:976 +#: ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Kirjoitus epäonnistui." + +#: ../midori/main.c:1000 +#: ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Siirrot" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Istuntoa ei voitu tallentaa. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "Suorita annettu tiedostonimi javascriptinä" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Näytä sovelluksen versio" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "URI-osoitteet" + +#: ../midori/main.c:1335 +msgid "[URIs]" +msgstr "[URI-osoitteet]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Voit lähettää kommentteja, ehdotuksia ja tietoa ohjelmavirheistä osoitteeseen:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Kaäy katsomassa uusia versioita osoittesta:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "Tiedostonimeä ei annettu" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Midori on jo käynnissä, muttei vastaa.\n" + +#: ../midori/main.c:1447 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Kirjanmerkkejä ei voitu ladata: %s\n" + +#: ../midori/main.c:1463 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Istuntoa ei voitu ladata: %s\n" + +#: ../midori/main.c:1477 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Roskakoria ei voitu ladata: %s\n" + +#: ../midori/main.c:1491 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Historiaa ei voitu ladata: %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Seuraavat virheet tapahtuivat:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "_Ohita" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Hakukoneita ei voitu tallentaa. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Kirjanmerkkejä ei voitu tallentaa. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Roskakoria ei voitu tallentaa. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Asetuksia ei voitu tallentaa. %s" + +#: ../midori/midori-browser.c:249 +#: ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Lataa nykyinen sivu uudelleen" + +#: ../midori/midori-browser.c:261 +#: ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Keskeytä nykyisen sivun lataaminen" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d %% ladattu" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Odottamaton toimenpide ”%s”." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Uusi kirjanmerkki" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Muokkaa kirjanmerkkiä" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Nimi:" + +#: ../midori/midori-browser.c:543 +#: ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Kuvaus:" + +#: ../midori/midori-browser.c:562 +#: ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL-osoite:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Kansio:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Juuri" + +#: ../midori/midori-browser.c:668 +msgid "Save file as" +msgstr "Tallenna tiedosto nimellä" + +#: ../midori/midori-browser.c:1248 +msgid "Open file" +msgstr "Avaa tiedosto" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Avaa uudessa _välilehdessä" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Avaa uudessa _ikkunassa" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Erotin" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "Viikko sitten" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "%d päivää sitten" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "Tänään" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "Eilen" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Kevyt verkkoselain" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Elias Julkunen " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "Haluatko varmasti tyhjentää koko historian?" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Tiedosto" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Avaa uusi ikkuna" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Avaa uusi välilehti" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Avaa tiedosto" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Tallenna tiedostoon" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "Sulje _välilehti" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Sulje nykyinen välilehti" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "Sulje _ikkuna" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Sulje tämä ikkuna" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Tulosta nykyinen sivu" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Poistu sovelluksesta" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Muokkaa" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Leikkaa valittu teksti" + +#: ../midori/midori-browser.c:3096 +#: ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Kopioi valittu teksti" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Liitä teksti leikepöydältä" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Poista valittu teksti" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Valitse kaikki tekstit" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Etsi sana tai lause sivulta" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Etsi _seuraava" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Etsi seuraavan sanan tai lauseen esiintymä" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Etsi _edellinen" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Etsi edellisen sanan tai lauseen esiintymä" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Pikahaku" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Hyppää nopeasti sanaan tai lauseeseen" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Muokkaa sovelluksen asetuksia" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Näytä" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Työkalupalkit" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Suurenna" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Pienennä" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Palauta suurennustaso" + +#: ../midori/midori-browser.c:3147 +#: ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Näytä _lähdekoodi" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Näytä sivun lähdekoodi" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Näytä valinnan lähdekoodi" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Näytä valinnan lähdekoodi" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Vaihda kokonäyttötilan välillä" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Siirry" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Siirry takaisin edelliselle sivulle" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Siirry eteenpäin seuraavalle sivulle" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Siirry kotisivulle" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Tyhjennä roskakori" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Poista roskakorin sisältö" + +#: ../midori/midori-browser.c:3171 +#: ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Kumoa välilehden sulkeminen" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Avaa viimeisin suljettu välilehti" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Lisää uusi kirjanmerkki" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Muokkaa valittua kirjanmerkkiä" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Poista valittu kirjanmerkki" + +#: ../midori/midori-browser.c:3185 +msgid "Delete the selected history item" +msgstr "Poista valittu historiatietue" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "Tyhjennä koko historia" + +#: ../midori/midori-browser.c:3191 +msgid "Bookmark the selected history item" +msgstr "Lisää valittu histoariatietue kirjanmerkkeihin" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Työkalut" + +#: ../midori/midori-browser.c:3195 +#: ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Hallitse hakukoneita" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Lisää, muokkaa ja poista hakukoneita..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Edellinen välilehti" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Vaihda edelliseen välilehteen" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "_Seuraava välilehti" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Vaihda seuraavaan välilehteen" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Ohje" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Sisältö" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Näyttä dokumentaatio" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "_Usein kysytyt kysymykset" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "Näytä usein kysytyt kysymykset" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "_Ilmoita ohjelmavirheestä" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "Avaa Midorin ohjelmavirhehallinta" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Näytää tietoja sovelluksesta" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "_Yksityinen selaaminen" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Ei tallenna mitään yksityisyystietoja selatessa" + +#: ../midori/midori-browser.c:3231 +msgid "_Menubar" +msgstr "_Valikkopalkki" + +#: ../midori/midori-browser.c:3232 +msgid "Show menubar" +msgstr "Näytä valikkopalkki" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "_Navigointipalkki" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Näytä navigointipalkki" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "_Sivupaneeli" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Näytä sivupaneeli" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "_Kirjanmerkkipalkki" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Näytä kirjanmerkkipalkki" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "_Siirtopalkki" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Näytä siirtopalkki" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "_Tilapalkki" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Näytä tilapalkki" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Sijainti..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Avaa tarkka sijainti" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_WWW-haku" + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Suorita WWW-haku" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Avaa uudelleen aikaisemmin suljettu välilehti tai ikkuna" + +#: ../midori/midori-browser.c:3729 +msgid "_Recently visited pages" +msgstr "_Usein vieraillut sivut" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "Avaa uudelleen sivut, joilla vierailit aikaisemmin" + +#: ../midori/midori-browser.c:3746 +msgid "Show the saved bookmarks" +msgstr "Näytä tallennetut kirjanmerkit" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Ikkuna" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "Näytä luettelo kaikista avoimista välilehdistä" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Kirjanmerkit" + +#: ../midori/midori-browser.c:3926 +#: ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Historia" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "_Haku:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Kirjainkoko merkitsee" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "Korosta osumat" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Sulje hakupalkki" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Odottamaton asetus ”%s”" + +#: ../midori/midori-panel.c:223 +#: ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Sulje paneeli" + +#: ../midori/midori-websettings.c:131 +#: ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Tyhjä sivu" + +#: ../midori/midori-websettings.c:132 +#: ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Kotisivu" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Viimeisimmät avoinna olleet sivut" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Kiinalainen (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japanilainen (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Venäläinen (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Läntinen (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Muokattu..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Uusi välilehti" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Uusi ikkuna" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Nykyinen välilehti" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Oletus" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Kuvakkeet" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Teksti" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Molemmat" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Molemmat vaakasuorassa" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Kaikki evästeet" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Istunnon evästeet" + +#: ../midori/midori-websettings.c:206 +#: ../panels/midori-addons.c:97 +msgid "None" +msgstr "Ei mitään" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Muista viimeisin ikkunan koko" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Tallennetaanko viimeisin ikkunan koko" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Viimeisin ikkunan leveys" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Viimeisin tallennettu ikkunan leveys" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Viimeisin ikkunan korkeus" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Viimeisin tallennettu ikkunan korkeus" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Viimeisin paneelin paikka" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Viimeisin tallennettu paneelin paikka" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Viimeisin paneelin sivu" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Viimeisin tallennettu paneelin sivu" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Viimeisin verkkohaku" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Viimeisin tallennettu verkkohaku" + +#: ../midori/midori-websettings.c:302 +msgid "Show Menubar" +msgstr "Näytä valikkopalkki" + +#: ../midori/midori-websettings.c:303 +msgid "Whether to show the menubar" +msgstr "Näytetäänkö valikkopalkki" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Näytä navigointipalkki" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Näytetäänkö navigointipalkki" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Näytä kirjanmerkkipalkki" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Näytetäänkö kirjanmerkkipalkki" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Näytä paneeli" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Näytetäänkö paneeli" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Näytä tilapalkki" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Näytetäänkö tilapalkki" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Työkalupalkin tyyli" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Työkalupalkin tyyli" + +#: ../midori/midori-websettings.c:358 +msgid "Toolbar Items" +msgstr "Työkakupalkin painikkeet" + +#: ../midori/midori-websettings.c:359 +msgid "The items to show on the toolbar" +msgstr "Työkalupalkissa näytettävät painikkeet" + +#: ../midori/midori-websettings.c:367 +msgid "Compact Sidepanel" +msgstr "Kompakti sivupaneeli" + +#: ../midori/midori-websettings.c:368 +msgid "Whether to make the sidepanel compact" +msgstr "Tehdäänkö sivupaneelista kompakti" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Lataa käynnistettäessä" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Mitä ladataan käynnistyksessä" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Kotisivu" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Latauskansio" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "Kansio, jonne ladatut tiedostot tallennetaan" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "Latauksien hallinta" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Ulkoinen latauksien hallinta" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "Tekstieditori" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "Ulkoinen tekstieditori" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Käytettävä merkkikoodaus" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Oletuksena käytettävä merkkikoodaus" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "Näytä aina välilehtipalkki" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "Näytä aina välilehtipalkki" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Sulkemispainikkeet välilehdissä" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Onko välilehdissä sulkemispainikkeet" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Avaa uudet sivut" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Miten uudet sivut avataan" + +#: ../midori/midori-websettings.c:473 +msgid "Open external pages in" +msgstr "Avaa ulkoiset sivut" + +#: ../midori/midori-websettings.c:474 +msgid "Where to open externally opened pages" +msgstr "Miten ulkoisesti avatut sivut avataan" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Keskinapsautus avaa valinnan" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Lataa URL-osoitteen valinnasta keskinapsautuksella" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Avaa välilehdet taustalla" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Avataanko uudet välilehdet taustalla" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "Avaa välilehdet nykyisestä seuraavaksi" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Avataanko uudet välilehdet nykyistä välilehteä seuraavaksi vai viimeiseksi" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Avaa ponnahdusikkunat välilehdissä" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Avataanko ponnahdusikkunat välilehdissä" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Salli evästeet" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Minkälaiset evästeet sallitaan" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Alkuperäiset evästeet" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Sallii vain alkuperäisen sivuston evästeet" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Evästeiden enimmäisikä" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Evästetietojen säilytysaika päivinä" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Muista sivut, joilla on vierailtu" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Tallennetaanko sivut, joilla on vierailtu" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Historian enimmäisikä" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Historiatietojen säilytysaika päivinä" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Muista lomakkeisiin annetut tiedot" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Tallennetaanko lomakkeisiin annetut tiedot" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Muista ladatut tiedostot" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Tallennetaanko ladattujen tiedostojen lista" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "HTTP-välityspalvelin" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "HTTP-yhteyksille käytettävä välityspalvelin" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Välimuistin koko" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Välimuistin enimmäiskoko" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "Ei löydy - %s" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Avaa linkki uudessa _välilehdessä" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "_Tallenna linkin kohde" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "_Lataa linkin kohde" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Avaa URL-osoite uudessa _välilehdessä" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "Tutkii sivua - %s" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Lähdekoodi" + +#: ../midori/midori-view.c:1527 +#, c-format +msgid "No documentation installed" +msgstr "Dokumentaatiota ei ole asennettu" + +#: ../midori/midori-preferences.c:87 +#, c-format +msgid "Preferences for %s" +msgstr "Kohteen %s asetukset" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Yleiset" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Käynnistys" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Ulkoasu" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Kirjasinasetukset" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "Oletuskirjasinperhe" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "Kirjasimen vähimmäiskoko" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Käyttäytyminen" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Ominaisuudet" + +#: ../midori/midori-preferences.c:411 +#: ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "Lataa kuvat automaattisesti" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "Pienennä kuvat automaattisesti" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "Näytä taustakuvat" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "Tekstialueiden kokoa voidaan muuttaa" + +#: ../midori/midori-preferences.c:423 +#: ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "Salli skriptit" + +#: ../midori/midori-preferences.c:426 +#: ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "Salli liitännäiset" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "Ota kehittäjän työkalut käyttöön" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Käyttöliittymä" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Navigointipalkki" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Selaaminen" + +#: ../midori/midori-preferences.c:480 +#: ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Verkko" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "Yksityisyys" + +#: ../midori/midori-preferences.c:500 +msgid "Web Cookies" +msgstr "Verkkoevästeet" + +#: ../midori/midori-preferences.c:513 +#: ../midori/midori-preferences.c:524 +msgid "days" +msgstr "päivää" + +#: ../midori/midori-searchaction.c:456 +#: ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Tyhjä" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Lisää hakukone" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Muokkaa hakukonetta" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Nimi:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Kuvake (nimi tai tiedosto):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "_Merkki:" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Hallitse hakukoneita" + +#: ../midori/sokoke.c:63 +#: ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Ulkoista ohjelmaa ei voitu suorittaa" + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Varoitus: Käytät pääkäyttäjän tiliä!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Tapahtui tuntematon virhe." + +#: ../midori/gjs.c:742 +#: ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "Asialla %s ei ole ominaisuutta ”%s”" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "" + +#: ../panels/midori-addons.c:98 +#: ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Käyttäjän skriptit" + +#: ../panels/midori-addons.c:99 +#: ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Käyttäjän tyylit" + +#: ../panels/midori-addons.c:1006 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Ota käyttöön" + +#: ../panels/midori-addons.c:1015 +#: ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Poista käytöstä" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsoli" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Liitännäiset" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Nimettyä kuvaketta ”%s” ei voitu ladata" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Vakiokuvaketta ”%s” ei voitu ladata" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Animaatiokehykset ovat rikki" + +#: ../katze/katze-utils.c:154 +#: ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Ominaisuus ”%s” on epäkelpo kohteelle %s" + +#: ../katze/katze-utils.c:178 +#: ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Valitse tiedosto" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Valitse kansio" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 +#: ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Sivupidike" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Sivupidike" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "Kuvat" + +#: ../extensions/statusbar-features.c:37 +msgid "Scripts" +msgstr "Skriptit" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "Liitännäiset" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Avaa _sivun pitäjässä" +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Avaa nykyinen sivu sivun pitäjässä" +#~ msgid "Open the selected bookmark in a new tab" +#~ msgstr "Avaa valittu kirjanmerkki uudessa välilehdessä" +#~ msgid "Open the selected bookmark in a new window" +#~ msgstr "Avaa valittu kirjanmerkki uudessa ikkunassa" +#~ msgid "Open the selected history item in a new tab" +#~ msgstr "Avaa valittu historiatietue uudessa välilehdessä" +#~ msgid "Last pageholder URI" +#~ msgstr "Viimeisin sivupidike URL-osoite" +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Viimeisin avoinna ollut URL-osoite sivupipidike" +#~ msgid "Download Link with Download _Manager" +#~ msgstr "Lataa linkin kohde _latauksien hallinnalla" + diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 00000000..c63f079c --- /dev/null +++ b/po/fr.po @@ -0,0 +1,1865 @@ +# French translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Christian Dywan 2008-2009 +# Adrien Nader 2008 +# Robert-André Mauchin 2008 +# Pascal Gervais 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-19 16:44+0200\n" +"PO-Revision-Date: 2009-04-19 16:05+0100\n" +"Last-Translator: Christian Dywan \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Navigateur internet léger" + +#: ../data/midori.desktop.in.h:2 ../midori/main.c:1288 ../midori/main.c:1388 +#: ../midori/main.c:1396 ../midori/main.c:1407 +#: ../midori/midori-websettings.c:273 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Navigateur internet" + +#: ../midori/main.c:94 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "La configuration n'a pu être chargée : %s\n" + +#: ../midori/main.c:149 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "La valeur « %s » n'est pas valide pour %s" + +#: ../midori/main.c:156 ../midori/main.c:228 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Valeur de paramètre non valide « %s »" + +#: ../midori/main.c:332 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Impossible d'ouvrir la base de données : %s\n" + +#: ../midori/main.c:364 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Impossible d'exécuter l'instruction de la base de données : %s\n" + +#: ../midori/main.c:418 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Impossible de supprimer de l'historique l'élément : %s\n" + +#: ../midori/main.c:442 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Impossible d'effacer l'historique : %s\n" + +#: ../midori/main.c:465 ../midori/main.c:499 ../midori/main.c:515 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Impossible d'ajouter à l'historique l'élément : %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:694 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Impossible de supprimer de l'historique les anciens éléments : %s\n" + +#: ../midori/main.c:722 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "La configuration n'a pu être enregistrée. %s" + +#: ../midori/main.c:751 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Les moteurs de recherche n'ont pu être enregistrés. %s" + +#: ../midori/main.c:770 ../midori/main.c:798 ../midori/main.c:827 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Les signets n'ont pu être enregistrés. %s" + +# pas très content +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:850 ../midori/main.c:873 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "La corbeille n'a pu être enregistrée. %s" + +#: ../midori/main.c:946 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "La session n'a pu être enregistrée. %s" + +#: ../midori/main.c:1073 +msgid "" +"Midori seems to have crashed the last time it was opened. If this happened " +"repeatedly, try one of the following options to solve the problem." +msgstr "" +"Midori semble s'être interrompu de façon inattendue lors de la dernière " +"utilisation. Si cela se produit de façon répétée, essayez l'une des options " +"suivantes pour résoudre le problème." + +#: ../midori/main.c:1088 +msgid "Modify _preferences" +msgstr "Modifier les _préférences" + +#: ../midori/main.c:1092 +msgid "Reset the last _session" +msgstr "Réinitialiser la dernière _session" + +#: ../midori/main.c:1097 +msgid "Disable all _extensions" +msgstr "Désactiver toutes les _extensions" + +#: ../midori/main.c:1288 +msgid "No filename specified" +msgstr "Aucun nom de fichier spécifié" + +#: ../midori/main.c:1311 +msgid "An unknown error occured." +msgstr "Une erreur inconnue est survenue." + +#: ../midori/main.c:1336 +msgid "Run ADDRESS as a web application" +msgstr "Exécuter l'adresse spécifié comme application internet" + +#: ../midori/main.c:1336 +msgid "ADDRESS" +msgstr "Adresse" + +#: ../midori/main.c:1338 +msgid "Use FOLDER as configuration folder" +msgstr "Utiliser DOSSIER comme dossier de configuration" + +#: ../midori/main.c:1338 +msgid "FOLDER" +msgstr "DOSSIER" + +#: ../midori/main.c:1340 +msgid "Run the specified filename as javascript" +msgstr "Exécuter le fichier spécifié en tant que javascript" + +#: ../midori/main.c:1342 +msgid "Display program version" +msgstr "Afficher la version du programme" + +#: ../midori/main.c:1344 +msgid "Addresses" +msgstr "Adresses" + +#: ../midori/main.c:1385 +msgid "[Addresses]" +msgstr "[Adresses]" + +#: ../midori/main.c:1408 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Merci d'envoyer vos commentaires, suggestions et anomalies à :" + +#: ../midori/main.c:1410 +msgid "Check for new versions at:" +msgstr "Vérifier l'existence de nouvelles versions à :" + +#: ../midori/main.c:1454 +msgid "The specified configuration folder is invalid." +msgstr "Le dossier de configuration specifié n'est pas valide." + +#: ../midori/main.c:1489 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Une instance de Midori est déjà lancée mais ne répond pas.\n" + +#: ../midori/main.c:1539 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "Les moteurs de recherche n'ont pu être chargés. %s\n" + +#: ../midori/main.c:1551 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Les signets n'ont pu être chargés : %s\n" + +#: ../midori/main.c:1566 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "La session n'a pu être chargée : %s\n" + +# pas très content +#: ../midori/main.c:1579 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "La corbeille n'a pu être chargée : %s\n" + +# pas très content +#: ../midori/main.c:1592 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "L'historique n'a pu être chargé : %s\n" + +#: ../midori/main.c:1604 +msgid "The following errors occured:" +msgstr "Les erreurs suivantes ont eu lieu :" + +#: ../midori/main.c:1620 +msgid "_Ignore" +msgstr "_Ignorer" + +#: ../midori/midori-array.c:195 +msgid "File not found." +msgstr "Fichier non trouvé." + +#: ../midori/midori-array.c:203 ../midori/midori-array.c:212 +msgid "Malformed document." +msgstr "Document mal formé." + +#: ../midori/midori-array.c:338 ../midori/sokoke.c:625 +#, c-format +msgid "Writing failed." +msgstr "L'écriture a échoué." + +#: ../midori/midori-browser.c:280 ../midori/midori-browser.c:3368 +#: ../midori/midori-browser.c:3374 +msgid "Reload the current page" +msgstr "Actualiser la page" + +#: ../midori/midori-browser.c:291 ../midori/midori-browser.c:3371 +msgid "Stop loading the current page" +msgstr "Arrêter le chargement de la page" + +#: ../midori/midori-browser.c:353 +#, c-format +msgid "%d%% loaded" +msgstr "%d %% chargés" + +#: ../midori/midori-browser.c:378 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Action inattendue « %s »" + +#: ../midori/midori-browser.c:541 +msgid "New folder" +msgstr "Nouveau répertoire" + +#: ../midori/midori-browser.c:541 +msgid "Edit folder" +msgstr "Modifier le répertoire" + +#: ../midori/midori-browser.c:543 +msgid "New bookmark" +msgstr "Nouveau signet" + +#: ../midori/midori-browser.c:543 +msgid "Edit bookmark" +msgstr "Modifier le signet" + +#: ../midori/midori-browser.c:573 +msgid "_Title:" +msgstr "_Titre :" + +#: ../midori/midori-browser.c:586 ../midori/midori-searchaction.c:948 +msgid "_Description:" +msgstr "_Description :" + +#: ../midori/midori-browser.c:605 ../midori/midori-searchaction.c:962 +msgid "_Address:" +msgstr "_Adresse :" + +# manque un raccourcis Alt+X +#: ../midori/midori-browser.c:624 +msgid "_Folder:" +msgstr "_Dossier :" + +#: ../midori/midori-browser.c:629 ../midori/midori-browser.c:670 +msgid "Toplevel folder" +msgstr "Répertoire supérieur" + +#: ../midori/midori-browser.c:746 +msgid "Save file as" +msgstr "Enregistrer le fichier sous" + +#: ../midori/midori-browser.c:1523 +msgid "Open file" +msgstr "Ouvrir le fichier" + +#: ../midori/midori-browser.c:2803 ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:809 +msgid "Open all in _Tabs" +msgstr "Tout ouvrir dans des _onglets" + +#: ../midori/midori-browser.c:2810 ../panels/midori-bookmarks.c:788 +#: ../panels/midori-history.c:815 +msgid "Open in New _Tab" +msgstr "Ouvrir dans un nouvel _onglet" + +#: ../midori/midori-browser.c:2813 ../panels/midori-bookmarks.c:790 +#: ../panels/midori-history.c:817 +msgid "Open in New _Window" +msgstr "Ouvrir dans une nouvelle _fenêtre" + +#: ../midori/midori-browser.c:2974 +msgid "Clear Private Data" +msgstr "Effacer informations privées" + +#: ../midori/midori-browser.c:2977 +msgid "_Clear private data" +msgstr "_Effacer informations privées" + +#: ../midori/midori-browser.c:2990 +msgid "Clear the following data:" +msgstr "Effacer les informations suivantes :" + +#: ../midori/midori-browser.c:2998 ../midori/midori-preferences.c:640 +#: ../panels/midori-history.c:108 +msgid "History" +msgstr "Historique" + +#: ../midori/midori-browser.c:3001 +msgid "Cookies" +msgstr "Fichiers témoins/ Cookies" + +#: ../midori/midori-browser.c:3004 +msgid "'Flash' Cookies" +msgstr "Cookies « Flash »" + +#: ../midori/midori-browser.c:3007 +msgid "Website icons" +msgstr "Icônes de pages internet" + +#: ../midori/midori-browser.c:3093 +msgid "A lightweight web browser." +msgstr "Un navigateur internet léger." + +#: ../midori/midori-browser.c:3101 +msgid "translator-credits" +msgstr "" +"Christian Dywan \n" +"Adrien Nader \n" +"Robert-André Mauchin \n" +"Pascal Gervais " + +#: ../midori/midori-browser.c:3302 +msgid "_File" +msgstr "_Fichier" + +#: ../midori/midori-browser.c:3305 +msgid "Open a new window" +msgstr "Ouvrir une nouvelle fenêtre" + +#: ../midori/midori-browser.c:3308 +msgid "Open a new tab" +msgstr "Ouvrir un nouvel onglet" + +#: ../midori/midori-browser.c:3311 +msgid "Open a file" +msgstr "Ouvrir un fichier" + +#: ../midori/midori-browser.c:3314 +msgid "Save to a file" +msgstr "Enregistrer dans un fichier" + +#: ../midori/midori-browser.c:3316 +msgid "_Close Tab" +msgstr "Fe_rmer l'onglet" + +#: ../midori/midori-browser.c:3317 +msgid "Close the current tab" +msgstr "Fermer l'onglet actuel" + +#: ../midori/midori-browser.c:3319 +msgid "C_lose Window" +msgstr "_Fermer la fenêtre" + +#: ../midori/midori-browser.c:3320 +msgid "Close this window" +msgstr "Fermer cette fenêtre" + +#: ../midori/midori-browser.c:3323 +msgid "Print the current page" +msgstr "Imprimer la page actuelle" + +#: ../midori/midori-browser.c:3326 +msgid "Quit the application" +msgstr "Quitter le programme" + +#: ../midori/midori-browser.c:3328 +msgid "_Edit" +msgstr "É_dition" + +#: ../midori/midori-browser.c:3331 +msgid "Cut the selected text" +msgstr "Couper le texte sélectionné" + +#: ../midori/midori-browser.c:3334 ../midori/midori-browser.c:3337 +msgid "Copy the selected text" +msgstr "Copier le texte sélectionné" + +#: ../midori/midori-browser.c:3340 +msgid "Paste text from the clipboard" +msgstr "Coller le texte à partir du presse-papiers" + +#: ../midori/midori-browser.c:3343 +msgid "Delete the selected text" +msgstr "Supprimer le texte sélectionné" + +#: ../midori/midori-browser.c:3346 +msgid "Select all text" +msgstr "Sélectionner tout le texte" + +#: ../midori/midori-browser.c:3349 +msgid "Find a word or phrase in the page" +msgstr "Rechercher un mot ou une phrase dans la page" + +#: ../midori/midori-browser.c:3351 +msgid "Find _Next" +msgstr "Rechercher le _suivant" + +#: ../midori/midori-browser.c:3352 +msgid "Find the next occurrence of a word or phrase" +msgstr "Rechercher l'occurrence suivante d'un mot ou d'une phrase" + +#: ../midori/midori-browser.c:3354 +msgid "Find _Previous" +msgstr "Rechercher le _précédent" + +#: ../midori/midori-browser.c:3355 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Rechercher l'occurrence précédente d'un mot ou d'une phrase" + +#: ../midori/midori-browser.c:3358 +msgid "_Quick Find" +msgstr "Recherche rapi_de" + +#: ../midori/midori-browser.c:3359 +msgid "Quickly jump to a word or phrase" +msgstr "Saut rapide vers un mot ou une phrase" + +#: ../midori/midori-browser.c:3362 +msgid "Configure the application preferences" +msgstr "Configurer les préférences de l'application" + +#: ../midori/midori-browser.c:3364 +msgid "_View" +msgstr "_Affichage" + +#: ../midori/midori-browser.c:3365 +msgid "_Toolbars" +msgstr "_Barre d'outils" + +#: ../midori/midori-browser.c:3377 +msgid "Increase the zoom level" +msgstr "Augmenter le niveau d'agrandissement" + +#: ../midori/midori-browser.c:3380 +msgid "Decrease the zoom level" +msgstr "Diminuer le niveau d'agrandissement" + +#: ../midori/midori-browser.c:3383 +msgid "Reset the zoom level" +msgstr "Réinitialiser le niveau d'agrandissement" + +#: ../midori/midori-browser.c:3384 +msgid "_Encoding" +msgstr "_Encodage" + +#: ../midori/midori-browser.c:3386 +msgid "_Automatic" +msgstr "_Automatique" + +#: ../midori/midori-browser.c:3389 ../midori/midori-websettings.c:200 +msgid "Chinese (BIG5)" +msgstr "Chinois (BIG5)" + +#: ../midori/midori-browser.c:3392 ../midori/midori-websettings.c:201 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japonais (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3395 ../midori/midori-websettings.c:202 +msgid "Russian (KOI8-R)" +msgstr "Russe (KOI8-R)" + +#: ../midori/midori-browser.c:3398 ../midori/midori-websettings.c:203 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3401 ../midori/midori-websettings.c:204 +msgid "Western (ISO-8859-1)" +msgstr "Occidental (ISO-8859-1)" + +#: ../midori/midori-browser.c:3404 ../midori/midori-websettings.c:205 +#: ../midori/midori-websettings.c:277 +msgid "Custom..." +msgstr "Personnalisé..." + +#: ../midori/midori-browser.c:3407 ../midori/midori-view.c:1138 +msgid "View _Source" +msgstr "Afficher la _source" + +#: ../midori/midori-browser.c:3408 +msgid "View the source code of the page" +msgstr "Affiche le code source de la page" + +#: ../midori/midori-browser.c:3410 +msgid "View Selection Source" +msgstr "Afficher la source de la sélection" + +#: ../midori/midori-browser.c:3411 +msgid "View the source code of the selection" +msgstr "Afficher le code source de la sélection" + +#: ../midori/midori-browser.c:3415 +msgid "Toggle fullscreen view" +msgstr "Activer/désactiver le plein écran" + +#: ../midori/midori-browser.c:3417 +msgid "_Go" +msgstr "A_ller" + +#: ../midori/midori-browser.c:3420 +msgid "Go back to the previous page" +msgstr "Aller à la page précédente" + +#: ../midori/midori-browser.c:3423 +msgid "Go forward to the next page" +msgstr "Aller à la page suivante" + +#: ../midori/midori-browser.c:3426 +msgid "Go to your homepage" +msgstr "Aller à la page d'accueil" + +#: ../midori/midori-browser.c:3428 +msgid "Empty Trash" +msgstr "Vider la corbeille" + +#: ../midori/midori-browser.c:3429 +msgid "Delete the contents of the trash" +msgstr "Supprimer le contenu de la corbeille" + +#: ../midori/midori-browser.c:3431 ../midori/midori-view.c:1110 +msgid "Undo Close Tab" +msgstr "Annuler la fermeture de l'onglet" + +#: ../midori/midori-browser.c:3432 +msgid "Open the last closed tab" +msgstr "Ouvrir le dernier onglet fermé" + +#: ../midori/midori-browser.c:3436 ../panels/midori-bookmarks.c:232 +msgid "Add a new bookmark" +msgstr "Ajouter un nouveau signet" + +#: ../midori/midori-browser.c:3438 ../panels/midori-bookmarks.c:261 +msgid "Add a new folder" +msgstr "Ajouter un nouveau répertoire" + +#: ../midori/midori-browser.c:3439 +msgid "Add a new bookmark folder" +msgstr "Ajouter un nouveau dossier signet" + +#: ../midori/midori-browser.c:3440 +msgid "_Tools" +msgstr "_Outils" + +#: ../midori/midori-browser.c:3442 ../midori/midori-searchaction.c:493 +msgid "_Manage Search Engines" +msgstr "_Gestion des moteurs de recherche" + +#: ../midori/midori-browser.c:3443 +msgid "Add, edit and remove search engines..." +msgstr "Ajouter, modifier et supprimer des moteurs de recherche..." + +#: ../midori/midori-browser.c:3446 +msgid "_Clear Private Data" +msgstr "_Effacer les informations privées" + +#: ../midori/midori-browser.c:3447 +msgid "Clear private data..." +msgstr "Effacer les informations privées..." + +#: ../midori/midori-browser.c:3451 +msgid "_Previous Tab" +msgstr "Onglet _précedent" + +#: ../midori/midori-browser.c:3452 +msgid "Switch to the previous tab" +msgstr "Bascule vers l'onglet précédent" + +#: ../midori/midori-browser.c:3454 +msgid "_Next Tab" +msgstr "Onglet _suivant" + +#: ../midori/midori-browser.c:3455 +msgid "Switch to the next tab" +msgstr "Bascule vers l'onglet suivant" + +#: ../midori/midori-browser.c:3457 +msgid "_Help" +msgstr "Aid_e" + +#: ../midori/midori-browser.c:3459 +msgid "_Contents" +msgstr "_Sommaire" + +#: ../midori/midori-browser.c:3460 +msgid "Show the documentation" +msgstr "Afficher la documentation" + +#: ../midori/midori-browser.c:3462 +msgid "_Frequent Questions" +msgstr "_Questions fréquentes" + +#: ../midori/midori-browser.c:3463 +msgid "Show the Frequently Asked Questions" +msgstr "Afficher la foire aux questions" + +#: ../midori/midori-browser.c:3465 +msgid "_Report a Bug" +msgstr "_Rapporter une anomalie" + +#: ../midori/midori-browser.c:3466 +msgid "Open Midori's bug tracker" +msgstr "Ouvrir le gestionnaire d'anomalies de Midori" + +#: ../midori/midori-browser.c:3469 +msgid "Show information about the program" +msgstr "Afficher des informations concernant le programme" + +#: ../midori/midori-browser.c:3476 +msgid "P_rivate Browsing" +msgstr "Navigation _privée" + +#: ../midori/midori-browser.c:3477 +msgid "Don't save any private data while browsing" +msgstr "Ne pas enregistrer de données privées durant la navigation" + +#: ../midori/midori-browser.c:3482 +msgid "_Menubar" +msgstr "Barre de _menu" + +#: ../midori/midori-browser.c:3483 +msgid "Show menubar" +msgstr "Afficher la barre de menu" + +#: ../midori/midori-browser.c:3486 +msgid "_Navigationbar" +msgstr "Barre de _navigation" + +#: ../midori/midori-browser.c:3487 +msgid "Show navigationbar" +msgstr "Afficher la barre de navigation" + +#: ../midori/midori-browser.c:3490 +msgid "Side_panel" +msgstr "_Panneau latéral" + +#: ../midori/midori-browser.c:3491 +msgid "Show sidepanel" +msgstr "Afficher le panneau latéral" + +#: ../midori/midori-browser.c:3494 +msgid "_Bookmarkbar" +msgstr "Barre de _signets" + +#: ../midori/midori-browser.c:3495 +msgid "Show bookmarkbar" +msgstr "Afficher la barre des signets" + +#: ../midori/midori-browser.c:3498 +msgid "_Transferbar" +msgstr "Barre de _transferts" + +#: ../midori/midori-browser.c:3499 +msgid "Show transferbar" +msgstr "Afficher la barre des transferts" + +#: ../midori/midori-browser.c:3502 +msgid "_Statusbar" +msgstr "Barre d'é_tat" + +#: ../midori/midori-browser.c:3503 +msgid "Show statusbar" +msgstr "Afficher la barre d'état" + +#: ../midori/midori-browser.c:3937 +msgid "_Separator" +msgstr "_Séparateur" + +#: ../midori/midori-browser.c:3944 +msgid "_Location..." +msgstr "_Emplacement..." + +#: ../midori/midori-browser.c:3946 +msgid "Open a particular location" +msgstr "Ouvrir un emplacement particulier" + +#: ../midori/midori-browser.c:3970 +msgid "_Web Search..." +msgstr "Recherche _internet..." + +#: ../midori/midori-browser.c:3972 +msgid "Run a web search" +msgstr "Lancer une recherche sur l'internet" + +#: ../midori/midori-browser.c:3993 +msgid "Reopen a previously closed tab or window" +msgstr "Rouvrir un onglet ou une fenêtre précédemment fermé" + +#: ../midori/midori-browser.c:4006 +msgid "_Recently visited pages" +msgstr "Pages _récemment visitées" + +#: ../midori/midori-browser.c:4008 +msgid "Reopen pages that you visited earlier" +msgstr "Rouvrir des pages précédemment visitées" + +#: ../midori/midori-browser.c:4021 ../midori/sokoke.c:781 +msgid "_Bookmarks" +msgstr "_Signets" + +#: ../midori/midori-browser.c:4023 +msgid "Show the saved bookmarks" +msgstr "Afficher les signets sauvegardés" + +#: ../midori/midori-browser.c:4036 +msgid "_Window" +msgstr "_Fenêtre" + +#: ../midori/midori-browser.c:4038 +msgid "Show a list of all open tabs" +msgstr "Afficher une liste de tous les onglets ouverts" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4205 +msgid "_Inline Find:" +msgstr "_Recherche rapide :" + +#: ../midori/midori-browser.c:4230 +msgid "Previous" +msgstr "Précedent" + +#: ../midori/midori-browser.c:4235 +msgid "Next" +msgstr "Suivant" + +#: ../midori/midori-browser.c:4240 +msgid "Match Case" +msgstr "Sensible à la casse" + +#: ../midori/midori-browser.c:4248 +msgid "Highlight Matches" +msgstr "Résultats analogues en surbrillance" + +#: ../midori/midori-browser.c:4258 +msgid "Close Findbar" +msgstr "Fermer la barre de recherche" + +#: ../midori/midori-browser.c:4598 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Paramètre inattendu « %s »" + +#: ../midori/midori-panel.c:309 +msgid "Detach chosen panel from the window" +msgstr "Détacher le panneau choisi du fenêtre" + +#: ../midori/midori-panel.c:311 +msgid "Whether to detach the chosen panel from the window" +msgstr "Indique s'il faut détacher le panneau latéral choisi du fenêtre" + +#: ../midori/midori-panel.c:321 ../midori/midori-websettings.c:531 +msgid "Align sidepanel on the right" +msgstr "Aligner le panneau latéral sur la droite" + +#: ../midori/midori-panel.c:323 ../midori/midori-websettings.c:532 +msgid "Whether to align the sidepanel on the right" +msgstr "Indique s'il faut aligner le panneau latéral sur la droite" + +#: ../midori/midori-panel.c:333 ../midori/midori-panel.c:334 +msgid "Close panel" +msgstr "Fermer le panneau" + +#: ../midori/midori-websettings.c:183 ../midori/midori-view.c:1949 +msgid "Blank page" +msgstr "Page vierge" + +#: ../midori/midori-websettings.c:184 ../midori/midori-websettings.c:551 +msgid "Homepage" +msgstr "Page d'accueil" + +#: ../midori/midori-websettings.c:185 +msgid "Last open pages" +msgstr "Dernières pages ouvertes" + +#: ../midori/midori-websettings.c:220 +msgid "New tab" +msgstr "Nouvel onglet" + +#: ../midori/midori-websettings.c:221 +msgid "New window" +msgstr "Nouvelle fenêtre" + +#: ../midori/midori-websettings.c:222 +msgid "Current tab" +msgstr "Onglet actuel" + +#: ../midori/midori-websettings.c:237 +msgid "Default" +msgstr "Par défaut" + +#: ../midori/midori-websettings.c:238 +msgid "Icons" +msgstr "Icônes" + +#: ../midori/midori-websettings.c:239 +msgid "Text" +msgstr "Texte" + +#: ../midori/midori-websettings.c:240 +msgid "Both" +msgstr "Les deux" + +#: ../midori/midori-websettings.c:241 +msgid "Both horizontal" +msgstr "Les deux horizontalement" + +#: ../midori/midori-websettings.c:256 +msgid "All cookies" +msgstr "Tous les fichiers témoins" + +#: ../midori/midori-websettings.c:257 +msgid "Session cookies" +msgstr "Témoins de session" + +#: ../midori/midori-websettings.c:258 ../panels/midori-addons.c:94 +msgid "None" +msgstr "Aucun" + +#: ../midori/midori-websettings.c:274 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:275 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:276 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:329 +msgid "Remember last window size" +msgstr "Se souvenir de la taille de la fenêtre" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to save the last window size" +msgstr "Indique s'il faut enregistrer la dernière taille de la fenêtre" + +#: ../midori/midori-websettings.c:338 +msgid "Last window width" +msgstr "Dernière largeur de la fenêtre" + +#: ../midori/midori-websettings.c:339 +msgid "The last saved window width" +msgstr "La dernière largeur enregistrée de la fenêtre" + +#: ../midori/midori-websettings.c:347 +msgid "Last window height" +msgstr "Dernière hauteur de la fenêtre" + +#: ../midori/midori-websettings.c:348 +msgid "The last saved window height" +msgstr "La dernière hauteur enregistrée de la fenêtre" + +#: ../midori/midori-websettings.c:373 +msgid "Last panel position" +msgstr "Dernière position du panneau" + +#: ../midori/midori-websettings.c:374 +msgid "The last saved panel position" +msgstr "La dernière position enregistrée du panneau" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:383 +msgid "Last panel page" +msgstr "Dernière page du panneau" + +#: ../midori/midori-websettings.c:384 +msgid "The last saved panel page" +msgstr "La dernière page enregistrée du panneau" + +#: ../midori/midori-websettings.c:392 +msgid "Last Web search" +msgstr "Dernière recherche sur la toile" + +#: ../midori/midori-websettings.c:393 +msgid "The last saved Web search" +msgstr "La dernière recherche sur la toile enregistrée" + +#: ../midori/midori-websettings.c:402 +msgid "Show Menubar" +msgstr "Afficher la barre de menu" + +#: ../midori/midori-websettings.c:403 +msgid "Whether to show the menubar" +msgstr "Indique s'il faut afficher la barre de menu" + +#: ../midori/midori-websettings.c:411 +msgid "Show Navigationbar" +msgstr "Afficher la barre de navigation" + +#: ../midori/midori-websettings.c:412 +msgid "Whether to show the navigationbar" +msgstr "Indique s'il faut afficher la barre de navigation" + +#: ../midori/midori-websettings.c:420 +msgid "Show Bookmarkbar" +msgstr "Afficher la barre des _signets" + +#: ../midori/midori-websettings.c:421 +msgid "Whether to show the bookmarkbar" +msgstr "Indique s'il faut afficher la barre des signets" + +#: ../midori/midori-websettings.c:429 +msgid "Show Panel" +msgstr "Afficher le panneau" + +#: ../midori/midori-websettings.c:430 +msgid "Whether to show the panel" +msgstr "Indique s'il faut afficher le panneau" + +#: ../midori/midori-websettings.c:445 +msgid "Show Transferbar" +msgstr "Afficher la barre des transferts" + +#: ../midori/midori-websettings.c:446 +msgid "Whether to show the transferbar" +msgstr "Indique s'il faut afficher la barre de transferts" + +#: ../midori/midori-websettings.c:454 +msgid "Show Statusbar" +msgstr "Afficher la barre d'état" + +#: ../midori/midori-websettings.c:455 +msgid "Whether to show the statusbar" +msgstr "Indique s'il faut afficher la barre d'état" + +#: ../midori/midori-websettings.c:464 +msgid "Toolbar Style" +msgstr "Style de la barre d'outils" + +#: ../midori/midori-websettings.c:465 +msgid "The style of the toolbar" +msgstr "Le style de la barre d'outils" + +#: ../midori/midori-websettings.c:481 +msgid "Show progress in location entry" +msgstr "Progression dans le champ d'adresse" + +#: ../midori/midori-websettings.c:482 +msgid "Whether to show loading progress in the location entry" +msgstr "Indique s'il faut afficher la progression dans le champ d'adresse" + +#: ../midori/midori-websettings.c:497 +msgid "Search engines in location completion" +msgstr "Recherche dans complètement d'adresse" + +#: ../midori/midori-websettings.c:498 +msgid "Whether to show search engines in the location completion" +msgstr "" +"Indique s'il faut afficher les moteurs de recherche dans le complètement " +"d'adresse" + +#: ../midori/midori-websettings.c:506 +msgid "Toolbar Items" +msgstr "Éléments de la barre d'outils" + +#: ../midori/midori-websettings.c:507 +msgid "The items to show on the toolbar" +msgstr "Les éléments à afficher dans la barre d'outils" + +#: ../midori/midori-websettings.c:515 +msgid "Compact Sidepanel" +msgstr "Panneau latéral compact" + +#: ../midori/midori-websettings.c:516 +msgid "Whether to make the sidepanel compact" +msgstr "Indique s'il faut mettre le panneau latéral compact" + +#: ../midori/midori-websettings.c:541 +msgid "Load on Startup" +msgstr "Charger au démarrage" + +#: ../midori/midori-websettings.c:542 +msgid "What to load on startup" +msgstr "Éléments à charger au démarrage" + +#: ../midori/midori-websettings.c:552 +msgid "The homepage" +msgstr "La page d'accueil" + +#: ../midori/midori-websettings.c:567 +msgid "Show crash dialog" +msgstr "Afficher le dialogue de fermeture inattendue" + +#: ../midori/midori-websettings.c:568 +msgid "Show a dialog after Midori crashed" +msgstr "Afficher un dialogue en cas de fermeture inattendue de Midori" + +#: ../midori/midori-websettings.c:576 +msgid "Download Folder" +msgstr "Dossier de téléchargements" + +#: ../midori/midori-websettings.c:577 +msgid "The folder downloaded files are saved to" +msgstr "Le dossier où enregistrer les téléchargements" + +#: ../midori/midori-websettings.c:589 +msgid "Download Manager" +msgstr "Gestionnaire de téléchargements" + +#: ../midori/midori-websettings.c:590 +msgid "An external download manager" +msgstr "Un gestionnaire de téléchargements externe" + +#: ../midori/midori-websettings.c:598 +msgid "Text Editor" +msgstr "Éditeur de texte" + +#: ../midori/midori-websettings.c:599 +msgid "An external text editor" +msgstr "Un éditeur de texte externe" + +#: ../midori/midori-websettings.c:614 +msgid "News Aggregator" +msgstr "Agrégateur de flux" + +#: ../midori/midori-websettings.c:615 +msgid "An external news aggregator" +msgstr "Un agrégateur de flux externe" + +#: ../midori/midori-websettings.c:623 +msgid "Location entry Search" +msgstr "Recherche depuis la barre d'adresse" + +#: ../midori/midori-websettings.c:624 +msgid "The search to perform inside the location entry" +msgstr "La recherche à effectuer à partir du contenu de la barre d'adresse" + +#: ../midori/midori-websettings.c:632 +msgid "Preferred Encoding" +msgstr "Encodage favori" + +#: ../midori/midori-websettings.c:633 +msgid "The preferred character encoding" +msgstr "Encodage des caractères favori" + +#: ../midori/midori-websettings.c:643 +msgid "Always Show Tabbar" +msgstr "Toujours afficher la barre d'onglets" + +#: ../midori/midori-websettings.c:644 +msgid "Always show the tabbar" +msgstr "Toujours afficher la barre d'onglets" + +#: ../midori/midori-websettings.c:652 +msgid "Close Buttons on Tabs" +msgstr "Boutons fermer sur les onglets" + +#: ../midori/midori-websettings.c:653 +msgid "Whether tabs have close buttons" +msgstr "Indique s'il faut afficher un bouton de fermeture sur les onglets" + +#: ../midori/midori-websettings.c:661 +msgid "Open new pages in" +msgstr "Ouvrir les nouvelles pages dans" + +#: ../midori/midori-websettings.c:662 +msgid "Where to open new pages" +msgstr "Où ouvrir les nouvelles pages" + +#: ../midori/midori-websettings.c:671 +msgid "Open external pages in" +msgstr "Ouvrir les pages externes dans" + +#: ../midori/midori-websettings.c:672 +msgid "Where to open externally opened pages" +msgstr "Où ouvrir les pages externes" + +#: ../midori/midori-websettings.c:685 +msgid "Middle click opens Selection" +msgstr "Clic du milieu ouvre la sélection" + +#: ../midori/midori-websettings.c:686 +msgid "Load an address from the selection via middle click" +msgstr "" +"Charger l'addresse sous la sélection avec le bouton central de la souris" + +#: ../midori/midori-websettings.c:694 +msgid "Open tabs in the background" +msgstr "Ouvrir les onglets en arrière-plan" + +#: ../midori/midori-websettings.c:695 +msgid "Whether to open new tabs in the background" +msgstr "Indique s'il faut ouvrir les nouveaux onglets en arrière-plan" + +#: ../midori/midori-websettings.c:703 +msgid "Open Tabs next to Current" +msgstr "Ouvrir les onglets à côté de l'actuel" + +#: ../midori/midori-websettings.c:704 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" +"Indique s'il faut ouvrir les nouveaux onglets à côté de l'actuel ou après le " +"dernier" + +#: ../midori/midori-websettings.c:712 +msgid "Open popups in tabs" +msgstr "Ouvrir les fenêtres surgissantes dans des onglets" + +#: ../midori/midori-websettings.c:713 +msgid "Whether to open popup windows in tabs" +msgstr "" +"Indique s'il faut ouvrir les fenêtres surgissantes (popup) dans des onglets" + +#: ../midori/midori-websettings.c:729 +msgid "Zoom Text and Images" +msgstr "Agrandir le texte et les images" + +#: ../midori/midori-websettings.c:730 +msgid "Whether to zoom text and images" +msgstr "Indique s'il faut agrandir le texte et les images" + +#: ../midori/midori-websettings.c:745 +msgid "Find inline while typing" +msgstr "Chercher en ligne en tapant" + +#: ../midori/midori-websettings.c:746 +msgid "Whether to automatically find inline while typing" +msgstr "Indique s'il faut chercher automatiquement en ligne en tapant" + +#: ../midori/midori-websettings.c:754 +msgid "Accept cookies" +msgstr "Accepter les cookies" + +#: ../midori/midori-websettings.c:755 +msgid "What type of cookies to accept" +msgstr "Type de fichiers témoins à accepter" + +#: ../midori/midori-websettings.c:764 +msgid "Original cookies only" +msgstr "Uniquement les cookies d'origine" + +#: ../midori/midori-websettings.c:765 +msgid "Accept cookies from the original website only" +msgstr "Accepter les fichiers témoins du site d'origine uniquement" + +#: ../midori/midori-websettings.c:773 +msgid "Maximum cookie age" +msgstr "Âge maximal des cookies" + +#: ../midori/midori-websettings.c:774 +msgid "The maximum number of days to save cookies for" +msgstr "" +"Le nombre maximal de jours durant lesquels conserver les fichiers témoins" + +#: ../midori/midori-websettings.c:784 +msgid "Remember last visited pages" +msgstr "Se souvenir des pages récemment visitées" + +#: ../midori/midori-websettings.c:785 +msgid "Whether the last visited pages are saved" +msgstr "Indique s'il faut enregistrer les dernières pages visitées" + +#: ../midori/midori-websettings.c:793 +msgid "Maximum history age" +msgstr "Âge maximal de l'historique" + +#: ../midori/midori-websettings.c:794 +msgid "The maximum number of days to save the history for" +msgstr "Le nombre maximal de jours durant lesquels conserver l'historique" + +#: ../midori/midori-websettings.c:802 +msgid "Remember last form inputs" +msgstr "Se souvenir des dernières saisies de formulaires" + +#: ../midori/midori-websettings.c:803 +msgid "Whether the last form inputs are saved" +msgstr "Indique s'il faut enregistrer les saisies de formulaires" + +#: ../midori/midori-websettings.c:811 +msgid "Remember last downloaded files" +msgstr "Se souvenir des derniers fichiers téléchargés" + +#: ../midori/midori-websettings.c:812 +msgid "Whether the last downloaded files are saved" +msgstr "" +"Indique s'il faut enregistrer la liste des derniers fichiers téléchargés" + +#: ../midori/midori-websettings.c:822 +msgid "Proxy Server" +msgstr "Serveur mandataire" + +#: ../midori/midori-websettings.c:823 +msgid "The proxy server used for HTTP connections" +msgstr "Le serveur mandataire (proxy) pour les connexions HTTP" + +#: ../midori/midori-websettings.c:838 +msgid "Detect proxy server automatically" +msgstr "Détecter le serveur mandataire automatiquement" + +#: ../midori/midori-websettings.c:839 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "" +"Indique s'il faut détecter le serveur mandataire (proxy) automatiquement" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:855 +msgid "Identify as" +msgstr "S'identifier comme" + +#: ../midori/midori-websettings.c:856 +msgid "What to identify as to web pages" +msgstr "Comment s'identifier sur les pages de la toile" + +#: ../midori/midori-websettings.c:872 +msgid "Identification string" +msgstr "Chaîne d'identification" + +#: ../midori/midori-websettings.c:873 +msgid "The application identification string" +msgstr "La chaîne d'identification de l'application" + +#: ../midori/midori-websettings.c:881 +msgid "Cache size" +msgstr "Taille du cache" + +#: ../midori/midori-websettings.c:882 +msgid "The allowed size of the cache" +msgstr "La taille de l'antémémoire permise" + +#. i18n: The title of the 404 - Not found error page +#. Error pages are special, we want to try loading the destination +#. again, not the error page which isn't even a proper page +#: ../midori/midori-view.c:637 ../midori/midori-view.c:2473 +#, c-format +msgid "Not found - %s" +msgstr "Non trouvé - %s" + +#: ../midori/midori-view.c:976 +msgid "Open _Link" +msgstr "Ouvrir le _lien" + +#: ../midori/midori-view.c:978 +msgid "Open Link in New _Tab" +msgstr "Ouvrir le lien dans un nouvel _onglet" + +#: ../midori/midori-view.c:995 +msgid "Open Link in New _Window" +msgstr "Ouvrir le lien dans une nouvelle _fenêtre" + +#: ../midori/midori-view.c:1004 +msgid "_Download Link destination" +msgstr "_Télécharger la cible du lien" + +#: ../midori/midori-view.c:1010 +msgid "_Save Link destination" +msgstr "_Enregistrer la cible du lien" + +#: ../midori/midori-view.c:1019 +msgid "Download with Download _Manager" +msgstr "Télécharger avec _gestionnaire de téléchargements" + +#: ../midori/midori-view.c:1048 +msgid "Search _with" +msgstr "Chercher _avec" + +#: ../midori/midori-view.c:1076 +msgid "_Search the Web" +msgstr "_Chercher sur l'internet" + +#: ../midori/midori-view.c:1086 +msgid "Open Address in New _Tab" +msgstr "Ouvrir l'adresse dans un nouvel _onglet" + +#: ../midori/midori-view.c:1234 +msgid "Open or download file" +msgstr "Ouvrir ou télécharger le fichier" + +#: ../midori/midori-view.c:1251 +#, c-format +msgid "File Type: '%s'" +msgstr "Type de fichier : « %s »" + +#: ../midori/midori-view.c:1254 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "Type de fichier : %s (« %s »)" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1258 +#, c-format +msgid "Open %s" +msgstr "Ouvrir %s" + +#: ../midori/midori-view.c:1661 +#, c-format +msgid "Inspect page - %s" +msgstr "Analyser la page - %s" + +#: ../midori/midori-view.c:1806 +#, c-format +msgid "Document cannot be displayed" +msgstr "Le document ne peut être affiché" + +#: ../midori/midori-view.c:1822 +#, c-format +msgid "No documentation installed" +msgstr "Pas de documentation installée" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Préférences de %s" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "Général" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "Démarrage" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "Utiliser la page courante comme page d'accueil" + +#: ../midori/midori-preferences.c:423 ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "Transferts" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:475 +msgid "Appearance" +msgstr "Apparence" + +#: ../midori/midori-preferences.c:476 +msgid "Font settings" +msgstr "Paramètres des polices" + +#: ../midori/midori-preferences.c:478 +msgid "Default Font Family" +msgstr "Police par défaut" + +#: ../midori/midori-preferences.c:484 +msgid "The default font size used to display text" +msgstr "La taille par défaut de la police utilisée pour afficher le texte" + +#: ../midori/midori-preferences.c:487 +msgid "Minimum Font Size" +msgstr "Taille minimum de la police" + +#: ../midori/midori-preferences.c:490 +msgid "The minimum font size used to display text" +msgstr "La taille minimum de la police utilisée pour afficher le texte" + +#: ../midori/midori-preferences.c:497 +msgid "Encoding" +msgstr "Encodage" + +#: ../midori/midori-preferences.c:500 +msgid "The character encoding to use by default" +msgstr "Encodage des caractères par défaut" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:507 +msgid "Behavior" +msgstr "Comportement" + +#: ../midori/midori-preferences.c:508 +msgid "Features" +msgstr "Fonctionnalités" + +#: ../midori/midori-preferences.c:511 ../extensions/statusbar-features.c:54 +msgid "Load images automatically" +msgstr "Charger les images" + +#: ../midori/midori-preferences.c:512 +msgid "Load and display images automatically" +msgstr "Charger et afficher les images automatiquement" + +#: ../midori/midori-preferences.c:515 +msgid "Shrink images automatically" +msgstr "Réduire les images" + +#: ../midori/midori-preferences.c:516 +msgid "Automatically shrink standalone images to fit" +msgstr "Réduire automatiquement les images pour les adapter à la fenêtre" + +#: ../midori/midori-preferences.c:519 +msgid "Print background images" +msgstr "Imprimer les images d'arrière-plan" + +#: ../midori/midori-preferences.c:520 +msgid "Whether background images should be printed" +msgstr "Indique s'il faut imprimer les images d'arrière-plan" + +#: ../midori/midori-preferences.c:523 +msgid "Resizable text areas" +msgstr "Zones de texte redimensionnables" + +#: ../midori/midori-preferences.c:524 +msgid "Whether text areas are resizable" +msgstr "Indique si les zones de texte peuvent être redimensionnées" + +#: ../midori/midori-preferences.c:527 ../extensions/statusbar-features.c:63 +msgid "Enable scripts" +msgstr "Activer les scripts" + +#: ../midori/midori-preferences.c:528 +msgid "Enable embedded scripting languages" +msgstr "Active la prise en charge interne des scripts" + +#: ../midori/midori-preferences.c:531 ../extensions/statusbar-features.c:72 +msgid "Enable plugins" +msgstr "Activer les greffons" + +#: ../midori/midori-preferences.c:532 +msgid "Enable embedded plugin objects" +msgstr "Active la prise en charge interne des greffons" + +#: ../midori/midori-preferences.c:535 +msgid "Enforce 96 dots per inch" +msgstr "Forcer 96 points par pouce" + +#: ../midori/midori-preferences.c:536 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Force une densité visuelle de 96 DPI" + +#: ../midori/midori-preferences.c:539 +msgid "Enable developer tools" +msgstr "Activer les outils de développement" + +#: ../midori/midori-preferences.c:540 +msgid "Enable special extensions for developers" +msgstr "Activer les extensions spécifiques pour les développeurs" + +#. Page "Interface" +#: ../midori/midori-preferences.c:548 +msgid "Interface" +msgstr "Interface" + +#: ../midori/midori-preferences.c:549 +msgid "Navigationbar" +msgstr "Barre de navigation" + +#: ../midori/midori-preferences.c:560 +msgid "Browsing" +msgstr "Navigation" + +#. Page "Network" +#: ../midori/midori-preferences.c:590 ../midori/midori-preferences.c:591 +msgid "Network" +msgstr "Réseau" + +#: ../midori/midori-preferences.c:618 +msgid "MB" +msgstr "Mo" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:623 +msgid "Privacy" +msgstr "Vie privée" + +#: ../midori/midori-preferences.c:624 +msgid "Web Cookies" +msgstr "Témoins de connexion" + +#: ../midori/midori-preferences.c:637 ../midori/midori-preferences.c:647 +msgid "days" +msgstr "jours" + +#: ../midori/midori-searchaction.c:484 ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "Vide" + +#: ../midori/midori-searchaction.c:904 +msgid "Add search engine" +msgstr "Ajouter un moteur de recherche" + +#: ../midori/midori-searchaction.c:904 +msgid "Edit search engine" +msgstr "Modifier le moteur de recherche" + +#: ../midori/midori-searchaction.c:932 +msgid "_Name:" +msgstr "_Nom :" + +#: ../midori/midori-searchaction.c:976 +msgid "_Icon:" +msgstr "_Icône :" + +#: ../midori/midori-searchaction.c:990 +msgid "_Token:" +msgstr "_Jeton :" + +#: ../midori/midori-searchaction.c:1195 +msgid "Manage Search Engines" +msgstr "Gestion des moteurs de recherche" + +#: ../midori/midori-searchaction.c:1292 +msgid "Use as _default" +msgstr "Comme dé_faut" + +#: ../midori/sokoke.c:117 ../midori/sokoke.c:129 +msgid "Could not run external program." +msgstr "Impossible d'exécuter le programme externe" + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:448 +msgid "Warning: You are using a superuser account!" +msgstr "Attention : vous utilisez Midori avec un compte superutilisateur !" + +#: ../midori/sokoke.c:780 +msgid "_Bookmark" +msgstr "_Signet" + +#: ../midori/sokoke.c:782 +msgid "_Add Bookmark" +msgstr "_Ajouter un signet" + +#: ../midori/sokoke.c:783 +msgid "_Console" +msgstr "_Console" + +#: ../midori/sokoke.c:784 +msgid "_Extensions" +msgstr "_Extensions" + +#: ../midori/sokoke.c:785 +msgid "_History" +msgstr "_Historique" + +#: ../midori/sokoke.c:786 +msgid "_Homepage" +msgstr "_Page d'accueil" + +#: ../midori/sokoke.c:787 +msgid "_Userscripts" +msgstr "Scripts _utilisateur" + +#: ../midori/sokoke.c:788 +msgid "User_styles" +msgstr "_Styles utilisateur" + +#: ../midori/sokoke.c:789 +msgid "New _Tab" +msgstr "Nouvel _onglet" + +#: ../midori/sokoke.c:790 +msgid "_Transfers" +msgstr "_Transferts" + +#: ../midori/sokoke.c:791 +msgid "P_lugins" +msgstr "G_reffons" + +#: ../midori/sokoke.c:792 +msgid "_Closed Tabs and Windows" +msgstr "Onglets et fenêtres _fermés" + +#: ../midori/sokoke.c:793 +msgid "New _Window" +msgstr "Nouvelle _fenêtre" + +#: ../panels/midori-addons.c:95 ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "Scripts utilisateur" + +#: ../panels/midori-addons.c:96 ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "Styles utilisateur" + +#: ../panels/midori-addons.c:927 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Activer" + +#: ../panels/midori-addons.c:928 ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "Activer" + +#: ../panels/midori-addons.c:937 ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "_Désactiver" + +#: ../panels/midori-addons.c:938 ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "Désactiver" + +#: ../panels/midori-bookmarks.c:107 +msgid "Bookmarks" +msgstr "Signets" + +#: ../panels/midori-bookmarks.c:240 +msgid "Edit the selected bookmark" +msgstr "Modifier le signet sélectionné" + +#: ../panels/midori-bookmarks.c:248 +msgid "Delete the selected bookmark" +msgstr "Supprimer le signet sélectionné" + +#: ../panels/midori-bookmarks.c:593 +msgid "Separator" +msgstr "Séparateur" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Console" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Extensions" + +#: ../panels/midori-history.c:163 +msgid "Are you sure you want to remove all history items?" +msgstr "Ètes-vous certain de vouloir effacer tout l'historique ?" + +#: ../panels/midori-history.c:218 +msgid "Bookmark the selected history item" +msgstr "Ajouter un signet pour l'élément sélectionné de l'historique" + +#: ../panels/midori-history.c:227 +msgid "Delete the selected history item" +msgstr "Supprimer l'élément sélectionné de l'historique" + +#: ../panels/midori-history.c:235 +msgid "Clear the entire history" +msgstr "Vider l'historique entier" + +#: ../panels/midori-history.c:600 +#, c-format +msgid "A week ago" +msgstr "Il y a une semaine" + +#: ../panels/midori-history.c:606 +#, c-format +msgid "%d days ago" +msgstr "Il y a %d jours" + +#: ../panels/midori-history.c:613 +msgid "Today" +msgstr "Aujourd'hui" + +#: ../panels/midori-history.c:615 +msgid "Yesterday" +msgstr "Hier" + +#: ../panels/midori-plugins.c:87 +msgid "Plugins" +msgstr "Greffons" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "%s de %s" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "Authentification requise" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Un nom d'utilisateur et un mot de passe sont requis\n" +"pour l'ouverture de ce lieu :" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "Mot de passe" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "L'icône nommée « %s » n'a pu être chargée." + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "L'icône prédéfinie « %s » n'a pu être chargée." + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Les trames d'animation sont corrompues" + +#: ../katze/katze-utils.c:183 ../katze/katze-utils.c:395 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "La propriété « %s » n'est pas valide pour %s" + +#: ../katze/katze-utils.c:215 ../katze/katze-utils.c:254 +msgid "Choose file" +msgstr "Choisissez un fichier" + +#: ../katze/katze-utils.c:235 +msgid "Choose folder" +msgstr "Choisissez un répertoire" + +#: ../extensions/colorful-tabs.c:104 +msgid "Tint tabs distinctly" +msgstr "Colorer les onglets" + +#: ../extensions/colorful-tabs.c:140 +msgid "Colorful Tabs" +msgstr "Onglets colorés" + +#: ../extensions/colorful-tabs.c:141 +msgid "Tint each tab distinctly" +msgstr "Donner une couleur distincte à chaque onglet" + +#: ../extensions/cookie-manager.c:201 +msgid "At the end of the session" +msgstr "Au fin de la session" + +#: ../extensions/cookie-manager.c:204 +#, c-format +msgid "" +"Host: %s\n" +"Name: %s\n" +"Value: %s\n" +"Path: %s\n" +"Secure: %s\n" +"Expires: %s" +msgstr "" +"Hôte : %s\n" +"Nom : %s\n" +"Valeur : %s\n" +"Chemin : %s\n" +"Sécuritaire : %s\n" +"Expire : %s" + +#: ../extensions/cookie-manager.c:210 +msgid "Yes" +msgstr "Oui" + +#: ../extensions/cookie-manager.c:210 +msgid "No" +msgstr "Non" + +#: ../extensions/cookie-manager.c:491 +msgid "Do you really want to delete all cookies?" +msgstr "Ètes-vous certain de vouloir effacer tout les fichiers témoins ?" + +#: ../extensions/cookie-manager.c:493 +msgid "Question" +msgstr "Question" + +#: ../extensions/cookie-manager.c:501 +msgid "" +"Only the visible cookies are deleted which match the entered filter string." +msgstr "" + +#: ../extensions/cookie-manager.c:679 +msgid "Name" +msgstr "Nom" + +#: ../extensions/cookie-manager.c:739 +msgid "_Expand All" +msgstr "_Afficher tous" + +#: ../extensions/cookie-manager.c:747 +msgid "_Collapse All" +msgstr "_Masquer tous" + +#: ../extensions/cookie-manager.c:818 +msgid "Delete All" +msgstr "Supprimer tous" + +#: ../extensions/cookie-manager.c:820 +msgid "" +"Deletes all shown cookies. If a filter is set, only those cookies are " +"deleted which match the filter." +msgstr "" + +#: ../extensions/cookie-manager.c:835 +msgid "Expand All" +msgstr "Afficher tous" + +#: ../extensions/cookie-manager.c:842 +msgid "Collapse All" +msgstr "Masquer tous" + +# manque un raccourcis Alt+X +#: ../extensions/cookie-manager.c:873 +msgid "Filter:" +msgstr "Filtre :" + +#: ../extensions/cookie-manager.c:878 +msgid "" +"Enter a filter string to show only cookies whose name or domain field match " +"the entered filter" +msgstr "" + +#: ../extensions/cookie-manager.c:913 ../extensions/cookie-manager.c:961 +msgid "Cookie Manager" +msgstr "Gestionnaire de cookies" + +#: ../extensions/cookie-manager.c:945 +msgid "_Cookie Manager" +msgstr "Gestionnaire de _cookies" + +#: ../extensions/cookie-manager.c:962 +msgid "List, view and delete cookies" +msgstr "Lister, afficher et supprimer les témoins" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "Mouvements de souris" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "Contrôler Midori par des mouvements de la souris" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:129 ../extensions/page-holder.c:177 +msgid "Pageholder" +msgstr "Cadre de pages" + +#: ../extensions/page-holder.c:161 +msgid "_Pageholder" +msgstr "C_adre de pages" + +#~ msgid "Images" +#~ msgstr "Images" + +#~ msgid "Scripts" +#~ msgstr "Scripts" + +#~ msgid "%s has no property '%s'" +#~ msgstr "%s n'a pas de propriété « %s »" + +#~ msgid "%s cannot be assigned to %s.%s" +#~ msgstr "%s ne peut être assigné à %s.%s" + +#~ msgid "%s.%s cannot be accessed" +#~ msgstr "%s.%s ne peut être accédé" + +#~ msgid "Source" +#~ msgstr "Source" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 00000000..8fe65709 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,1594 @@ +# Galician translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Miguel Anxo Bouzada 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori-0.0.18\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-07-20 13:42+0100\n" +"Last-Translator: Miguel Anxo Bouzada \n" +"Language-Team: GALPon MiniNo \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Navegador lixeiro" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Navegador" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Marcapáxina" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Marcapáxinas" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Engadir marcapáxinas" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Consola" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Extensións" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Histórico" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "P_áxina de inicio" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Scripts de usuario" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "_Estilos de usuario" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Nova lingüe_ta" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Transferencias" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Nova _ventá" + +#: ../midori/main.c:143 +#, fuzzy, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Non se puido cargar a configuración. %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "O valor «%s» non é válido para %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, fuzzy, c-format +msgid "Invalid configuration value '%s'" +msgstr "Non se poden axustar as propiedades «%s»" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Non se atopa o ficheiro." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Documento defectuoso" + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Fallou a escritura." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Transferencias" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Non se puido gardar a sesión. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Amosar a versión do programa" + +#: ../midori/main.c:1301 +#, fuzzy +msgid "URIs" +msgstr "URI" + +#: ../midori/main.c:1335 +#, fuzzy +msgid "[URIs]" +msgstr "[URL]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Por favor, envíe comentarios, suxerencias e problemas a:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Comprobar se existen novas versións en:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "" + +#: ../midori/main.c:1447 +#, fuzzy, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Os marcapáxinas non puideron ser cargados. %s\n" + +#: ../midori/main.c:1463 +#, fuzzy, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Non se puido cargar a sesión. %s\n" + +#: ../midori/main.c:1477 +#, fuzzy, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Non se puido cargar a «Cesta do lixo». %s\n" + +#: ../midori/main.c:1491 +#, fuzzy, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Non se puido cargar a «Cesta do lixo». %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Producíronse os seguinte erros:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Non se puido gardar o motor de busca. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Non se puideron gardar os marcapáxinas. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Non se puido gardar a «cesta do lixo». %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Non se puido gardar a configuración. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Cargar novamente a páxina actual" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Deter a carga da páxina" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% cargada" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Acción non esperada «%s»" + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Novo marcapáxinas" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Editar o marcapáxinas" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Título:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Descrición" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Cartafol:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Raiz" + +#: ../midori/midori-browser.c:668 +#, fuzzy +msgid "Save file as" +msgstr "Gardar nun ficheiro" + +#: ../midori/midori-browser.c:1248 +#, fuzzy +msgid "Open file" +msgstr "Abrir un ficheiro" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Abrir nunha nova _lingüeta " + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Abrir nunha nova _ventá" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Separador" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Un navegador moi lixeiro" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "" +"Miguel Anxo Bouzada\n" +"Antonio Sanchez" + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Ficheiro" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Abrir unha nova ventá" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Abrir unha nova lingüeta" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Abrir un ficheiro" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Gardar nun ficheiro" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "Pechar _lingüeta" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Pechar a lingüeta actual" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "_Pechar a ventá" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Pechar esta ventá" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Imprimir a páxina actual" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Sair da aplicación" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Editar" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Copiar o texto seleccionado" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Copiar o texto seleccionado" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Pegar o texto seleccionado no porta papeis" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Borrar o texto seleccionado" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Seleccionar todo o texto" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Buscar palabra ou frase nesta páxina" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Buscar _seguinte" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Buscar a seguinte coincidencia de palabra ou frase" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Buscar _anterior" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Buscar a anterior coincidencia de palabra ou frase" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "Busca _rapida" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Salto rápido a unha palabra ou frase" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Configurar as preferencias da aplicación" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Ver" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Barra de ferramentas" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Aumentar o nivel de zoom" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Diminuir o nivel de zoom" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Reiniciar o nivel de zoom" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Amosar _código fonte" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Ver o código fonte da páxina" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Amosar código fonte da páxina seleccionada" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Ver o código fonte da selección" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Activar/desactivar pantalla completa" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Ir" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Ir á páxina anterior" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Avanzar á seguinte páxina" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Ir a súa páxina de inicio" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Baleirar a cesta do lixo" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Borrar o contido do lixo" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Desfacer o peche de lingüeta" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Abrir a última lingüeta pechada" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Engadir novo marcapáxinas" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Editar o marcapáxinas seleccionado" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Borrar o marcapáxinas seleccionado" + +#: ../midori/midori-browser.c:3185 +#, fuzzy +msgid "Delete the selected history item" +msgstr "Borrar o texto seleccionado" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "" + +#: ../midori/midori-browser.c:3191 +#, fuzzy +msgid "Bookmark the selected history item" +msgstr "Copiar o texto seleccionado" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Ferramentas" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Xestor de motores de busca" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Engadir, editar ou eliminar motores de busca..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "Lingüeta _anterior" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Cambiar a lingüeta anterior" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "Lingüeta _seguinte" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Cambiar a lingüeta seguinte" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Axuda" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Contido" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Amosar a documentación" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Amosar información sobre o programa" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "Navegación p_rivada" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Non gardar datos privados durante a navegación" + +#: ../midori/midori-browser.c:3231 +#, fuzzy +msgid "_Menubar" +msgstr "Barra do menú" + +#: ../midori/midori-browser.c:3232 +#, fuzzy +msgid "Show menubar" +msgstr "Barra de menu" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "Barra de _navegación" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Amosar a barra de navegación" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "_Panel lateral" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Amosar panel lateral" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "Barra de marcapáxinas" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Amosar a barra de marcapáxinas" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "Barra de _transferencias" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Amosar a barra de transferencias" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "Barra de es_tado" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Amosar a barra de estado" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "Ubicación..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Abrir un enderezo determinado" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "Buscar na _web..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Proceder a busca na web" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Voltar a abrir ventás ou lingüetas pechadas" + +#: ../midori/midori-browser.c:3729 +#, fuzzy +msgid "_Recently visited pages" +msgstr "Recordar as últimas páxinas visitadas" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "" + +#: ../midori/midori-browser.c:3746 +#, fuzzy +msgid "Show the saved bookmarks" +msgstr "Abrir o marcapáxinas seleccionado" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Ventá" + +#: ../midori/midori-browser.c:3761 +#, fuzzy +msgid "Show a list of all open tabs" +msgstr "Amosar unha visión xeral de todas as lingüetas abertas" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Marcapáxinas" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Histórico" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "_Busca en liña:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Sensible a maiúsculas" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Pechar barra de buscas" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Axuste non esperado «%s»" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Perchar o panel" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Páxina baleira" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Inicio" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Páxinas abertas recentemente" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Chinés (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Xaponés (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Ruso (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Occidental (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Personalizado..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Nova lingüeta" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Nova ventá" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Lingüeta actual" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Predeterminada" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Iconas" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Texto" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Ambos" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Ambos en horizontal" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Todas as «cookies»" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "As «cookies» de esta sesión" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Ningunha" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Recordar último tamaño de ventá" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Gardar (ou non) o último tamaño de ventá" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Última largura da ventá" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Última largura da ventá gardada" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Última altura da ventá" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Última altura da ventá gardada" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Última posición do panel" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Uñtima posición gardada do panel" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Última páxina do panel" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Última páxina gardada do panel" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Última busca na web" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Última busca na web gardada" + +#: ../midori/midori-websettings.c:302 +#, fuzzy +msgid "Show Menubar" +msgstr "Barra do menú" + +#: ../midori/midori-websettings.c:303 +#, fuzzy +msgid "Whether to show the menubar" +msgstr "Amosar (ou non) a barra de estado" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Amosar a barra de navegación" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Amosar (ou non) a barra de navegación" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Amosar a barra de marcapáxinas" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Amosar (ou non) a barra de marcapáxinas" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Amosar o panel" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Amosar (ou non) o panel" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Amosar a barra de estado" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Amosar (ou non) a barra de estado" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Estilo da barra de ferramentas" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "O estilo da barra de ferramentas" + +#: ../midori/midori-websettings.c:358 +#, fuzzy +msgid "Toolbar Items" +msgstr "Estilo da barra de ferramentas" + +#: ../midori/midori-websettings.c:359 +#, fuzzy +msgid "The items to show on the toolbar" +msgstr "O estilo da barra de ferramentas" + +#: ../midori/midori-websettings.c:367 +#, fuzzy +msgid "Compact Sidepanel" +msgstr "_Panel lateral" + +#: ../midori/midori-websettings.c:368 +#, fuzzy +msgid "Whether to make the sidepanel compact" +msgstr "Amosar (ou non) o panel" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Cargar ao inicio" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Que cargar no inicio" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Páxina de inicio" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Cartafol de descargas" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "O cartafol de descargas foi gardado en" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "Xestor de descargas" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Xestor de descargas externo" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Busca de barra de enderezos" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "Facer unha busca a partir do contido da barra de enderezos" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Codificación prefereida" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Codificación de carácteres preferida" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Botón de pechar nas lingüetas" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Cada unha das lingüetas terá o seu botón para pechala" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Abrir as páxinas novas en" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Donde se van a abrir as páxinas novas" + +#: ../midori/midori-websettings.c:473 +#, fuzzy +msgid "Open external pages in" +msgstr "Abrir as páxinas novas en" + +#: ../midori/midori-websettings.c:474 +#, fuzzy +msgid "Where to open externally opened pages" +msgstr "Donde se van a abrir as páxinas novas" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Clic no botón do medio abre a selección" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Cargar unha URL na selección empregando o botón de medio do rato" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Abrir lingüetas en segundo plano" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Abrir (ou non) as novas lingüetas en segundo plano" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Abrir «emerxentes» en lingüetas" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Abrir (ou non) as ventas emerxentes en lingüetas" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Aceptar as «cookies»" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Que tipos de «cookies» van ser aceptadas" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Só as «cookies» do sitio orixinal" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Só se aceptan as «cookies» do sitio orixe" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Persistencia máxima das «cookies»" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Tempo máximo, en dias, durante os que se gardaran as «cookies»" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Recordar as últimas páxinas visitadas" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Recordar (ou non) as últimas páxinas que foron visitadas" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Persistencia máxima do histórico" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Tempo máximo, en dias, durante os que se gardará un dato do histórico" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Recordar as últimas sesións de formularios" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Recordar (ou non) as últimas sesións cos seus datos de formularios" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Recordar últimos ficheiros descargados" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "" +"Recordar (ou non) a lista de descargas de ficheiros realizadas últimamente" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "Servidor proxy HTTP" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "Servidor proxy para conexións HTTP" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Tamaño da caché" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Tamaño asignado á memoria caché" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Abrir a ligazón nunha nova _lingüeta" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Abrir a URL nunha nova _lingüeta" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Código fonte" + +#: ../midori/midori-view.c:1527 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Amosar a documentación" + +#: ../midori/midori-preferences.c:87 +#, fuzzy, c-format +msgid "Preferences for %s" +msgstr "%s Preferencias" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Xeral" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Inicio" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Aparencia" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Axustes de fontes" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Comportamento" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Funcionalidades" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +#, fuzzy +msgid "Enable scripts" +msgstr "Scripts de usuario" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Interface" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Barra de navegación" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Navegación" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Rede" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "" + +#: ../midori/midori-preferences.c:500 +#, fuzzy +msgid "Web Cookies" +msgstr "Aceptar as «cookies»" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Baleiro" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Engadir un motor de busca" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Editar o motor de busca" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Nome:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Icona (nome ou ficheiro):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "«_Marca»" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Xestionar os motores de busca" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Non se puido executar o programa externo." + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Aviso: Estas conectado como super usuario!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Atopouse un erro descoñecido:" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s non ten a propiedade «%s»" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s non pode ser asignado a %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s non se pode acceder" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Scripts de usuario" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Estilos de usuario" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +#, fuzzy +msgid "_Disable" +msgstr "_Ficheiro" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Consola" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Extensións" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "A propiedade «%s» non é válida para %s" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Escoller un ficheiro" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Escoller un cartafol" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Cadro de páxinas" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "C_adro de páxinas" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "Scripts de usuario" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Select _All" +#~ msgstr "Seleccion_ar todo" + +#~ msgid "_Fullscreen" +#~ msgstr "_Pantalla completa" + +#~ msgid "_Leave Fullscreen" +#~ msgstr "_Saír de pantalla completa" + +#~ msgid "Unknown argument." +#~ msgstr "Argumento descoñecido." + +#~ msgid "Failed to setup interface." +#~ msgstr "Fallou a configuración da interface." + +#~ msgid "Settings" +#~ msgstr "Configuración" + +#~ msgid "The associated settings" +#~ msgstr "Axustes asociados" + +#~ msgid "Trash" +#~ msgstr "Cesta do lixo" + +#~ msgid "The trash, collecting recently closed tabs and windows" +#~ msgstr "Lixo, recollido recentemente pechando lingüetas e ventás" + +#~ msgid "Browser" +#~ msgstr "Navegador" + +#~ msgid "The current browser" +#~ msgstr "Navegador actual" + +#~ msgid "Browser Count" +#~ msgstr "Contador do navegador" + +#~ msgid "The current number of browsers" +#~ msgstr "Número actual de navegadores" + +#~ msgid "Search Engines" +#~ msgstr "Motores de busca" + +#~ msgid "The list of search engines" +#~ msgstr "Lista de motores de busca" + +#~ msgid "The navigationbar" +#~ msgstr "Barra de navegación" + +#~ msgid "Tab" +#~ msgstr "Lingüeta" + +#~ msgid "The current tab" +#~ msgstr "Lingüeta actual" + +#~ msgid "Statusbar" +#~ msgstr "Barra de estado" + +#~ msgid "The statusbar" +#~ msgstr "Barra de estado" + +#~ msgid "Statusbar Text" +#~ msgstr "Texto da barra de estado" + +#~ msgid "The text that is displayed in the statusbar" +#~ msgstr "O texto amosase na barra de estado" + +#~ msgid "The list of search engines to be used for web search" +#~ msgstr "Lista de motores de busca que pode utilizar para buscas na web" + +#~ msgid "Pa_ge Setup" +#~ msgstr "Configuración da páxina" + +#~ msgid "Show a preview of the printed page" +#~ msgstr "Amosar previsualización da páxina á imprimir" + +#~ msgid "Undo the last modification" +#~ msgstr "Desfacer a última modificación" + +#~ msgid "Redo the last modification" +#~ msgstr "Refacer a última modificación" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Abrir no _cadro de páxinas" + +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Abrir a páxina actual no cadro de páxinas" + +#~ msgid "_Manage Bookmarks" +#~ msgstr "_Xestionar marcapáxinas" + +#~ msgid "Add, edit and remove bookmarks..." +#~ msgstr "Engadir, editar ou eliminar marcapáxinas..." + +#~ msgid "Open the selected bookmark in a new tab" +#~ msgstr "Abrir o marcapáxinas seleccionado nunha lingüeta nova" + +#~ msgid "Open the selected bookmark in a new window" +#~ msgstr "Abrir o marcapáxinas seleccionado nunha ventá nova" + +# comprobar +#~ msgid "Tab _Overview" +#~ msgstr "_Descrición de lingüetas" + +#~ msgid "_Work Offline" +#~ msgstr "Traballar desconectado" + +#~ msgid "Work without a network connection" +#~ msgstr "Traballar sin conexión de rede" + +#~ msgid "Appearance of the shadow around each panel" +#~ msgstr "Aspecto das sombras arredor de cada panel" + +#~ msgid "Menu" +#~ msgstr "Menú" + +#~ msgid "Menu to hold panel items" +#~ msgstr "Menu para conter os elementos dos paneis" + +#~ msgid "The index of the current page" +#~ msgstr "Indice da páxina actual" + +#~ msgid "Last pageholder URI" +#~ msgstr "Última URI do cadro de páxinas" + +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Última URI aberta no cadro de páxinas" + +#~ msgid "Show New Tab" +#~ msgstr "Amosar nova lingüeta" + +#~ msgid "Show the New Tab button in the toolbar" +#~ msgstr "Amosar o botón de «Nova lingüeta» na barra de ferramentas" + +#~ msgid "Show Homepage" +#~ msgstr "Amosar páxina de inicio" + +#~ msgid "Show the Homepage button in the toolbar" +#~ msgstr "Amosar o botón de «Páxina de Inicio» na barra de ferramentas" + +#~ msgid "Show Web search" +#~ msgstr "Amosar o buscador web" + +#~ msgid "Show the Web search entry in the toolbar" +#~ msgstr "Amosar a caixa se buscas na web na barra de ferramentas" + +#~ msgid "Show Trash" +#~ msgstr "Amosar «Cesta do lixo»" + +#~ msgid "Show the Trash button in the toolbar" +#~ msgstr "Amosar o botón «Cesta do lixo» na barra de ferramentas" + +#~ msgid "Tab Label Size" +#~ msgstr "Tamaño da etiqueta de lingüetas" + +#~ msgid "The desired tab label size" +#~ msgstr "Tamaño desexado da etiqueta das lingüetas" + +#~ msgid "The URI of the currently loaded page" +#~ msgstr "URI da páxina actualmente cargada" + +#~ msgid "The title of the currently loaded page" +#~ msgstr "Título da páxina actualmente cargada" + +#~ msgid "Download Link with Download _Manager" +#~ msgstr "Descargar a ligazón con un _xestor de descargas" + +#~ msgid "Settings instance to provide properties" +#~ msgstr "Configuración exemplo para fornecer propiedades" + +#~ msgid "Current Item" +#~ msgstr "Elemento actual" + +#~ msgid "The currently selected item" +#~ msgstr "Elemento seleccionado actualmente" + +#~ msgid "Dialog" +#~ msgstr "Dialogo" + +#~ msgid "A dialog to manage search engines" +#~ msgstr "Caixa de dialogo para xestionar os motores de busca" + +#~ msgid "Symbolic size to use for the animation" +#~ msgstr "Tamaño simbólico a usar para animacións" + +#~ msgid "The name of an icon containing animation frames" +#~ msgstr "O nome da icona contén cadros animados" + +#~ msgid "A GdkPixbuf containing animation frames" +#~ msgstr "O «GdkPixbuf» conten cadros de animación" + +#~ msgid "Whether the throbber should be animated" +#~ msgstr "Animar (ou non) a icona" + +#~ msgid "The name of an icon to be used as the static image" +#~ msgstr "Nome a usar para a icona non animada" + +#~ msgid "A GdkPixbuf to be used as the static image" +#~ msgstr "O «GdkPixbuf» vai ser usada como imaxe estática" + +#~ msgid "The stock ID of an icon to be used as the static image" +#~ msgstr "ID da icona para ser usada como imaxe estática" + +#~ msgid "Name" +#~ msgstr "Nome:" + +#~ msgid "Icon" +#~ msgstr "Icona" + +#~ msgid "Token" +#~ msgstr "«Marca»" + +#~ msgid "The token of the item" +#~ msgstr "«Marca» do elemento" diff --git a/po/he.po b/po/he.po new file mode 100644 index 00000000..95bd36d6 --- /dev/null +++ b/po/he.po @@ -0,0 +1,1805 @@ +# Hebrew translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Shlomi Israel 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: Midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-13 23:00+0200\n" +"PO-Revision-Date: 2009-04-13 12:14+0300\n" +"Last-Translator: Shlomi Israel \n" +"Language-Team: Hebrew \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "דפדפן קל משקל" + +#: ../data/midori.desktop.in.h:2 ../midori/main.c:1288 ../midori/main.c:1388 +#: ../midori/main.c:1396 ../midori/main.c:1407 +#: ../midori/midori-websettings.c:269 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "דפדפן" + +#: ../midori/main.c:94 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "ההגדרות לא ניתנות לטעינה: %s\n" + +#: ../midori/main.c:149 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "הערך %s אינו תקף עבור %s" + +#: ../midori/main.c:156 ../midori/main.c:228 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "ערך הגדרה אינו תקף '%s'" + +#: ../midori/main.c:332 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "כשל בפתיחת מסד הנתונים: %s\n" + +#: ../midori/main.c:364 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "נכשל בהרצת הצהרת מסד הנתונים: %s\n" + +#: ../midori/main.c:418 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "כשל בהסרת פריט היסטוריה: %s\n" + +#: ../midori/main.c:442 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "כשל בניקוי ההיסטוריה: %s\n" + +#: ../midori/main.c:465 ../midori/main.c:499 ../midori/main.c:515 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "כשל בהוספת פריט היסטוריה: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:694 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "כשל בהסרת פריטי היסטוריה ישנים: %s\n" + +#: ../midori/main.c:722 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "ההגדרות לא ניתנות לשמירה. %s" + +#: ../midori/main.c:751 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "מנועי החיפוש לא ניתנים לשמירהץ %s" + +#: ../midori/main.c:770 ../midori/main.c:798 ../midori/main.c:827 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "הסימניה לא ניתנת לשמירה. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:850 ../midori/main.c:873 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "האשפה לא ניתנת לשמירה. %s" + +#: ../midori/main.c:946 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "תצורת ההפעלה לא ניתנת לשמירה. %s" + +#: ../midori/main.c:1073 +msgid "" +"Midori seems to have crashed the last time it was opened. If this happened " +"repeatedly, try one of the following options to solve the problem." +msgstr "" +"נראה ש־Midori קרס בפעם הקודמת שנפתח. אם זה יקרה שוב,נסה את אחת האפשרויות " +"הבאות לפתירת התקלה." + +#: ../midori/main.c:1088 +msgid "Modify _preferences" +msgstr "ערוך העדפות" + +#: ../midori/main.c:1092 +msgid "Reset the last _session" +msgstr "שחזר לתצורת ההפעלה האחרונה" + +#: ../midori/main.c:1097 +msgid "Disable all _extensions" +msgstr "נטרל את כל ההרחבות" + +#: ../midori/main.c:1288 +msgid "No filename specified" +msgstr "לא צויין שם קובץ" + +#: ../midori/main.c:1311 +msgid "An unknown error occured." +msgstr "התרחשה שגיאה לא מזוהה." + +#: ../midori/main.c:1336 +msgid "Run ADDRESS as a web application" +msgstr "" + +#: ../midori/main.c:1336 +msgid "ADDRESS" +msgstr "" + +#: ../midori/main.c:1338 +msgid "Use FOLDER as configuration folder" +msgstr "" + +#: ../midori/main.c:1338 +msgid "FOLDER" +msgstr "" + +#: ../midori/main.c:1340 +msgid "Run the specified filename as javascript" +msgstr "הרץ את שם הקובץ המצויין כ־javascript" + +#: ../midori/main.c:1342 +msgid "Display program version" +msgstr "הצג גרסת יישום" + +#: ../midori/main.c:1344 +msgid "Addresses" +msgstr "כתובות" + +#: ../midori/main.c:1385 +msgid "[Addresses]" +msgstr "[כתובות]" + +#: ../midori/main.c:1408 +msgid "Please report comments, suggestions and bugs to:" +msgstr "אנא דווח תגובות, הצעות ובאגים אל:" + +#: ../midori/main.c:1410 +msgid "Check for new versions at:" +msgstr "בדוק גרסות חדשות ב:" + +#: ../midori/main.c:1454 +msgid "The specified configuration folder is invalid." +msgstr "" + +#: ../midori/main.c:1489 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "מופע של Midori כבר רץ אך אינו מגיב. \n" + +#: ../midori/main.c:1539 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "מנועי החיפוש לא ניתנים לטעינה. %s\n" + +#: ../midori/main.c:1551 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "הסימניה לא ניתנת לטעינה: %s\n" + +#: ../midori/main.c:1566 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "תצורת ההפעלה לא ניתנת לטעינה: %s\n" + +#: ../midori/main.c:1579 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "האשפה לא ניתנת לטעינה: %s\n" + +#: ../midori/main.c:1592 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "ההיסטוריה לא ניתנת לטעינה: %s\n" + +#: ../midori/main.c:1604 +msgid "The following errors occured:" +msgstr "השגיאות הבאות התרחשו:" + +#: ../midori/main.c:1620 +msgid "_Ignore" +msgstr "התעלם" + +#: ../midori/midori-array.c:195 +msgid "File not found." +msgstr "הקובץ לא נמצא." + +#: ../midori/midori-array.c:203 ../midori/midori-array.c:212 +msgid "Malformed document." +msgstr "מסמך לא תקין." + +#: ../midori/midori-array.c:338 ../midori/sokoke.c:623 +#, c-format +msgid "Writing failed." +msgstr "הכתיבה נכשלה." + +#: ../midori/midori-browser.c:278 ../midori/midori-browser.c:3357 +#: ../midori/midori-browser.c:3363 +msgid "Reload the current page" +msgstr "טען את הדף הנוכחי מחדש" + +#: ../midori/midori-browser.c:289 ../midori/midori-browser.c:3360 +msgid "Stop loading the current page" +msgstr "הפסק לטעון את הדף הנוכחי" + +#: ../midori/midori-browser.c:350 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% נטען" + +#: ../midori/midori-browser.c:375 +#, c-format +msgid "Unexpected action '%s'." +msgstr "פעולה בלתי צפויה '%s'." + +#: ../midori/midori-browser.c:538 +msgid "New folder" +msgstr "תיקיה חדשה" + +#: ../midori/midori-browser.c:538 +msgid "Edit folder" +msgstr "ערוך תיקיה" + +#: ../midori/midori-browser.c:540 +msgid "New bookmark" +msgstr "סימניה חדשה" + +#: ../midori/midori-browser.c:540 +msgid "Edit bookmark" +msgstr "ערוך סימניה" + +#: ../midori/midori-browser.c:570 +msgid "_Title:" +msgstr "כותרת:" + +#: ../midori/midori-browser.c:583 ../midori/midori-searchaction.c:856 +msgid "_Description:" +msgstr "תיאור:" + +#: ../midori/midori-browser.c:602 ../midori/midori-searchaction.c:870 +msgid "_Address:" +msgstr "כתובת:" + +#: ../midori/midori-browser.c:621 +msgid "_Folder:" +msgstr "תיקיה:" + +#: ../midori/midori-browser.c:626 ../midori/midori-browser.c:667 +msgid "Toplevel folder" +msgstr "תיקיית שורש" + +#: ../midori/midori-browser.c:743 +msgid "Save file as" +msgstr "שמור בשם" + +#: ../midori/midori-browser.c:1520 +msgid "Open file" +msgstr "פתח קובץ" + +#: ../midori/midori-browser.c:2792 ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:809 +msgid "Open all in _Tabs" +msgstr "פתח הכל בלשוניות" + +#: ../midori/midori-browser.c:2799 ../panels/midori-bookmarks.c:788 +#: ../panels/midori-history.c:815 +msgid "Open in New _Tab" +msgstr "פתח בלשונית חדשה" + +#: ../midori/midori-browser.c:2802 ../panels/midori-bookmarks.c:790 +#: ../panels/midori-history.c:817 +msgid "Open in New _Window" +msgstr "פתח בחלון חדש" + +#: ../midori/midori-browser.c:2963 +msgid "Clear Private Data" +msgstr "" + +#: ../midori/midori-browser.c:2966 +msgid "Clear private data" +msgstr "" + +#: ../midori/midori-browser.c:2979 +msgid "Clear the following data:" +msgstr "" + +#: ../midori/midori-browser.c:2987 ../midori/midori-preferences.c:628 +#: ../panels/midori-history.c:108 +msgid "History" +msgstr "" + +#: ../midori/midori-browser.c:2990 +msgid "Cookies" +msgstr "" + +#: ../midori/midori-browser.c:2993 +msgid "'Flash' Cookies" +msgstr "" + +#: ../midori/midori-browser.c:2996 +msgid "Website icons" +msgstr "" + +#: ../midori/midori-browser.c:3082 +msgid "A lightweight web browser." +msgstr "דפדפן קל משקל." + +#: ../midori/midori-browser.c:3090 +msgid "translator-credits" +msgstr "Shlomi Israel " + +#: ../midori/midori-browser.c:3291 +msgid "_File" +msgstr "קובץ" + +#: ../midori/midori-browser.c:3294 +msgid "Open a new window" +msgstr "פתח חלון חדש" + +#: ../midori/midori-browser.c:3297 +msgid "Open a new tab" +msgstr "פתח לשונית חדשה" + +#: ../midori/midori-browser.c:3300 +msgid "Open a file" +msgstr "פתח קובץ" + +#: ../midori/midori-browser.c:3303 +msgid "Save to a file" +msgstr "שמור לקובץ" + +#: ../midori/midori-browser.c:3305 +msgid "_Close Tab" +msgstr "סגור לשונית" + +#: ../midori/midori-browser.c:3306 +msgid "Close the current tab" +msgstr "סגור את הלשונית הנוכחית" + +#: ../midori/midori-browser.c:3308 +msgid "C_lose Window" +msgstr "סגור חלון" + +#: ../midori/midori-browser.c:3309 +msgid "Close this window" +msgstr "סגור את החלון הזה" + +#: ../midori/midori-browser.c:3312 +msgid "Print the current page" +msgstr "הדפס את הדף הנוכחי" + +#: ../midori/midori-browser.c:3315 +msgid "Quit the application" +msgstr "צא מהיישום" + +#: ../midori/midori-browser.c:3317 +msgid "_Edit" +msgstr "ערוך" + +#: ../midori/midori-browser.c:3320 +msgid "Cut the selected text" +msgstr "גזור את הטקסט המסומן" + +#: ../midori/midori-browser.c:3323 ../midori/midori-browser.c:3326 +msgid "Copy the selected text" +msgstr "העתק את הטקסט המסומן" + +#: ../midori/midori-browser.c:3329 +msgid "Paste text from the clipboard" +msgstr "הדבק טקסט מלוח הגזירים" + +#: ../midori/midori-browser.c:3332 +msgid "Delete the selected text" +msgstr "מחק את הטקסט המסומן" + +#: ../midori/midori-browser.c:3335 +msgid "Select all text" +msgstr "סמן את כל הטקסט" + +#: ../midori/midori-browser.c:3338 +msgid "Find a word or phrase in the page" +msgstr "מצא מילה או ביטוי בדף" + +#: ../midori/midori-browser.c:3340 +msgid "Find _Next" +msgstr "מצא את הבא" + +#: ../midori/midori-browser.c:3341 +msgid "Find the next occurrence of a word or phrase" +msgstr "מצא את המופע הבא של המילה או הביטוי" + +#: ../midori/midori-browser.c:3343 +msgid "Find _Previous" +msgstr "מצא את הקודם" + +#: ../midori/midori-browser.c:3344 +msgid "Find the previous occurrence of a word or phrase" +msgstr "מצא את המופע הקודם של המילה או הביטוי" + +#: ../midori/midori-browser.c:3347 +msgid "_Quick Find" +msgstr "חיפוש מהיר" + +#: ../midori/midori-browser.c:3348 +msgid "Quickly jump to a word or phrase" +msgstr "קופץ במהירות אל מילה או ביטוי" + +#: ../midori/midori-browser.c:3351 +msgid "Configure the application preferences" +msgstr "הגדר את העדפות היישום" + +#: ../midori/midori-browser.c:3353 +msgid "_View" +msgstr "תצוגה" + +#: ../midori/midori-browser.c:3354 +msgid "_Toolbars" +msgstr "סרגלי כלים" + +#: ../midori/midori-browser.c:3366 +msgid "Increase the zoom level" +msgstr "הגדל את רמת הזום" + +#: ../midori/midori-browser.c:3369 +msgid "Decrease the zoom level" +msgstr "הקטן את רמת הזום" + +#: ../midori/midori-browser.c:3372 +msgid "Reset the zoom level" +msgstr "אפס את רמת הזום" + +#: ../midori/midori-browser.c:3373 +msgid "_Encoding" +msgstr "קידוד" + +#: ../midori/midori-browser.c:3375 +msgid "_Automatic" +msgstr "אוטומטי" + +#: ../midori/midori-browser.c:3378 ../midori/midori-websettings.c:196 +msgid "Chinese (BIG5)" +msgstr "" + +#: ../midori/midori-browser.c:3381 ../midori/midori-websettings.c:197 +msgid "Japanese (SHIFT_JIS)" +msgstr "" + +#: ../midori/midori-browser.c:3384 ../midori/midori-websettings.c:198 +msgid "Russian (KOI8-R)" +msgstr "" + +#: ../midori/midori-browser.c:3387 ../midori/midori-websettings.c:199 +msgid "Unicode (UTF-8)" +msgstr "" + +#: ../midori/midori-browser.c:3390 ../midori/midori-websettings.c:200 +msgid "Western (ISO-8859-1)" +msgstr "" + +#: ../midori/midori-browser.c:3393 ../midori/midori-websettings.c:201 +#: ../midori/midori-websettings.c:273 +msgid "Custom..." +msgstr "" + +#: ../midori/midori-browser.c:3396 ../midori/midori-view.c:1141 +msgid "View _Source" +msgstr "הצג מקור" + +#: ../midori/midori-browser.c:3397 +msgid "View the source code of the page" +msgstr "הצג את קוד המקור של הדף" + +#: ../midori/midori-browser.c:3399 +msgid "View Selection Source" +msgstr "הצג את מקור הבחירה" + +#: ../midori/midori-browser.c:3400 +msgid "View the source code of the selection" +msgstr "הצג את קוד המקור של הבחירה" + +#: ../midori/midori-browser.c:3404 +msgid "Toggle fullscreen view" +msgstr "מסך מלא" + +#: ../midori/midori-browser.c:3406 +msgid "_Go" +msgstr "לך" + +#: ../midori/midori-browser.c:3409 +msgid "Go back to the previous page" +msgstr "לך אל הדף הקודם" + +#: ../midori/midori-browser.c:3412 +msgid "Go forward to the next page" +msgstr "לך אל הדף הבא" + +#: ../midori/midori-browser.c:3415 +msgid "Go to your homepage" +msgstr "לך אל דף הבית" + +#: ../midori/midori-browser.c:3417 +msgid "Empty Trash" +msgstr "רוקן אשפה" + +#: ../midori/midori-browser.c:3418 +msgid "Delete the contents of the trash" +msgstr "מחק את תכולת האשפה" + +#: ../midori/midori-browser.c:3420 ../midori/midori-view.c:1113 +msgid "Undo Close Tab" +msgstr "בטל סגירת לשונית" + +#: ../midori/midori-browser.c:3421 +msgid "Open the last closed tab" +msgstr "פתח את הלשונית האחרונה שנסגרה" + +#: ../midori/midori-browser.c:3425 ../panels/midori-bookmarks.c:232 +msgid "Add a new bookmark" +msgstr "הוסף לשונית חדשה" + +#: ../midori/midori-browser.c:3427 ../panels/midori-bookmarks.c:261 +msgid "Add a new folder" +msgstr "" + +#: ../midori/midori-browser.c:3428 +msgid "Add a new bookmark folder" +msgstr "" + +#: ../midori/midori-browser.c:3429 +msgid "_Tools" +msgstr "כלים" + +#: ../midori/midori-browser.c:3431 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "נהל מנועי חיפוש" + +#: ../midori/midori-browser.c:3432 +msgid "Add, edit and remove search engines..." +msgstr "הוסף, ערוך והסר מנועי חיפוש..." + +#: ../midori/midori-browser.c:3435 +msgid "_Clear Private Data" +msgstr "" + +#: ../midori/midori-browser.c:3436 +msgid "Clear private data..." +msgstr "" + +#: ../midori/midori-browser.c:3440 +msgid "_Previous Tab" +msgstr "לשונית קודמת" + +#: ../midori/midori-browser.c:3441 +msgid "Switch to the previous tab" +msgstr "עבור אל הלשונית הקודמת" + +#: ../midori/midori-browser.c:3443 +msgid "_Next Tab" +msgstr "לשונית הבאה" + +#: ../midori/midori-browser.c:3444 +msgid "Switch to the next tab" +msgstr "עבור אל הלשונית הבאה" + +#: ../midori/midori-browser.c:3446 +msgid "_Help" +msgstr "עזרה" + +#: ../midori/midori-browser.c:3448 +msgid "_Contents" +msgstr "תכנים" + +#: ../midori/midori-browser.c:3449 +msgid "Show the documentation" +msgstr "הצג את התיעוד" + +#: ../midori/midori-browser.c:3451 +msgid "_Frequent Questions" +msgstr "שאלות נפוצות" + +#: ../midori/midori-browser.c:3452 +msgid "Show the Frequently Asked Questions" +msgstr "הצג את השאלות הנפוצות" + +#: ../midori/midori-browser.c:3454 +msgid "_Report a Bug" +msgstr "דווח על באג" + +#: ../midori/midori-browser.c:3455 +msgid "Open Midori's bug tracker" +msgstr "פתח את עוקב הבאגים של Midori" + +#: ../midori/midori-browser.c:3458 +msgid "Show information about the program" +msgstr "הצג מידע אודות התוכנה" + +#: ../midori/midori-browser.c:3465 +msgid "P_rivate Browsing" +msgstr "גלישה פרטית" + +#: ../midori/midori-browser.c:3466 +msgid "Don't save any private data while browsing" +msgstr "אל תשמור אף מידע אישי בזמן הגלישה" + +#: ../midori/midori-browser.c:3471 +msgid "_Menubar" +msgstr "סרגל תפריט" + +#: ../midori/midori-browser.c:3472 +msgid "Show menubar" +msgstr "הצג את סרגל התפריט" + +#: ../midori/midori-browser.c:3475 +msgid "_Navigationbar" +msgstr "סרגל ניווט" + +#: ../midori/midori-browser.c:3476 +msgid "Show navigationbar" +msgstr "הצג את סרגל הניווט" + +#: ../midori/midori-browser.c:3479 +msgid "Side_panel" +msgstr "סרגל צד" + +#: ../midori/midori-browser.c:3480 +msgid "Show sidepanel" +msgstr "הצג סרגל צד" + +#: ../midori/midori-browser.c:3483 +msgid "_Bookmarkbar" +msgstr "סרגל סימניות" + +#: ../midori/midori-browser.c:3484 +msgid "Show bookmarkbar" +msgstr "הצג את סרגל הסימניות" + +#: ../midori/midori-browser.c:3487 +msgid "_Transferbar" +msgstr "סרגל העברה" + +#: ../midori/midori-browser.c:3488 +msgid "Show transferbar" +msgstr "הצג את סרגל ההעברה" + +#: ../midori/midori-browser.c:3491 +msgid "_Statusbar" +msgstr "שורת מצב" + +#: ../midori/midori-browser.c:3492 +msgid "Show statusbar" +msgstr "הצג את שורת המצב" + +#: ../midori/midori-browser.c:3926 +msgid "_Separator" +msgstr "קו מפריד" + +#: ../midori/midori-browser.c:3933 +msgid "_Location..." +msgstr "מיקום..." + +#: ../midori/midori-browser.c:3935 +msgid "Open a particular location" +msgstr "פתח מיקום" + +#: ../midori/midori-browser.c:3959 +msgid "_Web Search..." +msgstr "חיפוש באינטרנט" + +#: ../midori/midori-browser.c:3961 +msgid "Run a web search" +msgstr "הרץ חיפוש באינטרנט" + +#: ../midori/midori-browser.c:3980 +msgid "Reopen a previously closed tab or window" +msgstr "פתח מחדש לשונית או חלון שנסגרו קודם לכן" + +#: ../midori/midori-browser.c:3993 +msgid "_Recently visited pages" +msgstr "דפים שבוקרו בעבר" + +#: ../midori/midori-browser.c:3995 +msgid "Reopen pages that you visited earlier" +msgstr "פתיחה מחדש של דפים שביקרת בהם בעבר" + +#: ../midori/midori-browser.c:4008 ../midori/sokoke.c:778 +msgid "_Bookmarks" +msgstr "סימניות" + +#: ../midori/midori-browser.c:4010 +msgid "Show the saved bookmarks" +msgstr "הצג את הסימניות השמורות" + +#: ../midori/midori-browser.c:4023 +msgid "_Window" +msgstr "חלון" + +#: ../midori/midori-browser.c:4025 +msgid "Show a list of all open tabs" +msgstr "הצג רשימה של כל הלשוניות הפתוחות" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4192 +msgid "_Inline Find:" +msgstr "חיפוש פנימי" + +#: ../midori/midori-browser.c:4217 +msgid "Previous" +msgstr "הקודם" + +#: ../midori/midori-browser.c:4222 +msgid "Next" +msgstr "הבא" + +#: ../midori/midori-browser.c:4227 +msgid "Match Case" +msgstr "התאם רישיות" + +#: ../midori/midori-browser.c:4235 +msgid "Highlight Matches" +msgstr "הדגש התאמות" + +#: ../midori/midori-browser.c:4245 +msgid "Close Findbar" +msgstr "סגור סרגל חיפוש" + +#: ../midori/midori-browser.c:4551 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "הגדרה לא צפויה '%s'" + +#: ../midori/midori-panel.c:309 +msgid "Detach chosen panel from the window" +msgstr "" + +#: ../midori/midori-panel.c:311 +msgid "Whether to detach the chosen panel from the window" +msgstr "" + +#: ../midori/midori-panel.c:321 ../midori/midori-websettings.c:511 +msgid "Align sidepanel on the right" +msgstr "יישר סרגל צד לימין" + +#: ../midori/midori-panel.c:323 ../midori/midori-websettings.c:512 +msgid "Whether to align the sidepanel on the right" +msgstr "האם ליישר את סרגל הצד לימין" + +#: ../midori/midori-panel.c:333 ../midori/midori-panel.c:334 +msgid "Close panel" +msgstr "סגור סרגל" + +#: ../midori/midori-websettings.c:179 ../midori/midori-view.c:1945 +msgid "Blank page" +msgstr "דף ריק" + +#: ../midori/midori-websettings.c:180 ../midori/midori-websettings.c:531 +msgid "Homepage" +msgstr "דף הבית" + +#: ../midori/midori-websettings.c:181 +msgid "Last open pages" +msgstr "הדפים שנפתחו אחרונים" + +#: ../midori/midori-websettings.c:216 +msgid "New tab" +msgstr "לשונית חדשה" + +#: ../midori/midori-websettings.c:217 +msgid "New window" +msgstr "חלון חדש" + +#: ../midori/midori-websettings.c:218 +msgid "Current tab" +msgstr "לשונית נוכחית" + +#: ../midori/midori-websettings.c:233 +msgid "Default" +msgstr "ברירת מחדל" + +#: ../midori/midori-websettings.c:234 +msgid "Icons" +msgstr "סמלים" + +#: ../midori/midori-websettings.c:235 +msgid "Text" +msgstr "טקסט" + +#: ../midori/midori-websettings.c:236 +msgid "Both" +msgstr "שניהם" + +#: ../midori/midori-websettings.c:237 +msgid "Both horizontal" +msgstr "" + +#: ../midori/midori-websettings.c:252 +msgid "All cookies" +msgstr "כל העוגיות" + +#: ../midori/midori-websettings.c:253 +msgid "Session cookies" +msgstr "עוגיות תצורת הפעלה" + +#: ../midori/midori-websettings.c:254 ../panels/midori-addons.c:94 +msgid "None" +msgstr "כלום" + +#: ../midori/midori-websettings.c:270 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:271 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:272 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:325 +msgid "Remember last window size" +msgstr "זכור את גודל החלון האחרון" + +#: ../midori/midori-websettings.c:326 +msgid "Whether to save the last window size" +msgstr "האם לשמור את גודל החלון האחרון" + +#: ../midori/midori-websettings.c:334 +msgid "Last window width" +msgstr "רוחב החלון האחרון" + +#: ../midori/midori-websettings.c:335 +msgid "The last saved window width" +msgstr "הרוחב האחרון של החלון הנשמר" + +#: ../midori/midori-websettings.c:343 +msgid "Last window height" +msgstr "אורך החלון האחרון" + +#: ../midori/midori-websettings.c:344 +msgid "The last saved window height" +msgstr "האורך האחרון של החלון הנשמר" + +#: ../midori/midori-websettings.c:369 +msgid "Last panel position" +msgstr "המיקום האחרון של הסרגל" + +#: ../midori/midori-websettings.c:370 +msgid "The last saved panel position" +msgstr "המיקום האחרון של הסרגל שנשמר" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:379 +msgid "Last panel page" +msgstr "העמוד האחרון של הסרגל" + +#: ../midori/midori-websettings.c:380 +msgid "The last saved panel page" +msgstr "העמוד האחרון של הסרגל שנשמר" + +#: ../midori/midori-websettings.c:388 +msgid "Last Web search" +msgstr "החיפוש האחרון" + +#: ../midori/midori-websettings.c:389 +msgid "The last saved Web search" +msgstr "חיפוש האינטרנט האחרון שנשמר" + +#: ../midori/midori-websettings.c:398 +msgid "Show Menubar" +msgstr "הצג סרגל תפריט" + +#: ../midori/midori-websettings.c:399 +msgid "Whether to show the menubar" +msgstr "האם להראות את סרגל התפריטים" + +#: ../midori/midori-websettings.c:407 +msgid "Show Navigationbar" +msgstr "הצג סרגל ניווט" + +#: ../midori/midori-websettings.c:408 +msgid "Whether to show the navigationbar" +msgstr "האם להציג את סרגל הניווט" + +#: ../midori/midori-websettings.c:416 +msgid "Show Bookmarkbar" +msgstr "הצג סרגל סימניות" + +#: ../midori/midori-websettings.c:417 +msgid "Whether to show the bookmarkbar" +msgstr "האם להראות את סרגל הסימניות" + +#: ../midori/midori-websettings.c:425 +msgid "Show Panel" +msgstr "הצג סרגל" + +#: ../midori/midori-websettings.c:426 +msgid "Whether to show the panel" +msgstr "האם להציג את הסרגל" + +#: ../midori/midori-websettings.c:441 +msgid "Show Transferbar" +msgstr "הצג סרגל העברות" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to show the transferbar" +msgstr "האם להציג את סרגל ההעברות" + +#: ../midori/midori-websettings.c:450 +msgid "Show Statusbar" +msgstr "הצג שורת מצב" + +#: ../midori/midori-websettings.c:451 +msgid "Whether to show the statusbar" +msgstr "האם להציג את שורת המצב" + +#: ../midori/midori-websettings.c:460 +msgid "Toolbar Style" +msgstr "סגנון סרגל כלים" + +#: ../midori/midori-websettings.c:461 +msgid "The style of the toolbar" +msgstr "הסגנון של סרגל הכלים" + +#: ../midori/midori-websettings.c:477 +msgid "Show progress in location entry" +msgstr "הצג התקדמות בתיבת המיקום" + +#: ../midori/midori-websettings.c:478 +msgid "Whether to show loading progress in the location entry" +msgstr "האם להציג את התקדמות הטעינה בתיבת המיקום" + +#: ../midori/midori-websettings.c:486 +msgid "Toolbar Items" +msgstr "פריטי סרגל כלים" + +#: ../midori/midori-websettings.c:487 +msgid "The items to show on the toolbar" +msgstr "הפריטים להצגה בסרגל הכלים" + +#: ../midori/midori-websettings.c:495 +msgid "Compact Sidepanel" +msgstr "סרגל צד קומפקטי" + +#: ../midori/midori-websettings.c:496 +msgid "Whether to make the sidepanel compact" +msgstr "האם להפוך את סרגל הצד לקומפקטי" + +#: ../midori/midori-websettings.c:521 +msgid "Load on Startup" +msgstr "טען בהפעלה" + +#: ../midori/midori-websettings.c:522 +msgid "What to load on startup" +msgstr "האם לטעון בהפעלה" + +#: ../midori/midori-websettings.c:532 +msgid "The homepage" +msgstr "דף הבית" + +#: ../midori/midori-websettings.c:547 +msgid "Show crash dialog" +msgstr "הצג דו־שיח קריסות" + +#: ../midori/midori-websettings.c:548 +msgid "Show a dialog after Midori crashed" +msgstr "הצג דו־שיח לאחר ש־Midori קורס" + +#: ../midori/midori-websettings.c:556 +msgid "Download Folder" +msgstr "הורד תיקיה" + +#: ../midori/midori-websettings.c:557 +msgid "The folder downloaded files are saved to" +msgstr "קבצי התיקיה המורדת ישמרו ב" + +#: ../midori/midori-websettings.c:569 +msgid "Download Manager" +msgstr "מנהל הורדות" + +#: ../midori/midori-websettings.c:570 +msgid "An external download manager" +msgstr "מנהל הורדות חיצוני" + +#: ../midori/midori-websettings.c:578 +msgid "Text Editor" +msgstr "עורך טקסט" + +#: ../midori/midori-websettings.c:579 +msgid "An external text editor" +msgstr "עורך טקסט חיצוני" + +#: ../midori/midori-websettings.c:587 +msgid "Location entry Search" +msgstr "חיפוש בתיבת מיקום" + +#: ../midori/midori-websettings.c:588 +msgid "The search to perform inside the location entry" +msgstr "החיפוש לביצוע בתוך תיבת המיקום" + +#: ../midori/midori-websettings.c:596 +msgid "Preferred Encoding" +msgstr "קידוד מועדף" + +#: ../midori/midori-websettings.c:597 +msgid "The preferred character encoding" +msgstr "הקידוד המועדף" + +#: ../midori/midori-websettings.c:607 +msgid "Always Show Tabbar" +msgstr "תמיד הצג סרגל לשוניות" + +#: ../midori/midori-websettings.c:608 +msgid "Always show the tabbar" +msgstr "תמיד הצג את סרגל הלשוניות" + +#: ../midori/midori-websettings.c:616 +msgid "Close Buttons on Tabs" +msgstr "לחצני סגירה בלשוניות" + +#: ../midori/midori-websettings.c:617 +msgid "Whether tabs have close buttons" +msgstr "האם ללשוניות יש לחצני סגירה" + +#: ../midori/midori-websettings.c:625 +msgid "Open new pages in" +msgstr "פתיחת דפים חדשים ב" + +#: ../midori/midori-websettings.c:626 +msgid "Where to open new pages" +msgstr "איפה לפתוח דפים חדשים" + +#: ../midori/midori-websettings.c:635 +msgid "Open external pages in" +msgstr "פתח דפים חיצוניים ב" + +#: ../midori/midori-websettings.c:636 +msgid "Where to open externally opened pages" +msgstr "איפה לפתוח דפים חיצוניים" + +#: ../midori/midori-websettings.c:649 +msgid "Middle click opens Selection" +msgstr "לחיצה אמצעית פותחת בחירה" + +#: ../midori/midori-websettings.c:650 +msgid "Load an address from the selection via middle click" +msgstr "פתח את הכתובת הנבחרת באמצעות לחצן אמצעי בעכבר" + +#: ../midori/midori-websettings.c:658 +msgid "Open tabs in the background" +msgstr "פתח לשוניות ברקע" + +#: ../midori/midori-websettings.c:659 +msgid "Whether to open new tabs in the background" +msgstr "האם לפתוח לשוניות חדשות ברקע" + +#: ../midori/midori-websettings.c:667 +msgid "Open Tabs next to Current" +msgstr "פתח לשוניות אחרי הנוכחית" + +#: ../midori/midori-websettings.c:668 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "האם לפתוח לשוניות אחרי הלשונית הנוכחית או אחרי הלשונית האחרונה" + +#: ../midori/midori-websettings.c:676 +msgid "Open popups in tabs" +msgstr "פתח חלונות קופצים בלשוניות" + +#: ../midori/midori-websettings.c:677 +msgid "Whether to open popup windows in tabs" +msgstr "האם לפתוח חלונות קופצים בלשוניות" + +#: ../midori/midori-websettings.c:693 +msgid "Zoom Text and Images" +msgstr "קרב טקסט ותמונות" + +#: ../midori/midori-websettings.c:694 +msgid "Whether to zoom text and images" +msgstr "האם לקרב טקסט ותמונות" + +#: ../midori/midori-websettings.c:709 +msgid "Find inline while typing" +msgstr "חפש תוך כדי הקלדה" + +#: ../midori/midori-websettings.c:710 +msgid "Whether to automatically find inline while typing" +msgstr "האם לחפש אוטומטית בתוך הטקסט בזמן הקלדה" + +#: ../midori/midori-websettings.c:718 +msgid "Accept cookies" +msgstr "קבל עוגיות" + +#: ../midori/midori-websettings.c:719 +msgid "What type of cookies to accept" +msgstr "איזה סוג של עוגיות לקבל" + +#: ../midori/midori-websettings.c:728 +msgid "Original cookies only" +msgstr "עוגיות מקוריות בלבד" + +#: ../midori/midori-websettings.c:729 +msgid "Accept cookies from the original website only" +msgstr "קבל עוגיות מהאתר המקורי בלבד" + +#: ../midori/midori-websettings.c:737 +msgid "Maximum cookie age" +msgstr "תוקף העוגיות המקסימלי" + +#: ../midori/midori-websettings.c:738 +msgid "The maximum number of days to save cookies for" +msgstr "מספר הימים המקסימלי לשמירת עוגיות" + +#: ../midori/midori-websettings.c:748 +msgid "Remember last visited pages" +msgstr "זכור דפים שנשמרו לאחרונה" + +#: ../midori/midori-websettings.c:749 +msgid "Whether the last visited pages are saved" +msgstr "האם הדפים שנשמרו אחרונים ישמרו" + +#: ../midori/midori-websettings.c:757 +msgid "Maximum history age" +msgstr "תוקף מקסימלי להיסטוריה" + +#: ../midori/midori-websettings.c:758 +msgid "The maximum number of days to save the history for" +msgstr "מספר הימים המקסימלי לשמירת היסטוריה" + +#: ../midori/midori-websettings.c:766 +msgid "Remember last form inputs" +msgstr "זכור קלטי הטופס האחרונים" + +#: ../midori/midori-websettings.c:767 +msgid "Whether the last form inputs are saved" +msgstr "האם לשמור את קלטי הטופס האחרונים" + +#: ../midori/midori-websettings.c:775 +msgid "Remember last downloaded files" +msgstr "זכור את הקבצים האחרונים שהורדו" + +#: ../midori/midori-websettings.c:776 +msgid "Whether the last downloaded files are saved" +msgstr "האם לשמור את הקבצים האחרונים שהורדו" + +#: ../midori/midori-websettings.c:786 +msgid "Proxy Server" +msgstr "שרת מתווך" + +#: ../midori/midori-websettings.c:787 +msgid "The proxy server used for HTTP connections" +msgstr "השרת המתווך המשמש עבור חיבורי HTTP" + +#: ../midori/midori-websettings.c:802 +msgid "Detect proxy server automatically" +msgstr "זהה שרת מתווך אוטומטית" + +#: ../midori/midori-websettings.c:803 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "האם לזהות את השרת המתווך אוטומטית מהסביבה" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:819 +msgid "Identify as" +msgstr "זהה כ" + +#: ../midori/midori-websettings.c:820 +msgid "What to identify as to web pages" +msgstr "כיצד להזדהות עבור דפי אינטרנט" + +#: ../midori/midori-websettings.c:836 +msgid "Identification string" +msgstr "מחרוזת זיהוי" + +#: ../midori/midori-websettings.c:837 +msgid "The application identification string" +msgstr "מחרוזת הזיהוי של היישום" + +#: ../midori/midori-websettings.c:845 +msgid "Cache size" +msgstr "גדול מטמון" + +#: ../midori/midori-websettings.c:846 +msgid "The allowed size of the cache" +msgstr "הגודל המותר של המטמון" + +#. i18n: The title of the 404 - Not found error page +#. Error pages are special, we want to try loading the destination +#. again, not the error page which isn't even a proper page +#: ../midori/midori-view.c:636 ../midori/midori-view.c:2469 +#, c-format +msgid "Not found - %s" +msgstr "לא נמצא - %s" + +#: ../midori/midori-view.c:978 +msgid "Open _Link" +msgstr "פתח קישור" + +#: ../midori/midori-view.c:980 +msgid "Open Link in New _Tab" +msgstr "פתח קישור בלשונית חדשה" + +#: ../midori/midori-view.c:997 +msgid "Open Link in New _Window" +msgstr "" + +#: ../midori/midori-view.c:1006 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:1012 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:1021 +msgid "Download with Download _Manager" +msgstr "" + +#: ../midori/midori-view.c:1053 +#, c-format +msgid "Search with %s" +msgstr "" + +#: ../midori/midori-view.c:1079 +msgid "_Search the Web" +msgstr "" + +#: ../midori/midori-view.c:1089 +msgid "Open Address in New _Tab" +msgstr "" + +#: ../midori/midori-view.c:1237 +msgid "Open or download file" +msgstr "" + +#: ../midori/midori-view.c:1254 +#, c-format +msgid "File Type: '%s'" +msgstr "" + +#: ../midori/midori-view.c:1257 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1261 +#, c-format +msgid "Open %s" +msgstr "" + +#: ../midori/midori-view.c:1657 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1802 +#, c-format +msgid "Document cannot be displayed" +msgstr "" + +#: ../midori/midori-view.c:1818 +#, c-format +msgid "No documentation installed" +msgstr "" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:461 +msgid "Appearance" +msgstr "" + +#: ../midori/midori-preferences.c:462 +msgid "Font settings" +msgstr "" + +#: ../midori/midori-preferences.c:464 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:470 +msgid "The default font size used to display text" +msgstr "" + +#: ../midori/midori-preferences.c:473 +msgid "Minimum Font Size" +msgstr "" + +#: ../midori/midori-preferences.c:476 +msgid "The minimum font size used to display text" +msgstr "" + +#: ../midori/midori-preferences.c:483 +msgid "Encoding" +msgstr "" + +#: ../midori/midori-preferences.c:486 +msgid "The character encoding to use by default" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:493 +msgid "Behavior" +msgstr "" + +#: ../midori/midori-preferences.c:494 +msgid "Features" +msgstr "" + +#: ../midori/midori-preferences.c:497 ../extensions/statusbar-features.c:51 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:498 +msgid "Load and display images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:501 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:502 +msgid "Automatically shrink standalone images to fit" +msgstr "" + +#: ../midori/midori-preferences.c:505 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:506 +msgid "Whether background images should be printed" +msgstr "" + +#: ../midori/midori-preferences.c:509 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:510 +msgid "Whether text areas are resizable" +msgstr "" + +#: ../midori/midori-preferences.c:513 ../extensions/statusbar-features.c:58 +msgid "Enable scripts" +msgstr "" + +#: ../midori/midori-preferences.c:514 +msgid "Enable embedded scripting languages" +msgstr "" + +#: ../midori/midori-preferences.c:517 ../extensions/statusbar-features.c:65 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:518 +msgid "Enable embedded plugin objects" +msgstr "" + +#: ../midori/midori-preferences.c:521 +msgid "Enforce 96 dots per inch" +msgstr "" + +#: ../midori/midori-preferences.c:522 +msgid "Enforce a video dot density of 96 DPI" +msgstr "" + +#: ../midori/midori-preferences.c:525 +msgid "Enable developer tools" +msgstr "" + +#: ../midori/midori-preferences.c:526 +msgid "Enable special extensions for developers" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:538 +msgid "Interface" +msgstr "" + +#: ../midori/midori-preferences.c:539 +msgid "Navigationbar" +msgstr "" + +#: ../midori/midori-preferences.c:548 +msgid "Browsing" +msgstr "" + +#. Page "Network" +#: ../midori/midori-preferences.c:578 ../midori/midori-preferences.c:579 +msgid "Network" +msgstr "" + +#: ../midori/midori-preferences.c:606 +msgid "MB" +msgstr "" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:611 +msgid "Privacy" +msgstr "" + +#: ../midori/midori-preferences.c:612 +msgid "Web Cookies" +msgstr "" + +#: ../midori/midori-preferences.c:625 ../midori/midori-preferences.c:635 +msgid "days" +msgstr "" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "" + +#: ../midori/midori-searchaction.c:812 +msgid "Add search engine" +msgstr "" + +#: ../midori/midori-searchaction.c:812 +msgid "Edit search engine" +msgstr "" + +#: ../midori/midori-searchaction.c:840 +msgid "_Name:" +msgstr "" + +#: ../midori/midori-searchaction.c:884 +msgid "_Icon:" +msgstr "" + +#: ../midori/midori-searchaction.c:898 +msgid "_Token:" +msgstr "" + +#: ../midori/midori-searchaction.c:1078 +msgid "Manage Search Engines" +msgstr "" + +#: ../midori/sokoke.c:117 ../midori/sokoke.c:129 +msgid "Could not run external program." +msgstr "" + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:446 +msgid "Warning: You are using a superuser account!" +msgstr "" + +#: ../midori/sokoke.c:777 +msgid "_Bookmark" +msgstr "" + +#: ../midori/sokoke.c:779 +msgid "_Add Bookmark" +msgstr "" + +#: ../midori/sokoke.c:780 +msgid "_Console" +msgstr "" + +#: ../midori/sokoke.c:781 +msgid "_Extensions" +msgstr "" + +#: ../midori/sokoke.c:782 +msgid "_History" +msgstr "" + +#: ../midori/sokoke.c:783 +msgid "_Homepage" +msgstr "" + +#: ../midori/sokoke.c:784 +msgid "_Userscripts" +msgstr "" + +#: ../midori/sokoke.c:785 +msgid "User_styles" +msgstr "" + +#: ../midori/sokoke.c:786 +msgid "New _Tab" +msgstr "" + +#: ../midori/sokoke.c:787 +msgid "_Transfers" +msgstr "" + +#: ../midori/sokoke.c:788 +msgid "P_lugins" +msgstr "" + +#: ../midori/sokoke.c:789 +msgid "_Closed Tabs and Windows" +msgstr "" + +#: ../midori/sokoke.c:790 +msgid "New _Window" +msgstr "" + +#: ../panels/midori-addons.c:95 ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "" + +#: ../panels/midori-addons.c:96 ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "" + +#: ../panels/midori-addons.c:923 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "" + +#: ../panels/midori-addons.c:924 ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "" + +#: ../panels/midori-addons.c:933 ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "" + +#: ../panels/midori-addons.c:934 ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "" + +#: ../panels/midori-bookmarks.c:107 +msgid "Bookmarks" +msgstr "" + +#: ../panels/midori-bookmarks.c:240 +msgid "Edit the selected bookmark" +msgstr "" + +#: ../panels/midori-bookmarks.c:248 +msgid "Delete the selected bookmark" +msgstr "" + +#: ../panels/midori-bookmarks.c:593 +msgid "Separator" +msgstr "" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "" + +#: ../panels/midori-history.c:163 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../panels/midori-history.c:218 +msgid "Bookmark the selected history item" +msgstr "" + +#: ../panels/midori-history.c:227 +msgid "Delete the selected history item" +msgstr "" + +#: ../panels/midori-history.c:235 +msgid "Clear the entire history" +msgstr "" + +#: ../panels/midori-history.c:600 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../panels/midori-history.c:606 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../panels/midori-history.c:613 +msgid "Today" +msgstr "" + +#: ../panels/midori-history.c:615 +msgid "Yesterday" +msgstr "" + +#: ../panels/midori-plugins.c:87 ../extensions/statusbar-features.c:63 +msgid "Plugins" +msgstr "" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "" + +#: ../katze/katze-utils.c:180 ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "" + +#: ../katze/katze-utils.c:209 ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "" + +#: ../extensions/colorful-tabs.c:104 +msgid "Tint tabs distinctly" +msgstr "" + +#: ../extensions/colorful-tabs.c:140 +msgid "Colorful Tabs" +msgstr "" + +#: ../extensions/colorful-tabs.c:141 +msgid "Tint each tab distinctly" +msgstr "" + +#: ../extensions/cookie-manager.c:185 +msgid "At the end of the session" +msgstr "" + +#: ../extensions/cookie-manager.c:188 +#, c-format +msgid "" +"Host: %s\n" +"Name: %s\n" +"Value: %s\n" +"Path: %s\n" +"Secure: %s\n" +"Expires: %s" +msgstr "" + +#: ../extensions/cookie-manager.c:194 +msgid "Yes" +msgstr "" + +#: ../extensions/cookie-manager.c:194 +msgid "No" +msgstr "" + +#: ../extensions/cookie-manager.c:475 +msgid "Do you really want to delete all cookies?" +msgstr "" + +#: ../extensions/cookie-manager.c:477 +msgid "Question" +msgstr "" + +#: ../extensions/cookie-manager.c:485 +msgid "" +"Only the visible cookies are deleted which match the entered filter string." +msgstr "" + +#: ../extensions/cookie-manager.c:663 +msgid "Name" +msgstr "" + +#: ../extensions/cookie-manager.c:723 +msgid "_Expand All" +msgstr "" + +#: ../extensions/cookie-manager.c:731 +msgid "_Collapse All" +msgstr "" + +#: ../extensions/cookie-manager.c:800 +msgid "Delete All" +msgstr "" + +#: ../extensions/cookie-manager.c:802 +msgid "" +"Deletes all shown cookies. If a filter is set, only those cookies are " +"deleted which match the filter." +msgstr "" + +#: ../extensions/cookie-manager.c:817 +msgid "Expand All" +msgstr "" + +#: ../extensions/cookie-manager.c:824 +msgid "Collapse All" +msgstr "" + +#: ../extensions/cookie-manager.c:855 +msgid "Filter:" +msgstr "" + +#: ../extensions/cookie-manager.c:860 +msgid "" +"Enter a filter string to show only cookies whose name or domain field match " +"the entered filter" +msgstr "" + +#: ../extensions/cookie-manager.c:895 ../extensions/cookie-manager.c:942 +msgid "Cookie Manager" +msgstr "" + +#: ../extensions/cookie-manager.c:926 +msgid "_Cookie Manager" +msgstr "" + +#: ../extensions/cookie-manager.c:943 +msgid "List, view and delete cookies" +msgstr "" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:129 ../extensions/page-holder.c:177 +msgid "Pageholder" +msgstr "" + +#: ../extensions/page-holder.c:161 +msgid "_Pageholder" +msgstr "" + +#: ../extensions/statusbar-features.c:49 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:56 +msgid "Scripts" +msgstr "" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 00000000..fd67e1f0 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,1494 @@ +# Hungarian translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# SZERVÁC Attila 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.0.18\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-05-10 19:33+0100\n" +"Last-Translator: SZERVÁC Attila \n" +"Language-Team: Hungarian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Pehelysúlyú webböngésző" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Webböngésző" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "Könyv_jelzők" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Konzol" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "K_iterjesztések" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Történet" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "H_onlap" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Új _lap" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Letöltések" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Bezárt lapok és ablakok" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Új _ablak" + +#: ../midori/main.c:143 +#, fuzzy, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "A beállítást nem sikerült betölteni. %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "'%s' érték érvénytelen ehhez: %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "A fájl nem található." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Hibás dokumentum." + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Az írás meghiúsult." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Letöltések" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "A folyamatot nem tudtam elmenteni. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Program verzió kiírása" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "" + +#: ../midori/main.c:1335 +#, fuzzy +msgid "[URIs]" +msgstr "[URL]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Véleményeket, javaslatokat és hibákat ide:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Új verziók keresése itt:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "" + +#: ../midori/main.c:1447 +#, fuzzy, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "A könyvjelzőket nem tudtam betölteni. %s\n" + +#: ../midori/main.c:1463 +#, fuzzy, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "A folyamatot nem tudtam betölteni. %s\n" + +#: ../midori/main.c:1477 +#, fuzzy, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "A kukát nem tudtam betölteni. %s\n" + +#: ../midori/main.c:1491 +#, fuzzy, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "A kukát nem tudtam betölteni. %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Az alábbi hibák történtek:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "A keresőmotorokat nem tudtam elmenteni. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "A könyvjelzőket nem tudtam elmenteni. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "A kukát nem tudtam elmenteni. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "A beállítást nem tudtam elmenteni. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Oldal újratöltése" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Betöltés leállítása" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% betöltve" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Ismeretlen '%s' művelet" + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Új könyvjelző" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Könyvjelző szerkesztése" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Cím:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Leírás:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Mappa:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Gyökér" + +#: ../midori/midori-browser.c:668 +#, fuzzy +msgid "Save file as" +msgstr "Mentés fájlba" + +#: ../midori/midori-browser.c:1248 +#, fuzzy +msgid "Open file" +msgstr "Fájl megnyitása" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Megnyitás új _lapon" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Megnyitás új _ablakban" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Elválasztó" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Egy pehelysúlyú webböngésző" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "SZERVÁC Attila " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Fájl" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Új ablak megnyitása" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Új lap megnyitása" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Fájl megnyitása" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Mentés fájlba" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Lap bezárása" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "A jelenlegi lap bezárása" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "_Ablak bezárása" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "A jelenlegi ablak bezárása" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Kilépés a programból" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "Sz_erkesztés" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "A kijelölt szöveg másolása" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Szöveg beillesztése a vágólapról" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "A kijelölt szöveg törlése" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Minden szöveg kijelölése" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "_Következő" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "_Előző" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Gyors keresés" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Nézet" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "Eszköz_sávok" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Kijelölés forrásnak megtekintése" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Teljes képernyős váltás" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Ugrás" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Üres kuka" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Lap bezárásának visszavonása" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "" + +#: ../midori/midori-browser.c:3185 +#, fuzzy +msgid "Delete the selected history item" +msgstr "A kijelölt szöveg törlése" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "" + +#: ../midori/midori-browser.c:3191 +#, fuzzy +msgid "Bookmark the selected history item" +msgstr "A kijelölt szöveg másolása" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "Esz_közök" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "Kereső-motorok kezelése" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Kereső-motorok hozzáadása, szerkesztése és eltávolítása..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Előző lap" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "_Következő lap" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Súgó" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Tartalom" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "_Személyes böngészés" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "" + +#: ../midori/midori-browser.c:3231 +#, fuzzy +msgid "_Menubar" +msgstr "Menüsáv" + +#: ../midori/midori-browser.c:3232 +#, fuzzy +msgid "Show menubar" +msgstr "A menüsáv" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "_Címsáv" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Oldal_panel" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "_Könyvjelzősáv" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "_Letöltési sáv" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "_Állapotsáv" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Hely..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_Web-keresés..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Egy korábban bezárt lap vagy ablak megnyitása" + +#: ../midori/midori-browser.c:3729 +#, fuzzy +msgid "_Recently visited pages" +msgstr "Legutóbbi lapok megjegyzése" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "" + +#: ../midori/midori-browser.c:3746 +#, fuzzy +msgid "Show the saved bookmarks" +msgstr "Könyvjelzősáv mutatása" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Ablak" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Könyvjelzők" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Történet" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Nagybetű-érzékeny" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Keresősáv bezárása" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Ismeretlen '%s' beállítás" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Panel bezárása" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Üres lap" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Honlap" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Legutóbb megnyitott lapok" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Kínai (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japán (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Orosz (KOI8-r)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Nyugati (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Egyéni..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Új lap" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Új ablak" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Jelenlegi lap" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Alap" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Ikonok" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Szöveg" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Mindkettő" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Mindkettő vízszintesen" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Minden süti" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Munkafolyamat sütik" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Semmi" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Legutóbbi ablak méretének megjegyzése" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Mentésre kerüljön-e a legutóbbi ablak mérete" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Legutóbbi ablak szélessége" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "A legutóbb elmentett ablak-szélesség" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Legutóbbi ablak magassága" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "A legutóbb mentett ablak-magasság" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "A panel helyzete" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "A legutóbb mentett panel-helyzet" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Legutóbbi panel-lap" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "A legutóbb mentett panel-lap" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Legutóbbi web-keresés" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "A legutóbb mentett web-keresés" + +#: ../midori/midori-websettings.c:302 +#, fuzzy +msgid "Show Menubar" +msgstr "Menüsáv" + +#: ../midori/midori-websettings.c:303 +#, fuzzy +msgid "Whether to show the menubar" +msgstr "Megjelenjen-e az állapotsáv" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Címsáv mutatása" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Megjelenjen-e a címsáv" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Könyvjelzősáv mutatása" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Megjelenjen-e a könyvjelzősáv" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Panel mutatása" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Megjelenjen-e a panel" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Állapotsáv mutatása" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Megjelenjen-e az állapotsáv" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Eszközsáv stílus" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Az eszközsáv stílusa" + +#: ../midori/midori-websettings.c:358 +#, fuzzy +msgid "Toolbar Items" +msgstr "Eszközsáv stílus" + +#: ../midori/midori-websettings.c:359 +#, fuzzy +msgid "The items to show on the toolbar" +msgstr "Az eszközsáv stílusa" + +#: ../midori/midori-websettings.c:367 +#, fuzzy +msgid "Compact Sidepanel" +msgstr "Oldal_panel" + +#: ../midori/midori-websettings.c:368 +#, fuzzy +msgid "Whether to make the sidepanel compact" +msgstr "Megjelenjen-e a panel" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Betöltés induláskor" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Az induláskor betöltendő" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "A honlap" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Letöltő mappa" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "A fájlok alapértelmezett letöltési mappája" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "A hely-beviteli Kereső" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "A keresés a hely-beviteli mezőben" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Alapértelmezett kódolás" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Az alapértelmezett karakter-kódolás" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Bezáró gombok a lapokon" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Legyenek-e bezáró gombok a lapokon" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Új lapok megnyitása itt:" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Hol nyíljanak az új lapok" + +#: ../midori/midori-websettings.c:473 +#, fuzzy +msgid "Open external pages in" +msgstr "Új lapok megnyitása itt:" + +#: ../midori/midori-websettings.c:474 +#, fuzzy +msgid "Where to open externally opened pages" +msgstr "Hol nyíljanak az új lapok" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Középső gombra megnyitás" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "URL betöltése a kijelölésből középső gombbal" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Lapok megnyitása a háttérben" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Az új lapok a háttérben nyíljanak-e" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Felugrók megnyitása lapokon" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Megnyíljanak-e a felugró ablakok lapokon" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Sütik fogadása" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Milyen sütiket fogadjunk el" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Csak eredeti sütiket" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Csak az eredeti lapról való sütiket fogadjuk el" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Sütik maximális kora" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "A napok száma, melyre a sütiket legfeljebb elmentsük" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Legutóbbi lapok megjegyzése" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Mentsük-e a legutóbb meglátogatott lapokat" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Történet maximális kora" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "A legtöbb nap, melyre a történetet elmentsük" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Űrlapok megjegyzése" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Mentsük-e az űrlapokba bevitt adatokat" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Legutóbbi letöltések megjegyzése" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Jegyezzük-e a legutóbbi letöltéseket" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "HTTP Proxy" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "A HTTP-kapcsolatok proxy kiszolgálója" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Gyorstár mérete" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Az engedélyezett gyorstár-méret" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Hivatkozás megnyitása új _lapon" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "URL megnyitása új _lapon" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "" + +#: ../midori/midori-view.c:1527 +#, c-format +msgid "No documentation installed" +msgstr "" + +#: ../midori/midori-preferences.c:87 +#, fuzzy, c-format +msgid "Preferences for %s" +msgstr "%s beállításai" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Általános" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Indulás" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Megjelenés" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Betű beállítások" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Viselkedés" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Képességek" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Felület" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Címsáv" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Böngészés" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Hálózat" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "" + +#: ../midori/midori-preferences.c:500 +#, fuzzy +msgid "Web Cookies" +msgstr "Sütik fogadása" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Üres" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Kereső-motor hozzáadása" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Kereső-motor szerkesztése" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Név:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Ikon (Név vagy fájl):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Kereső-motorok kezelése" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "" + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "VESZÉLY! Rendszergazda hozzáférést használsz!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +#, fuzzy +msgid "_Disable" +msgstr "_Fájl" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konzol" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Kiterjesztések" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Érvénytelen '%s' tulajdonság ehhez: %s" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Válassz fájlt" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Válassz mappát" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Mappa:" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +msgid "Scripts" +msgstr "" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Select _All" +#~ msgstr "Mindent ki_jelöl" + +#~ msgid "_Fullscreen" +#~ msgstr "_Teljes képernyő" + +#~ msgid "_Leave Fullscreen" +#~ msgstr "Teljes képernyő elhagyása" + +#~ msgid "Settings" +#~ msgstr "Beállítások" + +#~ msgid "The associated settings" +#~ msgstr "Társított beállítások" + +#~ msgid "Trash" +#~ msgstr "Kuka" + +#~ msgid "The trash, collecting recently closed tabs and windows" +#~ msgstr "A legutóbb bezárt lapokat és ablakokat gyűjtő kuka." + +#~ msgid "Browser" +#~ msgstr "Böngésző" + +#~ msgid "The navigationbar" +#~ msgstr "A címsáv" + +#~ msgid "Tab" +#~ msgstr "Lap" + +#~ msgid "The current tab" +#~ msgstr "Jelenlegi lap" + +#~ msgid "Statusbar" +#~ msgstr "Állapotsáv" + +#~ msgid "The statusbar" +#~ msgstr "Az állapotsáv" + +#~ msgid "Statusbar Text" +#~ msgstr "Állapotsáv szöveg" + +#~ msgid "The text that is displayed in the statusbar" +#~ msgstr "Az állapotsávra írt szöveg" + +#~ msgid "Pa_ge Setup" +#~ msgstr "_Oldal beállítása" + +#~ msgid "Undo the last modification" +#~ msgstr "Utolsó módosítás visszavonása" + +#~ msgid "Redo the last modification" +#~ msgstr "Utolsó módosítás ismétlése" + +#~ msgid "_Manage Bookmarks" +#~ msgstr "Könyvjelzők _kezelése" + +#~ msgid "Tab _Overview" +#~ msgstr "Lapok át_tekintése" + +#~ msgid "_Work Offline" +#~ msgstr "_Kapcsolat nélküli munka" + +#~ msgid "Appearance of the shadow around each panel" +#~ msgstr "Panelek körüli árnyékok megjelenése" + +#~ msgid "Menu" +#~ msgstr "Menü" + +#~ msgid "Menu to hold panel items" +#~ msgstr "Panel-elemek menüje" + +#~ msgid "Show New Tab" +#~ msgstr "Új lap mutatása" + +#~ msgid "Show the New Tab button in the toolbar" +#~ msgstr "Új lap gomb mutatása az eszközsávon" + +#~ msgid "Show Web search" +#~ msgstr "Web-keresés mutatása" + +#~ msgid "Show the Web search entry in the toolbar" +#~ msgstr "A Web-kereső mező mutatása az eszközsávon" + +#~ msgid "Show Trash" +#~ msgstr "Kuka mutatása" + +#~ msgid "Show the Trash button in the toolbar" +#~ msgstr "A kuka gomb mutatása az eszközsávon" + +#~ msgid "Tab Label Size" +#~ msgstr "A címke mérete" + +#~ msgid "The desired tab label size" +#~ msgstr "A lapok címkéinek kívánt mérete" + +#~ msgid "The URI of the currently loaded page" +#~ msgstr "A jelenlegi lap URI-ja" + +#~ msgid "The title of the currently loaded page" +#~ msgstr "A jelenlegi lap címe" + +#~ msgid "Symbolic size to use for the animation" +#~ msgstr "Az animációra használt jelképes méret" + +#~ msgid "The name of an icon containing animation frames" +#~ msgstr "Egy animációs kereteket tartalmazó ikon neve" + +#~ msgid "A GdkPixbuf containing animation frames" +#~ msgstr "Egy animációs kereteket tartalmazó GdkPixbuf" + +#~ msgid "Whether the throbber should be animated" +#~ msgstr "A betöltés-jelző animált legyen-e" + +#~ msgid "The name of an icon to be used as the static image" +#~ msgstr "Egy állóképként használandó ikon neve" + +#~ msgid "A GdkPixbuf to be used as the static image" +#~ msgstr "Egy állóképként használandó GdkPixbuf" diff --git a/po/id.po b/po/id.po new file mode 100644 index 00000000..7ba6abcd --- /dev/null +++ b/po/id.po @@ -0,0 +1,1370 @@ +# Indonesian translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Andhika Padmawan 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-11-13 21:26+0700\n" +"Last-Translator: Andhika Padmawan \n" +"Language-Team: Indonesian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,54,-1,-1,-1,-1\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Peramban web ringan" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Peramban Web" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "B_ookmark" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "B_ookmark" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Tambah Bookmark" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Konsol" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Ekstensi" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Riwayat" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Beranda" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Skrip pengguna" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "Ga_ya pengguna" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Tab _Baru" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Transfer" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "Tutup Tab dan _Jendela" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Jendela _Baru" + +#: ../midori/main.c:143 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Konfigurasi tak dapat dimuat: %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Nilai '%s' hanya sah untuk %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Nilai konfigurasi '%s' tidak sah" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Berkas tak ditemukan." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Dokumen salah bentuk." + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Gagal membuka basis data: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Gagal menghapus item riwayat: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Gagal membersihkan riwayat: %s\n" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Gagal menambah item riwayat: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Gagal menghapus item riwayat lama: %s\n" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Penulisan gagal." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Transfer" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Sesi tak dapat disimpan. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "Jalankan nama berkas yang ditentukan sebagai javascript" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Tampilkan versi program" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "URI" + +#: ../midori/main.c:1335 +msgid "[URIs]" +msgstr "[URI]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Silakan laporkan komentar, saran dan kutu ke:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Cek versi baru di:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "Tak ada nama berkas yang ditentukan" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Sebuah instansi Midori telah berjalan namun tidak merespon.\n" + +#: ../midori/main.c:1447 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Bookmark tak dapat dimuat: %s\n" + +#: ../midori/main.c:1463 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Sesi tak dapat dimuat: %s\n" + +#: ../midori/main.c:1477 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Kotak sampah tak dapat dimuat: %s\n" + +#: ../midori/main.c:1491 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Riwayat tak dapat dimuat: %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Galat berikut terjadi:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Mesin pencari tak dapat disimpan. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Bookmark tak dapat disimpan. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Kotak sampah tak dapat disimpan. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Konfigurasi tak dapat disimpan. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Muat ulang halaman ini" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Stop memuat halaman ini" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% termuat" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Aksi tak diharapkan '%s'." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Bookmark baru" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Sunting bookmark" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Judul:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Keterangan:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Folder:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Root" + +#: ../midori/midori-browser.c:668 +msgid "Save file as" +msgstr "Simpan berkas sebagai" + +#: ../midori/midori-browser.c:1248 +msgid "Open file" +msgstr "Buka berkas" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Buka di _Tab Baru" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Buka di _Jendela Baru" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Pemisah" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "Seminggu yang lalu" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "%d hari yang lalu" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "Hari Ini" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "Kemarin" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Peramban web ringan." + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Andhika Padmawan " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "Anda yakin ingin menghapus semua item riwayat?" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Berkas" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Buka di jendela baru" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Buka di tab baru" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Buka berkas" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Simpan ke berkas" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Tutup Tab" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Tutup tab saat ini" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "T_utup Jendela" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Tutup jendela ini" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Cetak halaman saat ini" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Keluar aplikasi" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Sunting" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Potong teks terpilih" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Salin teks terpilih" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Tempel teks dari papan klip" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Hapus teks terpilih" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Pilih semua teks" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Cari kata atau frasa di halaman" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Cari _Berikutnya" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Cari kejadian berikutnya dari kata atau frasa" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Cari _Sebelumnya" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Cari kejadian sebelumnya dari kata atau frasa" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Cari Cepat" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Lompat segera ke kata atau frasa" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Konfigurasi pilihan aplikasi" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Tampilan" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Batang Alat" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Naikkan level pembesaran" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Turunkan level pembesaran" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Reset level pembesaran" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Tampilkan _Sumber" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Tampilkan kode program dari halaman" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Tampilkan Pemilihan Sumber" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Tampilkan kode program dari pemilihan" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Aktifkan tampilan layar penuh" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Ke" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Mundur ke halaman sebelumnya" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Maju ke halaman berikutnya" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Ke laman anda" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Kosongkan Tempat Sampah" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Hapus isi tempat sampah" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Batalkan Menutup Tab" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Buka tab yang terakhir ditutup" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Tambah bookmark baru" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Sunting bookmark terpilih" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Hapus bookmark terpilih" + +#: ../midori/midori-browser.c:3185 +msgid "Delete the selected history item" +msgstr "Hapus item riwayat terpilih" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "Bersihkan seluruh riwayat" + +#: ../midori/midori-browser.c:3191 +msgid "Bookmark the selected history item" +msgstr "Bookmark item riwayat terpilih" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Alat" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Atur Mesin Pencari" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Tambah, sunting dan hapus mesin pencari..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Tab Sebelumnya" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Pindah ke tab sebelumnya" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "Tab _Berikutnya" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Pindah ke tab berikutnya" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "Ba_ntuan" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Isi" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Tampilkan dokumentasi" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "_Sering ditanyakan" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "Tampilkan Pertanyaan Acapkali Diajukan" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "_Laporkan kutu" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "Buka pelacak kutu Midori" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Tampilkan informasi tentang program" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "Meramban P_rivat" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Jangan simpan data privat ketika meramban" + +#: ../midori/midori-browser.c:3231 +msgid "_Menubar" +msgstr "_Batang menu" + +#: ../midori/midori-browser.c:3232 +msgid "Show menubar" +msgstr "Tampilkan batang menu" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "Batang _navigasi" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Tampilkan batang navigasi" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Panel _sisi" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Tampilkan panel sisi" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "Batang _bookmark" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Tampilkan batang bookmark" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "Batang _transfer" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Tampilkan batang transfer" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "Batang stat_us" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Tampilkan batang status" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Lokasi..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Buka lokasi khusus" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "Penelusuran _Web..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Jalankan penelusuran web" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Buka kembali tab atau jendela yang sebelumnya tertutup" + +#: ../midori/midori-browser.c:3729 +msgid "_Recently visited pages" +msgstr "_Halaman yang baru dikunjungi" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "Buka kembali halaman yang sebelumnya anda kunjungi" + +#: ../midori/midori-browser.c:3746 +msgid "Show the saved bookmarks" +msgstr "Tampilkan bookmark tersimpan" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Jendela" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "Tampilkan senarai semua tab yang terbuka" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Bookmark" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Riwayat" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "_Cari dalam baris:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Cocokkan Huruf" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "Sorot Kecocokan" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Tutup batang cari" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Pengaturan tak diharapkan '%s'" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Tutup panel" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Halaman kosong" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Beranda" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Halaman terakhir dibuka" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "China (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Jepang (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Rusia (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Barat (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Suai..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Tab baru" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Jendela baru" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Tab saat ini" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Standar" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Ikon" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Teks" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Keduanya" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Keduanya horizontal" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Semua kuki" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Kuki sesi" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Tak ada" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Ingat ukuran jendela terakhir" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Apakah ingin menyimpan ukuran jendela yang terakhir tersimpan" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Lebar jendela terakhir" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Lebar jendela terakhir tersimpan" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Tinggi jendela terakhir" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Tinggi jendela terakhir tersimpan" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Posisi panel terakhir" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Posisi panel terakhir tersimpan" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Halaman panel terakhir" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Halaman panel terakhir tersimpan" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Penelusuran Web terakhir" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Penelusuran Web terakhir tersimpan" + +#: ../midori/midori-websettings.c:302 +msgid "Show Menubar" +msgstr "Tampilkan Batang Menu" + +#: ../midori/midori-websettings.c:303 +msgid "Whether to show the menubar" +msgstr "Apakah ingin menampilkan batang menu" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Tampilkan Batang Navigasi" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Apakah ingin menampilkan batang navigasi" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Tampilkan Batang Bookmark" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Apakah ingin menampilkan batang bookmark" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Tampilkan Panel" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Apakah ingin menampilkan panel" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Tampilkan Batang Status" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Apakah ingin menampilkan batang status" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Gaya Batang Alat" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Gaya dari batang alat" + +#: ../midori/midori-websettings.c:358 +msgid "Toolbar Items" +msgstr "Item Batang Alat" + +#: ../midori/midori-websettings.c:359 +msgid "The items to show on the toolbar" +msgstr "Item yang akan ditampilkan di batang alat" + +#: ../midori/midori-websettings.c:367 +msgid "Compact Sidepanel" +msgstr "Panel Sisi Kompak" + +#: ../midori/midori-websettings.c:368 +msgid "Whether to make the sidepanel compact" +msgstr "Apakah ingin membuat panel sisi kompak" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Dimuat Saat Hidupkan" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Apa yang akan dimuat saat hidupkan" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Laman" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Folder Unduh" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "Folder berkas terunduh disimpan di" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "Manajer Unduh" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Manajer unduh eksternal" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "Penyunting Teks" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "Penyunting teks eksternal" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Pencari entri lokasi" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "Pencarian yang dilakukan di dalam entri lokasi" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Penyandian Kesukaan" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Penyandian karakter kesukaan" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "Selalu Tampilkan Batang Tab" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "Selalu tampilkan batang tab" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Tutup Tombol di Tab" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Apakah tab memiliki tombol tutup" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Buka halaman baru di" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Dimana membuka halaman baru" + +#: ../midori/midori-websettings.c:473 +msgid "Open external pages in" +msgstr "Buka halaman eksternal di" + +#: ../midori/midori-websettings.c:474 +msgid "Where to open externally opened pages" +msgstr "Dimana ingin membuka halaman yang dibuka secara eksternal" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Klik Tengah Membuka Pilihan" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Muat URI dari pilihan via klik tengah" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Buka Tab di Latar Belakang" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Apakah ingin membuka tab baru di latar belakang" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "Buka Tab di Samping Saat Ini" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" +"Apakah ingin membuka tab baru di sebelah tab saat ini atau setelah tab " +"terakhir" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Buka popup di tab" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Apakah ingin membuka jendela popup di tab" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Terima kuki" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Tipe kuki apa yang diterima" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Hanya kuki asli" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Terima kuki hanya dari situs web asli" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Usia kuki maksimum" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Jumlah maksimum hari untuk menyimpan kuki" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Ingat halaman terakhir dikunjungi" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Apakah halaman terakhir dikunjungi tersimpan" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Usia riwayat maksimum" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Jumlah maksimum hari untuk tetap menyimpan riwayat" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Ingat bentuk terakhir masukan" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Apakah bentuk terakhir masukan disimpan" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Ingat berkas terakhir diunduh" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Apakah berkas terakhir diunduh akan disimpan" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "Proxy HTTP" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "Proxy yang digunakan untuk koneksi HTTP" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Ukuran tembolok" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Ukuran tembolok yang diizinkan" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Buka Taut di _Tab Baru" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "_Simpan Taut tujuan" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "_Unduh Taut tujuan" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Buka URL di _Tab Baru" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "Periksa halaman - %s" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Sumber" + +#: ../midori/midori-view.c:1527 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Tampilkan dokumentasi" + +#: ../midori/midori-preferences.c:87 +#, c-format +msgid "Preferences for %s" +msgstr "Pengaturan untuk %s" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Umum" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Mulai" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Tampilan" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Pengaturan fonta" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "Keluarga Fonta Standar" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "Ukuran Fonta Minimum" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Perilaku" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Fitur" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "Muat citra secara otomatis" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "Kecilkan citra secara otomatis" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "Cetak citra latar belakang" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "Area teks dapat diubah ukurannya" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "Aktifkan skrip" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "Aktifkan plugin" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "Aktifkan alat pengembang" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Antarmuka" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Batang navigasi" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Meramban" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Jaringan" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "Privasi" + +#: ../midori/midori-preferences.c:500 +msgid "Web Cookies" +msgstr "Kuki Web" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "hari" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Kosong" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Tambah mesin pencari" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Sunting mesin pencari" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Nama:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Ikon (nama atau berkas):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "_Token:" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Atur mesin pencari" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Tak dapat menjalankan program eksternal." + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Peringatan: Anda menggunakan akun superuser!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Galat tak diketahui terjadi." + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s tak memiliki properti '%s'" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s tak dapat ditugaskan ke %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s tak dapat diakses" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Skrip pengguna" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Gaya pengguna" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Aktifkan" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Non Aktifkan" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsol" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Ekstensi" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Ikon bernama '%s' tak dapat dimuat" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Stok ikon '%s' tak dapat dimuat" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Bingkai animasi rusak" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Properti '%s' tidak sah untuk %s" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Pilih berkas" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Pilih folder" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Pageholder" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Pageholder" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "Skrip pengguna" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Buka di Page_holder..." + +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Buka halaman saat ini di pageholder" + +#~ msgid "Last pageholder URI" +#~ msgstr "URI pageholder terakhir" + +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "URI terakhir dibuka di pageholder" diff --git a/po/it.po b/po/it.po new file mode 100644 index 00000000..7248ca8b --- /dev/null +++ b/po/it.po @@ -0,0 +1,1656 @@ +# Italian translations for midori package. +# Copyright (C) YEAR THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Sergio Durzu 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-03-03 09:50+0100\n" +"PO-Revision-Date: 2009-03-03 10:06+0100\n" +"Last-Translator: Sergio Durzu \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Browser web leggero" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1596 +#: ../midori/main.c:1702 +#: ../midori/main.c:1711 +#: ../midori/main.c:1722 +#: ../midori/midori-websettings.c:267 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Browser web" + +#: ../midori/main.c:106 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Le impostazioni non possono essere caricate: %s\n" + +#: ../midori/main.c:161 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Il valore «%s» non è valido per %s" + +#: ../midori/main.c:168 +#: ../midori/main.c:238 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Valore di configurazione «%s» non valido" + +#: ../midori/main.c:480 +msgid "File not found." +msgstr "File non trovato." + +#: ../midori/main.c:488 +#: ../midori/main.c:497 +msgid "Malformed document." +msgstr "Documento corrotto." + +#: ../midori/main.c:519 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Errore nella connessione al database: %s\n" + +#: ../midori/main.c:551 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Errore nell'esecuzione della richiesta al database: %s\n" + +#: ../midori/main.c:605 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Errore nell'eliminazione dell'elemento della cronologia: %s\n" + +#: ../midori/main.c:629 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Errore nella cancellazione della cronologia: %s\n" + +#: ../midori/main.c:652 +#: ../midori/main.c:686 +#: ../midori/main.c:702 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Errore nell'inserimento dell'elemento nella cronologia: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:882 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Errore nella cancellazione dei vecchi elementi della cronologia: %s\n" + +#: ../midori/main.c:910 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Le impostazioni non possono essere salvate. %s" + +#: ../midori/main.c:939 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "I motori di ricerca non possono essere salvati. %s" + +#: ../midori/main.c:1069 +#: ../midori/sokoke.c:617 +#, c-format +msgid "Writing failed." +msgstr "Errore di scrittura." + +#: ../midori/main.c:1090 +#: ../midori/main.c:1117 +#: ../midori/main.c:1145 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "I segnalibri non possono essere salvati. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1169 +#: ../midori/main.c:1193 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Il cestino non può essere salvato. %s" + +#: ../midori/main.c:1224 +#: ../midori/midori-preferences.c:404 +msgid "Transfers" +msgstr "Download" + +#: ../midori/main.c:1265 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "La sessione non può essere salvata. %s" + +#: ../midori/main.c:1398 +msgid "Midori seems to have crashed the last time it was opened. If this happened repeatedly, try one of the following options to solve the problem." +msgstr "Midori sembra essersi chiuso inaspettatamente l'ultima volta che è stato usato. Se dovesse capitare spesso, provare una delle seguenti opzioni per risolvere il problema." + +#: ../midori/main.c:1413 +msgid "Modify _preferences" +msgstr "Modifica _preferenze" + +#: ../midori/main.c:1417 +msgid "Reset the last _session" +msgstr "Reimposta l'ultima _sessione" + +#: ../midori/main.c:1422 +msgid "Disable all _extensions" +msgstr "Disabilita tutte le _estensioni" + +#: ../midori/main.c:1596 +msgid "No filename specified" +msgstr "Nessun file specificato" + +#: ../midori/main.c:1628 +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Si è presentato un errore sconosciuto" + +#: ../midori/main.c:1651 +msgid "Run the specified filename as javascript" +msgstr "Esegue il file specificato come javascript" + +#: ../midori/main.c:1653 +msgid "Display program version" +msgstr "Visualizza la versione dell'applicazione" + +#: ../midori/main.c:1655 +msgid "Addresses" +msgstr "Indirizzi" + +#: ../midori/main.c:1699 +msgid "[Addresses]" +msgstr "[Indirizzi]" + +#: ../midori/main.c:1723 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Segnalare commenti, suggerimenti e bug su:" + +#: ../midori/main.c:1725 +msgid "Check for new versions at:" +msgstr "Controlla nuove versioni su:" + +#: ../midori/main.c:1752 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Un'istanza di Midori è già in esecuzione, ma non risponde.\n" + +#: ../midori/main.c:1820 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "I motori di ricerca non possono essere caricati. %s\n" + +#: ../midori/main.c:1832 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "I segnalibri non possono essere caricati: %s\n" + +#: ../midori/main.c:1847 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "La sessione non può essere caricata: %s\n" + +#: ../midori/main.c:1860 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Il cestino non può essere caricato: %s\n" + +#: ../midori/main.c:1873 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "La cronologia non può essere caricata: %s\n" + +#: ../midori/main.c:1885 +msgid "The following errors occured:" +msgstr "Si sono presentati i seguenti errori:" + +#: ../midori/main.c:1901 +msgid "_Ignore" +msgstr "_Ignora" + +#: ../midori/midori-browser.c:277 +#: ../midori/midori-browser.c:3055 +#: ../midori/midori-browser.c:3061 +msgid "Reload the current page" +msgstr "Ricarica la pagina corrente" + +#: ../midori/midori-browser.c:288 +#: ../midori/midori-browser.c:3058 +msgid "Stop loading the current page" +msgstr "Interrompe il caricamento della pagina corrente" + +#: ../midori/midori-browser.c:350 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% caricato" + +#: ../midori/midori-browser.c:375 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Azione inaspettata: '%s'" + +#: ../midori/midori-browser.c:552 +msgid "New folder" +msgstr "Nuova cartella" + +#: ../midori/midori-browser.c:552 +msgid "Edit folder" +msgstr "Modifica cartella" + +#: ../midori/midori-browser.c:554 +msgid "New bookmark" +msgstr "Nuovo segnalibro" + +#: ../midori/midori-browser.c:554 +msgid "Edit bookmark" +msgstr "Modifica segnalibro" + +#: ../midori/midori-browser.c:584 +msgid "_Title:" +msgstr "_Titolo:" + +#: ../midori/midori-browser.c:597 +#: ../midori/midori-searchaction.c:855 +msgid "_Description:" +msgstr "_Descrizione:" + +#: ../midori/midori-browser.c:616 +#: ../midori/midori-searchaction.c:869 +msgid "_Address:" +msgstr "_Indirizzo:" + +#: ../midori/midori-browser.c:635 +msgid "_Folder:" +msgstr "_Cartella:" + +#: ../midori/midori-browser.c:640 +#: ../midori/midori-browser.c:681 +msgid "Toplevel folder" +msgstr "Livello principale" + +#: ../midori/midori-browser.c:761 +msgid "Save file as" +msgstr "Salva come" + +#: ../midori/midori-browser.c:1372 +msgid "Open file" +msgstr "Apri file" + +#: ../midori/midori-browser.c:2634 +#: ../panels/midori-bookmarks.c:776 +#: ../panels/midori-history.c:810 +msgid "Open all in _Tabs" +msgstr "Apri _tutti in nuove schede" + +#: ../midori/midori-browser.c:2641 +#: ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:816 +msgid "Open in New _Tab" +msgstr "Apri in una nuova sc_heda" + +#: ../midori/midori-browser.c:2644 +#: ../panels/midori-bookmarks.c:784 +#: ../panels/midori-history.c:818 +msgid "Open in New _Window" +msgstr "Apri in una nuova _finestra" + +#: ../midori/midori-browser.c:2794 +msgid "A lightweight web browser." +msgstr "Un browser web leggero" + +#: ../midori/midori-browser.c:2802 +msgid "translator-credits" +msgstr "Sergio Durzu " + +#: ../midori/midori-browser.c:2989 +msgid "_File" +msgstr "_File" + +#: ../midori/midori-browser.c:2992 +msgid "Open a new window" +msgstr "Apre una nuova finestra" + +#: ../midori/midori-browser.c:2995 +msgid "Open a new tab" +msgstr "Apre una nuova scheda" + +#: ../midori/midori-browser.c:2998 +msgid "Open a file" +msgstr "Apre un file" + +#: ../midori/midori-browser.c:3001 +msgid "Save to a file" +msgstr "Salva un file" + +#: ../midori/midori-browser.c:3003 +msgid "_Close Tab" +msgstr "_Chiudi scheda" + +#: ../midori/midori-browser.c:3004 +msgid "Close the current tab" +msgstr "Chiude la scheda corrente" + +#: ../midori/midori-browser.c:3006 +msgid "C_lose Window" +msgstr "Chiudi _finestra" + +#: ../midori/midori-browser.c:3007 +msgid "Close this window" +msgstr "Chiude la finestra" + +#: ../midori/midori-browser.c:3010 +msgid "Print the current page" +msgstr "Stampa la pagina corrente" + +#: ../midori/midori-browser.c:3013 +msgid "Quit the application" +msgstr "Esce dall'applicazione" + +#: ../midori/midori-browser.c:3015 +msgid "_Edit" +msgstr "_Modifica" + +#: ../midori/midori-browser.c:3018 +msgid "Cut the selected text" +msgstr "Taglia il testo selezionato" + +#: ../midori/midori-browser.c:3021 +#: ../midori/midori-browser.c:3024 +msgid "Copy the selected text" +msgstr "Copia il testo selezionato" + +#: ../midori/midori-browser.c:3027 +msgid "Paste text from the clipboard" +msgstr "Incolla il testo dagli appunti" + +#: ../midori/midori-browser.c:3030 +msgid "Delete the selected text" +msgstr "Elimina il testo selezionato" + +#: ../midori/midori-browser.c:3033 +msgid "Select all text" +msgstr "Seleziona tutto" + +#: ../midori/midori-browser.c:3036 +msgid "Find a word or phrase in the page" +msgstr "Cerca una parola o una frase nella pagina" + +#: ../midori/midori-browser.c:3038 +msgid "Find _Next" +msgstr "Trova _successivo" + +#: ../midori/midori-browser.c:3039 +msgid "Find the next occurrence of a word or phrase" +msgstr "Trova la parola o frase successiva" + +#: ../midori/midori-browser.c:3041 +msgid "Find _Previous" +msgstr "Trova _precedente" + +#: ../midori/midori-browser.c:3042 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Trova la parola o frase precedente" + +#: ../midori/midori-browser.c:3045 +msgid "_Quick Find" +msgstr "Ricerca _veloce" + +#: ../midori/midori-browser.c:3046 +msgid "Quickly jump to a word or phrase" +msgstr "Salta velocemente a una parola o frase" + +#: ../midori/midori-browser.c:3049 +msgid "Configure the application preferences" +msgstr "Imposta le preferenze dell'applicazione" + +#: ../midori/midori-browser.c:3051 +msgid "_View" +msgstr "_Visualizza" + +#: ../midori/midori-browser.c:3052 +msgid "_Toolbars" +msgstr "_Barre degli strumenti" + +#: ../midori/midori-browser.c:3064 +msgid "Increase the zoom level" +msgstr "Aumenta il livello di ingrandimento" + +#: ../midori/midori-browser.c:3067 +msgid "Decrease the zoom level" +msgstr "Diminuisce il livello di ingrandimento" + +#: ../midori/midori-browser.c:3070 +msgid "Reset the zoom level" +msgstr "Azzera il livello di ingrandimento" + +#: ../midori/midori-browser.c:3071 +msgid "_Encoding" +msgstr "_Codifica" + +#: ../midori/midori-browser.c:3073 +msgid "_Automatic" +msgstr "_Automatico" + +#: ../midori/midori-browser.c:3076 +#: ../midori/midori-websettings.c:194 +msgid "Chinese (BIG5)" +msgstr "Cinese (BIGS)" + +#: ../midori/midori-browser.c:3079 +#: ../midori/midori-websettings.c:195 +msgid "Japanese (SHIFT_JIS)" +msgstr "Giapponese (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3082 +#: ../midori/midori-websettings.c:196 +msgid "Russian (KOI8-R)" +msgstr "Russo (KOI8-R)" + +#: ../midori/midori-browser.c:3085 +#: ../midori/midori-websettings.c:197 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3088 +#: ../midori/midori-websettings.c:198 +msgid "Western (ISO-8859-1)" +msgstr "Occidentale (ISO-8859-1)" + +#: ../midori/midori-browser.c:3091 +#: ../midori/midori-websettings.c:199 +#: ../midori/midori-websettings.c:271 +msgid "Custom..." +msgstr "Personalizzato..." + +#: ../midori/midori-browser.c:3094 +#: ../midori/midori-view.c:1077 +msgid "View _Source" +msgstr "Visualizza _sorgente" + +#: ../midori/midori-browser.c:3095 +msgid "View the source code of the page" +msgstr "Visualizza il codice sorgente della pagina" + +#: ../midori/midori-browser.c:3097 +msgid "View Selection Source" +msgstr "Visualizza sorgente selezione" + +#: ../midori/midori-browser.c:3098 +msgid "View the source code of the selection" +msgstr "Visualizza il codice sorgente della selezione" + +#: ../midori/midori-browser.c:3102 +msgid "Toggle fullscreen view" +msgstr "Schermo intero" + +#: ../midori/midori-browser.c:3104 +msgid "_Go" +msgstr "_Vai" + +#: ../midori/midori-browser.c:3107 +msgid "Go back to the previous page" +msgstr "Va alla pagina precedente" + +#: ../midori/midori-browser.c:3110 +msgid "Go forward to the next page" +msgstr "Va alla pagina successiva" + +#: ../midori/midori-browser.c:3113 +msgid "Go to your homepage" +msgstr "Va alla pagina iniziale" + +#: ../midori/midori-browser.c:3115 +msgid "Empty Trash" +msgstr "Svuota cestino" + +#: ../midori/midori-browser.c:3116 +msgid "Delete the contents of the trash" +msgstr "Elimina il contenuto del cestino" + +#: ../midori/midori-browser.c:3118 +#: ../midori/midori-view.c:1049 +msgid "Undo Close Tab" +msgstr "Annulla chiusura scheda" + +#: ../midori/midori-browser.c:3119 +msgid "Open the last closed tab" +msgstr "Apre l'ultima scheda chiusa" + +#: ../midori/midori-browser.c:3123 +#: ../panels/midori-bookmarks.c:228 +msgid "Add a new bookmark" +msgstr "Aggiunge un nuovo segnalibro" + +#: ../midori/midori-browser.c:3124 +msgid "_Tools" +msgstr "S_trumenti" + +#: ../midori/midori-browser.c:3126 +#: ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "Gestisci _motori di ricerca" + +#: ../midori/midori-browser.c:3127 +msgid "Add, edit and remove search engines..." +msgstr "Aggiunge, modifica e elimina motori di ricerca..." + +#: ../midori/midori-browser.c:3131 +msgid "_Previous Tab" +msgstr "Scheda _precedente" + +#: ../midori/midori-browser.c:3132 +msgid "Switch to the previous tab" +msgstr "Passa alla scheda precedente" + +#: ../midori/midori-browser.c:3134 +msgid "_Next Tab" +msgstr "Scheda _successiva" + +#: ../midori/midori-browser.c:3135 +msgid "Switch to the next tab" +msgstr "Passa alla scheda successiva" + +#: ../midori/midori-browser.c:3137 +msgid "_Help" +msgstr "_Aiuto" + +#: ../midori/midori-browser.c:3139 +msgid "_Contents" +msgstr "_Sommario" + +#: ../midori/midori-browser.c:3140 +msgid "Show the documentation" +msgstr "Mostra la documentazione" + +#: ../midori/midori-browser.c:3142 +msgid "_Frequent Questions" +msgstr "Domande _frequenti" + +#: ../midori/midori-browser.c:3143 +msgid "Show the Frequently Asked Questions" +msgstr "Mostra le domande e risposte frequenti (F.A.Q.)" + +#: ../midori/midori-browser.c:3145 +msgid "_Report a Bug" +msgstr "Segnala un _bug" + +#: ../midori/midori-browser.c:3146 +msgid "Open Midori's bug tracker" +msgstr "Apre lo strumento di segnalazione bug di Midori" + +#: ../midori/midori-browser.c:3149 +msgid "Show information about the program" +msgstr "Mostra le informazioni sull'applicazione" + +#: ../midori/midori-browser.c:3156 +msgid "P_rivate Browsing" +msgstr "Navigazione _privata" + +#: ../midori/midori-browser.c:3157 +msgid "Don't save any private data while browsing" +msgstr "Non memorizza i dati personali durante la navigazione" + +#: ../midori/midori-browser.c:3162 +msgid "_Menubar" +msgstr "Barra dei _menù" + +#: ../midori/midori-browser.c:3163 +msgid "Show menubar" +msgstr "Mostra la barra dei menù" + +#: ../midori/midori-browser.c:3166 +msgid "_Navigationbar" +msgstr "Barra di _navigazione" + +#: ../midori/midori-browser.c:3167 +msgid "Show navigationbar" +msgstr "Mostra la barra di navigazione" + +#: ../midori/midori-browser.c:3170 +msgid "Side_panel" +msgstr "_Pannello laterale" + +#: ../midori/midori-browser.c:3171 +msgid "Show sidepanel" +msgstr "Mostra il pannello laterale" + +#: ../midori/midori-browser.c:3174 +msgid "_Bookmarkbar" +msgstr "_Barra dei segnalibri" + +#: ../midori/midori-browser.c:3175 +msgid "Show bookmarkbar" +msgstr "Mostra la barra dei segnalibri" + +#: ../midori/midori-browser.c:3178 +msgid "_Transferbar" +msgstr "Barra dei _download" + +#: ../midori/midori-browser.c:3179 +msgid "Show transferbar" +msgstr "Mostra la barra dei download" + +#: ../midori/midori-browser.c:3182 +msgid "_Statusbar" +msgstr "Barra di _stato" + +#: ../midori/midori-browser.c:3183 +msgid "Show statusbar" +msgstr "Mostra la barra di stato" + +#: ../midori/midori-browser.c:3602 +msgid "_Separator" +msgstr "Sep_aratore" + +#: ../midori/midori-browser.c:3609 +msgid "_Location..." +msgstr "_Indirizzo..." + +#: ../midori/midori-browser.c:3611 +msgid "Open a particular location" +msgstr "Apre un indirizzo specifico" + +#: ../midori/midori-browser.c:3635 +msgid "_Web Search..." +msgstr "Ricerca sul _web..." + +#: ../midori/midori-browser.c:3637 +msgid "Run a web search" +msgstr "Esegue una ricerca sul web" + +#: ../midori/midori-browser.c:3656 +msgid "Reopen a previously closed tab or window" +msgstr "Riapre una scheda o una finestra chiusa precedentemente" + +#: ../midori/midori-browser.c:3669 +msgid "_Recently visited pages" +msgstr "Pagine visitate _recentemente" + +#: ../midori/midori-browser.c:3671 +msgid "Reopen pages that you visited earlier" +msgstr "Riapre le pagine visitate recentemente" + +#: ../midori/midori-browser.c:3684 +#: ../midori/sokoke.c:772 +msgid "_Bookmarks" +msgstr "S_egnalibri" + +#: ../midori/midori-browser.c:3686 +msgid "Show the saved bookmarks" +msgstr "Mostra i segnalibri salvati" + +#: ../midori/midori-browser.c:3699 +msgid "_Window" +msgstr "_Finestra" + +#: ../midori/midori-browser.c:3701 +msgid "Show a list of all open tabs" +msgstr "Mostra un elenco delle schede aperte" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3864 +msgid "_Inline Find:" +msgstr "Cerca nel _testo:" + +#: ../midori/midori-browser.c:3889 +msgid "Previous" +msgstr "Successivo" + +#: ../midori/midori-browser.c:3894 +msgid "Next" +msgstr "Precedente" + +#: ../midori/midori-browser.c:3899 +msgid "Match Case" +msgstr "Maiuscole/minuscole" + +#: ../midori/midori-browser.c:3907 +msgid "Highlight Matches" +msgstr "Evidenzia risultati" + +#: ../midori/midori-browser.c:3917 +msgid "Close Findbar" +msgstr "Chiudi barra ricerca" + +#: ../midori/midori-browser.c:4211 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Impostazione «%s» non prevista" + +#: ../midori/midori-panel.c:229 +#: ../midori/midori-websettings.c:481 +msgid "Align sidepanel on the right" +msgstr "Allinea a destra il pannello laterale" + +#: ../midori/midori-panel.c:231 +#: ../midori/midori-websettings.c:482 +msgid "Whether to align the sidepanel on the right" +msgstr "Abilitare per allineare il pannello laterale a destra" + +#: ../midori/midori-panel.c:241 +#: ../midori/midori-panel.c:242 +msgid "Close panel" +msgstr "Chiudi pannello" + +#: ../midori/midori-websettings.c:177 +#: ../midori/midori-view.c:1821 +msgid "Blank page" +msgstr "Pagina vuota" + +#: ../midori/midori-websettings.c:178 +#: ../midori/midori-websettings.c:501 +msgid "Homepage" +msgstr "Pagina iniziale" + +#: ../midori/midori-websettings.c:179 +msgid "Last open pages" +msgstr "Ultime pagine visitate" + +#: ../midori/midori-websettings.c:214 +msgid "New tab" +msgstr "Nuova scheda" + +#: ../midori/midori-websettings.c:215 +msgid "New window" +msgstr "Nuova finestra" + +#: ../midori/midori-websettings.c:216 +msgid "Current tab" +msgstr "Scheda corrente" + +#: ../midori/midori-websettings.c:231 +msgid "Default" +msgstr "Predefinito" + +#: ../midori/midori-websettings.c:232 +msgid "Icons" +msgstr "Icone" + +#: ../midori/midori-websettings.c:233 +msgid "Text" +msgstr "Testo" + +#: ../midori/midori-websettings.c:234 +msgid "Both" +msgstr "Entrambi" + +#: ../midori/midori-websettings.c:235 +msgid "Both horizontal" +msgstr "Entrambi orizzontalmente" + +#: ../midori/midori-websettings.c:250 +msgid "All cookies" +msgstr "Tutti i cookie" + +#: ../midori/midori-websettings.c:251 +msgid "Session cookies" +msgstr "Cookie di sessione" + +#: ../midori/midori-websettings.c:252 +#: ../panels/midori-addons.c:96 +msgid "None" +msgstr "Nessuno" + +#: ../midori/midori-websettings.c:268 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:269 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:270 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:311 +msgid "Remember last window size" +msgstr "Ricorda la dimensione dell'ultima finestra" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to save the last window size" +msgstr "Salva le dimensioni dell'ultima finestra" + +#: ../midori/midori-websettings.c:320 +msgid "Last window width" +msgstr "Larghezza dell'ultima finestra" + +#: ../midori/midori-websettings.c:321 +msgid "The last saved window width" +msgstr "L'ultima larghezza salvata per la finestra" + +#: ../midori/midori-websettings.c:329 +msgid "Last window height" +msgstr "Altezza dell'ultima finestra" + +#: ../midori/midori-websettings.c:330 +msgid "The last saved window height" +msgstr "L'ultima altezza salvata per la finestra" + +#: ../midori/midori-websettings.c:355 +msgid "Last panel position" +msgstr "Posizione del pannello" + +#: ../midori/midori-websettings.c:356 +msgid "The last saved panel position" +msgstr "L'ultima posizione salvata per il pannello" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:365 +msgid "Last panel page" +msgstr "Pagina dell'ultimo pannello" + +#: ../midori/midori-websettings.c:366 +msgid "The last saved panel page" +msgstr "L'ultima pagina salvata per il pannello" + +#: ../midori/midori-websettings.c:374 +msgid "Last Web search" +msgstr "Ultima ricerca web" + +#: ../midori/midori-websettings.c:375 +msgid "The last saved Web search" +msgstr "L'ultima ricerca web salvata" + +#: ../midori/midori-websettings.c:384 +msgid "Show Menubar" +msgstr "Mostra barra dei menù" + +#: ../midori/midori-websettings.c:385 +msgid "Whether to show the menubar" +msgstr "Abilitare per mostrare la barra dei menù" + +#: ../midori/midori-websettings.c:393 +msgid "Show Navigationbar" +msgstr "Mostra barra di navigazione" + +#: ../midori/midori-websettings.c:394 +msgid "Whether to show the navigationbar" +msgstr "Abilitare per mostrare la barra di navigazione" + +#: ../midori/midori-websettings.c:402 +msgid "Show Bookmarkbar" +msgstr "Mostra barra dei segnalibri" + +#: ../midori/midori-websettings.c:403 +msgid "Whether to show the bookmarkbar" +msgstr "Abilitare per mostrare la barra dei segnalibri" + +#: ../midori/midori-websettings.c:411 +msgid "Show Panel" +msgstr "Mostra pannello" + +#: ../midori/midori-websettings.c:412 +msgid "Whether to show the panel" +msgstr "Abilitare per mostrare il pannello" + +#: ../midori/midori-websettings.c:420 +msgid "Show Statusbar" +msgstr "Mostra barra di stato" + +#: ../midori/midori-websettings.c:421 +msgid "Whether to show the statusbar" +msgstr "Abilitare per mostrare la barra di stato" + +#: ../midori/midori-websettings.c:430 +msgid "Toolbar Style" +msgstr "Stile della barra degli strumenti" + +#: ../midori/midori-websettings.c:431 +msgid "The style of the toolbar" +msgstr "Scegliere lo stile della barra degli strumenti" + +#: ../midori/midori-websettings.c:447 +msgid "Show progress in location entry" +msgstr "Mostra caricamento nella barra degli indirizzi" + +#: ../midori/midori-websettings.c:448 +msgid "Whether to show loading progress in the location entry" +msgstr "Abilitare per mostrare la percentuale di caricamento della pagina nella barra degli indirizzi" + +#: ../midori/midori-websettings.c:456 +msgid "Toolbar Items" +msgstr "Elementi barra degli strumenti" + +#: ../midori/midori-websettings.c:457 +msgid "The items to show on the toolbar" +msgstr "Indicare gli elementi da mostrare nella barra degli strumenti" + +#: ../midori/midori-websettings.c:465 +msgid "Compact Sidepanel" +msgstr "Pannello compatto" + +#: ../midori/midori-websettings.c:466 +msgid "Whether to make the sidepanel compact" +msgstr "Abilitare per la visualizzazione compatta del pannello" + +#: ../midori/midori-websettings.c:491 +msgid "Load on Startup" +msgstr "Carica all'avvio" + +#: ../midori/midori-websettings.c:492 +msgid "What to load on startup" +msgstr "Scegliere cosa deve essere caricato all'avvio dell'applicazione" + +#: ../midori/midori-websettings.c:502 +msgid "The homepage" +msgstr "Pagina iniziale" + +#: ../midori/midori-websettings.c:517 +msgid "Show crash dialog" +msgstr "Mostra finestra di errore" + +#: ../midori/midori-websettings.c:518 +msgid "Show a dialog after Midori crashed" +msgstr "Mostra una finestra dopo che Midori si è chiuso inaspettatamente" + +#: ../midori/midori-websettings.c:526 +msgid "Download Folder" +msgstr "Cartella download" + +#: ../midori/midori-websettings.c:527 +msgid "The folder downloaded files are saved to" +msgstr "Scegliere la cartella dove devono essere salvati i file scaricati" + +#: ../midori/midori-websettings.c:535 +msgid "Download Manager" +msgstr "Gestione download" + +#: ../midori/midori-websettings.c:536 +msgid "An external download manager" +msgstr "Inserire un gestore download esterno" + +#: ../midori/midori-websettings.c:544 +msgid "Text Editor" +msgstr "Editor di testo" + +#: ../midori/midori-websettings.c:545 +msgid "An external text editor" +msgstr "Inserire un editor di testo esterno" + +#: ../midori/midori-websettings.c:553 +msgid "Location entry Search" +msgstr "Motore di ricerca predefinito" + +#: ../midori/midori-websettings.c:554 +msgid "The search to perform inside the location entry" +msgstr "Inserire il motore di ricerca predefinito da utilizzare dalla barra degli indirizzi" + +#: ../midori/midori-websettings.c:562 +msgid "Preferred Encoding" +msgstr "Codifica preferita" + +#: ../midori/midori-websettings.c:563 +msgid "The preferred character encoding" +msgstr "Scegliere la codifica dei caratteri preferita" + +#: ../midori/midori-websettings.c:573 +msgid "Always Show Tabbar" +msgstr "Mostra sempre le schede" + +#: ../midori/midori-websettings.c:574 +msgid "Always show the tabbar" +msgstr "Abilitare per mostrare sempre le etichette delle schede" + +#: ../midori/midori-websettings.c:582 +msgid "Close Buttons on Tabs" +msgstr "Pulsante di chiusura schede" + +#: ../midori/midori-websettings.c:583 +msgid "Whether tabs have close buttons" +msgstr "Abilitare per visualizzare il pulsante di chiusura nelle schede" + +#: ../midori/midori-websettings.c:592 +msgid "Open new pages in" +msgstr "Apri nuove pagine in" + +#: ../midori/midori-websettings.c:593 +msgid "Where to open new pages" +msgstr "Scegliere dove aprire le nuove pagine" + +#: ../midori/midori-websettings.c:603 +msgid "Open external pages in" +msgstr "Apri pagine esterne in" + +#: ../midori/midori-websettings.c:604 +msgid "Where to open externally opened pages" +msgstr "Scegliere dove aprire le pagine aperte da applicazioni esterne" + +#: ../midori/midori-websettings.c:617 +msgid "Middle click opens Selection" +msgstr "Tasto centrale apre la selezione" + +#: ../midori/midori-websettings.c:618 +msgid "Load an address from the selection via middle click" +msgstr "Abilitare per caricare un indirizzo da una selezione tramite il clic col tasto centrale" + +#: ../midori/midori-websettings.c:626 +msgid "Open tabs in the background" +msgstr "Apri schede sullo sfondo" + +#: ../midori/midori-websettings.c:627 +msgid "Whether to open new tabs in the background" +msgstr "Abilitare per aprire le nuove schede sullo sfondo" + +#: ../midori/midori-websettings.c:635 +msgid "Open Tabs next to Current" +msgstr "Apri schede dopo quella corrente" + +#: ../midori/midori-websettings.c:636 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Abilitare per aprire le nuove schede dopo la scheda attuale o dopo l'ultima" + +#: ../midori/midori-websettings.c:644 +msgid "Open popups in tabs" +msgstr "Apri popup in schede" + +#: ../midori/midori-websettings.c:645 +msgid "Whether to open popup windows in tabs" +msgstr "Abilitare per aprire le finestre popup in schede" + +#: ../midori/midori-websettings.c:696 +msgid "Zoom Text and Images" +msgstr "Ingrandimento testo e immagini" + +#: ../midori/midori-websettings.c:697 +msgid "Whether to zoom text and images" +msgstr "Abilitare per ingrandire il testo e le immagini" + +#: ../midori/midori-websettings.c:714 +msgid "Find inline while typing" +msgstr "Cerco direttamente nella pagina mentre si scrive" + +#: ../midori/midori-websettings.c:715 +msgid "Whether to automatically find inline while typing" +msgstr "Abilitare per per cercare automaticamente nella pagina quando si scrive" + +#: ../midori/midori-websettings.c:723 +msgid "Accept cookies" +msgstr "Accetta cookie" + +#: ../midori/midori-websettings.c:724 +msgid "What type of cookies to accept" +msgstr "Indicare che tipo di cookie devono essere accettati" + +#: ../midori/midori-websettings.c:737 +msgid "Original cookies only" +msgstr "Cookie originali" + +#: ../midori/midori-websettings.c:738 +msgid "Accept cookies from the original website only" +msgstr "Accetta cookie solo dai siti visitati" + +#: ../midori/midori-websettings.c:746 +msgid "Maximum cookie age" +msgstr "Durata massima dei cookie" + +#: ../midori/midori-websettings.c:747 +msgid "The maximum number of days to save cookies for" +msgstr "Numero di giorni massimo per cui possono essere validi i cookie" + +#: ../midori/midori-websettings.c:757 +msgid "Remember last visited pages" +msgstr "Ricorda ultime pagine visitate" + +#: ../midori/midori-websettings.c:758 +msgid "Whether the last visited pages are saved" +msgstr "Abilitare per salvare l'elenco delle ultime pagine visitate" + +#: ../midori/midori-websettings.c:766 +msgid "Maximum history age" +msgstr "Durata cronologia" + +#: ../midori/midori-websettings.c:767 +msgid "The maximum number of days to save the history for" +msgstr "Numero massimo di giorni per cui deve essere salvata la cronologia" + +#: ../midori/midori-websettings.c:775 +msgid "Remember last form inputs" +msgstr "Ricorda i moduli compilati" + +#: ../midori/midori-websettings.c:776 +msgid "Whether the last form inputs are saved" +msgstr "Abilitare per salvare le informazioni inserite nei moduli." + +#: ../midori/midori-websettings.c:784 +msgid "Remember last downloaded files" +msgstr "Ricorda gli ultimi download" + +#: ../midori/midori-websettings.c:785 +msgid "Whether the last downloaded files are saved" +msgstr "Abilitare per salvare l'elenco degli ultimi file scaricati" + +#: ../midori/midori-websettings.c:795 +msgid "Proxy Server" +msgstr "Server proxy" + +#: ../midori/midori-websettings.c:796 +msgid "The proxy server used for HTTP connections" +msgstr "Inserire il server proxy usato per le connessioni HTTP" + +#: ../midori/midori-websettings.c:815 +msgid "Detect proxy server automatically" +msgstr "Riconosci automaticamente il server proxy" + +#: ../midori/midori-websettings.c:816 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "Abilitare per riconoscere automaticamente il server proxy di sistema" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:836 +msgid "Identify as" +msgstr "Identifica come" + +#: ../midori/midori-websettings.c:837 +msgid "What to identify as to web pages" +msgstr "Come essere identificati sul web" + +#: ../midori/midori-websettings.c:857 +msgid "Identification string" +msgstr "Stringa di identificazione" + +#: ../midori/midori-websettings.c:858 +msgid "The application identification string" +msgstr "Inserire la stringa di identificazione dell'applicazione" + +#: ../midori/midori-websettings.c:870 +msgid "Cache size" +msgstr "File temporanei" + +#: ../midori/midori-websettings.c:871 +msgid "The allowed size of the cache" +msgstr "Dimensione massima consentita per i file temporanei" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:630 +#, c-format +msgid "Not found - %s" +msgstr "Non trovato - %s" + +#: ../midori/midori-view.c:960 +msgid "Open _Link" +msgstr "Apri co_llegamento" + +#: ../midori/midori-view.c:962 +msgid "Open Link in New _Tab" +msgstr "Apri collegamento in una nuova _scheda" + +#: ../midori/midori-view.c:979 +msgid "Open Link in New _Window" +msgstr "Apri collegamento in una nuova _finestra" + +#: ../midori/midori-view.c:989 +msgid "_Save Link destination" +msgstr "_Salva indirizzo collegamento" + +#: ../midori/midori-view.c:997 +msgid "_Download Link destination" +msgstr "Scarica _indirizzo collegamento" + +#: ../midori/midori-view.c:1019 +msgid "_Search the Web" +msgstr "_Cerca nel web" + +#: ../midori/midori-view.c:1028 +msgid "Open Address in New _Tab" +msgstr "Apri indirizzi in una nuova _scheda" + +#: ../midori/midori-view.c:1507 +#, c-format +msgid "Inspect page - %s" +msgstr "Controlla pagina - %s" + +#: ../midori/midori-view.c:1664 +msgid "Source" +msgstr "Sorgente" + +#: ../midori/midori-view.c:1688 +#, c-format +msgid "Document cannot be displayed" +msgstr "Il documento non può essere visualizzato" + +#: ../midori/midori-view.c:1704 +#, c-format +msgid "No documentation installed" +msgstr "La documentazione non è installata" + +#: ../midori/midori-preferences.c:93 +#, c-format +msgid "Preferences for %s" +msgstr "Preferenze per %s" + +#. Page "General" +#: ../midori/midori-preferences.c:390 +msgid "General" +msgstr "Generale" + +#: ../midori/midori-preferences.c:391 +msgid "Startup" +msgstr "Avvio" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:440 +msgid "Appearance" +msgstr "Visualizzazione" + +#: ../midori/midori-preferences.c:441 +msgid "Font settings" +msgstr "Impostazioni caratteri" + +#: ../midori/midori-preferences.c:443 +msgid "Default Font Family" +msgstr "Famiglia di caratteri predefinita" + +#: ../midori/midori-preferences.c:449 +msgid "The default font size used to display text" +msgstr "Scegliere la dimensione predefinita dei caratteri per visualizzare il testo" + +#: ../midori/midori-preferences.c:452 +msgid "Minimum Font Size" +msgstr "Dimensione minima caratteri" + +#: ../midori/midori-preferences.c:455 +msgid "The minimum font size used to display text" +msgstr "Scegliere la dimensione minima dei caratteri per visualizzare il testo" + +#: ../midori/midori-preferences.c:462 +msgid "Encoding" +msgstr "Codifica" + +#: ../midori/midori-preferences.c:465 +msgid "The character encoding to use by default" +msgstr "Scegliere la codifica predefinita dei caratteri" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:472 +msgid "Behavior" +msgstr "Comportamento" + +#: ../midori/midori-preferences.c:473 +msgid "Features" +msgstr "Opzioni" + +#: ../midori/midori-preferences.c:476 +#: ../extensions/statusbar-features.c:42 +msgid "Load images automatically" +msgstr "Carica immagini" + +#: ../midori/midori-preferences.c:477 +msgid "Load and display images automatically" +msgstr "Abilitare per caricare e visualizzare automaticamente le immagini" + +#: ../midori/midori-preferences.c:480 +msgid "Shrink images automatically" +msgstr "Ridimensiona immagini" + +#: ../midori/midori-preferences.c:481 +msgid "Automatically shrink standalone images to fit" +msgstr "Abilitare per ridimensionare automaticamente le immagini caricate da sole" + +#: ../midori/midori-preferences.c:484 +msgid "Print background images" +msgstr "Stampa immagini di sfondo" + +#: ../midori/midori-preferences.c:485 +msgid "Whether background images should be printed" +msgstr "Abilitare per stampare le immagini di sfondo" + +#: ../midori/midori-preferences.c:488 +msgid "Resizable text areas" +msgstr "Aree di testo ridimensionabili" + +#: ../midori/midori-preferences.c:489 +msgid "Whether text areas are resizable" +msgstr "Abilitare per rendere le aree di testo ridimensionabili" + +#: ../midori/midori-preferences.c:492 +#: ../extensions/statusbar-features.c:49 +msgid "Enable scripts" +msgstr "Abilita script" + +#: ../midori/midori-preferences.c:493 +msgid "Enable embedded scripting languages" +msgstr "Abilita linguaggi di scripting integrati" + +#: ../midori/midori-preferences.c:496 +#: ../extensions/statusbar-features.c:56 +msgid "Enable plugins" +msgstr "Abilita plugin" + +#: ../midori/midori-preferences.c:497 +msgid "Enable embedded plugin objects" +msgstr "Abilita oggetti integrati con plugin" + +#: ../midori/midori-preferences.c:500 +msgid "Enforce 96 dots per inch" +msgstr "Forza 96 punti per pollice" + +#: ../midori/midori-preferences.c:501 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Abilitare per forzare la densità dei punti a 96 DPI" + +#: ../midori/midori-preferences.c:504 +msgid "Enable developer tools" +msgstr "Abilita strumenti di sviluppo" + +#: ../midori/midori-preferences.c:505 +msgid "Enable special extensions for developers" +msgstr "Abilitare per utilizzare estensioni particolari per gli sviluppatori" + +#. Page "Interface" +#: ../midori/midori-preferences.c:517 +msgid "Interface" +msgstr "Interfaccia" + +#: ../midori/midori-preferences.c:518 +msgid "Navigationbar" +msgstr "Barra di navigazione" + +#: ../midori/midori-preferences.c:527 +msgid "Browsing" +msgstr "Navigazione" + +#: ../midori/midori-preferences.c:564 +#: ../midori/midori-preferences.c:565 +msgid "Network" +msgstr "Rete" + +#: ../midori/midori-preferences.c:592 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:599 +msgid "Privacy" +msgstr "Privacy" + +#: ../midori/midori-preferences.c:606 +msgid "Web Cookies" +msgstr "Cookie" + +#: ../midori/midori-preferences.c:619 +#: ../midori/midori-preferences.c:631 +msgid "days" +msgstr "giorni" + +#: ../midori/midori-preferences.c:624 +#: ../panels/midori-history.c:104 +msgid "History" +msgstr "Cronologia" + +#: ../midori/midori-searchaction.c:455 +#: ../katze/katze-arrayaction.c:279 +msgid "Empty" +msgstr "Vuoto" + +#: ../midori/midori-searchaction.c:811 +msgid "Add search engine" +msgstr "Aggiungi motore di ricerca" + +#: ../midori/midori-searchaction.c:811 +msgid "Edit search engine" +msgstr "Modifica motore di ricerca" + +#: ../midori/midori-searchaction.c:839 +msgid "_Name:" +msgstr "_Nome:" + +#: ../midori/midori-searchaction.c:883 +msgid "_Icon:" +msgstr "I_cona:" + +#: ../midori/midori-searchaction.c:897 +msgid "_Token:" +msgstr "Parame_tro:" + +#: ../midori/midori-searchaction.c:1077 +msgid "Manage Search Engines" +msgstr "Gestisci motori di ricerca" + +#: ../midori/sokoke.c:109 +#: ../midori/sokoke.c:121 +msgid "Could not run external program." +msgstr "Non è possibile eseguire l'applicazione esterna." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:440 +msgid "Warning: You are using a superuser account!" +msgstr "Attenzione: si sta eseguendo l'applicazione come amministratore." + +#: ../midori/sokoke.c:771 +msgid "_Bookmark" +msgstr "S_egnalibro" + +#: ../midori/sokoke.c:773 +msgid "_Add Bookmark" +msgstr "A_ggiungi segnalibro" + +#: ../midori/sokoke.c:774 +msgid "_Console" +msgstr "_Console" + +#: ../midori/sokoke.c:775 +msgid "_Extensions" +msgstr "_Estensioni" + +#: ../midori/sokoke.c:776 +msgid "_History" +msgstr "C_ronologia" + +#: ../midori/sokoke.c:777 +msgid "_Homepage" +msgstr "_Pagina iniziale" + +#: ../midori/sokoke.c:778 +msgid "_Userscripts" +msgstr "Script dell'_utente" + +#: ../midori/sokoke.c:779 +msgid "User_styles" +msgstr "_Stili dell'utente" + +#: ../midori/sokoke.c:780 +msgid "New _Tab" +msgstr "N_uova scheda" + +#: ../midori/sokoke.c:781 +msgid "_Transfers" +msgstr "_Download" + +#: ../midori/sokoke.c:782 +msgid "_Closed Tabs and Windows" +msgstr "_Finestre e schede chiuse" + +#: ../midori/sokoke.c:783 +msgid "New _Window" +msgstr "_Nuova finestra" + +#: ../midori/gjs.c:742 +#: ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s non ha la proprietà «%s»" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s non può essere assegnato a %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s non è accessibile" + +#: ../panels/midori-addons.c:97 +#: ../panels/midori-addons.c:143 +msgid "Userscripts" +msgstr "Script dell'utente" + +#: ../panels/midori-addons.c:98 +#: ../panels/midori-addons.c:145 +msgid "Userstyles" +msgstr "Stili dell'utente" + +#: ../panels/midori-addons.c:1005 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Abilita" + +#: ../panels/midori-addons.c:1014 +#: ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Disabilita" + +#: ../panels/midori-bookmarks.c:103 +msgid "Bookmarks" +msgstr "Segnalibri" + +#: ../panels/midori-bookmarks.c:236 +msgid "Edit the selected bookmark" +msgstr "Modifica il segnalibro selezionato" + +#: ../panels/midori-bookmarks.c:244 +msgid "Delete the selected bookmark" +msgstr "Elimina il segnalibro selezionato" + +#: ../panels/midori-bookmarks.c:257 +msgid "Add a new folder" +msgstr "Aggiungi una nuova cartella" + +#: ../panels/midori-bookmarks.c:589 +msgid "Separator" +msgstr "Separatore" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Console" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Estensioni" + +#: ../panels/midori-history.c:159 +msgid "Are you sure you want to remove all history items?" +msgstr "Cancellare completamente la cronologia?" + +#: ../panels/midori-history.c:216 +msgid "Bookmark the selected history item" +msgstr "Crea un segnalibro dall'elemento della cronologia selezionato" + +#: ../panels/midori-history.c:225 +msgid "Delete the selected history item" +msgstr "Elimina l'elemento selezionato dalla cronologia" + +#: ../panels/midori-history.c:233 +msgid "Clear the entire history" +msgstr "Cancella l'intera cronologia" + +#: ../panels/midori-history.c:603 +#, c-format +msgid "A week ago" +msgstr "Una settimana fa" + +#: ../panels/midori-history.c:609 +#, c-format +msgid "%d days ago" +msgstr "%d giorni fa" + +#: ../panels/midori-history.c:616 +msgid "Today" +msgstr "Oggi" + +#: ../panels/midori-history.c:618 +msgid "Yesterday" +msgstr "Ieri" + +#: ../panels/midori-plugins.c:87 +#: ../extensions/statusbar-features.c:54 +msgid "Plugins" +msgstr "Plugin" + +#: ../katze/katze-http-auth.c:101 +msgid "Authentication Required" +msgstr "Autenticazione richiesta" + +#: ../katze/katze-http-auth.c:117 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Sono necessari un nome utente e una password\n" +"per aprire questo indirizzo:" + +#: ../katze/katze-http-auth.c:131 +msgid "Username" +msgstr "Nome utente" + +#: ../katze/katze-http-auth.c:142 +msgid "Password" +msgstr "Password" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "L'icona denominata '%s' non può essere caricata" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "L'icona «%s» dello stock non può essere caricata" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "I fotogrammi dell'animazione sono danneggiati" + +#: ../katze/katze-utils.c:180 +#: ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "La proprietà «%s» non è valida per %s" + +#: ../katze/katze-utils.c:209 +#: ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "Scegli un file" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "Scegli una cartella" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "Gesti del mouse" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "Controllare Midori con i movimenti del mouse" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 +#: ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "" + +#: ../extensions/statusbar-features.c:40 +msgid "Images" +msgstr "Immagini" + +#: ../extensions/statusbar-features.c:47 +msgid "Scripts" +msgstr "Script" + +#~ msgid "_Icon (name or file):" +#~ msgstr "_Icona (nome o file):" + diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 00000000..ea272656 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,1867 @@ +# Japanese translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Masato Hashimoto 2008-2009 +# +msgid "" +msgstr "" +"Project-Id-Version: Midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-12 22:19+0900\n" +"PO-Revision-Date: 2009-04-13 01:45+0900\n" +"Last-Translator: Masato Hashimoto \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "軽量級ウェブブラウザ" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1288 +#: ../midori/main.c:1384 +#: ../midori/main.c:1392 +#: ../midori/main.c:1403 +#: ../midori/midori-websettings.c:269 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "ウェブブラウザ" + +#: ../midori/main.c:94 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "設定を読み込めませんでした: %s\n" + +#: ../midori/main.c:149 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "'%s' は %s の値として無効です" + +#: ../midori/main.c:156 +#: ../midori/main.c:228 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "無効な設定値 '%s'" + +#: ../midori/main.c:332 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "データベースのオープンに失敗しました: %s\n" + +#: ../midori/main.c:364 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "データベース文の実行に失敗しました: %s\n" + +#: ../midori/main.c:418 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "履歴アイテムの削除に失敗しました: %s\n" + +#: ../midori/main.c:442 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "履歴のクリアに失敗しました: %s\n" + +#: ../midori/main.c:465 +#: ../midori/main.c:499 +#: ../midori/main.c:515 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "履歴アイテムの追加に失敗しました: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:694 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "古い履歴アイテムの削除に失敗しました: %s\n" + +#: ../midori/main.c:722 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "設定を保存できませんでした。%s" + +#: ../midori/main.c:751 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "検索エンジンを保存できませんでした。%s" + +#: ../midori/main.c:770 +#: ../midori/main.c:798 +#: ../midori/main.c:827 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "ブックマークを保存できませんでした。%s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:850 +#: ../midori/main.c:873 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "ゴミ箱を保存できませんでした。%s" + +#: ../midori/main.c:946 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "セッションは保存できませんでした。%s" + +#: ../midori/main.c:1073 +msgid "Midori seems to have crashed the last time it was opened. If this happened repeatedly, try one of the following options to solve the problem." +msgstr "Midori は最後に開いたときにクラッシュしたようです。もしこれが繰り返し発生するようであれば、問題解決のために以下のオプションのひとつを試してみてください。" + +#: ../midori/main.c:1088 +msgid "Modify _preferences" +msgstr "設定を変更する(_P)" + +#: ../midori/main.c:1092 +msgid "Reset the last _session" +msgstr "最後のセッションをリセットする(_S)" + +#: ../midori/main.c:1097 +msgid "Disable all _extensions" +msgstr "すべてのエクステンションを無効にする(_E)" + +#: ../midori/main.c:1288 +msgid "No filename specified" +msgstr "ファイル名が指定されていません" + +#: ../midori/main.c:1311 +msgid "An unknown error occured." +msgstr "未知のエラーが発生しました。" + +#: ../midori/main.c:1335 +msgid "Use FOLDER as configuration folder" +msgstr "設定フォルダとして FOLDER を使用する" + +#: ../midori/main.c:1335 +msgid "FOLDER" +msgstr "FOLDER" + +# CLI --help +#: ../midori/main.c:1337 +msgid "Run the specified filename as javascript" +msgstr "指定されたファイル名を javascript として実行する" + +# CLI --help +#: ../midori/main.c:1339 +msgid "Display program version" +msgstr "プログラムのバージョンを表示する" + +#: ../midori/main.c:1341 +msgid "Addresses" +msgstr "アドレス" + +#: ../midori/main.c:1381 +msgid "[Addresses]" +msgstr "[アドレス]" + +#: ../midori/main.c:1404 +msgid "Please report comments, suggestions and bugs to:" +msgstr "コメント、ご提案、またはバグの報告はこちらまでお願いします:" + +#: ../midori/main.c:1406 +msgid "Check for new versions at:" +msgstr "新しいバージョンのチェックはこちら:" + +#: ../midori/main.c:1427 +msgid "The specified configuration folder is invalid." +msgstr "指定された設定フォルダが正しくありません。" + +#: ../midori/main.c:1462 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Midori のインスタンスはすでに実行中ですが応答がありません。\n" + +#: ../midori/main.c:1512 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "検索エンジンを読み込めませんでした。%s\n" + +#: ../midori/main.c:1524 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "ブックマークを読み込めませんでした: %s\n" + +#: ../midori/main.c:1539 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "セッションを読み込めませんでした: %s\n" + +#: ../midori/main.c:1552 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "ゴミ箱を読み込めませんでした: %s\n" + +#: ../midori/main.c:1565 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "履歴を読み込めませんでした: %s\n" + +#: ../midori/main.c:1577 +msgid "The following errors occured:" +msgstr "次のエラーが発生しました:" + +#: ../midori/main.c:1593 +msgid "_Ignore" +msgstr "無視(_I)" + +#: ../midori/midori-array.c:195 +msgid "File not found." +msgstr "ファイルが見つかりません。" + +#: ../midori/midori-array.c:203 +#: ../midori/midori-array.c:212 +msgid "Malformed document." +msgstr "不正な形式のドキュメントです。" + +#: ../midori/midori-array.c:338 +#: ../midori/sokoke.c:616 +#, c-format +msgid "Writing failed." +msgstr "書き込みに失敗しました。" + +#: ../midori/midori-browser.c:278 +#: ../midori/midori-browser.c:3415 +#: ../midori/midori-browser.c:3421 +msgid "Reload the current page" +msgstr "現在のページを再読み込みします" + +#: ../midori/midori-browser.c:289 +#: ../midori/midori-browser.c:3418 +msgid "Stop loading the current page" +msgstr "現在のページの読み込みを中止します" + +#: ../midori/midori-browser.c:352 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% ロードしました" + +#: ../midori/midori-browser.c:377 +#, c-format +msgid "Unexpected action '%s'." +msgstr "'%s' は想定外のアクションです。" + +#: ../midori/midori-browser.c:554 +msgid "New folder" +msgstr "新しいフォルダ" + +#: ../midori/midori-browser.c:554 +msgid "Edit folder" +msgstr "フォルダの編集" + +#: ../midori/midori-browser.c:556 +msgid "New bookmark" +msgstr "新しいブックマーク" + +#: ../midori/midori-browser.c:556 +msgid "Edit bookmark" +msgstr "ブックマークの編集" + +#: ../midori/midori-browser.c:586 +msgid "_Title:" +msgstr "タイトル(_T):" + +#: ../midori/midori-browser.c:599 +#: ../midori/midori-searchaction.c:856 +msgid "_Description:" +msgstr "説明(_D):" + +#: ../midori/midori-browser.c:618 +#: ../midori/midori-searchaction.c:870 +msgid "_Address:" +msgstr "アドレス(_A):" + +#: ../midori/midori-browser.c:637 +msgid "_Folder:" +msgstr "フォルダ(_F):" + +#: ../midori/midori-browser.c:642 +#: ../midori/midori-browser.c:683 +msgid "Toplevel folder" +msgstr "トップレベルフォルダ" + +#: ../midori/midori-browser.c:759 +msgid "Save file as" +msgstr "名前を付けて保存" + +#: ../midori/midori-browser.c:1538 +msgid "Open file" +msgstr "ファイルを開く" + +#: ../midori/midori-browser.c:2850 +#: ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:809 +msgid "Open all in _Tabs" +msgstr "タブですべて開く(_T)" + +#: ../midori/midori-browser.c:2857 +#: ../panels/midori-bookmarks.c:788 +#: ../panels/midori-history.c:815 +msgid "Open in New _Tab" +msgstr "新しいタブで開く(_T)" + +#: ../midori/midori-browser.c:2860 +#: ../panels/midori-bookmarks.c:790 +#: ../panels/midori-history.c:817 +msgid "Open in New _Window" +msgstr "新しいウィンドウで開く(_W)" + +# Dialog title +#: ../midori/midori-browser.c:3021 +msgid "Clear Private Data" +msgstr "プライベートデータのクリア" + +# Button title +#: ../midori/midori-browser.c:3024 +msgid "Clear private data" +msgstr "プライベートデータのクリア" + +#: ../midori/midori-browser.c:3037 +msgid "Clear the following data:" +msgstr "以下のデータをクリアします:" + +#: ../midori/midori-browser.c:3045 +#: ../midori/midori-preferences.c:628 +#: ../panels/midori-history.c:108 +msgid "History" +msgstr "履歴" + +#: ../midori/midori-browser.c:3048 +msgid "Cookies" +msgstr "Cookie" + +#: ../midori/midori-browser.c:3051 +msgid "'Flash' Cookies" +msgstr "'Flash' Cookie" + +#: ../midori/midori-browser.c:3054 +msgid "Website icons" +msgstr "ウェブサイトアイコン" + +#: ../midori/midori-browser.c:3140 +msgid "A lightweight web browser." +msgstr "軽快なウェブブラウザ" + +#: ../midori/midori-browser.c:3148 +msgid "translator-credits" +msgstr "Masato Hashimoto " + +#: ../midori/midori-browser.c:3349 +msgid "_File" +msgstr "ファイル(_F)" + +#: ../midori/midori-browser.c:3352 +msgid "Open a new window" +msgstr "新しいウィンドウを開きます" + +#: ../midori/midori-browser.c:3355 +msgid "Open a new tab" +msgstr "新しいタブを開きます" + +#: ../midori/midori-browser.c:3358 +msgid "Open a file" +msgstr "ファイルを開きます" + +#: ../midori/midori-browser.c:3361 +msgid "Save to a file" +msgstr "ファイルへ保存します" + +#: ../midori/midori-browser.c:3363 +msgid "_Close Tab" +msgstr "タブを閉じる(_C)" + +#: ../midori/midori-browser.c:3364 +msgid "Close the current tab" +msgstr "現在のタブを閉じます" + +#: ../midori/midori-browser.c:3366 +msgid "C_lose Window" +msgstr "ウィンドウを閉じる(_L)" + +#: ../midori/midori-browser.c:3367 +msgid "Close this window" +msgstr "このウィンドウを閉じます" + +#: ../midori/midori-browser.c:3370 +msgid "Print the current page" +msgstr "現在のページを印刷します" + +#: ../midori/midori-browser.c:3373 +msgid "Quit the application" +msgstr "このアプリケーションを終了します" + +#: ../midori/midori-browser.c:3375 +msgid "_Edit" +msgstr "編集(_E)" + +#: ../midori/midori-browser.c:3378 +msgid "Cut the selected text" +msgstr "選択された文字を切り取ります" + +#: ../midori/midori-browser.c:3381 +#: ../midori/midori-browser.c:3384 +msgid "Copy the selected text" +msgstr "選択された文字をコピーします" + +#: ../midori/midori-browser.c:3387 +msgid "Paste text from the clipboard" +msgstr "クリップボードから文字を貼り付けます" + +#: ../midori/midori-browser.c:3390 +msgid "Delete the selected text" +msgstr "選択された文字を削除します" + +#: ../midori/midori-browser.c:3393 +msgid "Select all text" +msgstr "すべての文字を選択します" + +#: ../midori/midori-browser.c:3396 +msgid "Find a word or phrase in the page" +msgstr "ページ内の単語やフレーズを検索します" + +#: ../midori/midori-browser.c:3398 +msgid "Find _Next" +msgstr "次を検索(_N)" + +#: ../midori/midori-browser.c:3399 +msgid "Find the next occurrence of a word or phrase" +msgstr "指定文字列に一致する次の候補を検索します" + +#: ../midori/midori-browser.c:3401 +msgid "Find _Previous" +msgstr "前を検索(_P)" + +#: ../midori/midori-browser.c:3402 +msgid "Find the previous occurrence of a word or phrase" +msgstr "指定文字列に一致する前の候補を検索します" + +#: ../midori/midori-browser.c:3405 +msgid "_Quick Find" +msgstr "クイック検索(_Q)" + +#: ../midori/midori-browser.c:3406 +msgid "Quickly jump to a word or phrase" +msgstr "単語やフレーズにすぐに移動します" + +#: ../midori/midori-browser.c:3409 +msgid "Configure the application preferences" +msgstr "アプリケーションの設定を行います" + +#: ../midori/midori-browser.c:3411 +msgid "_View" +msgstr "表示(_V)" + +#: ../midori/midori-browser.c:3412 +msgid "_Toolbars" +msgstr "ツールバー(_T)" + +#: ../midori/midori-browser.c:3424 +msgid "Increase the zoom level" +msgstr "ズームレベルを大きくします" + +#: ../midori/midori-browser.c:3427 +msgid "Decrease the zoom level" +msgstr "ズームレベルを小さくします" + +#: ../midori/midori-browser.c:3430 +msgid "Reset the zoom level" +msgstr "ズームレベルをリセットします" + +#: ../midori/midori-browser.c:3431 +msgid "_Encoding" +msgstr "エンコーディング(_E)" + +#: ../midori/midori-browser.c:3433 +msgid "_Automatic" +msgstr "自動(_A)" + +#: ../midori/midori-browser.c:3436 +#: ../midori/midori-websettings.c:196 +msgid "Chinese (BIG5)" +msgstr "中国語 (BIG5)" + +#: ../midori/midori-browser.c:3439 +#: ../midori/midori-websettings.c:197 +msgid "Japanese (SHIFT_JIS)" +msgstr "日本語 (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3442 +#: ../midori/midori-websettings.c:198 +msgid "Russian (KOI8-R)" +msgstr "ロシア語 (KOI8-R)" + +#: ../midori/midori-browser.c:3445 +#: ../midori/midori-websettings.c:199 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3448 +#: ../midori/midori-websettings.c:200 +msgid "Western (ISO-8859-1)" +msgstr "西欧 (ISO-8859-1)" + +#: ../midori/midori-browser.c:3451 +#: ../midori/midori-websettings.c:201 +#: ../midori/midori-websettings.c:273 +msgid "Custom..." +msgstr "カスタム..." + +#: ../midori/midori-browser.c:3454 +#: ../midori/midori-view.c:1161 +msgid "View _Source" +msgstr "ソースを表示(_S)" + +#: ../midori/midori-browser.c:3455 +msgid "View the source code of the page" +msgstr "ページのソースコードを表示します" + +#: ../midori/midori-browser.c:3457 +msgid "View Selection Source" +msgstr "選択領域のソースを表示" + +#: ../midori/midori-browser.c:3458 +msgid "View the source code of the selection" +msgstr "選択した領域のソースを表示します" + +#: ../midori/midori-browser.c:3462 +msgid "Toggle fullscreen view" +msgstr "全画面表示/解除を切り替えます" + +#: ../midori/midori-browser.c:3464 +msgid "_Go" +msgstr "移動(_G)" + +#: ../midori/midori-browser.c:3467 +msgid "Go back to the previous page" +msgstr "前のページへ戻ります" + +#: ../midori/midori-browser.c:3470 +msgid "Go forward to the next page" +msgstr "次のページへ進みます" + +#: ../midori/midori-browser.c:3473 +msgid "Go to your homepage" +msgstr "ホームページに移動します" + +#: ../midori/midori-browser.c:3475 +msgid "Empty Trash" +msgstr "ゴミ箱を空にする" + +#: ../midori/midori-browser.c:3476 +msgid "Delete the contents of the trash" +msgstr "ゴミ箱の中身を削除します" + +#: ../midori/midori-browser.c:3478 +#: ../midori/midori-view.c:1133 +msgid "Undo Close Tab" +msgstr "閉じたタブを元に戻す" + +#: ../midori/midori-browser.c:3479 +msgid "Open the last closed tab" +msgstr "最後に閉じたタブを開きます" + +#: ../midori/midori-browser.c:3483 +#: ../panels/midori-bookmarks.c:232 +msgid "Add a new bookmark" +msgstr "新しいブックマークを追加します" + +#: ../midori/midori-browser.c:3485 +#: ../panels/midori-bookmarks.c:261 +msgid "Add a new folder" +msgstr "新しいフォルダの追加" + +#: ../midori/midori-browser.c:3486 +msgid "Add a new bookmark folder" +msgstr "新しいブックマークフォルダを追加します" + +#: ../midori/midori-browser.c:3487 +msgid "_Tools" +msgstr "ツール(_T)" + +#: ../midori/midori-browser.c:3489 +#: ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "検索エンジンの管理(_M)" + +#: ../midori/midori-browser.c:3490 +msgid "Add, edit and remove search engines..." +msgstr "検索エンジンを追加、編集、または削除します..." + +#: ../midori/midori-browser.c:3493 +msgid "_Clear Private Data" +msgstr "プライベートデータのクリア(_C)" + +#: ../midori/midori-browser.c:3494 +msgid "Clear private data..." +msgstr "プライベートデータをクリアします..." + +#: ../midori/midori-browser.c:3498 +msgid "_Previous Tab" +msgstr "前のタブ(_P)" + +#: ../midori/midori-browser.c:3499 +msgid "Switch to the previous tab" +msgstr "前のタブへ切り替えます" + +#: ../midori/midori-browser.c:3501 +msgid "_Next Tab" +msgstr "次のタブ(_N)" + +#: ../midori/midori-browser.c:3502 +msgid "Switch to the next tab" +msgstr "次のタブへ切り替えます" + +#: ../midori/midori-browser.c:3504 +msgid "_Help" +msgstr "ヘルプ(_H)" + +#: ../midori/midori-browser.c:3506 +msgid "_Contents" +msgstr "目次(_C)" + +#: ../midori/midori-browser.c:3507 +msgid "Show the documentation" +msgstr "ドキュメントを表示します" + +#: ../midori/midori-browser.c:3509 +msgid "_Frequent Questions" +msgstr "よくある質問(_F)" + +#: ../midori/midori-browser.c:3510 +msgid "Show the Frequently Asked Questions" +msgstr "よくある質問とその答えを表示します" + +#: ../midori/midori-browser.c:3512 +msgid "_Report a Bug" +msgstr "バグを報告(_R)" + +#: ../midori/midori-browser.c:3513 +msgid "Open Midori's bug tracker" +msgstr "Midori のバグトラッカーを開きます" + +#: ../midori/midori-browser.c:3516 +msgid "Show information about the program" +msgstr "このプログラムについての情報を表示します" + +#: ../midori/midori-browser.c:3523 +msgid "P_rivate Browsing" +msgstr "プライベートブラウジング(_R)" + +#: ../midori/midori-browser.c:3524 +msgid "Don't save any private data while browsing" +msgstr "閲覧する中で個人データを保存しません" + +#: ../midori/midori-browser.c:3529 +msgid "_Menubar" +msgstr "メニューバー(_M)" + +#: ../midori/midori-browser.c:3530 +msgid "Show menubar" +msgstr "メニューバーを表示します" + +#: ../midori/midori-browser.c:3533 +msgid "_Navigationbar" +msgstr "ナビゲーションバー(_N)" + +#: ../midori/midori-browser.c:3534 +msgid "Show navigationbar" +msgstr "ナビゲーションバーを表示します" + +#: ../midori/midori-browser.c:3537 +msgid "Side_panel" +msgstr "サイドパネル(_P)" + +#: ../midori/midori-browser.c:3538 +msgid "Show sidepanel" +msgstr "サイドパネルを表示します" + +#: ../midori/midori-browser.c:3541 +msgid "_Bookmarkbar" +msgstr "ブックマークバー(_B)" + +#: ../midori/midori-browser.c:3542 +msgid "Show bookmarkbar" +msgstr "ブックマークバーを表示します" + +#: ../midori/midori-browser.c:3545 +msgid "_Transferbar" +msgstr "転送バー(_T)" + +#: ../midori/midori-browser.c:3546 +msgid "Show transferbar" +msgstr "転送バーを表示します" + +#: ../midori/midori-browser.c:3549 +msgid "_Statusbar" +msgstr "ステータスバー(_S)" + +#: ../midori/midori-browser.c:3550 +msgid "Show statusbar" +msgstr "ステータスバーを表示します" + +#: ../midori/midori-browser.c:3984 +msgid "_Separator" +msgstr "セパレータ(_S)" + +#: ../midori/midori-browser.c:3991 +msgid "_Location..." +msgstr "場所(_L)..." + +#: ../midori/midori-browser.c:3993 +msgid "Open a particular location" +msgstr "指定された場所を開きます" + +#: ../midori/midori-browser.c:4017 +msgid "_Web Search..." +msgstr "ウェブ検索(_W)..." + +#: ../midori/midori-browser.c:4019 +msgid "Run a web search" +msgstr "ウェブ検索を実行します" + +#: ../midori/midori-browser.c:4038 +msgid "Reopen a previously closed tab or window" +msgstr "これまでに閉じられたタブやウィンドウを再び開きます" + +#: ../midori/midori-browser.c:4051 +msgid "_Recently visited pages" +msgstr "最近訪れたページ(_R)" + +#: ../midori/midori-browser.c:4053 +msgid "Reopen pages that you visited earlier" +msgstr "以前に訪れたページを再び開きます" + +#: ../midori/midori-browser.c:4066 +#: ../midori/sokoke.c:771 +msgid "_Bookmarks" +msgstr "ブックマーク(_B)" + +#: ../midori/midori-browser.c:4068 +msgid "Show the saved bookmarks" +msgstr "保存されたブックマークを表示します" + +#: ../midori/midori-browser.c:4081 +msgid "_Window" +msgstr "ウィンドウ(_W)" + +#: ../midori/midori-browser.c:4083 +msgid "Show a list of all open tabs" +msgstr "開いているすべてのタブのリストを表示します" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4250 +msgid "_Inline Find:" +msgstr "インライン検索(_I)" + +#: ../midori/midori-browser.c:4275 +msgid "Previous" +msgstr "前を検索" + +#: ../midori/midori-browser.c:4280 +msgid "Next" +msgstr "次を検索" + +#: ../midori/midori-browser.c:4285 +msgid "Match Case" +msgstr "大文字・小文字を区別" + +#: ../midori/midori-browser.c:4293 +msgid "Highlight Matches" +msgstr "強調表示" + +#: ../midori/midori-browser.c:4303 +msgid "Close Findbar" +msgstr "検索バーを閉じる" + +#: ../midori/midori-browser.c:4609 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "'%s' は予想外の設定です" + +#: ../midori/midori-panel.c:309 +msgid "Detach chosen panel from the window" +msgstr "選択されたパネルをウィンドウから切り離す" + +#: ../midori/midori-panel.c:311 +msgid "Whether to detach the chosen panel from the window" +msgstr "選択されたパネルをウィンドウから切り離します" + +#: ../midori/midori-panel.c:321 +#: ../midori/midori-websettings.c:511 +msgid "Align sidepanel on the right" +msgstr "サイドパネルを右側に配置する" + +#: ../midori/midori-panel.c:323 +#: ../midori/midori-websettings.c:512 +msgid "Whether to align the sidepanel on the right" +msgstr "サイドパネルを右側に表示します" + +#: ../midori/midori-panel.c:333 +#: ../midori/midori-panel.c:334 +msgid "Close panel" +msgstr "パネルを閉じます" + +#: ../midori/midori-websettings.c:179 +#: ../midori/midori-view.c:1965 +msgid "Blank page" +msgstr "空白ページ" + +#: ../midori/midori-websettings.c:180 +#: ../midori/midori-websettings.c:531 +msgid "Homepage" +msgstr "ホームページ" + +#: ../midori/midori-websettings.c:181 +msgid "Last open pages" +msgstr "最後に開いたページ" + +#: ../midori/midori-websettings.c:216 +msgid "New tab" +msgstr "新しいタブ" + +#: ../midori/midori-websettings.c:217 +msgid "New window" +msgstr "新しいウィンドウ" + +#: ../midori/midori-websettings.c:218 +msgid "Current tab" +msgstr "現在のタブ" + +#: ../midori/midori-websettings.c:233 +msgid "Default" +msgstr "デフォルト" + +#: ../midori/midori-websettings.c:234 +msgid "Icons" +msgstr "アイコン" + +#: ../midori/midori-websettings.c:235 +msgid "Text" +msgstr "文字" + +#: ../midori/midori-websettings.c:236 +msgid "Both" +msgstr "アイコンと文字" + +#: ../midori/midori-websettings.c:237 +msgid "Both horizontal" +msgstr "アイコンと文字 (横方向)" + +#: ../midori/midori-websettings.c:252 +msgid "All cookies" +msgstr "すべての Cookie" + +#: ../midori/midori-websettings.c:253 +msgid "Session cookies" +msgstr "セッションの Cookie" + +#: ../midori/midori-websettings.c:254 +#: ../panels/midori-addons.c:94 +msgid "None" +msgstr "なし" + +#: ../midori/midori-websettings.c:270 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:271 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:272 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:325 +msgid "Remember last window size" +msgstr "最後のウィンドウサイズを記憶する" + +#: ../midori/midori-websettings.c:326 +msgid "Whether to save the last window size" +msgstr "最後のウィンドウサイズを記憶します" + +#: ../midori/midori-websettings.c:334 +msgid "Last window width" +msgstr "最後のウィンドウの幅" + +#: ../midori/midori-websettings.c:335 +msgid "The last saved window width" +msgstr "最後に保存されたウィンドウ幅" + +#: ../midori/midori-websettings.c:343 +msgid "Last window height" +msgstr "最後のウィンドウの高さ" + +#: ../midori/midori-websettings.c:344 +msgid "The last saved window height" +msgstr "最後に保存されたウィンドウの高さにします" + +#: ../midori/midori-websettings.c:369 +msgid "Last panel position" +msgstr "最後のパネルの位置" + +#: ../midori/midori-websettings.c:370 +msgid "The last saved panel position" +msgstr "最後に保存されたパネルの位置にします" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:379 +msgid "Last panel page" +msgstr "最後のパネルページ" + +#: ../midori/midori-websettings.c:380 +msgid "The last saved panel page" +msgstr "最後に保存されたパネルのページです" + +#: ../midori/midori-websettings.c:388 +msgid "Last Web search" +msgstr "最後のウェブ検索" + +#: ../midori/midori-websettings.c:389 +msgid "The last saved Web search" +msgstr "最後に保存されたウェブ検索です" + +#: ../midori/midori-websettings.c:398 +msgid "Show Menubar" +msgstr "メニューバーを表示する" + +#: ../midori/midori-websettings.c:399 +msgid "Whether to show the menubar" +msgstr "メニューバーを表示します" + +#: ../midori/midori-websettings.c:407 +msgid "Show Navigationbar" +msgstr "ナビゲーションバーを表示する" + +#: ../midori/midori-websettings.c:408 +msgid "Whether to show the navigationbar" +msgstr "ナビゲーションバーを表示します" + +#: ../midori/midori-websettings.c:416 +msgid "Show Bookmarkbar" +msgstr "ブックマークバーを表示する" + +#: ../midori/midori-websettings.c:417 +msgid "Whether to show the bookmarkbar" +msgstr "ブックマークバーを表示します" + +#: ../midori/midori-websettings.c:425 +msgid "Show Panel" +msgstr "パネルを表示する" + +#: ../midori/midori-websettings.c:426 +msgid "Whether to show the panel" +msgstr "パネルを表示します" + +#: ../midori/midori-websettings.c:441 +msgid "Show Transferbar" +msgstr "転送バーを表示する" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to show the transferbar" +msgstr "転送バーを表示します" + +#: ../midori/midori-websettings.c:450 +msgid "Show Statusbar" +msgstr "ステータスバーを表示する" + +#: ../midori/midori-websettings.c:451 +msgid "Whether to show the statusbar" +msgstr "ステータスバーを表示します" + +#: ../midori/midori-websettings.c:460 +msgid "Toolbar Style" +msgstr "ツールバー方式" + +#: ../midori/midori-websettings.c:461 +msgid "The style of the toolbar" +msgstr "ツールバーの表示方式を指定します" + +#: ../midori/midori-websettings.c:477 +msgid "Show progress in location entry" +msgstr "ロケーションエントリに進捗を表示する" + +#: ../midori/midori-websettings.c:478 +msgid "Whether to show loading progress in the location entry" +msgstr "ロケーションエントリ内に読み込みの進捗状況を表示します" + +#: ../midori/midori-websettings.c:486 +msgid "Toolbar Items" +msgstr "ツールバーアイテム" + +#: ../midori/midori-websettings.c:487 +msgid "The items to show on the toolbar" +msgstr "ツールバーに表示するアイテムを指定します" + +#: ../midori/midori-websettings.c:495 +msgid "Compact Sidepanel" +msgstr "サイドパネルをコンパクトにする" + +#: ../midori/midori-websettings.c:496 +msgid "Whether to make the sidepanel compact" +msgstr "サイドパネルの表示をコンパクトにします" + +#: ../midori/midori-websettings.c:521 +msgid "Load on Startup" +msgstr "起動時に読み込む" + +#: ../midori/midori-websettings.c:522 +msgid "What to load on startup" +msgstr "起動時に読み込むページを指定します" + +#: ../midori/midori-websettings.c:532 +msgid "The homepage" +msgstr "ホームページを指定します" + +#: ../midori/midori-websettings.c:547 +msgid "Show crash dialog" +msgstr "クラッシュダイアログを表示する" + +#: ../midori/midori-websettings.c:548 +msgid "Show a dialog after Midori crashed" +msgstr "Midori がクラッシュした後の起動時にダイアログを表示します" + +#: ../midori/midori-websettings.c:556 +msgid "Download Folder" +msgstr "ダウンロードフォルダ" + +#: ../midori/midori-websettings.c:557 +msgid "The folder downloaded files are saved to" +msgstr "ダウンロードファイルの保存先を指定します" + +#: ../midori/midori-websettings.c:569 +msgid "Download Manager" +msgstr "ダウンロードマネージャ" + +#: ../midori/midori-websettings.c:570 +msgid "An external download manager" +msgstr "外部ダウンロードマネージャを指定します" + +#: ../midori/midori-websettings.c:578 +msgid "Text Editor" +msgstr "テキストエディタ" + +#: ../midori/midori-websettings.c:579 +msgid "An external text editor" +msgstr "外部テキストエディタを指定します" + +#: ../midori/midori-websettings.c:587 +msgid "Location entry Search" +msgstr "ロケーションエントリの検索" + +#: ../midori/midori-websettings.c:588 +msgid "The search to perform inside the location entry" +msgstr "ロケーションエントリに入力された文字列の検索エンジンを指定します" + +#: ../midori/midori-websettings.c:596 +msgid "Preferred Encoding" +msgstr "文字のエンコーディング" + +#: ../midori/midori-websettings.c:597 +msgid "The preferred character encoding" +msgstr "文字のエンコーディングを指定します" + +#: ../midori/midori-websettings.c:607 +msgid "Always Show Tabbar" +msgstr "常にタブバーを表示する" + +#: ../midori/midori-websettings.c:608 +msgid "Always show the tabbar" +msgstr "常にタブバーを表示します" + +#: ../midori/midori-websettings.c:616 +msgid "Close Buttons on Tabs" +msgstr "タブに閉じるボタンを表示する" + +#: ../midori/midori-websettings.c:617 +msgid "Whether tabs have close buttons" +msgstr "タブに閉じるボタンを表示します" + +#: ../midori/midori-websettings.c:625 +msgid "Open new pages in" +msgstr "新しくページを開くとき" + +#: ../midori/midori-websettings.c:626 +msgid "Where to open new pages" +msgstr "新しいページをどこに開くか指定します" + +#: ../midori/midori-websettings.c:635 +msgid "Open external pages in" +msgstr "外部ページを開くとき" + +#: ../midori/midori-websettings.c:636 +msgid "Where to open externally opened pages" +msgstr "外部のページをどこに開くか指定します" + +#: ../midori/midori-websettings.c:649 +msgid "Middle click opens Selection" +msgstr "選択範囲を中央クリックで開く" + +#: ../midori/midori-websettings.c:650 +msgid "Load an address from the selection via middle click" +msgstr "選択したアドレスをマウスの中央クリックで読み込みます" + +#: ../midori/midori-websettings.c:658 +msgid "Open tabs in the background" +msgstr "タブをバックグラウンドで開く" + +#: ../midori/midori-websettings.c:659 +msgid "Whether to open new tabs in the background" +msgstr "新しいタブをバックグラウンドで開きます" + +#: ../midori/midori-websettings.c:667 +msgid "Open Tabs next to Current" +msgstr "現在のタブの隣に開く" + +#: ../midori/midori-websettings.c:668 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "新しいタブを現在のタブの隣に開くか、最後のタブの隣に開くかを指定します" + +#: ../midori/midori-websettings.c:676 +msgid "Open popups in tabs" +msgstr "ポップアップをタブに開く" + +#: ../midori/midori-websettings.c:677 +msgid "Whether to open popup windows in tabs" +msgstr "ポップアップウィンドウをタブに開きます" + +#: ../midori/midori-websettings.c:693 +msgid "Zoom Text and Images" +msgstr "文字や画像を拡大/縮小する" + +#: ../midori/midori-websettings.c:694 +msgid "Whether to zoom text and images" +msgstr "文字や画像の拡大/縮小を可能にします" + +#: ../midori/midori-websettings.c:709 +msgid "Find inline while typing" +msgstr "キー入力中に自動的に検索する" + +#: ../midori/midori-websettings.c:710 +msgid "Whether to automatically find inline while typing" +msgstr "インライン検索において、キー入力に従い自動的に検索します" + +#: ../midori/midori-websettings.c:718 +msgid "Accept cookies" +msgstr "Cookie の受け入れ" + +#: ../midori/midori-websettings.c:719 +msgid "What type of cookies to accept" +msgstr "Cookie を受け入れる方式を選択してください" + +#: ../midori/midori-websettings.c:728 +msgid "Original cookies only" +msgstr "オリジナルの Cookie のみ" + +#: ../midori/midori-websettings.c:729 +msgid "Accept cookies from the original website only" +msgstr "オリジナルのウェブサイトからの Cookie のみ受け入れる" + +#: ../midori/midori-websettings.c:737 +msgid "Maximum cookie age" +msgstr "Cookie の最大保存日数" + +#: ../midori/midori-websettings.c:738 +msgid "The maximum number of days to save cookies for" +msgstr "Cookie を保存する最大の日数です" + +#: ../midori/midori-websettings.c:748 +msgid "Remember last visited pages" +msgstr "最後に訪れたページを記憶する" + +#: ../midori/midori-websettings.c:749 +msgid "Whether the last visited pages are saved" +msgstr "最後に訪れたページを記憶します" + +#: ../midori/midori-websettings.c:757 +msgid "Maximum history age" +msgstr "履歴の最大保存日数" + +#: ../midori/midori-websettings.c:758 +msgid "The maximum number of days to save the history for" +msgstr "履歴を保存する最大の日数です" + +#: ../midori/midori-websettings.c:766 +msgid "Remember last form inputs" +msgstr "最後のフォーム入力を記憶する" + +#: ../midori/midori-websettings.c:767 +msgid "Whether the last form inputs are saved" +msgstr "最後にフォーム入力した内容を記憶します" + +#: ../midori/midori-websettings.c:775 +msgid "Remember last downloaded files" +msgstr "最後のダウンロードファイルを記憶する" + +#: ../midori/midori-websettings.c:776 +msgid "Whether the last downloaded files are saved" +msgstr "最後にダウンロードしたファイルを記憶します" + +#: ../midori/midori-websettings.c:786 +msgid "Proxy Server" +msgstr "プロキシサーバ" + +#: ../midori/midori-websettings.c:787 +msgid "The proxy server used for HTTP connections" +msgstr "HTTP 接続でプロキシサーバを使用する場合に設定します" + +#: ../midori/midori-websettings.c:802 +msgid "Detect proxy server automatically" +msgstr "プロキシサーバを自動検出する" + +#: ../midori/midori-websettings.c:803 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "プロキシサーバをシステム環境から自動的に検出します" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:819 +msgid "Identify as" +msgstr "User-Agent" + +#: ../midori/midori-websettings.c:820 +msgid "What to identify as to web pages" +msgstr "ウェブページに報告する User-Agent 識別名を指定します" + +#: ../midori/midori-websettings.c:836 +msgid "Identification string" +msgstr "識別文字列" + +#: ../midori/midori-websettings.c:837 +msgid "The application identification string" +msgstr "User-Agent アプリケーション識別文字列です" + +#: ../midori/midori-websettings.c:845 +msgid "Cache size" +msgstr "キャッシュサイズ" + +#: ../midori/midori-websettings.c:846 +msgid "The allowed size of the cache" +msgstr "キャッシュのサイズを指定します" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:661 +#, c-format +msgid "Not found - %s" +msgstr "ページが見つかりません - %s" + +#: ../midori/midori-view.c:998 +msgid "Open _Link" +msgstr "リンクを開く(_L)" + +#: ../midori/midori-view.c:1000 +msgid "Open Link in New _Tab" +msgstr "リンクを新しいタブで開く(_T)" + +#: ../midori/midori-view.c:1017 +msgid "Open Link in New _Window" +msgstr "リンクを新しいウィンドウで開く(_W)" + +#: ../midori/midori-view.c:1026 +msgid "_Download Link destination" +msgstr "リンク先をダウンロード(_D)" + +#: ../midori/midori-view.c:1032 +msgid "_Save Link destination" +msgstr "リンク先を保存(_S)" + +#: ../midori/midori-view.c:1041 +msgid "Download with Download _Manager" +msgstr "ダウンロードマネージャでダウンロード(_M)" + +#: ../midori/midori-view.c:1073 +#, c-format +msgid "Search with %s" +msgstr "%s で検索" + +#: ../midori/midori-view.c:1099 +msgid "_Search the Web" +msgstr "ウェブで検索(_S)" + +#: ../midori/midori-view.c:1109 +msgid "Open Address in New _Tab" +msgstr "アドレスを新しいタブで開く(_T)" + +#: ../midori/midori-view.c:1257 +msgid "Open or download file" +msgstr "ファイルを開きますか、保存しますか?" + +#: ../midori/midori-view.c:1274 +#, c-format +msgid "File Type: '%s'" +msgstr "ファイルタイプ: '%s'" + +#: ../midori/midori-view.c:1277 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "ファイルタイプ: %s ('%s')" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1281 +#, c-format +msgid "Open %s" +msgstr "%s を開く" + +#: ../midori/midori-view.c:1677 +#, c-format +msgid "Inspect page - %s" +msgstr "ページの調査 - %s" + +#: ../midori/midori-view.c:1822 +#, c-format +msgid "Document cannot be displayed" +msgstr "ドキュメントを表示できません" + +#: ../midori/midori-view.c:1838 +#, c-format +msgid "No documentation installed" +msgstr "ドキュメントはインストールされていません" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "%s の設定" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "一般" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "起動" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "現在のページをホームページにします" + +#: ../midori/midori-preferences.c:423 +#: ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "転送" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:461 +msgid "Appearance" +msgstr "外観" + +#: ../midori/midori-preferences.c:462 +msgid "Font settings" +msgstr "フォント設定" + +#: ../midori/midori-preferences.c:464 +msgid "Default Font Family" +msgstr "デフォルトフォントファミリ" + +#: ../midori/midori-preferences.c:470 +msgid "The default font size used to display text" +msgstr "文字表示で使用されるデフォルトのフォントサイズを指定します" + +#: ../midori/midori-preferences.c:473 +msgid "Minimum Font Size" +msgstr "最小フォントサイズ" + +#: ../midori/midori-preferences.c:476 +msgid "The minimum font size used to display text" +msgstr "文字表示で使用される最小のフォントサイズを指定します" + +#: ../midori/midori-preferences.c:483 +msgid "Encoding" +msgstr "エンコーディング" + +#: ../midori/midori-preferences.c:486 +msgid "The character encoding to use by default" +msgstr "デフォルトで使用する文字エンコーディングです" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:493 +msgid "Behavior" +msgstr "振る舞い" + +#: ../midori/midori-preferences.c:494 +msgid "Features" +msgstr "機能" + +#: ../midori/midori-preferences.c:497 +#: ../extensions/statusbar-features.c:51 +msgid "Load images automatically" +msgstr "画像を自動的に読み込む" + +#: ../midori/midori-preferences.c:498 +msgid "Load and display images automatically" +msgstr "画像を自動的に読み込んで表示します" + +#: ../midori/midori-preferences.c:501 +msgid "Shrink images automatically" +msgstr "画像を自動的に縮小する" + +#: ../midori/midori-preferences.c:502 +msgid "Automatically shrink standalone images to fit" +msgstr "画像を単独表示するときに自動的に縮小します" + +#: ../midori/midori-preferences.c:505 +msgid "Print background images" +msgstr "背景画像を印刷する" + +#: ../midori/midori-preferences.c:506 +msgid "Whether background images should be printed" +msgstr "印刷するときに背景画像も印刷します" + +#: ../midori/midori-preferences.c:509 +msgid "Resizable text areas" +msgstr "可変サイズのテキストエリアにする" + +#: ../midori/midori-preferences.c:510 +msgid "Whether text areas are resizable" +msgstr "テキストエリアのサイズ変更を可能にします" + +#: ../midori/midori-preferences.c:513 +#: ../extensions/statusbar-features.c:58 +msgid "Enable scripts" +msgstr "スクリプトを有効にする" + +#: ../midori/midori-preferences.c:514 +msgid "Enable embedded scripting languages" +msgstr "組み込みスクリプト言語を有効にします" + +#: ../midori/midori-preferences.c:517 +#: ../extensions/statusbar-features.c:65 +msgid "Enable plugins" +msgstr "プラグインを有効にする" + +#: ../midori/midori-preferences.c:518 +msgid "Enable embedded plugin objects" +msgstr "組み込みプラグインオブジェクトを有効にします" + +#: ../midori/midori-preferences.c:521 +msgid "Enforce 96 dots per inch" +msgstr "強制的に 96DPI にする" + +#: ../midori/midori-preferences.c:522 +msgid "Enforce a video dot density of 96 DPI" +msgstr "ドット密度を強制的に 96DPI にします" + +#: ../midori/midori-preferences.c:525 +msgid "Enable developer tools" +msgstr "開発ツールを有効にする" + +#: ../midori/midori-preferences.c:526 +msgid "Enable special extensions for developers" +msgstr "開発者用特殊エクステンションを有効にします" + +#. Page "Interface" +#: ../midori/midori-preferences.c:538 +msgid "Interface" +msgstr "インターフェイス" + +#: ../midori/midori-preferences.c:539 +msgid "Navigationbar" +msgstr "ナビゲーションバー" + +#: ../midori/midori-preferences.c:548 +msgid "Browsing" +msgstr "ブラウジング" + +#. Page "Network" +#: ../midori/midori-preferences.c:578 +#: ../midori/midori-preferences.c:579 +msgid "Network" +msgstr "ネットワーク" + +#: ../midori/midori-preferences.c:606 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:611 +msgid "Privacy" +msgstr "プライバシー" + +#: ../midori/midori-preferences.c:612 +msgid "Web Cookies" +msgstr "ウェブ Cookie" + +#: ../midori/midori-preferences.c:625 +#: ../midori/midori-preferences.c:635 +msgid "days" +msgstr "日" + +#: ../midori/midori-searchaction.c:456 +#: ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "空です" + +#: ../midori/midori-searchaction.c:812 +msgid "Add search engine" +msgstr "検索エンジンの追加" + +#: ../midori/midori-searchaction.c:812 +msgid "Edit search engine" +msgstr "検索エンジンの編集" + +#: ../midori/midori-searchaction.c:840 +msgid "_Name:" +msgstr "名前(_N):" + +#: ../midori/midori-searchaction.c:884 +msgid "_Icon:" +msgstr "アイコン(_I):" + +#: ../midori/midori-searchaction.c:898 +msgid "_Token:" +msgstr "トークン(_T):" + +#: ../midori/midori-searchaction.c:1078 +msgid "Manage Search Engines" +msgstr "検索エンジンの管理" + +#: ../midori/sokoke.c:110 +#: ../midori/sokoke.c:122 +msgid "Could not run external program." +msgstr "外部プログラムを実行できませんでした。" + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:439 +msgid "Warning: You are using a superuser account!" +msgstr "警告: あなたはスーパーユーザアカウントを使用しています!" + +#: ../midori/sokoke.c:770 +msgid "_Bookmark" +msgstr "ブックマーク(_B)" + +#: ../midori/sokoke.c:772 +msgid "_Add Bookmark" +msgstr "ブックマークに追加(_A)" + +#: ../midori/sokoke.c:773 +msgid "_Console" +msgstr "コンソール(_C)" + +#: ../midori/sokoke.c:774 +msgid "_Extensions" +msgstr "エクステンション(_E)" + +#: ../midori/sokoke.c:775 +msgid "_History" +msgstr "履歴(_H)" + +#: ../midori/sokoke.c:776 +msgid "_Homepage" +msgstr "ホームページ(_H)" + +#: ../midori/sokoke.c:777 +msgid "_Userscripts" +msgstr "ユーザスクリプト(_U)" + +#: ../midori/sokoke.c:778 +msgid "User_styles" +msgstr "ユーザスタイル(_S)" + +#: ../midori/sokoke.c:779 +msgid "New _Tab" +msgstr "新しいタブ(_T)" + +#: ../midori/sokoke.c:780 +msgid "_Transfers" +msgstr "転送(_T)" + +#: ../midori/sokoke.c:781 +msgid "P_lugins" +msgstr "プラグイン(_L)" + +#: ../midori/sokoke.c:782 +msgid "_Closed Tabs and Windows" +msgstr "閉じたタブとウィンドウ(_C)" + +#: ../midori/sokoke.c:783 +msgid "New _Window" +msgstr "新しいウィンドウ(_W)" + +#: ../panels/midori-addons.c:95 +#: ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "ユーザスクリプト" + +#: ../panels/midori-addons.c:96 +#: ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "ユーザスタイル" + +#: ../panels/midori-addons.c:923 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "有効(_E)" + +#: ../panels/midori-addons.c:924 +#: ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "有効" + +#: ../panels/midori-addons.c:933 +#: ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "無効(_D)" + +#: ../panels/midori-addons.c:934 +#: ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "無効" + +#: ../panels/midori-bookmarks.c:107 +msgid "Bookmarks" +msgstr "ブックマーク" + +#: ../panels/midori-bookmarks.c:240 +msgid "Edit the selected bookmark" +msgstr "選択したブックマークを編集します" + +#: ../panels/midori-bookmarks.c:248 +msgid "Delete the selected bookmark" +msgstr "選択したブックマークを削除します" + +#: ../panels/midori-bookmarks.c:593 +msgid "Separator" +msgstr "セパレータ" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "コンソール" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "エクステンション" + +#: ../panels/midori-history.c:163 +msgid "Are you sure you want to remove all history items?" +msgstr "すべての履歴アイテムを削除してよろしいですか?" + +#: ../panels/midori-history.c:218 +msgid "Bookmark the selected history item" +msgstr "選択された履歴アイテムをブックマークに追加します" + +#: ../panels/midori-history.c:227 +msgid "Delete the selected history item" +msgstr "選択された履歴アイテムを削除します" + +#: ../panels/midori-history.c:235 +msgid "Clear the entire history" +msgstr "すべての履歴をクリアします" + +#: ../panels/midori-history.c:600 +#, c-format +msgid "A week ago" +msgstr "一週間前" + +#: ../panels/midori-history.c:606 +#, c-format +msgid "%d days ago" +msgstr "%d 日前" + +#: ../panels/midori-history.c:613 +msgid "Today" +msgstr "今日" + +#: ../panels/midori-history.c:615 +msgid "Yesterday" +msgstr "昨日" + +#: ../panels/midori-plugins.c:87 +#: ../extensions/statusbar-features.c:63 +msgid "Plugins" +msgstr "プラグイン" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "%s / %s" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "認証が要求されました" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"この場所を開くためにはユーザ名とパスワードが\n" +"必要です:" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "ユーザ名" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "パスワード" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "アイコン名 '%s' を読み込めませんでした" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "ストックアイコン '%s' を読み込めませんでした" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "アニメーションフレームは壊れています" + +#: ../katze/katze-utils.c:180 +#: ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "'%s' は %s のプロパティとして無効です" + +#: ../katze/katze-utils.c:209 +#: ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "ファイルの選択" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "フォルダの選択" + +#: ../extensions/colorful-tabs.c:104 +msgid "Tint tabs distinctly" +msgstr "タブの色分け" + +#: ../extensions/colorful-tabs.c:140 +msgid "Colorful Tabs" +msgstr "カラフルタブ" + +#: ../extensions/colorful-tabs.c:141 +msgid "Tint each tab distinctly" +msgstr "各タブにそれぞれを区別する色をつけます" + +#: ../extensions/cookie-manager.c:185 +msgid "At the end of the session" +msgstr "セッションの終わりまで" + +#: ../extensions/cookie-manager.c:188 +#, c-format +msgid "" +"Host: %s\n" +"Name: %s\n" +"Value: %s\n" +"Path: %s\n" +"Secure: %s\n" +"Expires: %s" +msgstr "" +"ホスト: %s\n" +"名前: %s\n" +": %s\n" +"パス: %s\n" +"Secure: %s\n" +"有効期限: %s" + +# cookie: Secure flag is set. +#: ../extensions/cookie-manager.c:194 +msgid "Yes" +msgstr "あり" + +# cookie: Secure flag isn't set. +#: ../extensions/cookie-manager.c:194 +msgid "No" +msgstr "なし" + +#: ../extensions/cookie-manager.c:475 +msgid "Do you really want to delete all cookies?" +msgstr "本当にすべての cookie を削除してよろしいですか?" + +# Dialog title +#: ../extensions/cookie-manager.c:477 +msgid "Question" +msgstr "確認" + +#: ../extensions/cookie-manager.c:485 +msgid "Only the visible cookies are deleted which match the entered filter string." +msgstr "フィルタに入力された文字列にマッチした、表示されている cookie のみ削除されます。" + +# Column name of cookie browser +#: ../extensions/cookie-manager.c:663 +msgid "Name" +msgstr "名前" + +#: ../extensions/cookie-manager.c:723 +msgid "_Expand All" +msgstr "すべて展開する(_E)" + +#: ../extensions/cookie-manager.c:731 +msgid "_Collapse All" +msgstr "すべて折り畳む(_C)" + +#: ../extensions/cookie-manager.c:800 +msgid "Delete All" +msgstr "すべて削除" + +#: ../extensions/cookie-manager.c:802 +msgid "Deletes all shown cookies. If a filter is set, only those cookies are deleted which match the filter." +msgstr "表示されているすべての cookie を削除します。フィルタが設定されていれば、フィルタにマッチした cookie のみ削除されます。" + +# tooltip +#: ../extensions/cookie-manager.c:817 +msgid "Expand All" +msgstr "すべて展開します" + +# tooltip +#: ../extensions/cookie-manager.c:824 +msgid "Collapse All" +msgstr "すべて折り畳みます" + +#: ../extensions/cookie-manager.c:855 +msgid "Filter:" +msgstr "フィルタ:" + +#: ../extensions/cookie-manager.c:860 +msgid "Enter a filter string to show only cookies whose name or domain field match the entered filter" +msgstr "フィルタに入力された文字列と、名前またはドメインフィールドがマッチした cookie のみ表示します。" + +#: ../extensions/cookie-manager.c:895 +#: ../extensions/cookie-manager.c:942 +msgid "Cookie Manager" +msgstr "Cookie マネージャ" + +#: ../extensions/cookie-manager.c:926 +msgid "_Cookie Manager" +msgstr "Cookie マネージャ(_C)" + +#: ../extensions/cookie-manager.c:943 +msgid "List, view and delete cookies" +msgstr "Cookie の一覧や内容の表示および削除を行います" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "マウスジェスチャ" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "マウスの操作で Midori を制御します" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:129 +#: ../extensions/page-holder.c:177 +msgid "Pageholder" +msgstr "ページホルダ" + +#: ../extensions/page-holder.c:161 +msgid "_Pageholder" +msgstr "ページホルダ(_P)" + +#: ../extensions/statusbar-features.c:49 +msgid "Images" +msgstr "画像" + +#: ../extensions/statusbar-features.c:56 +msgid "Scripts" +msgstr "スクリプト" + +#~ msgid "Source" +#~ msgstr "ソース" + diff --git a/po/midori.pot b/po/midori.pot new file mode 100644 index 00000000..094702e7 --- /dev/null +++ b/po/midori.pot @@ -0,0 +1,1815 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-19 16:44+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "" + +#: ../data/midori.desktop.in.h:2 ../midori/main.c:1288 ../midori/main.c:1388 +#: ../midori/main.c:1396 ../midori/main.c:1407 +#: ../midori/midori-websettings.c:273 +msgid "Midori" +msgstr "" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "" + +#: ../midori/main.c:94 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "" + +#: ../midori/main.c:149 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "" + +#: ../midori/main.c:156 ../midori/main.c:228 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "" + +#: ../midori/main.c:332 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "" + +#: ../midori/main.c:364 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "" + +#: ../midori/main.c:418 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "" + +#: ../midori/main.c:442 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "" + +#: ../midori/main.c:465 ../midori/main.c:499 ../midori/main.c:515 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:694 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "" + +#: ../midori/main.c:722 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "" + +#: ../midori/main.c:751 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "" + +#: ../midori/main.c:770 ../midori/main.c:798 ../midori/main.c:827 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:850 ../midori/main.c:873 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "" + +#: ../midori/main.c:946 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "" + +#: ../midori/main.c:1073 +msgid "" +"Midori seems to have crashed the last time it was opened. If this happened " +"repeatedly, try one of the following options to solve the problem." +msgstr "" + +#: ../midori/main.c:1088 +msgid "Modify _preferences" +msgstr "" + +#: ../midori/main.c:1092 +msgid "Reset the last _session" +msgstr "" + +#: ../midori/main.c:1097 +msgid "Disable all _extensions" +msgstr "" + +#: ../midori/main.c:1288 +msgid "No filename specified" +msgstr "" + +#: ../midori/main.c:1311 +msgid "An unknown error occured." +msgstr "" + +#: ../midori/main.c:1336 +msgid "Run ADDRESS as a web application" +msgstr "" + +#: ../midori/main.c:1336 +msgid "ADDRESS" +msgstr "" + +#: ../midori/main.c:1338 +msgid "Use FOLDER as configuration folder" +msgstr "" + +#: ../midori/main.c:1338 +msgid "FOLDER" +msgstr "" + +#: ../midori/main.c:1340 +msgid "Run the specified filename as javascript" +msgstr "" + +#: ../midori/main.c:1342 +msgid "Display program version" +msgstr "" + +#: ../midori/main.c:1344 +msgid "Addresses" +msgstr "" + +#: ../midori/main.c:1385 +msgid "[Addresses]" +msgstr "" + +#: ../midori/main.c:1408 +msgid "Please report comments, suggestions and bugs to:" +msgstr "" + +#: ../midori/main.c:1410 +msgid "Check for new versions at:" +msgstr "" + +#: ../midori/main.c:1454 +msgid "The specified configuration folder is invalid." +msgstr "" + +#: ../midori/main.c:1489 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "" + +#: ../midori/main.c:1539 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "" + +#: ../midori/main.c:1551 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "" + +#: ../midori/main.c:1566 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "" + +#: ../midori/main.c:1579 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "" + +#: ../midori/main.c:1592 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "" + +#: ../midori/main.c:1604 +msgid "The following errors occured:" +msgstr "" + +#: ../midori/main.c:1620 +msgid "_Ignore" +msgstr "" + +#: ../midori/midori-array.c:195 +msgid "File not found." +msgstr "" + +#: ../midori/midori-array.c:203 ../midori/midori-array.c:212 +msgid "Malformed document." +msgstr "" + +#: ../midori/midori-array.c:338 ../midori/sokoke.c:625 +#, c-format +msgid "Writing failed." +msgstr "" + +#: ../midori/midori-browser.c:280 ../midori/midori-browser.c:3368 +#: ../midori/midori-browser.c:3374 +msgid "Reload the current page" +msgstr "" + +#: ../midori/midori-browser.c:291 ../midori/midori-browser.c:3371 +msgid "Stop loading the current page" +msgstr "" + +#: ../midori/midori-browser.c:353 +#, c-format +msgid "%d%% loaded" +msgstr "" + +#: ../midori/midori-browser.c:378 +#, c-format +msgid "Unexpected action '%s'." +msgstr "" + +#: ../midori/midori-browser.c:541 +msgid "New folder" +msgstr "" + +#: ../midori/midori-browser.c:541 +msgid "Edit folder" +msgstr "" + +#: ../midori/midori-browser.c:543 +msgid "New bookmark" +msgstr "" + +#: ../midori/midori-browser.c:543 +msgid "Edit bookmark" +msgstr "" + +#: ../midori/midori-browser.c:573 +msgid "_Title:" +msgstr "" + +#: ../midori/midori-browser.c:586 ../midori/midori-searchaction.c:948 +msgid "_Description:" +msgstr "" + +#: ../midori/midori-browser.c:605 ../midori/midori-searchaction.c:962 +msgid "_Address:" +msgstr "" + +#: ../midori/midori-browser.c:624 +msgid "_Folder:" +msgstr "" + +#: ../midori/midori-browser.c:629 ../midori/midori-browser.c:670 +msgid "Toplevel folder" +msgstr "" + +#: ../midori/midori-browser.c:746 +msgid "Save file as" +msgstr "" + +#: ../midori/midori-browser.c:1523 +msgid "Open file" +msgstr "" + +#: ../midori/midori-browser.c:2803 ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:809 +msgid "Open all in _Tabs" +msgstr "" + +#: ../midori/midori-browser.c:2810 ../panels/midori-bookmarks.c:788 +#: ../panels/midori-history.c:815 +msgid "Open in New _Tab" +msgstr "" + +#: ../midori/midori-browser.c:2813 ../panels/midori-bookmarks.c:790 +#: ../panels/midori-history.c:817 +msgid "Open in New _Window" +msgstr "" + +#: ../midori/midori-browser.c:2974 +msgid "Clear Private Data" +msgstr "" + +#: ../midori/midori-browser.c:2977 +msgid "_Clear private data" +msgstr "" + +#: ../midori/midori-browser.c:2990 +msgid "Clear the following data:" +msgstr "" + +#: ../midori/midori-browser.c:2998 ../midori/midori-preferences.c:640 +#: ../panels/midori-history.c:108 +msgid "History" +msgstr "" + +#: ../midori/midori-browser.c:3001 +msgid "Cookies" +msgstr "" + +#: ../midori/midori-browser.c:3004 +msgid "'Flash' Cookies" +msgstr "" + +#: ../midori/midori-browser.c:3007 +msgid "Website icons" +msgstr "" + +#: ../midori/midori-browser.c:3093 +msgid "A lightweight web browser." +msgstr "" + +#: ../midori/midori-browser.c:3101 +msgid "translator-credits" +msgstr "" + +#: ../midori/midori-browser.c:3302 +msgid "_File" +msgstr "" + +#: ../midori/midori-browser.c:3305 +msgid "Open a new window" +msgstr "" + +#: ../midori/midori-browser.c:3308 +msgid "Open a new tab" +msgstr "" + +#: ../midori/midori-browser.c:3311 +msgid "Open a file" +msgstr "" + +#: ../midori/midori-browser.c:3314 +msgid "Save to a file" +msgstr "" + +#: ../midori/midori-browser.c:3316 +msgid "_Close Tab" +msgstr "" + +#: ../midori/midori-browser.c:3317 +msgid "Close the current tab" +msgstr "" + +#: ../midori/midori-browser.c:3319 +msgid "C_lose Window" +msgstr "" + +#: ../midori/midori-browser.c:3320 +msgid "Close this window" +msgstr "" + +#: ../midori/midori-browser.c:3323 +msgid "Print the current page" +msgstr "" + +#: ../midori/midori-browser.c:3326 +msgid "Quit the application" +msgstr "" + +#: ../midori/midori-browser.c:3328 +msgid "_Edit" +msgstr "" + +#: ../midori/midori-browser.c:3331 +msgid "Cut the selected text" +msgstr "" + +#: ../midori/midori-browser.c:3334 ../midori/midori-browser.c:3337 +msgid "Copy the selected text" +msgstr "" + +#: ../midori/midori-browser.c:3340 +msgid "Paste text from the clipboard" +msgstr "" + +#: ../midori/midori-browser.c:3343 +msgid "Delete the selected text" +msgstr "" + +#: ../midori/midori-browser.c:3346 +msgid "Select all text" +msgstr "" + +#: ../midori/midori-browser.c:3349 +msgid "Find a word or phrase in the page" +msgstr "" + +#: ../midori/midori-browser.c:3351 +msgid "Find _Next" +msgstr "" + +#: ../midori/midori-browser.c:3352 +msgid "Find the next occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3354 +msgid "Find _Previous" +msgstr "" + +#: ../midori/midori-browser.c:3355 +msgid "Find the previous occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3358 +msgid "_Quick Find" +msgstr "" + +#: ../midori/midori-browser.c:3359 +msgid "Quickly jump to a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3362 +msgid "Configure the application preferences" +msgstr "" + +#: ../midori/midori-browser.c:3364 +msgid "_View" +msgstr "" + +#: ../midori/midori-browser.c:3365 +msgid "_Toolbars" +msgstr "" + +#: ../midori/midori-browser.c:3377 +msgid "Increase the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3380 +msgid "Decrease the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3383 +msgid "Reset the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3384 +msgid "_Encoding" +msgstr "" + +#: ../midori/midori-browser.c:3386 +msgid "_Automatic" +msgstr "" + +#: ../midori/midori-browser.c:3389 ../midori/midori-websettings.c:200 +msgid "Chinese (BIG5)" +msgstr "" + +#: ../midori/midori-browser.c:3392 ../midori/midori-websettings.c:201 +msgid "Japanese (SHIFT_JIS)" +msgstr "" + +#: ../midori/midori-browser.c:3395 ../midori/midori-websettings.c:202 +msgid "Russian (KOI8-R)" +msgstr "" + +#: ../midori/midori-browser.c:3398 ../midori/midori-websettings.c:203 +msgid "Unicode (UTF-8)" +msgstr "" + +#: ../midori/midori-browser.c:3401 ../midori/midori-websettings.c:204 +msgid "Western (ISO-8859-1)" +msgstr "" + +#: ../midori/midori-browser.c:3404 ../midori/midori-websettings.c:205 +#: ../midori/midori-websettings.c:277 +msgid "Custom..." +msgstr "" + +#: ../midori/midori-browser.c:3407 ../midori/midori-view.c:1138 +msgid "View _Source" +msgstr "" + +#: ../midori/midori-browser.c:3408 +msgid "View the source code of the page" +msgstr "" + +#: ../midori/midori-browser.c:3410 +msgid "View Selection Source" +msgstr "" + +#: ../midori/midori-browser.c:3411 +msgid "View the source code of the selection" +msgstr "" + +#: ../midori/midori-browser.c:3415 +msgid "Toggle fullscreen view" +msgstr "" + +#: ../midori/midori-browser.c:3417 +msgid "_Go" +msgstr "" + +#: ../midori/midori-browser.c:3420 +msgid "Go back to the previous page" +msgstr "" + +#: ../midori/midori-browser.c:3423 +msgid "Go forward to the next page" +msgstr "" + +#: ../midori/midori-browser.c:3426 +msgid "Go to your homepage" +msgstr "" + +#: ../midori/midori-browser.c:3428 +msgid "Empty Trash" +msgstr "" + +#: ../midori/midori-browser.c:3429 +msgid "Delete the contents of the trash" +msgstr "" + +#: ../midori/midori-browser.c:3431 ../midori/midori-view.c:1110 +msgid "Undo Close Tab" +msgstr "" + +#: ../midori/midori-browser.c:3432 +msgid "Open the last closed tab" +msgstr "" + +#: ../midori/midori-browser.c:3436 ../panels/midori-bookmarks.c:232 +msgid "Add a new bookmark" +msgstr "" + +#: ../midori/midori-browser.c:3438 ../panels/midori-bookmarks.c:261 +msgid "Add a new folder" +msgstr "" + +#: ../midori/midori-browser.c:3439 +msgid "Add a new bookmark folder" +msgstr "" + +#: ../midori/midori-browser.c:3440 +msgid "_Tools" +msgstr "" + +#: ../midori/midori-browser.c:3442 ../midori/midori-searchaction.c:493 +msgid "_Manage Search Engines" +msgstr "" + +#: ../midori/midori-browser.c:3443 +msgid "Add, edit and remove search engines..." +msgstr "" + +#: ../midori/midori-browser.c:3446 +msgid "_Clear Private Data" +msgstr "" + +#: ../midori/midori-browser.c:3447 +msgid "Clear private data..." +msgstr "" + +#: ../midori/midori-browser.c:3451 +msgid "_Previous Tab" +msgstr "" + +#: ../midori/midori-browser.c:3452 +msgid "Switch to the previous tab" +msgstr "" + +#: ../midori/midori-browser.c:3454 +msgid "_Next Tab" +msgstr "" + +#: ../midori/midori-browser.c:3455 +msgid "Switch to the next tab" +msgstr "" + +#: ../midori/midori-browser.c:3457 +msgid "_Help" +msgstr "" + +#: ../midori/midori-browser.c:3459 +msgid "_Contents" +msgstr "" + +#: ../midori/midori-browser.c:3460 +msgid "Show the documentation" +msgstr "" + +#: ../midori/midori-browser.c:3462 +msgid "_Frequent Questions" +msgstr "" + +#: ../midori/midori-browser.c:3463 +msgid "Show the Frequently Asked Questions" +msgstr "" + +#: ../midori/midori-browser.c:3465 +msgid "_Report a Bug" +msgstr "" + +#: ../midori/midori-browser.c:3466 +msgid "Open Midori's bug tracker" +msgstr "" + +#: ../midori/midori-browser.c:3469 +msgid "Show information about the program" +msgstr "" + +#: ../midori/midori-browser.c:3476 +msgid "P_rivate Browsing" +msgstr "" + +#: ../midori/midori-browser.c:3477 +msgid "Don't save any private data while browsing" +msgstr "" + +#: ../midori/midori-browser.c:3482 +msgid "_Menubar" +msgstr "" + +#: ../midori/midori-browser.c:3483 +msgid "Show menubar" +msgstr "" + +#: ../midori/midori-browser.c:3486 +msgid "_Navigationbar" +msgstr "" + +#: ../midori/midori-browser.c:3487 +msgid "Show navigationbar" +msgstr "" + +#: ../midori/midori-browser.c:3490 +msgid "Side_panel" +msgstr "" + +#: ../midori/midori-browser.c:3491 +msgid "Show sidepanel" +msgstr "" + +#: ../midori/midori-browser.c:3494 +msgid "_Bookmarkbar" +msgstr "" + +#: ../midori/midori-browser.c:3495 +msgid "Show bookmarkbar" +msgstr "" + +#: ../midori/midori-browser.c:3498 +msgid "_Transferbar" +msgstr "" + +#: ../midori/midori-browser.c:3499 +msgid "Show transferbar" +msgstr "" + +#: ../midori/midori-browser.c:3502 +msgid "_Statusbar" +msgstr "" + +#: ../midori/midori-browser.c:3503 +msgid "Show statusbar" +msgstr "" + +#: ../midori/midori-browser.c:3937 +msgid "_Separator" +msgstr "" + +#: ../midori/midori-browser.c:3944 +msgid "_Location..." +msgstr "" + +#: ../midori/midori-browser.c:3946 +msgid "Open a particular location" +msgstr "" + +#: ../midori/midori-browser.c:3970 +msgid "_Web Search..." +msgstr "" + +#: ../midori/midori-browser.c:3972 +msgid "Run a web search" +msgstr "" + +#: ../midori/midori-browser.c:3993 +msgid "Reopen a previously closed tab or window" +msgstr "" + +#: ../midori/midori-browser.c:4006 +msgid "_Recently visited pages" +msgstr "" + +#: ../midori/midori-browser.c:4008 +msgid "Reopen pages that you visited earlier" +msgstr "" + +#: ../midori/midori-browser.c:4021 ../midori/sokoke.c:781 +msgid "_Bookmarks" +msgstr "" + +#: ../midori/midori-browser.c:4023 +msgid "Show the saved bookmarks" +msgstr "" + +#: ../midori/midori-browser.c:4036 +msgid "_Window" +msgstr "" + +#: ../midori/midori-browser.c:4038 +msgid "Show a list of all open tabs" +msgstr "" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4205 +msgid "_Inline Find:" +msgstr "" + +#: ../midori/midori-browser.c:4230 +msgid "Previous" +msgstr "" + +#: ../midori/midori-browser.c:4235 +msgid "Next" +msgstr "" + +#: ../midori/midori-browser.c:4240 +msgid "Match Case" +msgstr "" + +#: ../midori/midori-browser.c:4248 +msgid "Highlight Matches" +msgstr "" + +#: ../midori/midori-browser.c:4258 +msgid "Close Findbar" +msgstr "" + +#: ../midori/midori-browser.c:4598 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "" + +#: ../midori/midori-panel.c:309 +msgid "Detach chosen panel from the window" +msgstr "" + +#: ../midori/midori-panel.c:311 +msgid "Whether to detach the chosen panel from the window" +msgstr "" + +#: ../midori/midori-panel.c:321 ../midori/midori-websettings.c:531 +msgid "Align sidepanel on the right" +msgstr "" + +#: ../midori/midori-panel.c:323 ../midori/midori-websettings.c:532 +msgid "Whether to align the sidepanel on the right" +msgstr "" + +#: ../midori/midori-panel.c:333 ../midori/midori-panel.c:334 +msgid "Close panel" +msgstr "" + +#: ../midori/midori-websettings.c:183 ../midori/midori-view.c:1949 +msgid "Blank page" +msgstr "" + +#: ../midori/midori-websettings.c:184 ../midori/midori-websettings.c:551 +msgid "Homepage" +msgstr "" + +#: ../midori/midori-websettings.c:185 +msgid "Last open pages" +msgstr "" + +#: ../midori/midori-websettings.c:220 +msgid "New tab" +msgstr "" + +#: ../midori/midori-websettings.c:221 +msgid "New window" +msgstr "" + +#: ../midori/midori-websettings.c:222 +msgid "Current tab" +msgstr "" + +#: ../midori/midori-websettings.c:237 +msgid "Default" +msgstr "" + +#: ../midori/midori-websettings.c:238 +msgid "Icons" +msgstr "" + +#: ../midori/midori-websettings.c:239 +msgid "Text" +msgstr "" + +#: ../midori/midori-websettings.c:240 +msgid "Both" +msgstr "" + +#: ../midori/midori-websettings.c:241 +msgid "Both horizontal" +msgstr "" + +#: ../midori/midori-websettings.c:256 +msgid "All cookies" +msgstr "" + +#: ../midori/midori-websettings.c:257 +msgid "Session cookies" +msgstr "" + +#: ../midori/midori-websettings.c:258 ../panels/midori-addons.c:94 +msgid "None" +msgstr "" + +#: ../midori/midori-websettings.c:274 +msgid "Safari" +msgstr "" + +#: ../midori/midori-websettings.c:275 +msgid "Firefox" +msgstr "" + +#: ../midori/midori-websettings.c:276 +msgid "Internet Explorer" +msgstr "" + +#: ../midori/midori-websettings.c:329 +msgid "Remember last window size" +msgstr "" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to save the last window size" +msgstr "" + +#: ../midori/midori-websettings.c:338 +msgid "Last window width" +msgstr "" + +#: ../midori/midori-websettings.c:339 +msgid "The last saved window width" +msgstr "" + +#: ../midori/midori-websettings.c:347 +msgid "Last window height" +msgstr "" + +#: ../midori/midori-websettings.c:348 +msgid "The last saved window height" +msgstr "" + +#: ../midori/midori-websettings.c:373 +msgid "Last panel position" +msgstr "" + +#: ../midori/midori-websettings.c:374 +msgid "The last saved panel position" +msgstr "" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:383 +msgid "Last panel page" +msgstr "" + +#: ../midori/midori-websettings.c:384 +msgid "The last saved panel page" +msgstr "" + +#: ../midori/midori-websettings.c:392 +msgid "Last Web search" +msgstr "" + +#: ../midori/midori-websettings.c:393 +msgid "The last saved Web search" +msgstr "" + +#: ../midori/midori-websettings.c:402 +msgid "Show Menubar" +msgstr "" + +#: ../midori/midori-websettings.c:403 +msgid "Whether to show the menubar" +msgstr "" + +#: ../midori/midori-websettings.c:411 +msgid "Show Navigationbar" +msgstr "" + +#: ../midori/midori-websettings.c:412 +msgid "Whether to show the navigationbar" +msgstr "" + +#: ../midori/midori-websettings.c:420 +msgid "Show Bookmarkbar" +msgstr "" + +#: ../midori/midori-websettings.c:421 +msgid "Whether to show the bookmarkbar" +msgstr "" + +#: ../midori/midori-websettings.c:429 +msgid "Show Panel" +msgstr "" + +#: ../midori/midori-websettings.c:430 +msgid "Whether to show the panel" +msgstr "" + +#: ../midori/midori-websettings.c:445 +msgid "Show Transferbar" +msgstr "" + +#: ../midori/midori-websettings.c:446 +msgid "Whether to show the transferbar" +msgstr "" + +#: ../midori/midori-websettings.c:454 +msgid "Show Statusbar" +msgstr "" + +#: ../midori/midori-websettings.c:455 +msgid "Whether to show the statusbar" +msgstr "" + +#: ../midori/midori-websettings.c:464 +msgid "Toolbar Style" +msgstr "" + +#: ../midori/midori-websettings.c:465 +msgid "The style of the toolbar" +msgstr "" + +#: ../midori/midori-websettings.c:481 +msgid "Show progress in location entry" +msgstr "" + +#: ../midori/midori-websettings.c:482 +msgid "Whether to show loading progress in the location entry" +msgstr "" + +#: ../midori/midori-websettings.c:497 +msgid "Search engines in location completion" +msgstr "" + +#: ../midori/midori-websettings.c:498 +msgid "Whether to show search engines in the location completion" +msgstr "" + +#: ../midori/midori-websettings.c:506 +msgid "Toolbar Items" +msgstr "" + +#: ../midori/midori-websettings.c:507 +msgid "The items to show on the toolbar" +msgstr "" + +#: ../midori/midori-websettings.c:515 +msgid "Compact Sidepanel" +msgstr "" + +#: ../midori/midori-websettings.c:516 +msgid "Whether to make the sidepanel compact" +msgstr "" + +#: ../midori/midori-websettings.c:541 +msgid "Load on Startup" +msgstr "" + +#: ../midori/midori-websettings.c:542 +msgid "What to load on startup" +msgstr "" + +#: ../midori/midori-websettings.c:552 +msgid "The homepage" +msgstr "" + +#: ../midori/midori-websettings.c:567 +msgid "Show crash dialog" +msgstr "" + +#: ../midori/midori-websettings.c:568 +msgid "Show a dialog after Midori crashed" +msgstr "" + +#: ../midori/midori-websettings.c:576 +msgid "Download Folder" +msgstr "" + +#: ../midori/midori-websettings.c:577 +msgid "The folder downloaded files are saved to" +msgstr "" + +#: ../midori/midori-websettings.c:589 +msgid "Download Manager" +msgstr "" + +#: ../midori/midori-websettings.c:590 +msgid "An external download manager" +msgstr "" + +#: ../midori/midori-websettings.c:598 +msgid "Text Editor" +msgstr "" + +#: ../midori/midori-websettings.c:599 +msgid "An external text editor" +msgstr "" + +#: ../midori/midori-websettings.c:614 +msgid "News Aggregator" +msgstr "" + +#: ../midori/midori-websettings.c:615 +msgid "An external news aggregator" +msgstr "" + +#: ../midori/midori-websettings.c:623 +msgid "Location entry Search" +msgstr "" + +#: ../midori/midori-websettings.c:624 +msgid "The search to perform inside the location entry" +msgstr "" + +#: ../midori/midori-websettings.c:632 +msgid "Preferred Encoding" +msgstr "" + +#: ../midori/midori-websettings.c:633 +msgid "The preferred character encoding" +msgstr "" + +#: ../midori/midori-websettings.c:643 +msgid "Always Show Tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:644 +msgid "Always show the tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:652 +msgid "Close Buttons on Tabs" +msgstr "" + +#: ../midori/midori-websettings.c:653 +msgid "Whether tabs have close buttons" +msgstr "" + +#: ../midori/midori-websettings.c:661 +msgid "Open new pages in" +msgstr "" + +#: ../midori/midori-websettings.c:662 +msgid "Where to open new pages" +msgstr "" + +#: ../midori/midori-websettings.c:671 +msgid "Open external pages in" +msgstr "" + +#: ../midori/midori-websettings.c:672 +msgid "Where to open externally opened pages" +msgstr "" + +#: ../midori/midori-websettings.c:685 +msgid "Middle click opens Selection" +msgstr "" + +#: ../midori/midori-websettings.c:686 +msgid "Load an address from the selection via middle click" +msgstr "" + +#: ../midori/midori-websettings.c:694 +msgid "Open tabs in the background" +msgstr "" + +#: ../midori/midori-websettings.c:695 +msgid "Whether to open new tabs in the background" +msgstr "" + +#: ../midori/midori-websettings.c:703 +msgid "Open Tabs next to Current" +msgstr "" + +#: ../midori/midori-websettings.c:704 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" + +#: ../midori/midori-websettings.c:712 +msgid "Open popups in tabs" +msgstr "" + +#: ../midori/midori-websettings.c:713 +msgid "Whether to open popup windows in tabs" +msgstr "" + +#: ../midori/midori-websettings.c:729 +msgid "Zoom Text and Images" +msgstr "" + +#: ../midori/midori-websettings.c:730 +msgid "Whether to zoom text and images" +msgstr "" + +#: ../midori/midori-websettings.c:745 +msgid "Find inline while typing" +msgstr "" + +#: ../midori/midori-websettings.c:746 +msgid "Whether to automatically find inline while typing" +msgstr "" + +#: ../midori/midori-websettings.c:754 +msgid "Accept cookies" +msgstr "" + +#: ../midori/midori-websettings.c:755 +msgid "What type of cookies to accept" +msgstr "" + +#: ../midori/midori-websettings.c:764 +msgid "Original cookies only" +msgstr "" + +#: ../midori/midori-websettings.c:765 +msgid "Accept cookies from the original website only" +msgstr "" + +#: ../midori/midori-websettings.c:773 +msgid "Maximum cookie age" +msgstr "" + +#: ../midori/midori-websettings.c:774 +msgid "The maximum number of days to save cookies for" +msgstr "" + +#: ../midori/midori-websettings.c:784 +msgid "Remember last visited pages" +msgstr "" + +#: ../midori/midori-websettings.c:785 +msgid "Whether the last visited pages are saved" +msgstr "" + +#: ../midori/midori-websettings.c:793 +msgid "Maximum history age" +msgstr "" + +#: ../midori/midori-websettings.c:794 +msgid "The maximum number of days to save the history for" +msgstr "" + +#: ../midori/midori-websettings.c:802 +msgid "Remember last form inputs" +msgstr "" + +#: ../midori/midori-websettings.c:803 +msgid "Whether the last form inputs are saved" +msgstr "" + +#: ../midori/midori-websettings.c:811 +msgid "Remember last downloaded files" +msgstr "" + +#: ../midori/midori-websettings.c:812 +msgid "Whether the last downloaded files are saved" +msgstr "" + +#: ../midori/midori-websettings.c:822 +msgid "Proxy Server" +msgstr "" + +#: ../midori/midori-websettings.c:823 +msgid "The proxy server used for HTTP connections" +msgstr "" + +#: ../midori/midori-websettings.c:838 +msgid "Detect proxy server automatically" +msgstr "" + +#: ../midori/midori-websettings.c:839 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:855 +msgid "Identify as" +msgstr "" + +#: ../midori/midori-websettings.c:856 +msgid "What to identify as to web pages" +msgstr "" + +#: ../midori/midori-websettings.c:872 +msgid "Identification string" +msgstr "" + +#: ../midori/midori-websettings.c:873 +msgid "The application identification string" +msgstr "" + +#: ../midori/midori-websettings.c:881 +msgid "Cache size" +msgstr "" + +#: ../midori/midori-websettings.c:882 +msgid "The allowed size of the cache" +msgstr "" + +#. i18n: The title of the 404 - Not found error page +#. Error pages are special, we want to try loading the destination +#. again, not the error page which isn't even a proper page +#: ../midori/midori-view.c:637 ../midori/midori-view.c:2473 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:976 +msgid "Open _Link" +msgstr "" + +#: ../midori/midori-view.c:978 +msgid "Open Link in New _Tab" +msgstr "" + +#: ../midori/midori-view.c:995 +msgid "Open Link in New _Window" +msgstr "" + +#: ../midori/midori-view.c:1004 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:1010 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:1019 +msgid "Download with Download _Manager" +msgstr "" + +#: ../midori/midori-view.c:1048 +msgid "Search _with" +msgstr "" + +#: ../midori/midori-view.c:1076 +msgid "_Search the Web" +msgstr "" + +#: ../midori/midori-view.c:1086 +msgid "Open Address in New _Tab" +msgstr "" + +#: ../midori/midori-view.c:1234 +msgid "Open or download file" +msgstr "" + +#: ../midori/midori-view.c:1251 +#, c-format +msgid "File Type: '%s'" +msgstr "" + +#: ../midori/midori-view.c:1254 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1258 +#, c-format +msgid "Open %s" +msgstr "" + +#: ../midori/midori-view.c:1661 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1806 +#, c-format +msgid "Document cannot be displayed" +msgstr "" + +#: ../midori/midori-view.c:1822 +#, c-format +msgid "No documentation installed" +msgstr "" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:475 +msgid "Appearance" +msgstr "" + +#: ../midori/midori-preferences.c:476 +msgid "Font settings" +msgstr "" + +#: ../midori/midori-preferences.c:478 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:484 +msgid "The default font size used to display text" +msgstr "" + +#: ../midori/midori-preferences.c:487 +msgid "Minimum Font Size" +msgstr "" + +#: ../midori/midori-preferences.c:490 +msgid "The minimum font size used to display text" +msgstr "" + +#: ../midori/midori-preferences.c:497 +msgid "Encoding" +msgstr "" + +#: ../midori/midori-preferences.c:500 +msgid "The character encoding to use by default" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:507 +msgid "Behavior" +msgstr "" + +#: ../midori/midori-preferences.c:508 +msgid "Features" +msgstr "" + +#: ../midori/midori-preferences.c:511 ../extensions/statusbar-features.c:54 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:512 +msgid "Load and display images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:515 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:516 +msgid "Automatically shrink standalone images to fit" +msgstr "" + +#: ../midori/midori-preferences.c:519 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:520 +msgid "Whether background images should be printed" +msgstr "" + +#: ../midori/midori-preferences.c:523 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:524 +msgid "Whether text areas are resizable" +msgstr "" + +#: ../midori/midori-preferences.c:527 ../extensions/statusbar-features.c:63 +msgid "Enable scripts" +msgstr "" + +#: ../midori/midori-preferences.c:528 +msgid "Enable embedded scripting languages" +msgstr "" + +#: ../midori/midori-preferences.c:531 ../extensions/statusbar-features.c:72 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:532 +msgid "Enable embedded plugin objects" +msgstr "" + +#: ../midori/midori-preferences.c:535 +msgid "Enforce 96 dots per inch" +msgstr "" + +#: ../midori/midori-preferences.c:536 +msgid "Enforce a video dot density of 96 DPI" +msgstr "" + +#: ../midori/midori-preferences.c:539 +msgid "Enable developer tools" +msgstr "" + +#: ../midori/midori-preferences.c:540 +msgid "Enable special extensions for developers" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:548 +msgid "Interface" +msgstr "" + +#: ../midori/midori-preferences.c:549 +msgid "Navigationbar" +msgstr "" + +#: ../midori/midori-preferences.c:560 +msgid "Browsing" +msgstr "" + +#. Page "Network" +#: ../midori/midori-preferences.c:590 ../midori/midori-preferences.c:591 +msgid "Network" +msgstr "" + +#: ../midori/midori-preferences.c:618 +msgid "MB" +msgstr "" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:623 +msgid "Privacy" +msgstr "" + +#: ../midori/midori-preferences.c:624 +msgid "Web Cookies" +msgstr "" + +#: ../midori/midori-preferences.c:637 ../midori/midori-preferences.c:647 +msgid "days" +msgstr "" + +#: ../midori/midori-searchaction.c:484 ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "" + +#: ../midori/midori-searchaction.c:904 +msgid "Add search engine" +msgstr "" + +#: ../midori/midori-searchaction.c:904 +msgid "Edit search engine" +msgstr "" + +#: ../midori/midori-searchaction.c:932 +msgid "_Name:" +msgstr "" + +#: ../midori/midori-searchaction.c:976 +msgid "_Icon:" +msgstr "" + +#: ../midori/midori-searchaction.c:990 +msgid "_Token:" +msgstr "" + +#: ../midori/midori-searchaction.c:1195 +msgid "Manage Search Engines" +msgstr "" + +#: ../midori/midori-searchaction.c:1292 +msgid "Use as _default" +msgstr "" + +#: ../midori/sokoke.c:117 ../midori/sokoke.c:129 +msgid "Could not run external program." +msgstr "" + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:448 +msgid "Warning: You are using a superuser account!" +msgstr "" + +#: ../midori/sokoke.c:780 +msgid "_Bookmark" +msgstr "" + +#: ../midori/sokoke.c:782 +msgid "_Add Bookmark" +msgstr "" + +#: ../midori/sokoke.c:783 +msgid "_Console" +msgstr "" + +#: ../midori/sokoke.c:784 +msgid "_Extensions" +msgstr "" + +#: ../midori/sokoke.c:785 +msgid "_History" +msgstr "" + +#: ../midori/sokoke.c:786 +msgid "_Homepage" +msgstr "" + +#: ../midori/sokoke.c:787 +msgid "_Userscripts" +msgstr "" + +#: ../midori/sokoke.c:788 +msgid "User_styles" +msgstr "" + +#: ../midori/sokoke.c:789 +msgid "New _Tab" +msgstr "" + +#: ../midori/sokoke.c:790 +msgid "_Transfers" +msgstr "" + +#: ../midori/sokoke.c:791 +msgid "P_lugins" +msgstr "" + +#: ../midori/sokoke.c:792 +msgid "_Closed Tabs and Windows" +msgstr "" + +#: ../midori/sokoke.c:793 +msgid "New _Window" +msgstr "" + +#: ../panels/midori-addons.c:95 ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "" + +#: ../panels/midori-addons.c:96 ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "" + +#: ../panels/midori-addons.c:927 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "" + +#: ../panels/midori-addons.c:928 ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "" + +#: ../panels/midori-addons.c:937 ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "" + +#: ../panels/midori-addons.c:938 ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "" + +#: ../panels/midori-bookmarks.c:107 +msgid "Bookmarks" +msgstr "" + +#: ../panels/midori-bookmarks.c:240 +msgid "Edit the selected bookmark" +msgstr "" + +#: ../panels/midori-bookmarks.c:248 +msgid "Delete the selected bookmark" +msgstr "" + +#: ../panels/midori-bookmarks.c:593 +msgid "Separator" +msgstr "" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "" + +#: ../panels/midori-history.c:163 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../panels/midori-history.c:218 +msgid "Bookmark the selected history item" +msgstr "" + +#: ../panels/midori-history.c:227 +msgid "Delete the selected history item" +msgstr "" + +#: ../panels/midori-history.c:235 +msgid "Clear the entire history" +msgstr "" + +#: ../panels/midori-history.c:600 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../panels/midori-history.c:606 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../panels/midori-history.c:613 +msgid "Today" +msgstr "" + +#: ../panels/midori-history.c:615 +msgid "Yesterday" +msgstr "" + +#: ../panels/midori-plugins.c:87 +msgid "Plugins" +msgstr "" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "" + +#: ../katze/katze-utils.c:183 ../katze/katze-utils.c:395 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "" + +#: ../katze/katze-utils.c:215 ../katze/katze-utils.c:254 +msgid "Choose file" +msgstr "" + +#: ../katze/katze-utils.c:235 +msgid "Choose folder" +msgstr "" + +#: ../extensions/colorful-tabs.c:104 +msgid "Tint tabs distinctly" +msgstr "" + +#: ../extensions/colorful-tabs.c:140 +msgid "Colorful Tabs" +msgstr "" + +#: ../extensions/colorful-tabs.c:141 +msgid "Tint each tab distinctly" +msgstr "" + +#: ../extensions/cookie-manager.c:201 +msgid "At the end of the session" +msgstr "" + +#: ../extensions/cookie-manager.c:204 +#, c-format +msgid "" +"Host: %s\n" +"Name: %s\n" +"Value: %s\n" +"Path: %s\n" +"Secure: %s\n" +"Expires: %s" +msgstr "" + +#: ../extensions/cookie-manager.c:210 +msgid "Yes" +msgstr "" + +#: ../extensions/cookie-manager.c:210 +msgid "No" +msgstr "" + +#: ../extensions/cookie-manager.c:491 +msgid "Do you really want to delete all cookies?" +msgstr "" + +#: ../extensions/cookie-manager.c:493 +msgid "Question" +msgstr "" + +#: ../extensions/cookie-manager.c:501 +msgid "" +"Only the visible cookies are deleted which match the entered filter string." +msgstr "" + +#: ../extensions/cookie-manager.c:679 +msgid "Name" +msgstr "" + +#: ../extensions/cookie-manager.c:739 +msgid "_Expand All" +msgstr "" + +#: ../extensions/cookie-manager.c:747 +msgid "_Collapse All" +msgstr "" + +#: ../extensions/cookie-manager.c:818 +msgid "Delete All" +msgstr "" + +#: ../extensions/cookie-manager.c:820 +msgid "" +"Deletes all shown cookies. If a filter is set, only those cookies are " +"deleted which match the filter." +msgstr "" + +#: ../extensions/cookie-manager.c:835 +msgid "Expand All" +msgstr "" + +#: ../extensions/cookie-manager.c:842 +msgid "Collapse All" +msgstr "" + +#: ../extensions/cookie-manager.c:873 +msgid "Filter:" +msgstr "" + +#: ../extensions/cookie-manager.c:878 +msgid "" +"Enter a filter string to show only cookies whose name or domain field match " +"the entered filter" +msgstr "" + +#: ../extensions/cookie-manager.c:913 ../extensions/cookie-manager.c:961 +msgid "Cookie Manager" +msgstr "" + +#: ../extensions/cookie-manager.c:945 +msgid "_Cookie Manager" +msgstr "" + +#: ../extensions/cookie-manager.c:962 +msgid "List, view and delete cookies" +msgstr "" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:129 ../extensions/page-holder.c:177 +msgid "Pageholder" +msgstr "" + +#: ../extensions/page-holder.c:161 +msgid "_Pageholder" +msgstr "" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 00000000..8334c3ef --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1515 @@ +# Dutch translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Vincent Tunru 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-01-04 19:06+0100\n" +"PO-Revision-Date: 2008-11-10 02:02+0100\n" +"Last-Translator: Vincent Tunru \n" +"Language-Team: Dutch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Lichtgewicht webbrowser" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1828 ../midori/main.c:1919 +#: ../midori/main.c:1928 ../midori/main.c:1939 +#: ../midori/midori-websettings.c:235 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Webbrowser" + +#: ../midori/main.c:87 +msgid "_Bookmark" +msgstr "_Bladwijzer" + +#: ../midori/main.c:88 ../midori/midori-browser.c:3797 +msgid "_Bookmarks" +msgstr "_Bladwijzers" + +#: ../midori/main.c:89 +msgid "_Add Bookmark" +msgstr "Bladwijzer _toevoegen" + +#: ../midori/main.c:90 +msgid "_Console" +msgstr "_Console" + +#: ../midori/main.c:91 +msgid "_Extensions" +msgstr "_Extensies" + +#: ../midori/main.c:92 +msgid "_History" +msgstr "_Geschiedenis" + +#: ../midori/main.c:93 +msgid "_Homepage" +msgstr "_Homepage" + +#: ../midori/main.c:94 +msgid "_Userscripts" +msgstr "Gebruikers_scripts" + +#: ../midori/main.c:95 +msgid "User_styles" +msgstr "Gebruikers_opmaakprofielen" + +#: ../midori/main.c:96 +msgid "New _Tab" +msgstr "Nieuw _tabblad" + +#: ../midori/main.c:97 +msgid "_Transfers" +msgstr "Bestands_overdrachten" + +#: ../midori/main.c:98 +msgid "_Closed Tabs and Windows" +msgstr "Ge_sloten tabbladen en vensters" + +#: ../midori/main.c:99 +msgid "New _Window" +msgstr "Nieuw _venster" + +#: ../midori/main.c:155 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Configuratie kan niet geladen worden: %s\n" + +#: ../midori/main.c:210 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Waarde '%s' is ongeldig voor %s" + +#: ../midori/main.c:217 ../midori/main.c:287 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Ongeldige waarde '%s'" + +#: ../midori/main.c:529 +msgid "File not found." +msgstr "Bestand niet gevonden." + +#: ../midori/main.c:537 ../midori/main.c:546 +msgid "Malformed document." +msgstr "Ongeldig document." + +#: ../midori/main.c:568 ../midori/main.c:600 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Kan database niet openen: %s\n" + +#: ../midori/main.c:654 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Kan item in geschiedenis niet verwijderen: %s\n" + +#: ../midori/main.c:678 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Kan geschiedenis niet wissen: %s\n" + +#: ../midori/main.c:711 ../midori/main.c:725 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Kan item niet toevoegen aan geschiedenis: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:841 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Kan verjaarde items in geschiedenis niet verwijderen: %s\n" + +#: ../midori/main.c:869 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "De instellingen kunnen niet worden opgeslagen. %s" + +#: ../midori/main.c:897 ../midori/main.c:915 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "De zoekmachines kunnen niet opgeslagen worden. %s" + +#: ../midori/main.c:1045 ../midori/sokoke.c:523 +#, c-format +msgid "Writing failed." +msgstr "Fout bij schrijven." + +#: ../midori/main.c:1075 ../midori/main.c:1100 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "De bladwijzers kunnen niet opgeslagen worden. %s" + +#: ../midori/main.c:1123 ../midori/main.c:1147 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "De prullenbak kan niet worden opgeslagen. %s" + +#: ../midori/main.c:1168 ../midori/midori-preferences.c:381 +msgid "Transfers" +msgstr "Bestandsoverdrachten" + +#: ../midori/main.c:1204 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "De sessie kan niet worden opgeslagen. %s" + +#: ../midori/main.c:1530 +msgid "Authentication Required" +msgstr "" + +#: ../midori/main.c:1546 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" + +#: ../midori/main.c:1560 +msgid "Username" +msgstr "" + +#: ../midori/main.c:1571 +msgid "Password" +msgstr "" + +#: ../midori/main.c:1675 +msgid "" +"Midori seems to have crashed the last time it was opened. If this " +"happened repeatedly, try one of the following options to solve the problem." +msgstr "" + +#: ../midori/main.c:1690 +msgid "Modify _preferences" +msgstr "" + +#: ../midori/main.c:1694 +msgid "Reset the last _session" +msgstr "" + +#: ../midori/main.c:1699 +msgid "Disable all _extensions" +msgstr "" + +#: ../midori/main.c:1828 +msgid "No filename specified" +msgstr "Geen bestandsnaam ingegeven" + +#: ../midori/main.c:1857 ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Onbekende fout." + +#: ../midori/main.c:1880 +msgid "Run the specified filename as javascript" +msgstr "Voer de gegeven bestandsnaam uit als Javascript" + +#: ../midori/main.c:1882 +msgid "Display program version" +msgstr "Versie-informatie weergeven" + +#: ../midori/main.c:1884 +msgid "Addresses" +msgstr "" + +#: ../midori/main.c:1916 +msgid "[Addresses]" +msgstr "" + +#: ../midori/main.c:1940 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Gelieve commentaar, suggesties en fouten in het Engels te melden bij:" + +#: ../midori/main.c:1942 +msgid "Check for new versions at:" +msgstr "Controleer op nieuwe versies op:" + +#: ../midori/main.c:1965 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Midori is al actief maar reageert niet.\n" + +#: ../midori/main.c:2024 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "De bladwijzers kunnen niet geladen worden: %s\n" + +#: ../midori/main.c:2039 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "De sessie kan niet geladen worden: %s\n" + +#: ../midori/main.c:2052 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "De prullenbak kan niet geladen worden: %s\n" + +#: ../midori/main.c:2065 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "De geschiedenis kan niet geladen worden: %s\n" + +#: ../midori/main.c:2077 +msgid "The following errors occured:" +msgstr "De volgende fouten hebben plaatsgevonden:" + +#: ../midori/main.c:2093 +msgid "_Ignore" +msgstr "" + +#: ../midori/midori-browser.c:248 ../midori/midori-browser.c:3155 +#: ../midori/midori-browser.c:3161 +msgid "Reload the current page" +msgstr "De huidige pagina herladen" + +#: ../midori/midori-browser.c:260 ../midori/midori-browser.c:3158 +msgid "Stop loading the current page" +msgstr "Stop met het laden van de huidige pagina" + +#: ../midori/midori-browser.c:318 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% geladen" + +#: ../midori/midori-browser.c:341 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Onverwachte actie '%s'." + +#: ../midori/midori-browser.c:506 +msgid "New bookmark" +msgstr "Nieuwe bladwijzer" + +#: ../midori/midori-browser.c:506 +msgid "Edit bookmark" +msgstr "Bladwijzer bewerken" + +#: ../midori/midori-browser.c:528 +msgid "_Title:" +msgstr "_Titel:" + +#: ../midori/midori-browser.c:541 ../midori/midori-searchaction.c:868 +msgid "_Description:" +msgstr "_Beschrijving:" + +#: ../midori/midori-browser.c:560 ../midori/midori-searchaction.c:882 +msgid "_Address:" +msgstr "" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Map:" + +#: ../midori/midori-browser.c:583 ../midori/midori-browser.c:619 +msgid "Toplevel folder" +msgstr "" + +#: ../midori/midori-browser.c:712 +msgid "Save file as" +msgstr "Bestand opslaan als" + +#: ../midori/midori-browser.c:1292 +msgid "Open file" +msgstr "Bestand openen" + +#: ../midori/midori-browser.c:2369 +msgid "Open in New _Tab" +msgstr "In nieuw _tabblad openen" + +#: ../midori/midori-browser.c:2371 +msgid "Open in New _Window" +msgstr "In nieuw _venster openen" + +#: ../midori/midori-browser.c:2646 +msgid "Separator" +msgstr "Scheidingsteken" + +#: ../midori/midori-browser.c:2757 +#, c-format +msgid "A week ago" +msgstr "Eén week geleden" + +#: ../midori/midori-browser.c:2763 +#, c-format +msgid "%d days ago" +msgstr "%d dagen geleden" + +#: ../midori/midori-browser.c:2770 +msgid "Today" +msgstr "Vandaag" + +#: ../midori/midori-browser.c:2772 +msgid "Yesterday" +msgstr "Gisteren" + +#: ../midori/midori-browser.c:2861 +msgid "A lightweight web browser." +msgstr "Een lichtgewicht webbrowser." + +#: ../midori/midori-browser.c:2869 +msgid "translator-credits" +msgstr "Vincent Tunru " + +#: ../midori/midori-browser.c:2998 +msgid "Are you sure you want to remove all history items?" +msgstr "Weet u zeker dat u de hele geschiedenis wilt wissen?" + +#: ../midori/midori-browser.c:3089 +msgid "_File" +msgstr "_Bestand" + +#: ../midori/midori-browser.c:3092 +msgid "Open a new window" +msgstr "Nieuw venster openen" + +#: ../midori/midori-browser.c:3095 +msgid "Open a new tab" +msgstr "Nieuw tabblad openen" + +#: ../midori/midori-browser.c:3098 +msgid "Open a file" +msgstr "Bestand openen" + +#: ../midori/midori-browser.c:3101 +msgid "Save to a file" +msgstr "Opslaan naar bestand" + +#: ../midori/midori-browser.c:3103 +msgid "_Close Tab" +msgstr "Tabblad _sluiten" + +#: ../midori/midori-browser.c:3104 +msgid "Close the current tab" +msgstr "Huidig tabblad sluiten" + +#: ../midori/midori-browser.c:3106 +msgid "C_lose Window" +msgstr "Venster _sluiten" + +#: ../midori/midori-browser.c:3107 +msgid "Close this window" +msgstr "Dit venster sluiten" + +#: ../midori/midori-browser.c:3110 +msgid "Print the current page" +msgstr "Huidige pagina uitprinten" + +#: ../midori/midori-browser.c:3113 +msgid "Quit the application" +msgstr "Programma afsluiten" + +#: ../midori/midori-browser.c:3115 +msgid "_Edit" +msgstr "_Bewerken" + +#: ../midori/midori-browser.c:3118 +msgid "Cut the selected text" +msgstr "Geselecteerde tekst knippen" + +#: ../midori/midori-browser.c:3121 ../midori/midori-browser.c:3124 +msgid "Copy the selected text" +msgstr "Geselecteerde tekst kopiëren" + +#: ../midori/midori-browser.c:3127 +msgid "Paste text from the clipboard" +msgstr "Tekst van het klembord plakken" + +#: ../midori/midori-browser.c:3130 +msgid "Delete the selected text" +msgstr "Geselecteerde tekst verwijderen" + +#: ../midori/midori-browser.c:3133 +msgid "Select all text" +msgstr "Alle tekst selecteren" + +#: ../midori/midori-browser.c:3136 +msgid "Find a word or phrase in the page" +msgstr "Zoek naar een woord of zin in deze pagina" + +#: ../midori/midori-browser.c:3138 +msgid "Find _Next" +msgstr "Vo_lgende zoeken" + +#: ../midori/midori-browser.c:3139 +msgid "Find the next occurrence of a word or phrase" +msgstr "Volgende voorkomen van een woord of zin opzoeken" + +#: ../midori/midori-browser.c:3141 +msgid "Find _Previous" +msgstr "Vo_rige zoeken" + +#: ../midori/midori-browser.c:3142 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Vorige voorkomen van een woord of zin opzoeken" + +#: ../midori/midori-browser.c:3145 +msgid "_Quick Find" +msgstr "_Snel zoeken" + +#: ../midori/midori-browser.c:3146 +msgid "Quickly jump to a word or phrase" +msgstr "Snel naar een woord of zin springen" + +#: ../midori/midori-browser.c:3149 +msgid "Configure the application preferences" +msgstr "Voorkeuren instellen" + +#: ../midori/midori-browser.c:3151 +msgid "_View" +msgstr "_Beeld" + +#: ../midori/midori-browser.c:3152 +msgid "_Toolbars" +msgstr "_Werkbalken" + +#: ../midori/midori-browser.c:3164 +msgid "Increase the zoom level" +msgstr "Zoomniveau verhogen" + +#: ../midori/midori-browser.c:3167 +msgid "Decrease the zoom level" +msgstr "Zoomniveau verlagen" + +#: ../midori/midori-browser.c:3170 +msgid "Reset the zoom level" +msgstr "Zoomniveau op beginwaarde" + +#: ../midori/midori-browser.c:3172 ../midori/midori-view.c:1077 +msgid "View _Source" +msgstr "_Bron bekijken" + +#: ../midori/midori-browser.c:3173 +msgid "View the source code of the page" +msgstr "Broncode van deze pagina bekijken" + +#: ../midori/midori-browser.c:3175 +msgid "View Selection Source" +msgstr "Bron van selectie bekijken" + +#: ../midori/midori-browser.c:3176 +msgid "View the source code of the selection" +msgstr "Bekijk de broncode van de geselecteerde tekst" + +#: ../midori/midori-browser.c:3180 +msgid "Toggle fullscreen view" +msgstr "Volledig scherm" + +#: ../midori/midori-browser.c:3182 +msgid "_Go" +msgstr "_Ga naar" + +#: ../midori/midori-browser.c:3185 +msgid "Go back to the previous page" +msgstr "Terug naar de vorige pagina" + +#: ../midori/midori-browser.c:3188 +msgid "Go forward to the next page" +msgstr "Naar de volgende pagina" + +#: ../midori/midori-browser.c:3191 +msgid "Go to your homepage" +msgstr "Naar de homepage" + +#: ../midori/midori-browser.c:3193 +msgid "Empty Trash" +msgstr "Prullenbak leegmaken" + +#: ../midori/midori-browser.c:3194 +msgid "Delete the contents of the trash" +msgstr "Verwijder de inhoud van de prullenbak" + +#: ../midori/midori-browser.c:3196 ../midori/midori-view.c:1049 +msgid "Undo Close Tab" +msgstr "Tabblad sluiten ongedaan maken" + +#: ../midori/midori-browser.c:3197 +msgid "Open the last closed tab" +msgstr "Open het laatst gesloten tabblad" + +#: ../midori/midori-browser.c:3201 +msgid "Add a new bookmark" +msgstr "Nieuwe bladwijzer toevoegen" + +#: ../midori/midori-browser.c:3204 +msgid "Edit the selected bookmark" +msgstr "Geselecteerde bladwijzer bewerken" + +#: ../midori/midori-browser.c:3207 +msgid "Delete the selected bookmark" +msgstr "Geselecteerde bladwijzer verwijderen" + +#: ../midori/midori-browser.c:3210 +msgid "Delete the selected history item" +msgstr "Geselecteerde item uit geschiedenis verwijderen" + +#: ../midori/midori-browser.c:3213 +msgid "Clear the entire history" +msgstr "Volledige geschiedenis wissen" + +#: ../midori/midori-browser.c:3216 +msgid "Bookmark the selected history item" +msgstr "Geselecteerde item uit geschiedenis toevoegen als bladwijzer" + +#: ../midori/midori-browser.c:3218 +msgid "_Tools" +msgstr "_Hulpmiddelen" + +#: ../midori/midori-browser.c:3220 ../midori/midori-searchaction.c:496 +msgid "_Manage Search Engines" +msgstr "_Zoekmachines beheren" + +#: ../midori/midori-browser.c:3221 +msgid "Add, edit and remove search engines..." +msgstr "Zoekmachines toevoegen, bewerken en verwijderen..." + +#: ../midori/midori-browser.c:3225 +msgid "_Previous Tab" +msgstr "Vo_rig tabblad" + +#: ../midori/midori-browser.c:3226 +msgid "Switch to the previous tab" +msgstr "Overschakelen naar het vorige tabblad" + +#: ../midori/midori-browser.c:3228 +msgid "_Next Tab" +msgstr "Vo_lgend tabblad" + +#: ../midori/midori-browser.c:3229 +msgid "Switch to the next tab" +msgstr "Overschakelen naar het volgende tabblad" + +#: ../midori/midori-browser.c:3231 +msgid "_Help" +msgstr "_Hulp" + +#: ../midori/midori-browser.c:3233 +msgid "_Contents" +msgstr "_Inhoud" + +#: ../midori/midori-browser.c:3234 +msgid "Show the documentation" +msgstr "Documentatie weergeven" + +#: ../midori/midori-browser.c:3236 +msgid "_Frequent questions" +msgstr "_Veelgestelde vragen" + +#: ../midori/midori-browser.c:3237 +msgid "Show the Frequently Asked Questions" +msgstr "Veelgestelde vragen weergeven" + +#: ../midori/midori-browser.c:3239 +msgid "_Report a bug" +msgstr "Fouten _melden" + +#: ../midori/midori-browser.c:3240 +msgid "Open Midori's bug tracker" +msgstr "Open Midori's foutmelder" + +#: ../midori/midori-browser.c:3243 +msgid "Show information about the program" +msgstr "Informatie over dit programma weergeven" + +#: ../midori/midori-browser.c:3250 +msgid "P_rivate Browsing" +msgstr "P_rivé browsen" + +#: ../midori/midori-browser.c:3251 +msgid "Don't save any private data while browsing" +msgstr "Geen privé-data opslaan tijdens het browsen" + +#: ../midori/midori-browser.c:3256 +msgid "_Menubar" +msgstr "_Menubalk" + +#: ../midori/midori-browser.c:3257 +msgid "Show menubar" +msgstr "Menubalk weergeven" + +#: ../midori/midori-browser.c:3260 +msgid "_Navigationbar" +msgstr "_Navigatiebalk" + +#: ../midori/midori-browser.c:3261 +msgid "Show navigationbar" +msgstr "Navigatiebalk weergeven" + +#: ../midori/midori-browser.c:3264 +msgid "Side_panel" +msgstr "_Paneel" + +#: ../midori/midori-browser.c:3265 +msgid "Show sidepanel" +msgstr "_Paneel weergeven" + +#: ../midori/midori-browser.c:3268 +msgid "_Bookmarkbar" +msgstr "_Bladwijzerbalk" + +#: ../midori/midori-browser.c:3269 +msgid "Show bookmarkbar" +msgstr "Bladwijzerbalk weergeven" + +#: ../midori/midori-browser.c:3272 +msgid "_Transferbar" +msgstr "Bestands_overdrachten-balk" + +#: ../midori/midori-browser.c:3273 +msgid "Show transferbar" +msgstr "Bestandsoverdrachten-balk weergeven" + +#: ../midori/midori-browser.c:3276 +msgid "_Statusbar" +msgstr "_Statusbalk" + +#: ../midori/midori-browser.c:3277 +msgid "Show statusbar" +msgstr "Statusbalk weergeven" + +#: ../midori/midori-browser.c:3722 +msgid "_Location..." +msgstr "_Locatie..." + +#: ../midori/midori-browser.c:3724 +msgid "Open a particular location" +msgstr "Open een locatie" + +#: ../midori/midori-browser.c:3748 +msgid "_Web Search..." +msgstr "Zoeken op het _web..." + +#: ../midori/midori-browser.c:3750 +msgid "Run a web search" +msgstr "Doorzoek het web" + +#: ../midori/midori-browser.c:3769 +msgid "Reopen a previously closed tab or window" +msgstr "Heropen een eerder gesloten tabblad of venster" + +#: ../midori/midori-browser.c:3782 +msgid "_Recently visited pages" +msgstr "_Recent bezochte pagina's" + +#: ../midori/midori-browser.c:3784 +msgid "Reopen pages that you visited earlier" +msgstr "Eerder bezochte pagina's heropenen" + +#: ../midori/midori-browser.c:3799 +msgid "Show the saved bookmarks" +msgstr "Opgeslagen bladwijzers weergeven" + +#: ../midori/midori-browser.c:3812 +msgid "_Window" +msgstr "_Venster" + +#: ../midori/midori-browser.c:3814 +msgid "Show a list of all open tabs" +msgstr "Geef een lijst met open tabbladen weer" + +#: ../midori/midori-browser.c:3936 +msgid "Bookmarks" +msgstr "Bladwijzers" + +#: ../midori/midori-browser.c:3979 ../midori/midori-preferences.c:592 +msgid "History" +msgstr "Geschiedenis" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4022 +msgid "_Inline find:" +msgstr "_Ingebed zoeken:" + +#: ../midori/midori-browser.c:4053 +msgid "Match Case" +msgstr "Hoofdlettergevoelig" + +#: ../midori/midori-browser.c:4061 +msgid "Highlight Matches" +msgstr "Gevonden items markeren" + +#: ../midori/midori-browser.c:4070 +msgid "Close Findbar" +msgstr "Zoekbalk sluiten" + +#: ../midori/midori-browser.c:4318 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Onverwachte configuratie-optie '%s'" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Paneel sluiten" + +#: ../midori/midori-websettings.c:145 ../midori/midori-view.c:1742 +msgid "Blank page" +msgstr "Blanco pagina" + +#: ../midori/midori-websettings.c:146 ../midori/midori-websettings.c:420 +msgid "Homepage" +msgstr "Homepage" + +#: ../midori/midori-websettings.c:147 +msgid "Last open pages" +msgstr "Laatst geopende pagina's" + +#: ../midori/midori-websettings.c:162 +msgid "Chinese (BIG5)" +msgstr "Chinees (BIG5)" + +#: ../midori/midori-websettings.c:163 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japans (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:164 +msgid "Russian (KOI8-R)" +msgstr "Russisch (KOI8-R)" + +#: ../midori/midori-websettings.c:165 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:166 +msgid "Western (ISO-8859-1)" +msgstr "Westers (ISO-8859-1)" + +#: ../midori/midori-websettings.c:167 ../midori/midori-websettings.c:239 +msgid "Custom..." +msgstr "Aangepast..." + +#: ../midori/midori-websettings.c:182 +msgid "New tab" +msgstr "Nieuw tabblad" + +#: ../midori/midori-websettings.c:183 +msgid "New window" +msgstr "Nieuw venster" + +#: ../midori/midori-websettings.c:184 +msgid "Current tab" +msgstr "Huidig tabblad" + +#: ../midori/midori-websettings.c:199 +msgid "Default" +msgstr "Standaard" + +#: ../midori/midori-websettings.c:200 +msgid "Icons" +msgstr "Pictogrammen" + +#: ../midori/midori-websettings.c:201 +msgid "Text" +msgstr "Tekst" + +#: ../midori/midori-websettings.c:202 +msgid "Both" +msgstr "Beide" + +#: ../midori/midori-websettings.c:203 +msgid "Both horizontal" +msgstr "Beide horizontaal" + +#: ../midori/midori-websettings.c:218 +msgid "All cookies" +msgstr "Alle koekies" + +#: ../midori/midori-websettings.c:219 +msgid "Session cookies" +msgstr "Sessie-koekies" + +#: ../midori/midori-websettings.c:220 ../panels/midori-addons.c:96 +msgid "None" +msgstr "Geen" + +#: ../midori/midori-websettings.c:236 +msgid "Safari" +msgstr "" + +#: ../midori/midori-websettings.c:237 +msgid "Firefox" +msgstr "" + +#: ../midori/midori-websettings.c:238 +msgid "Internet Explorer" +msgstr "" + +#: ../midori/midori-websettings.c:279 +msgid "Remember last window size" +msgstr "Laatst gebruikte venstergrootte onthouden" + +#: ../midori/midori-websettings.c:280 +msgid "Whether to save the last window size" +msgstr "Laatst gebruiken venstergrootte onthouden" + +#: ../midori/midori-websettings.c:288 +msgid "Last window width" +msgstr "Laatst gebruikte vensterbreedte" + +#: ../midori/midori-websettings.c:289 +msgid "The last saved window width" +msgstr "Laatst gebruikte vensterbreedte" + +#: ../midori/midori-websettings.c:297 +msgid "Last window height" +msgstr "Laatst gebruikte vensterhoogte" + +#: ../midori/midori-websettings.c:298 +msgid "The last saved window height" +msgstr "Laatst gebruikte vensterhoogte" + +#: ../midori/midori-websettings.c:306 +msgid "Last panel position" +msgstr "Laatst gebruikte positie van paneel" + +#: ../midori/midori-websettings.c:307 +msgid "The last saved panel position" +msgstr "Laatst gebruikte positie van paneel" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:316 +msgid "Last panel page" +msgstr "Laatst geopende paneel" + +#: ../midori/midori-websettings.c:317 +msgid "The last saved panel page" +msgstr "Laatst geopende paneel" + +#: ../midori/midori-websettings.c:325 +msgid "Last Web search" +msgstr "Laatst uitgevoerde zoekopdracht" + +#: ../midori/midori-websettings.c:326 +msgid "The last saved Web search" +msgstr "Laatst uitgevoerde zoekopdracht" + +#: ../midori/midori-websettings.c:335 +msgid "Show Menubar" +msgstr "Menubalk weergeven" + +#: ../midori/midori-websettings.c:336 +msgid "Whether to show the menubar" +msgstr "Menubalk weergeven" + +#: ../midori/midori-websettings.c:344 +msgid "Show Navigationbar" +msgstr "Navigatiebalk weergeven" + +#: ../midori/midori-websettings.c:345 +msgid "Whether to show the navigationbar" +msgstr "Navigatiebalk weergeven" + +#: ../midori/midori-websettings.c:353 +msgid "Show Bookmarkbar" +msgstr "Bladwijzerbalk weergeven" + +#: ../midori/midori-websettings.c:354 +msgid "Whether to show the bookmarkbar" +msgstr "Bladwijzerbalk weergeven" + +#: ../midori/midori-websettings.c:362 +msgid "Show Panel" +msgstr "Paneel weergeven" + +#: ../midori/midori-websettings.c:363 +msgid "Whether to show the panel" +msgstr "Paneel weergeven" + +#: ../midori/midori-websettings.c:371 +msgid "Show Statusbar" +msgstr "Statusbalk weergeven" + +#: ../midori/midori-websettings.c:372 +msgid "Whether to show the statusbar" +msgstr "Statusbalk weergeven" + +#: ../midori/midori-websettings.c:381 +msgid "Toolbar Style" +msgstr "Stijl van de werkbalk" + +#: ../midori/midori-websettings.c:382 +msgid "The style of the toolbar" +msgstr "Stijl van de werkbalk" + +#: ../midori/midori-websettings.c:391 +msgid "Toolbar Items" +msgstr "Items in de werkbalk" + +#: ../midori/midori-websettings.c:392 +msgid "The items to show on the toolbar" +msgstr "Items om weer te geven in de werkbalk" + +#: ../midori/midori-websettings.c:400 +msgid "Compact Sidepanel" +msgstr "Compact paneel" + +#: ../midori/midori-websettings.c:401 +msgid "Whether to make the sidepanel compact" +msgstr "Het paneel compact weergeven" + +#: ../midori/midori-websettings.c:410 +msgid "Load on Startup" +msgstr "Laden bij opstarten" + +#: ../midori/midori-websettings.c:411 +msgid "What to load on startup" +msgstr "Wat geladen moet worden tijdens het opstarten" + +#: ../midori/midori-websettings.c:421 +msgid "The homepage" +msgstr "Homepage" + +#: ../midori/midori-websettings.c:429 +msgid "Download Folder" +msgstr "Downloadmap" + +#: ../midori/midori-websettings.c:430 +#, fuzzy +msgid "The folder downloaded files are saved to" +msgstr "De map waar gedownloadede de bestanden worden opgeslagen" + +#: ../midori/midori-websettings.c:438 +msgid "Download Manager" +msgstr "Downloadbeheer" + +#: ../midori/midori-websettings.c:439 +msgid "An external download manager" +msgstr "Extern downloadbeheer" + +#: ../midori/midori-websettings.c:447 +msgid "Text Editor" +msgstr "Tekstbewerker" + +#: ../midori/midori-websettings.c:448 +msgid "An external text editor" +msgstr "Een externe tekstbewerker" + +#: ../midori/midori-websettings.c:456 +msgid "Location entry Search" +msgstr "Zoeken vanuit locatieveld" + +#: ../midori/midori-websettings.c:457 +msgid "The search to perform inside the location entry" +msgstr "Met welke website gezocht wordt vanuit het locatie-invoerveld" + +#: ../midori/midori-websettings.c:465 +msgid "Preferred Encoding" +msgstr "Voorkeurs-codering" + +#: ../midori/midori-websettings.c:466 +msgid "The preferred character encoding" +msgstr "Voorkeurs-codering" + +#: ../midori/midori-websettings.c:476 +msgid "Always Show Tabbar" +msgstr "Tabbladen altijd weergeven" + +#: ../midori/midori-websettings.c:477 +msgid "Always show the tabbar" +msgstr "Balk met tabbladen altijd weergeven" + +#: ../midori/midori-websettings.c:485 +msgid "Close Buttons on Tabs" +msgstr "Sluitknoppen op tabbladen" + +#: ../midori/midori-websettings.c:486 +msgid "Whether tabs have close buttons" +msgstr "Sluitknoppen op tabbladen" + +#: ../midori/midori-websettings.c:495 +msgid "Open new pages in" +msgstr "Nieuwe pagina's openen in" + +#: ../midori/midori-websettings.c:496 +msgid "Where to open new pages" +msgstr "Waar nieuwe pagina's geopend moeten worden" + +#: ../midori/midori-websettings.c:506 +msgid "Open external pages in" +msgstr "Externe pagina's openen in" + +#: ../midori/midori-websettings.c:507 +msgid "Where to open externally opened pages" +msgstr "Waar externe pagina's geopend moeten worden" + +#: ../midori/midori-websettings.c:516 +msgid "Middle click opens Selection" +msgstr "Middel-klikken opent selectie" + +#: ../midori/midori-websettings.c:517 +#, fuzzy +msgid "Load an address from the selection via middle click" +msgstr "Laad een URL vanuit de selectie met een klik op de middelste muisknop" + +#: ../midori/midori-websettings.c:525 +msgid "Open tabs in the background" +msgstr "Tabbladen op de achtergrond openen" + +#: ../midori/midori-websettings.c:526 +msgid "Whether to open new tabs in the background" +msgstr "Tabbladen op de achtergrond openen" + +#: ../midori/midori-websettings.c:534 +msgid "Open Tabs next to Current" +msgstr "Tabbladen naast het huidige tabblad openen" + +#: ../midori/midori-websettings.c:535 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Tabbladen naast het huidige tabblad openen" + +#: ../midori/midori-websettings.c:543 +msgid "Open popups in tabs" +msgstr "Pop-ups in tabbladen openen" + +#: ../midori/midori-websettings.c:544 +msgid "Whether to open popup windows in tabs" +msgstr "Pop-ups in tabbladen openen" + +#: ../midori/midori-websettings.c:587 +msgid "Accept cookies" +msgstr "Koekies accepteren" + +#: ../midori/midori-websettings.c:588 +msgid "What type of cookies to accept" +msgstr "Welke soorten koekies geaccepteerd moeten worden" + +#: ../midori/midori-websettings.c:601 +msgid "Original cookies only" +msgstr "Alleen originele koekies" + +#: ../midori/midori-websettings.c:602 +msgid "Accept cookies from the original website only" +msgstr "Alleen koekies accepteren van de originele website" + +#: ../midori/midori-websettings.c:610 +msgid "Maximum cookie age" +msgstr "Maximale leeftijd van koekies" + +#: ../midori/midori-websettings.c:611 +msgid "The maximum number of days to save cookies for" +msgstr "Hoeveel dagen een koekie maximaal bewaard mag worden" + +#: ../midori/midori-websettings.c:621 +msgid "Remember last visited pages" +msgstr "Laatst bezochte pagina's onthouden" + +#: ../midori/midori-websettings.c:622 +msgid "Whether the last visited pages are saved" +msgstr "Laatst bezochte pagina's onthouden" + +#: ../midori/midori-websettings.c:630 +msgid "Maximum history age" +msgstr "Dagen in geschiedenis" + +#: ../midori/midori-websettings.c:631 +msgid "The maximum number of days to save the history for" +msgstr "Hoeveel dagen items in de geschiedenis bewaard moeten blijven" + +#: ../midori/midori-websettings.c:639 +msgid "Remember last form inputs" +msgstr "Laatst ingevoerde data in formulieren onthouden" + +#: ../midori/midori-websettings.c:640 +msgid "Whether the last form inputs are saved" +msgstr "Laatst ingevoerde data in formulieren onthouden" + +#: ../midori/midori-websettings.c:648 +#, fuzzy +msgid "Remember last downloaded files" +msgstr "Laatst gedownloadede bestanden onthouden" + +#: ../midori/midori-websettings.c:649 +#, fuzzy +msgid "Whether the last downloaded files are saved" +msgstr "Laatst gedownloadede bestanden onthouden" + +#: ../midori/midori-websettings.c:659 +msgid "Proxy Server" +msgstr "" + +#: ../midori/midori-websettings.c:660 +#, fuzzy +msgid "The proxy server used for HTTP connections" +msgstr "De gebruikte proxy voor HTTP-verbindingen" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:680 +msgid "Identify as" +msgstr "" + +#: ../midori/midori-websettings.c:681 +msgid "What to identify as to web pages" +msgstr "" + +#: ../midori/midori-websettings.c:701 +msgid "Identification string" +msgstr "" + +#: ../midori/midori-websettings.c:702 +msgid "The application identification string" +msgstr "" + +#: ../midori/midori-websettings.c:714 +msgid "Cache size" +msgstr "Cachegrootte" + +#: ../midori/midori-websettings.c:715 +msgid "The allowed size of the cache" +msgstr "Toegestane grootte voor de cache" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:701 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:981 +msgid "Open Link in New _Tab" +msgstr "Link in nieuw _tabblad openen" + +#: ../midori/midori-view.c:1004 +msgid "_Save Link destination" +msgstr "Locatie _opslaan" + +#: ../midori/midori-view.c:1012 +msgid "_Download Link destination" +msgstr "Locatie _downloaden" + +#: ../midori/midori-view.c:1034 +#, fuzzy +msgid "Open Address in New _Tab" +msgstr "In nieuw _tabblad openen" + +#: ../midori/midori-view.c:1463 +#, c-format +msgid "Inspect page - %s" +msgstr "Pagina analyseren - %s" + +#: ../midori/midori-view.c:1606 +msgid "Source" +msgstr "Bron" + +#: ../midori/midori-view.c:1630 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Documentatie weergeven" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Voorkeuren voor %s" + +#. Page "General" +#: ../midori/midori-preferences.c:369 +msgid "General" +msgstr "Algemeen" + +#: ../midori/midori-preferences.c:370 +msgid "Startup" +msgstr "Opstarten" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:417 +msgid "Appearance" +msgstr "Weergave" + +#: ../midori/midori-preferences.c:418 +msgid "Font settings" +msgstr "Lettertype" + +#: ../midori/midori-preferences.c:420 +msgid "Default Font Family" +msgstr "Standaard lettertype" + +#: ../midori/midori-preferences.c:426 +msgid "The default font size used to display text" +msgstr "" + +#: ../midori/midori-preferences.c:429 +msgid "Minimum Font Size" +msgstr "Minimale lettergrootte" + +#: ../midori/midori-preferences.c:432 +msgid "The minimum font size used to display text" +msgstr "" + +#: ../midori/midori-preferences.c:439 +#, fuzzy +msgid "Encoding" +msgstr "Voorkeurs-codering" + +#: ../midori/midori-preferences.c:442 +#, fuzzy +msgid "The character encoding to use by default" +msgstr "Voorkeurs-codering" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:449 +msgid "Behavior" +msgstr "Gedrag" + +#: ../midori/midori-preferences.c:450 +msgid "Features" +msgstr "Opties" + +#: ../midori/midori-preferences.c:453 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "Afbeeldingen automatisch laden" + +#: ../midori/midori-preferences.c:454 +#, fuzzy +msgid "Load and display images automatically" +msgstr "Afbeeldingen automatisch laden" + +#: ../midori/midori-preferences.c:457 +msgid "Shrink images automatically" +msgstr "Afbeeldingen automatisch verkleinen" + +#: ../midori/midori-preferences.c:458 +msgid "Automatically shrink standalone images to fit" +msgstr "" + +#: ../midori/midori-preferences.c:461 +msgid "Print background images" +msgstr "Achtergrondafbeeldingen meenemen in afdrukken" + +#: ../midori/midori-preferences.c:462 +msgid "Whether background images should be printed" +msgstr "" + +#: ../midori/midori-preferences.c:465 +msgid "Resizable text areas" +msgstr "Schaalbare tekstvlakken" + +#: ../midori/midori-preferences.c:466 +#, fuzzy +msgid "Whether text areas are resizable" +msgstr "Laatst bezochte pagina's onthouden" + +#: ../midori/midori-preferences.c:469 ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "Scripts aanzetten" + +#: ../midori/midori-preferences.c:470 +msgid "Enable embedded scripting languages" +msgstr "" + +#: ../midori/midori-preferences.c:473 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "Plugins aanzetten" + +#: ../midori/midori-preferences.c:474 +#, fuzzy +msgid "Enable embedded plugin objects" +msgstr "Plugins aanzetten" + +#: ../midori/midori-preferences.c:477 +msgid "Enable developer tools" +msgstr "Ontwikkelaars-opties aanzetten" + +#: ../midori/midori-preferences.c:478 +msgid "Enable special extensions for developers" +msgstr "" + +#: ../midori/midori-preferences.c:481 +msgid "Enforce 96 dots per inch" +msgstr "" + +#: ../midori/midori-preferences.c:482 +msgid "Enforce a video dot density of 96 DPI" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:490 +msgid "Interface" +msgstr "Gebruik" + +#: ../midori/midori-preferences.c:491 +msgid "Navigationbar" +msgstr "Navigatiebalk" + +#: ../midori/midori-preferences.c:507 +msgid "Browsing" +msgstr "Browsen" + +#: ../midori/midori-preferences.c:538 ../midori/midori-preferences.c:539 +msgid "Network" +msgstr "Netwerk" + +#: ../midori/midori-preferences.c:561 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:568 +msgid "Privacy" +msgstr "Privacy" + +#: ../midori/midori-preferences.c:574 +msgid "Web Cookies" +msgstr "Koekies" + +#: ../midori/midori-preferences.c:587 ../midori/midori-preferences.c:599 +msgid "days" +msgstr "dagen" + +#: ../midori/midori-searchaction.c:487 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Leeg" + +#: ../midori/midori-searchaction.c:824 +msgid "Add search engine" +msgstr "Zoekmachine toevoegen" + +#: ../midori/midori-searchaction.c:824 +msgid "Edit search engine" +msgstr "Zoekmachine bewerken" + +#: ../midori/midori-searchaction.c:852 +msgid "_Name:" +msgstr "_Naam:" + +#: ../midori/midori-searchaction.c:896 +msgid "_Icon (name or file):" +msgstr "_Pictogram (naam of bestand):" + +#: ../midori/midori-searchaction.c:910 +msgid "_Token:" +msgstr "_Trefwoord:" + +#: ../midori/midori-searchaction.c:1087 +msgid "Manage search engines" +msgstr "Zoekmachines beheren" + +#: ../midori/sokoke.c:101 ../midori/sokoke.c:113 +msgid "Could not run external program." +msgstr "Kan externe applicatie niet uitvoeren." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:346 +msgid "Warning: You are using a superuser account!" +msgstr "Waarschuwing: u bent ingelogd als root!" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s heeft geen eigenschap '%s'" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s kan niet toegewezen worden aan %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s is niet toegankelijk" + +#: ../panels/midori-addons.c:97 ../panels/midori-addons.c:143 +msgid "Userscripts" +msgstr "Gebruikersscripts" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:145 +msgid "Userstyles" +msgstr "Gebruikersopmaakprofielen" + +#: ../panels/midori-addons.c:1005 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Inschakelen" + +#: ../panels/midori-addons.c:1014 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Uitschakelen" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Console" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Extensies" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Pictogram '%s' kan niet geladen worden" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Standaardpictogram '%s' kan niet geladen worden" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Film-frames werken niet " + +#: ../katze/katze-utils.c:182 ../katze/katze-utils.c:391 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Eigenschap '%s' is ongeldig voor %s" + +#: ../katze/katze-utils.c:211 ../katze/katze-utils.c:250 +msgid "Choose file" +msgstr "Bestand kiezen" + +#: ../katze/katze-utils.c:231 +msgid "Choose folder" +msgstr "Map kiezen" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Paginavak" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Paginavak" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "Afbeeldingen" + +#: ../extensions/statusbar-features.c:37 +msgid "Scripts" +msgstr "Scripts" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "Plugins" + +#~ msgid "Root" +#~ msgstr "Hoofdmap" + +#~ msgid "[URIs]" +#~ msgstr "[URI's]" + +#~ msgid "HTTP Proxy" +#~ msgstr "HTTP proxy" + +#~ msgid "URIs" +#~ msgstr "URI's" + +#~ msgid "_URL:" +#~ msgstr "_URL:" + +#~ msgid "Open URL in New _Tab" +#~ msgstr "URL in nieuw _tabblad openen" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Openen in _paginavak" + +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Open de huidige pagina in het paginavak" + +#~ msgid "Last pageholder URI" +#~ msgstr "Laatst gebruikte URI in het paginavak" + +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Laatst gebruikte URI in het paginavak" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 00000000..5e8761f2 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,1515 @@ +# Polish translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Przemysław Sitek , 2008. +# Lukasz Romanowicz , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.0.17\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-08-27 00:24+0100\n" +"Last-Translator: Lukasz Romanowicz \n" +"Language-Team: pl \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Lekka przeglądarka internetowa" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Przeglądarka Internetowa" + +#: ../midori/main.c:86 +#, fuzzy +msgid "_Bookmark" +msgstr "_Zakładki" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Zakładki" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Dodaj zakładkę" + +#: ../midori/main.c:89 +#, fuzzy +msgid "_Console" +msgstr "Konsola" + +#: ../midori/main.c:90 +#, fuzzy +msgid "_Extensions" +msgstr "Rozszerzenia" + +#: ../midori/main.c:91 +#, fuzzy +msgid "_History" +msgstr "Historia" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Strona startowa" + +#: ../midori/main.c:93 +#, fuzzy +msgid "_Userscripts" +msgstr "Skrypty użytkownika" + +#: ../midori/main.c:94 +#, fuzzy +msgid "User_styles" +msgstr "Skrypty użytkownika" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Nowa kar_ta" + +#: ../midori/main.c:96 +#, fuzzy +msgid "_Transfers" +msgstr "Pobierania plików" + +#: ../midori/main.c:97 +#, fuzzy +msgid "_Closed Tabs and Windows" +msgstr "Zamknięte karty i okna" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "_Nowe okno" + +#: ../midori/main.c:143 +#, fuzzy, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Ustawienia nie mogą być załadowane. %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Wartość '%s' nie jest poprawna dla %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Nie znaleziono dokumentu" + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "" + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Zapis nie powiódł się" + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Pobierania plików" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Sesja nie może zostać zapisana. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Wyświetl wersję programu" + +#: ../midori/main.c:1301 +#, fuzzy +msgid "URIs" +msgstr "URI" + +#: ../midori/main.c:1335 +#, fuzzy +msgid "[URIs]" +msgstr "[URL]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Prosimy o zgłaszanie uwag, sugestii i błędów:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Sprawdź nową wersję na:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "" + +#: ../midori/main.c:1447 +#, fuzzy, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Zakładki nie mogą być załadowane. %s\n" + +#: ../midori/main.c:1463 +#, fuzzy, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Sesja nie może być załadowana. %s\n" + +#: ../midori/main.c:1477 +#, fuzzy, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Nie można załadować śmietnika. %s\n" + +#: ../midori/main.c:1491 +#, fuzzy, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Nie można załadować śmietnika. %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Nastąpiły następujące błędy:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Wyszukiwarki internetowe nie mogą być zapisane. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Zakładki nie mogą zostać zapisane. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Kosz nie może zostać zapisany. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Ustawienia nie mogą zostać zapisane. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Odśwież bieżącą stronę" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Zatrzymaj wczytywanie bieżącej strony" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% załadowano" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Niespodziewana akcja '%s'." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Nowa zakładka" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Edytuj zakładkę" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Tytuł:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Opis:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Folder:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Korzeń" + +#: ../midori/midori-browser.c:668 +#, fuzzy +msgid "Save file as" +msgstr "Zapi_sz stronę jako" + +#: ../midori/midori-browser.c:1248 +#, fuzzy +msgid "Open file" +msgstr "_Otwórz plik" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Otwórz odnośnik w nowej _karcie" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Otwórz odnośnik w _nowym oknie" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Separator" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../midori/midori-browser.c:2725 +#, fuzzy +msgid "Today" +msgstr "dni" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Lekka przeglądarka internetowa" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Przemysław Sitek " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Plik" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "_Nowe okno" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Nowa kar_ta" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "_Otwórz plik" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Zapi_sz stronę jako" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Zamknij kartę" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Zamknij bieżącą kartę" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "Zamknij okno" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Zamknij okno" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Drukuj bieżącą stronę" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Za_kończ" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Edycja" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Wytnij zaznaczony tekst" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Skopiuj" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Wklej" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Usuń zaznaczony tekst" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Zaznacz w_szystko" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Znajdź słowa lub frazy na stronie" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Znajdź poprzednie" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Znajdź następne" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "Szybkie wyszukiwanie" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Widok" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "Paski _narzędziowe" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Powiększ" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Zmniejsz" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +#, fuzzy +msgid "View _Source" +msgstr "Ź_ródło strony" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Zobacz kod źródłowy strony" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Pokaż źródło zaznaczenia" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Tryb pełnoekranowy" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "P_rzejdź" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Wróć do poprzedniej strony" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Przejdź do następnej strony" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Przejdź do strony startowej" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Opróżnij kosz" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Usuń zawartość kosza" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Cofnij zamknięcie karty" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Otwórz ostatnio zamkniętą kartę" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Dodaj nową zakładkę" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Edytuj wybraną zakładkę" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Skasuj wybraną zakładkę" + +#: ../midori/midori-browser.c:3185 +#, fuzzy +msgid "Delete the selected history item" +msgstr "Usuń zaznaczony tekst" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "" + +#: ../midori/midori-browser.c:3191 +#, fuzzy +msgid "Bookmark the selected history item" +msgstr "Skopiuj" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Narzędzia" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Zarządzaj wyszukiwarkami" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Zarządzaj wyszukiwarkami internetowymi..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Poprzednia karta" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Przełącz na poprzednią kartę" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "_Następna karta" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Przełącz na następną kartę" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "Pomo_c" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Zawartość" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Pokaż dokumentację" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Pokaż informacje o programie" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "P_rywatne przeglądanie" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Nie zapisuj żadnych prywatnych danych podczas przeglądania" + +#: ../midori/midori-browser.c:3231 +#, fuzzy +msgid "_Menubar" +msgstr "Pasek menu" + +#: ../midori/midori-browser.c:3232 +#, fuzzy +msgid "Show menubar" +msgstr "Pasek menu" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "Pasek _narzędzi nawigacyjnych" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Panel _boczny" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "Pasek _zakładek" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "_Pasek pobierania plików" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "Pasek stanu" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Pokaż pasek stanu" + +#: ../midori/midori-browser.c:3669 +#, fuzzy +msgid "_Location..." +msgstr "_Położenie..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "" + +#: ../midori/midori-browser.c:3695 +#, fuzzy +msgid "_Web Search..." +msgstr "Znajdź w Internecie..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Otwórz wcześniej zamkniętą kartę lub okno" + +#: ../midori/midori-browser.c:3729 +#, fuzzy +msgid "_Recently visited pages" +msgstr "Przechowuj adresy ostatnio odwiedzonych stron" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "" + +#: ../midori/midori-browser.c:3746 +#, fuzzy +msgid "Show the saved bookmarks" +msgstr "Otwórz wybraną zakładkę" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Okno" + +#: ../midori/midori-browser.c:3761 +#, fuzzy +msgid "Show a list of all open tabs" +msgstr "Pokaż wszystkie otwarte karty" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Zakładki" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Historia" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "Wyszukaj:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Uwzg_lędniaj wielkość liter" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Zamknij" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Niespodziewane ustawienie '%s'" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Zamknij panel" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Pusta strona" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Strona startowa" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Ostatnio otwarte strony" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Chiński tradycyjny (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japoński (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Rosyjski (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Zachodni (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Dostosuj..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "nowej karcie" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "nowym oknie" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "bieżącej karcie" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Domyślnie" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Tylko ikony" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Tylko tekst" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Tekst pod ikonami" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Tekst obok ikon" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Wszystkie ciasteczka" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Ciasteczka sesji" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Żadne" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Pamiętaj ostatni rozmiar okna" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Ostatnia szerokość okna" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Ostatnia zapisana szerokość okna" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Ostatnia wysokość okna" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Ostatnia zapisana wysokość okna" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Ostatnia pozycja panelu" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Ostatnio zapisana pozycja panelu" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "" + +#: ../midori/midori-websettings.c:302 +#, fuzzy +msgid "Show Menubar" +msgstr "Pasek menu" + +#: ../midori/midori-websettings.c:303 +#, fuzzy +msgid "Whether to show the menubar" +msgstr "Otwieraj nowe karty w tle" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Pokaż panel" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Pasek _stanu" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Styl paska narzędzi" + +#: ../midori/midori-websettings.c:358 +#, fuzzy +msgid "Toolbar Items" +msgstr "Paski _narzędziowe" + +#: ../midori/midori-websettings.c:359 +#, fuzzy +msgid "The items to show on the toolbar" +msgstr "Styl paska narzędzi" + +#: ../midori/midori-websettings.c:367 +#, fuzzy +msgid "Compact Sidepanel" +msgstr "Panel _boczny" + +#: ../midori/midori-websettings.c:368 +msgid "Whether to make the sidepanel compact" +msgstr "" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Pokaż przy uruchomieniu" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Pokaż przy uruchomieniu" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Strona startowa" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Katalog pobierania plików" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "" + +#: ../midori/midori-websettings.c:405 +#, fuzzy +msgid "Download Manager" +msgstr "Katalog pobierania plików" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Adres domyślnej wyszukiwarki internetowej" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Preferowane kodowanie znaków" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Pokazuj przyciski zamykania kart" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Otwieraj nowe strony w" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Otwieraj nowe strony w" + +#: ../midori/midori-websettings.c:473 +#, fuzzy +msgid "Open external pages in" +msgstr "Otwieraj nowe strony w" + +#: ../midori/midori-websettings.c:474 +#, fuzzy +msgid "Where to open externally opened pages" +msgstr "Otwieraj nowe strony w" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Środkowy przycisk myszy otwiera zaznaczoną stronę" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Otwieraj nowe karty w tle" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Otwieraj nowe karty w tle" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "" + +#: ../midori/midori-websettings.c:502 +#, fuzzy +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Otwieraj nowe karty w tle" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Otwieraj wyskakujące okienka jako karty" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Czy otwierać wyskakujące okienka jako karty" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Akceptuj ciasteczka" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Zezwalaj wyłącznie na ciasteczka z bieżącej strony" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Przechowuj ciasteczka przez:" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Przechowuj adresy ostatnio odwiedzonych stron" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Przechowuj dane z formularzy" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Przechowuj informację o ostatnio pobranych plikach" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "Serwer proxy HTTP" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Rozmiar pamięci podręcznej" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Otwórz odnośnik w nowej karcie" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Otwórz URL w nowej karcie" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1503 +#, fuzzy +msgid "Source" +msgstr "Ź_ródło strony" + +#: ../midori/midori-view.c:1527 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Pokaż dokumentację" + +#: ../midori/midori-preferences.c:87 +#, fuzzy, c-format +msgid "Preferences for %s" +msgstr "Preferencje %s" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Ogólne" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Uruchomienie" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Wygląd" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Ustawienia czcionek" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Zachowanie" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Treść" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +#, fuzzy +msgid "Enable scripts" +msgstr "Skrypty użytkownika" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Interfejs" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Pasek narzędzi nawigacyjnych" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Przeglądanie" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Sieć" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "Prywatność" + +#: ../midori/midori-preferences.c:500 +msgid "Web Cookies" +msgstr "Ciasteczka" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "dni" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Puste" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Dodaj wyszukiwarkę internetową" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Modyfikuj przeglądarkę internetową" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Nazwa:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Ikona (nazwa albo plik):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "_Zarządzaj wyszukiwarkami" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "" + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Uwaga: Używasz konta administratora!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Skrypty użytkownika" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +#, fuzzy +msgid "_Disable" +msgstr "_Plik" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsola" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Rozszerzenia" + +#: ../katze/katze-throbber.c:828 +#, fuzzy, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Sesja nie może być załadowana. %s\n" + +#: ../katze/katze-throbber.c:841 +#, fuzzy, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Sesja nie może być załadowana. %s\n" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Wybierz plik" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Wybór katalogu" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "" + +#: ../extensions/page-holder.c:128 +#, fuzzy +msgid "_Pageholder" +msgstr "_Folder:" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "Skrypty użytkownika" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Bookmark" +#~ msgstr "Zakładka" + +#~ msgid "_Form Fill" +#~ msgstr "Wypełnij _formularz" + +#~ msgid "Select _All" +#~ msgstr "Z_aznacz wszystko" + +#~ msgid "_Fullscreen" +#~ msgstr "Tryb _pełnoekranowy" + +#~ msgid "_Leave Fullscreen" +#~ msgstr "_Opuść tryb pełnoekranowy" + +#~ msgid "midori" +#~ msgstr "midori" + +#~ msgid "Unknown argument." +#~ msgstr "Nieznany argument" + +#~ msgid "Settings" +#~ msgstr "Ustawienia" + +#~ msgid "Trash" +#~ msgstr "Kosz" + +#~ msgid "Browser" +#~ msgstr "Przeglądarka" + +#~ msgid "The current browser" +#~ msgstr "Obecna przeglądarka" + +#~ msgid "Search Engines" +#~ msgstr "Wyszukiwarki" + +#~ msgid "The list of search engines" +#~ msgstr "Lista wyszukiwarek" + +#~ msgid "The navigationbar" +#~ msgstr "Pasek narzędzi nawigacyjnych" + +#~ msgid "Tab" +#~ msgstr "Karta" + +#~ msgid "The current tab" +#~ msgstr "Bieżącą karta" + +#~ msgid "Statusbar" +#~ msgstr "Pasek stanu" + +#~ msgid "The statusbar" +#~ msgstr "Pasek stanu" + +#~ msgid "Statusbar Text" +#~ msgstr "Tekst paska stanu" + +#~ msgid "The text that is displayed in the statusbar" +#~ msgstr "Tekst wyświetlany na pasku stanu" + +#~ msgid "Pa_ge Setup" +#~ msgstr "_Ustawienia strony" + +#~ msgid "Show a preview of the printed page" +#~ msgstr "Pokaż podgląd drukowanej strony" + +#~ msgid "Undo the last modification" +#~ msgstr "Cofnij" + +#~ msgid "Redo the last modification" +#~ msgstr "Przywróć" + +#~ msgid "_Manage Bookmarks" +#~ msgstr "_Modyfikuj zakładki" + +#~ msgid "Open the selected bookmark in a new tab" +#~ msgstr "Otwórz wybraną zakładkę w nowej karcie" + +#~ msgid "Open the selected bookmark in a new window" +#~ msgstr "Otwórz wybraną zakładkę w nowym oknie" + +#~ msgid "Tab _Overview" +#~ msgstr "P_odgląd kart" + +#~ msgid "_Work Offline" +#~ msgstr "Pracuj bez podłączenia" + +#~ msgid "Untitled" +#~ msgstr "Bez tytułu" + +#~ msgid "Limit" +#~ msgstr "Ograniczenie" + +#~ msgid "Show New Tab" +#~ msgstr "Pokazuj przycisk \"Nowa karta\"" + +#~ msgid "Show the New Tab button in the toolbar" +#~ msgstr "Pokaż przycisk nowej karty na pasku narzędzi" + +#~ msgid "Show Homepage" +#~ msgstr "Pokazuj stronę startową" + +#~ msgid "Show the Homepage button in the toolbar" +#~ msgstr "Pokaż przycisk strony startowej na pasku narzędzi" + +#~ msgid "Show Web search" +#~ msgstr "Pokazuj wyszukiwarki internetowe" + +#~ msgid "Show Trash" +#~ msgstr "Pokazuj kosz" + +#~ msgid "Show the Trash button in the toolbar" +#~ msgstr "Pokaż kosz na pasku narzędzi" + +#~ msgid "Show a notification window for finished downloads" +#~ msgstr "Pokazuj powiadomienie dla zakończonych pobierań" + +#~ msgid "Name" +#~ msgstr "Nazwa:" + +#~ msgid "Description" +#~ msgstr "Opis:" diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100644 index 00000000..c353688f --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,1724 @@ +# Portuguese translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Sérgio Marques 2008-2009 +# +msgid "" +msgstr "" +"Project-Id-Version: Midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-03-22 22:19+0100\n" +"PO-Revision-Date: \n" +"Last-Translator: Sérgio Marques \n" +"Language-Team: Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Navegador Web leve" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1580 +#: ../midori/main.c:1672 +#: ../midori/main.c:1681 +#: ../midori/main.c:1692 +#: ../midori/midori-websettings.c:269 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Navegador Web" + +#: ../midori/main.c:103 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "A configuração não foi carregada: %s\n" + +#: ../midori/main.c:158 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "O valor '%s' é inválido para %s" + +#: ../midori/main.c:165 +#: ../midori/main.c:235 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Valor de configuração inválido '%s'" + +#: ../midori/main.c:477 +msgid "File not found." +msgstr "Ficheiro não encontrado." + +#: ../midori/main.c:485 +#: ../midori/main.c:494 +msgid "Malformed document." +msgstr "Documento mal formado." + +#: ../midori/main.c:516 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Falha ao abrir a base de dados: %s\n" + +#: ../midori/main.c:548 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Falha ao executar a declaração da base de dados: %s\n" + +#: ../midori/main.c:602 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Falha ao remover histórico: %s\n" + +#: ../midori/main.c:626 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Falha ao limpar histórico: %s\n" + +#: ../midori/main.c:649 +#: ../midori/main.c:683 +#: ../midori/main.c:699 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Falha ao adicionar histórico: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:879 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Falha ao remover histórico antigo: %s\n" + +#: ../midori/main.c:907 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "A configuração não foi guardada. %s" + +#: ../midori/main.c:936 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Os motores de pesquisa não foram guardados. %s" + +#: ../midori/main.c:1066 +#: ../midori/sokoke.c:617 +#, c-format +msgid "Writing failed." +msgstr "Falhou escrita." + +#: ../midori/main.c:1087 +#: ../midori/main.c:1114 +#: ../midori/main.c:1142 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Os marcadores não foram guardados. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1166 +#: ../midori/main.c:1190 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "O lixo não foi guardado. %s" + +#: ../midori/main.c:1261 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "A sessão não foi guardada. %s" + +#: ../midori/main.c:1377 +msgid "Midori seems to have crashed the last time it was opened. If this happend repeatedly, try one of the following options to solve the problem." +msgstr "O Midori encerrou abruptamente da última vez que foi aberto. Se isto ocorrer repetidamente, tente uma das seguintes opções para resolver o problema." + +#: ../midori/main.c:1392 +msgid "Modify _preferences" +msgstr "Modificar _preferências" + +#: ../midori/main.c:1396 +msgid "Reset the last _session" +msgstr "Restaurar última _sessão" + +#: ../midori/main.c:1401 +msgid "Disable all _extensions" +msgstr "Desactivar todas as _extensões" + +#: ../midori/main.c:1580 +msgid "No filename specified" +msgstr "Nenhum nome especificado" + +#: ../midori/main.c:1603 +#: ../midori/gjs.c:515 +msgid "An unknown error occured." +msgstr "Ocorreu um erro desconhecido." + +#: ../midori/main.c:1626 +msgid "Run the specified filename as javascript" +msgstr "Executar o ficheiro especificado como argumento java" + +#: ../midori/main.c:1628 +msgid "Display program version" +msgstr "Apresentar versão do programa" + +#: ../midori/main.c:1630 +msgid "Addresses" +msgstr "Endereços " + +#: ../midori/main.c:1669 +msgid "[Addresses]" +msgstr "[Endereços]" + +#: ../midori/main.c:1693 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Por favor reporte comentários, sugestões e erros para:" + +#: ../midori/main.c:1695 +msgid "Check for new versions at:" +msgstr "Verificar por novas versões a:" + +#: ../midori/main.c:1722 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Já existe uma instância de Midori em execução mas que não está respondendo.\n" + +#: ../midori/main.c:1772 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "Os motores de pesquisa não foram carregados. %s\n" + +#: ../midori/main.c:1784 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Os marcadores não foram carregados: %s\n" + +#: ../midori/main.c:1799 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "A sessão não foi carregada: %s\n" + +#: ../midori/main.c:1812 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "O lixo não foi carregado: %s\n" + +#: ../midori/main.c:1825 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "O histórico não foi carregado: %s\n" + +#: ../midori/main.c:1837 +msgid "The following errors occured:" +msgstr "Ocorreram os seguintes erros:" + +#: ../midori/main.c:1853 +msgid "_Ignore" +msgstr "_Ignorar " + +#: ../midori/midori-browser.c:278 +#: ../midori/midori-browser.c:3262 +#: ../midori/midori-browser.c:3268 +msgid "Reload the current page" +msgstr "Recarregar página actual" + +#: ../midori/midori-browser.c:289 +#: ../midori/midori-browser.c:3265 +msgid "Stop loading the current page" +msgstr "Parar o carregamento da página actual" + +#: ../midori/midori-browser.c:351 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% carregado" + +#: ../midori/midori-browser.c:376 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Acção inesperada '%s'." + +#: ../midori/midori-browser.c:553 +msgid "New folder" +msgstr "Nova pasta" + +#: ../midori/midori-browser.c:553 +msgid "Edit folder" +msgstr "Editar pasta" + +#: ../midori/midori-browser.c:555 +msgid "New bookmark" +msgstr "Novo marcador" + +#: ../midori/midori-browser.c:555 +msgid "Edit bookmark" +msgstr "Editar marcador" + +#: ../midori/midori-browser.c:585 +msgid "_Title:" +msgstr "_Título:" + +#: ../midori/midori-browser.c:598 +#: ../midori/midori-searchaction.c:855 +msgid "_Description:" +msgstr "_Descrição:" + +#: ../midori/midori-browser.c:617 +#: ../midori/midori-searchaction.c:869 +msgid "_Address:" +msgstr "_Endereço:" + +#: ../midori/midori-browser.c:636 +msgid "_Folder:" +msgstr "_Pasta:" + +#: ../midori/midori-browser.c:641 +#: ../midori/midori-browser.c:682 +msgid "Toplevel folder" +msgstr "Pasta Superior" + +#: ../midori/midori-browser.c:762 +msgid "Save file as" +msgstr "Guardar como" + +#: ../midori/midori-browser.c:1538 +msgid "Open file" +msgstr "Abrir ficheiro" + +#: ../midori/midori-browser.c:2837 +#: ../panels/midori-bookmarks.c:776 +#: ../panels/midori-history.c:810 +msgid "Open all in _Tabs" +msgstr "Abrir todas em _Separadores" + +#: ../midori/midori-browser.c:2844 +#: ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:816 +msgid "Open in New _Tab" +msgstr "Abrir em Novo _Separador" + +#: ../midori/midori-browser.c:2847 +#: ../panels/midori-bookmarks.c:784 +#: ../panels/midori-history.c:818 +msgid "Open in New _Window" +msgstr "Abrir em Nova _Janela" + +#: ../midori/midori-browser.c:3001 +msgid "A lightweight web browser." +msgstr "Um navegador web leve." + +#: ../midori/midori-browser.c:3009 +msgid "translator-credits" +msgstr "Sérgio Marques " + +#: ../midori/midori-browser.c:3196 +msgid "_File" +msgstr "_Ficheiro" + +#: ../midori/midori-browser.c:3199 +msgid "Open a new window" +msgstr "Abrir nova janela" + +#: ../midori/midori-browser.c:3202 +msgid "Open a new tab" +msgstr "Abrir novo separador" + +#: ../midori/midori-browser.c:3205 +msgid "Open a file" +msgstr "Abrir ficheiro" + +#: ../midori/midori-browser.c:3208 +msgid "Save to a file" +msgstr "Guardar para ficheiro" + +#: ../midori/midori-browser.c:3210 +msgid "_Close Tab" +msgstr "_Fechar Separador" + +#: ../midori/midori-browser.c:3211 +msgid "Close the current tab" +msgstr "Fechar separador actual" + +#: ../midori/midori-browser.c:3213 +msgid "C_lose Window" +msgstr "Fechar Jane_la" + +#: ../midori/midori-browser.c:3214 +msgid "Close this window" +msgstr "Fechar esta janela" + +#: ../midori/midori-browser.c:3217 +msgid "Print the current page" +msgstr "Imprimir página actual" + +#: ../midori/midori-browser.c:3220 +msgid "Quit the application" +msgstr "Sair da aplicação" + +#: ../midori/midori-browser.c:3222 +msgid "_Edit" +msgstr "_Editar" + +#: ../midori/midori-browser.c:3225 +msgid "Cut the selected text" +msgstr "Cortar o texto seleccionado" + +#: ../midori/midori-browser.c:3228 +#: ../midori/midori-browser.c:3231 +msgid "Copy the selected text" +msgstr "Copiar o texto seleccionado" + +#: ../midori/midori-browser.c:3234 +msgid "Paste text from the clipboard" +msgstr "Colar itens da área de transferência" + +#: ../midori/midori-browser.c:3237 +msgid "Delete the selected text" +msgstr "Eliminar o texto seleccionado" + +#: ../midori/midori-browser.c:3240 +msgid "Select all text" +msgstr "Seleccionar tudo" + +#: ../midori/midori-browser.c:3243 +msgid "Find a word or phrase in the page" +msgstr "Localizar uma palavra ou frase na página" + +#: ../midori/midori-browser.c:3245 +msgid "Find _Next" +msgstr "Localizar _Próxima" + +#: ../midori/midori-browser.c:3246 +msgid "Find the next occurrence of a word or phrase" +msgstr "Localizar próxima ocorrência da palavra ou frase" + +#: ../midori/midori-browser.c:3248 +msgid "Find _Previous" +msgstr "Localizar _Anterior" + +#: ../midori/midori-browser.c:3249 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Localizar a ocurrência anterior de uma palavra ou frase" + +#: ../midori/midori-browser.c:3252 +msgid "_Quick Find" +msgstr "Localização _Rápida" + +#: ../midori/midori-browser.c:3253 +msgid "Quickly jump to a word or phrase" +msgstr "Avanço rápido para palavra ou frase" + +#: ../midori/midori-browser.c:3256 +msgid "Configure the application preferences" +msgstr "Configurar preferências da aplicação" + +#: ../midori/midori-browser.c:3258 +msgid "_View" +msgstr "_Ver" + +#: ../midori/midori-browser.c:3259 +msgid "_Toolbars" +msgstr "_Barra de Ferramentas" + +#: ../midori/midori-browser.c:3271 +msgid "Increase the zoom level" +msgstr "Aumentar Zoom" + +#: ../midori/midori-browser.c:3274 +msgid "Decrease the zoom level" +msgstr "Diminuir Zoom" + +#: ../midori/midori-browser.c:3277 +msgid "Reset the zoom level" +msgstr "Restaurar Zoom" + +#: ../midori/midori-browser.c:3278 +msgid "_Encoding" +msgstr "_Codificação" + +#: ../midori/midori-browser.c:3280 +msgid "_Automatic" +msgstr "_Automático" + +#: ../midori/midori-browser.c:3283 +#: ../midori/midori-websettings.c:196 +msgid "Chinese (BIG5)" +msgstr "Chinês (BIG5)" + +#: ../midori/midori-browser.c:3286 +#: ../midori/midori-websettings.c:197 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japonês (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3289 +#: ../midori/midori-websettings.c:198 +msgid "Russian (KOI8-R)" +msgstr "Russo (KOI8-R)" + +#: ../midori/midori-browser.c:3292 +#: ../midori/midori-websettings.c:199 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3295 +#: ../midori/midori-websettings.c:200 +msgid "Western (ISO-8859-1)" +msgstr "Ocidental (ISO-8859-1)" + +#: ../midori/midori-browser.c:3298 +#: ../midori/midori-websettings.c:201 +#: ../midori/midori-websettings.c:273 +msgid "Custom..." +msgstr "Personalizar..." + +#: ../midori/midori-browser.c:3301 +#: ../midori/midori-view.c:1111 +msgid "View _Source" +msgstr "Ver _Origem" + +#: ../midori/midori-browser.c:3302 +msgid "View the source code of the page" +msgstr "Ver código fonte da página" + +#: ../midori/midori-browser.c:3304 +msgid "View Selection Source" +msgstr "Ver Origem da Selecção" + +#: ../midori/midori-browser.c:3305 +msgid "View the source code of the selection" +msgstr "Ver código fonte da selecção" + +#: ../midori/midori-browser.c:3309 +msgid "Toggle fullscreen view" +msgstr "Alternar para ecrã completo" + +#: ../midori/midori-browser.c:3311 +msgid "_Go" +msgstr "_Ir" + +#: ../midori/midori-browser.c:3314 +msgid "Go back to the previous page" +msgstr "Ir para página anterior" + +#: ../midori/midori-browser.c:3317 +msgid "Go forward to the next page" +msgstr "Ir para página seguinte" + +#: ../midori/midori-browser.c:3320 +msgid "Go to your homepage" +msgstr "Ir para página inicial" + +#: ../midori/midori-browser.c:3322 +msgid "Empty Trash" +msgstr "Esvaziar Lixo" + +#: ../midori/midori-browser.c:3323 +msgid "Delete the contents of the trash" +msgstr "Eliminar conteúdos do lixo" + +#: ../midori/midori-browser.c:3325 +#: ../midori/midori-view.c:1083 +msgid "Undo Close Tab" +msgstr "Desfazer Fecho de Separador" + +#: ../midori/midori-browser.c:3326 +msgid "Open the last closed tab" +msgstr "Abrir último separador fechado" + +#: ../midori/midori-browser.c:3330 +#: ../panels/midori-bookmarks.c:228 +msgid "Add a new bookmark" +msgstr "Adicionar novo marcador" + +#: ../midori/midori-browser.c:3331 +msgid "_Tools" +msgstr "_Ferramentas" + +#: ../midori/midori-browser.c:3333 +#: ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "Gerir _Motores de Pesquisa" + +#: ../midori/midori-browser.c:3334 +msgid "Add, edit and remove search engines..." +msgstr "Adicionar, editar e remover motores de pesquisa..." + +#: ../midori/midori-browser.c:3338 +msgid "_Previous Tab" +msgstr "Separador _Anterior" + +#: ../midori/midori-browser.c:3339 +msgid "Switch to the previous tab" +msgstr "Mudar para separador anterior" + +#: ../midori/midori-browser.c:3341 +msgid "_Next Tab" +msgstr "_Próximo Separador" + +#: ../midori/midori-browser.c:3342 +msgid "Switch to the next tab" +msgstr "Trocar para próximo separador" + +#: ../midori/midori-browser.c:3344 +msgid "_Help" +msgstr "_Ajuda" + +#: ../midori/midori-browser.c:3346 +msgid "_Contents" +msgstr "_Conteúdos" + +#: ../midori/midori-browser.c:3347 +msgid "Show the documentation" +msgstr "Mostrar documentação" + +#: ../midori/midori-browser.c:3349 +msgid "_Frequent Questions" +msgstr "Questões _Frequentes" + +#: ../midori/midori-browser.c:3350 +msgid "Show the Frequently Asked Questions" +msgstr "Mostrar Questões Frequentes" + +#: ../midori/midori-browser.c:3352 +msgid "_Report a Bug" +msgstr "_Reportar Erro" + +#: ../midori/midori-browser.c:3353 +msgid "Open Midori's bug tracker" +msgstr "Abrir Midori's bug tracker" + +#: ../midori/midori-browser.c:3356 +msgid "Show information about the program" +msgstr "Mostrar informação sobre o programa" + +#: ../midori/midori-browser.c:3363 +msgid "P_rivate Browsing" +msgstr "Navegação P_rivada" + +#: ../midori/midori-browser.c:3364 +msgid "Don't save any private data while browsing" +msgstr "Não guardar quaisquer dados privados ao navegar" + +#: ../midori/midori-browser.c:3369 +msgid "_Menubar" +msgstr "Barra de _Menu" + +#: ../midori/midori-browser.c:3370 +msgid "Show menubar" +msgstr "Mostrar barra de menu" + +#: ../midori/midori-browser.c:3373 +msgid "_Navigationbar" +msgstr "Barra de _Navegação" + +#: ../midori/midori-browser.c:3374 +msgid "Show navigationbar" +msgstr "Mostrar barra de navegação" + +#: ../midori/midori-browser.c:3377 +msgid "Side_panel" +msgstr "Pai_nel lateral" + +#: ../midori/midori-browser.c:3378 +msgid "Show sidepanel" +msgstr "Mostrar painel lateral" + +#: ../midori/midori-browser.c:3381 +msgid "_Bookmarkbar" +msgstr "_Barra de Marcadores" + +#: ../midori/midori-browser.c:3382 +msgid "Show bookmarkbar" +msgstr "Mostrar barra de marcadores" + +#: ../midori/midori-browser.c:3385 +msgid "_Transferbar" +msgstr "Barra de _Transferências" + +#: ../midori/midori-browser.c:3386 +msgid "Show transferbar" +msgstr "Mostrar barra de transferências" + +#: ../midori/midori-browser.c:3389 +msgid "_Statusbar" +msgstr "Barra de _Estado" + +#: ../midori/midori-browser.c:3390 +msgid "Show statusbar" +msgstr "Mostrar barra de estado" + +#: ../midori/midori-browser.c:3821 +msgid "_Separator" +msgstr "_Separador" + +#: ../midori/midori-browser.c:3828 +msgid "_Location..." +msgstr "_Localização..." + +#: ../midori/midori-browser.c:3830 +msgid "Open a particular location" +msgstr "Abrir localização específica" + +#: ../midori/midori-browser.c:3854 +msgid "_Web Search..." +msgstr "Pesquisa _Web..." + +#: ../midori/midori-browser.c:3856 +msgid "Run a web search" +msgstr "Executar uma pesquisa web" + +#: ../midori/midori-browser.c:3875 +msgid "Reopen a previously closed tab or window" +msgstr "Reabrir janela ou separador anteriormente fechado" + +#: ../midori/midori-browser.c:3888 +msgid "_Recently visited pages" +msgstr "Páginas _Recentes" + +#: ../midori/midori-browser.c:3890 +msgid "Reopen pages that you visited earlier" +msgstr "Reabrir páginas visitadas anteriormente" + +#: ../midori/midori-browser.c:3903 +#: ../midori/sokoke.c:772 +msgid "_Bookmarks" +msgstr "_Marcadores" + +#: ../midori/midori-browser.c:3905 +msgid "Show the saved bookmarks" +msgstr "Mostrar marcadores guardados" + +#: ../midori/midori-browser.c:3918 +msgid "_Window" +msgstr "_Janela" + +#: ../midori/midori-browser.c:3920 +msgid "Show a list of all open tabs" +msgstr "Mostrar lista de separadores abertos" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4085 +msgid "_Inline Find:" +msgstr "Localizar:" + +#: ../midori/midori-browser.c:4110 +msgid "Previous" +msgstr "Anterior" + +#: ../midori/midori-browser.c:4115 +msgid "Next" +msgstr "Seguinte" + +#: ../midori/midori-browser.c:4120 +msgid "Match Case" +msgstr "Maiúsculas e Minúsculas" + +#: ../midori/midori-browser.c:4128 +msgid "Highlight Matches" +msgstr "Realçar Correspondências" + +#: ../midori/midori-browser.c:4138 +msgid "Close Findbar" +msgstr "Fechar" + +#: ../midori/midori-browser.c:4444 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Definição inesperada '%s'" + +#: ../midori/midori-panel.c:229 +#: ../midori/midori-websettings.c:511 +msgid "Align sidepanel on the right" +msgstr "Alinhar painel lateral à direita" + +#: ../midori/midori-panel.c:231 +#: ../midori/midori-websettings.c:512 +msgid "Whether to align the sidepanel on the right" +msgstr "Se alinha painel lateral na direita" + +#: ../midori/midori-panel.c:241 +#: ../midori/midori-panel.c:242 +msgid "Close panel" +msgstr "Fechar painel" + +#: ../midori/midori-websettings.c:179 +#: ../midori/midori-view.c:1888 +msgid "Blank page" +msgstr "Página em branco" + +#: ../midori/midori-websettings.c:180 +#: ../midori/midori-websettings.c:531 +msgid "Homepage" +msgstr "Página Inicial" + +#: ../midori/midori-websettings.c:181 +msgid "Last open pages" +msgstr "Últimas páginas abertas" + +#: ../midori/midori-websettings.c:216 +msgid "New tab" +msgstr "Novo separador" + +#: ../midori/midori-websettings.c:217 +msgid "New window" +msgstr "Nova janela" + +#: ../midori/midori-websettings.c:218 +msgid "Current tab" +msgstr "Separador actual" + +#: ../midori/midori-websettings.c:233 +msgid "Default" +msgstr "Padrão" + +#: ../midori/midori-websettings.c:234 +msgid "Icons" +msgstr "Ícones" + +#: ../midori/midori-websettings.c:235 +msgid "Text" +msgstr "Texto" + +#: ../midori/midori-websettings.c:236 +msgid "Both" +msgstr "Texto e Ícones" + +#: ../midori/midori-websettings.c:237 +msgid "Both horizontal" +msgstr "Ambos na horizontal" + +#: ../midori/midori-websettings.c:252 +msgid "All cookies" +msgstr "Todos os cookies" + +#: ../midori/midori-websettings.c:253 +msgid "Session cookies" +msgstr "Cookies da sessão" + +#: ../midori/midori-websettings.c:254 +#: ../panels/midori-addons.c:94 +msgid "None" +msgstr "Nenhum" + +#: ../midori/midori-websettings.c:270 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:271 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:272 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:325 +msgid "Remember last window size" +msgstr "Lembrar último tamanho de janela" + +#: ../midori/midori-websettings.c:326 +msgid "Whether to save the last window size" +msgstr "Se guarda o último tamanho de janela" + +#: ../midori/midori-websettings.c:334 +msgid "Last window width" +msgstr "Largura da última janela" + +#: ../midori/midori-websettings.c:335 +msgid "The last saved window width" +msgstr "Última largura de janela guardada" + +#: ../midori/midori-websettings.c:343 +msgid "Last window height" +msgstr "Altura da última janela" + +#: ../midori/midori-websettings.c:344 +msgid "The last saved window height" +msgstr "Última altura de janela guardada" + +#: ../midori/midori-websettings.c:369 +msgid "Last panel position" +msgstr "Última posição do painel" + +#: ../midori/midori-websettings.c:370 +msgid "The last saved panel position" +msgstr "Última posição de painel guardada" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:379 +msgid "Last panel page" +msgstr "Última página do painel" + +#: ../midori/midori-websettings.c:380 +msgid "The last saved panel page" +msgstr "Última posição de painel de página guardada" + +#: ../midori/midori-websettings.c:388 +msgid "Last Web search" +msgstr "Última pesquisa na Web" + +#: ../midori/midori-websettings.c:389 +msgid "The last saved Web search" +msgstr "Última pesquisa Web guardada" + +#: ../midori/midori-websettings.c:398 +msgid "Show Menubar" +msgstr "Mostrar Barra de Menu" + +#: ../midori/midori-websettings.c:399 +msgid "Whether to show the menubar" +msgstr "Se mostra a barra de menu" + +#: ../midori/midori-websettings.c:407 +msgid "Show Navigationbar" +msgstr "Mostrar Barra de Navegação" + +#: ../midori/midori-websettings.c:408 +msgid "Whether to show the navigationbar" +msgstr "Se mostra a barra de navegação" + +#: ../midori/midori-websettings.c:416 +msgid "Show Bookmarkbar" +msgstr "Mostrar Barra de Marcadores" + +#: ../midori/midori-websettings.c:417 +msgid "Whether to show the bookmarkbar" +msgstr "Se mostra a barra de marcadores" + +#: ../midori/midori-websettings.c:425 +msgid "Show Panel" +msgstr "Mostrar Painel" + +#: ../midori/midori-websettings.c:426 +msgid "Whether to show the panel" +msgstr "Se mostra o painel" + +#: ../midori/midori-websettings.c:441 +msgid "Show Transferbar" +msgstr "Mostrar barra de transferências" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to show the transferbar" +msgstr "Se mostra a barra de transferências" + +#: ../midori/midori-websettings.c:450 +msgid "Show Statusbar" +msgstr "Mostrar Barra de Estado" + +#: ../midori/midori-websettings.c:451 +msgid "Whether to show the statusbar" +msgstr "Se mostra a barra de estado" + +#: ../midori/midori-websettings.c:460 +msgid "Toolbar Style" +msgstr "Estilo da Barra de Ferramentas" + +#: ../midori/midori-websettings.c:461 +msgid "The style of the toolbar" +msgstr "O estilo da barra de ferramentas" + +#: ../midori/midori-websettings.c:477 +msgid "Show progress in location entry" +msgstr "Mostrar evolução na entrada de localização" + +#: ../midori/midori-websettings.c:478 +msgid "Whether to show loading progress in the location entry" +msgstr "Se mostra evolução de carregamento na entrada de localização" + +#: ../midori/midori-websettings.c:486 +msgid "Toolbar Items" +msgstr "Itens da Barra de Ferramentas" + +#: ../midori/midori-websettings.c:487 +msgid "The items to show on the toolbar" +msgstr "Itens a mostrar na barra de ferramentas" + +#: ../midori/midori-websettings.c:495 +msgid "Compact Sidepanel" +msgstr "Compactar Painel Lateral" + +#: ../midori/midori-websettings.c:496 +msgid "Whether to make the sidepanel compact" +msgstr "Se implica compactação do painel lateral" + +#: ../midori/midori-websettings.c:521 +msgid "Load on Startup" +msgstr "Carregar ao Iniciar" + +#: ../midori/midori-websettings.c:522 +msgid "What to load on startup" +msgstr "Carregar ao iniciar" + +#: ../midori/midori-websettings.c:532 +msgid "The homepage" +msgstr "A página inicial" + +#: ../midori/midori-websettings.c:547 +msgid "Show crash dialog" +msgstr "Mostrar diálogo sobre encerramento" + +#: ../midori/midori-websettings.c:548 +msgid "Show a dialog after Midori crashed" +msgstr "Mostrar diálogo após o encerramento do Midori" + +#: ../midori/midori-websettings.c:556 +msgid "Download Folder" +msgstr "Pasta de Transferências" + +#: ../midori/midori-websettings.c:557 +msgid "The folder downloaded files are saved to" +msgstr "A pasta para guardar transferências" + +#: ../midori/midori-websettings.c:569 +msgid "Download Manager" +msgstr "Gestor de Transferências" + +#: ../midori/midori-websettings.c:570 +msgid "An external download manager" +msgstr "Um gestor de transferências externo" + +#: ../midori/midori-websettings.c:578 +msgid "Text Editor" +msgstr "Editor de Texto" + +#: ../midori/midori-websettings.c:579 +msgid "An external text editor" +msgstr "Um editor de texto externo" + +#: ../midori/midori-websettings.c:587 +msgid "Location entry Search" +msgstr "Pesquisa de entrada Local" + +#: ../midori/midori-websettings.c:588 +msgid "The search to perform inside the location entry" +msgstr "A pesquisa a executar dentro da entrada local" + +#: ../midori/midori-websettings.c:596 +msgid "Preferred Encoding" +msgstr "Codificação Preferida" + +#: ../midori/midori-websettings.c:597 +msgid "The preferred character encoding" +msgstr "A codificação de caracteres preferida" + +#: ../midori/midori-websettings.c:607 +msgid "Always Show Tabbar" +msgstr "Mostrar sempre Barra de Separadores" + +#: ../midori/midori-websettings.c:608 +msgid "Always show the tabbar" +msgstr "Mostrar sempre barra de separadores" + +#: ../midori/midori-websettings.c:616 +msgid "Close Buttons on Tabs" +msgstr "Ícone Fechar nos Separadores" + +#: ../midori/midori-websettings.c:617 +msgid "Whether tabs have close buttons" +msgstr "Se separadores têm botões para fechar" + +#: ../midori/midori-websettings.c:625 +msgid "Open new pages in" +msgstr "Abrir novas páginas em" + +#: ../midori/midori-websettings.c:626 +msgid "Where to open new pages" +msgstr "Onde abrir novas páginas" + +#: ../midori/midori-websettings.c:635 +msgid "Open external pages in" +msgstr "Abrir páginas externas em" + +#: ../midori/midori-websettings.c:636 +msgid "Where to open externally opened pages" +msgstr "Onde abrir páginas abertas externamente" + +#: ../midori/midori-websettings.c:649 +msgid "Middle click opens Selection" +msgstr "Clique na roda do rato abre Selecção" + +#: ../midori/midori-websettings.c:650 +msgid "Load an address from the selection via middle click" +msgstr "Carregar endereço através do clique na roda do rato" + +#: ../midori/midori-websettings.c:658 +msgid "Open tabs in the background" +msgstr "Abrir separadores em segundo plano" + +#: ../midori/midori-websettings.c:659 +msgid "Whether to open new tabs in the background" +msgstr "Se abre novos separadores em segundo plano" + +#: ../midori/midori-websettings.c:667 +msgid "Open Tabs next to Current" +msgstr "Abrir Separadores perto do Actual" + +#: ../midori/midori-websettings.c:668 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Se abre novos separadores perto do actual ou após o último " + +#: ../midori/midori-websettings.c:676 +msgid "Open popups in tabs" +msgstr "Abrir popups em separadores" + +#: ../midori/midori-websettings.c:677 +msgid "Whether to open popup windows in tabs" +msgstr "Se abre janelas popup em separadores" + +#: ../midori/midori-websettings.c:693 +msgid "Zoom Text and Images" +msgstr "Zoom de Texto e Imagens" + +#: ../midori/midori-websettings.c:694 +msgid "Whether to zoom text and images" +msgstr "Se ajusta zoom de texto e imagens" + +#: ../midori/midori-websettings.c:709 +msgid "Find inline while typing" +msgstr "Encontrar ao escrever" + +#: ../midori/midori-websettings.c:710 +msgid "Whether to automatically find inline while typing" +msgstr "Se deve encontrar automaticamente ao escrever" + +#: ../midori/midori-websettings.c:718 +msgid "Accept cookies" +msgstr "Aceitar cookies" + +#: ../midori/midori-websettings.c:719 +msgid "What type of cookies to accept" +msgstr "Tipo de cookies a aceitar" + +#: ../midori/midori-websettings.c:728 +msgid "Original cookies only" +msgstr "Apenas cookies originais" + +#: ../midori/midori-websettings.c:729 +msgid "Accept cookies from the original website only" +msgstr "Aceitar cookies apenas do sítio web original" + +#: ../midori/midori-websettings.c:737 +msgid "Maximum cookie age" +msgstr "Antiguidade máxima de cookies" + +#: ../midori/midori-websettings.c:738 +msgid "The maximum number of days to save cookies for" +msgstr "Número máximo de dias para guardar cookies" + +#: ../midori/midori-websettings.c:748 +msgid "Remember last visited pages" +msgstr "Lembrar últimas páginas visitadas" + +#: ../midori/midori-websettings.c:749 +msgid "Whether the last visited pages are saved" +msgstr "Se as últimas páginas visitadas são guardadas" + +#: ../midori/midori-websettings.c:757 +msgid "Maximum history age" +msgstr "Antiguidade máxima do histórico" + +#: ../midori/midori-websettings.c:758 +msgid "The maximum number of days to save the history for" +msgstr "O número máximo de dias para guardar histórico" + +#: ../midori/midori-websettings.c:766 +msgid "Remember last form inputs" +msgstr "Lembrar dados de formulários" + +#: ../midori/midori-websettings.c:767 +msgid "Whether the last form inputs are saved" +msgstr "Se os dados de formulário são guardados" + +#: ../midori/midori-websettings.c:775 +msgid "Remember last downloaded files" +msgstr "Lembrar últimas transferências " + +#: ../midori/midori-websettings.c:776 +msgid "Whether the last downloaded files are saved" +msgstr "Se as últimas transferências são guardadas" + +#: ../midori/midori-websettings.c:786 +msgid "Proxy Server" +msgstr "Servidor Proxy" + +#: ../midori/midori-websettings.c:787 +msgid "The proxy server used for HTTP connections" +msgstr "Servidor proxy para ligações HTTP" + +#: ../midori/midori-websettings.c:802 +msgid "Detect proxy server automatically" +msgstr "Detectar servidor proxy automaticamente" + +#: ../midori/midori-websettings.c:803 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "Se deve detectar automaticamente o servidor proxy do ambiente" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:819 +msgid "Identify as" +msgstr "Identificar como" + +#: ../midori/midori-websettings.c:820 +msgid "What to identify as to web pages" +msgstr "Identificar nas páginas web como" + +#: ../midori/midori-websettings.c:836 +msgid "Identification string" +msgstr "Linha de Identificação" + +#: ../midori/midori-websettings.c:837 +msgid "The application identification string" +msgstr "A linha de identificação da aplicação" + +#: ../midori/midori-websettings.c:845 +msgid "Cache size" +msgstr "Tamanho de cache" + +#: ../midori/midori-websettings.c:846 +msgid "The allowed size of the cache" +msgstr "Tamanho de cache permitido" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:656 +#, c-format +msgid "Not found - %s" +msgstr "Não encontrada(o) - %s" + +#: ../midori/midori-view.c:988 +msgid "Open _Link" +msgstr "Abrir _Ligação" + +#: ../midori/midori-view.c:990 +msgid "Open Link in New _Tab" +msgstr "Abrir Ligação em Novo _Separador" + +#: ../midori/midori-view.c:1007 +msgid "Open Link in New _Window" +msgstr "Abrir Ligação em Nova _Janela" + +#: ../midori/midori-view.c:1016 +#: ../midori/midori-view.c:1030 +msgid "_Download Link destination" +msgstr "_Destino de Transferir Ligação" + +#: ../midori/midori-view.c:1022 +msgid "_Save Link destination" +msgstr "De_stino para Guardar Ligação" + +#: ../midori/midori-view.c:1053 +msgid "_Search the Web" +msgstr "_Pesquisar na Web" + +#: ../midori/midori-view.c:1062 +msgid "Open Address in New _Tab" +msgstr "Abrir Endereço em Novo _Separador" + +#: ../midori/midori-view.c:1201 +msgid "Open or download file" +msgstr "Abrir ou transferir ficheiro" + +#: ../midori/midori-view.c:1210 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "Tipo de ficheiro: %s ('%s')" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1214 +#, c-format +msgid "Open %s" +msgstr "Abrir %s" + +#: ../midori/midori-view.c:1610 +#, c-format +msgid "Inspect page - %s" +msgstr "Inspeccionar página - %s" + +#: ../midori/midori-view.c:1755 +#, c-format +msgid "Document cannot be displayed" +msgstr "O documento não pode ser apresentado" + +#: ../midori/midori-view.c:1771 +#, c-format +msgid "No documentation installed" +msgstr "Nenhuma documentação instalada" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Preferências para %s" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "Geral" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "Início" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "Usar página actual como página inicial" + +#: ../midori/midori-preferences.c:423 +#: ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "Transferências" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:462 +msgid "Appearance" +msgstr "Aparência" + +#: ../midori/midori-preferences.c:463 +msgid "Font settings" +msgstr "Definições de fontes" + +#: ../midori/midori-preferences.c:465 +msgid "Default Font Family" +msgstr "Família de Fontes Padrão" + +#: ../midori/midori-preferences.c:471 +msgid "The default font size used to display text" +msgstr "O tamanho padrão de fonte para apresentar texto" + +#: ../midori/midori-preferences.c:474 +msgid "Minimum Font Size" +msgstr "Tmanho Mínimo de Fonte" + +#: ../midori/midori-preferences.c:477 +msgid "The minimum font size used to display text" +msgstr "Tamanho mínimo de fonte para apresentar texto" + +#: ../midori/midori-preferences.c:484 +msgid "Encoding" +msgstr "Codificação" + +#: ../midori/midori-preferences.c:487 +msgid "The character encoding to use by default" +msgstr "A codificação de caracteres preferida" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:494 +msgid "Behavior" +msgstr "Comportamento" + +#: ../midori/midori-preferences.c:495 +msgid "Features" +msgstr "Funções" + +#: ../midori/midori-preferences.c:498 +#: ../extensions/statusbar-features.c:42 +msgid "Load images automatically" +msgstr "Carregar imagens automaticamente" + +#: ../midori/midori-preferences.c:499 +msgid "Load and display images automatically" +msgstr "Carregar e apresentar automaticamente as imagens " + +#: ../midori/midori-preferences.c:502 +msgid "Shrink images automatically" +msgstr "Encolher imagens automaticamente" + +#: ../midori/midori-preferences.c:503 +msgid "Automatically shrink standalone images to fit" +msgstr "Encolher imagens automaticamente" + +#: ../midori/midori-preferences.c:506 +msgid "Print background images" +msgstr "Imprimir imagens em segundo plano" + +#: ../midori/midori-preferences.c:507 +msgid "Whether background images should be printed" +msgstr "Se imagens em segundo plano devem ser impressas" + +#: ../midori/midori-preferences.c:510 +msgid "Resizable text areas" +msgstr "Áreas de texto dimensionáveis" + +#: ../midori/midori-preferences.c:511 +msgid "Whether text areas are resizable" +msgstr "Se as áreas de texto são redimensionáveis" + +#: ../midori/midori-preferences.c:514 +#: ../extensions/statusbar-features.c:49 +msgid "Enable scripts" +msgstr "Activar argumentos" + +#: ../midori/midori-preferences.c:515 +msgid "Enable embedded scripting languages" +msgstr "Activar argumentos de idiomas incorporados" + +#: ../midori/midori-preferences.c:518 +#: ../extensions/statusbar-features.c:56 +msgid "Enable plugins" +msgstr "Activar plugins" + +#: ../midori/midori-preferences.c:519 +msgid "Enable embedded plugin objects" +msgstr "Activar plugin de objectos incorporados" + +#: ../midori/midori-preferences.c:522 +msgid "Enforce 96 dots per inch" +msgstr "Forçar 96 pontos por polegalda" + +#: ../midori/midori-preferences.c:523 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Forçar densidade de vídeo de 96 PPP" + +#: ../midori/midori-preferences.c:526 +msgid "Enable developer tools" +msgstr "Activar ferramentas de desenvolvimento" + +#: ../midori/midori-preferences.c:527 +msgid "Enable special extensions for developers" +msgstr "Activar extensões especiais de desenvolvimento" + +#. Page "Interface" +#: ../midori/midori-preferences.c:539 +msgid "Interface" +msgstr "Interface" + +#: ../midori/midori-preferences.c:540 +msgid "Navigationbar" +msgstr "Barra de Navegação" + +#: ../midori/midori-preferences.c:549 +msgid "Browsing" +msgstr "Navegar" + +#. Page "Network" +#: ../midori/midori-preferences.c:579 +#: ../midori/midori-preferences.c:580 +msgid "Network" +msgstr "Rede" + +#: ../midori/midori-preferences.c:607 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:612 +msgid "Privacy" +msgstr "Privacidade" + +#: ../midori/midori-preferences.c:613 +msgid "Web Cookies" +msgstr "Web Cookies" + +#: ../midori/midori-preferences.c:626 +#: ../midori/midori-preferences.c:636 +msgid "days" +msgstr "dias" + +#: ../midori/midori-preferences.c:629 +#: ../panels/midori-history.c:104 +msgid "History" +msgstr "Histórico" + +#: ../midori/midori-searchaction.c:455 +#: ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "Vazio" + +#: ../midori/midori-searchaction.c:811 +msgid "Add search engine" +msgstr "Adicionar motor de pesquisa" + +#: ../midori/midori-searchaction.c:811 +msgid "Edit search engine" +msgstr "Editar motor de pesquisa" + +#: ../midori/midori-searchaction.c:839 +msgid "_Name:" +msgstr "_Nome:" + +#: ../midori/midori-searchaction.c:883 +msgid "_Icon:" +msgstr "_Icone:" + +#: ../midori/midori-searchaction.c:897 +msgid "_Token:" +msgstr "_Token:" + +#: ../midori/midori-searchaction.c:1077 +msgid "Manage Search Engines" +msgstr "Gerir Motores de Pesquisa" + +#: ../midori/sokoke.c:109 +#: ../midori/sokoke.c:121 +msgid "Could not run external program." +msgstr "Não é possível executar o programa externo." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:440 +msgid "Warning: You are using a superuser account!" +msgstr "Aviso: Está a utilizar uma conta de super utilizador!" + +#: ../midori/sokoke.c:771 +msgid "_Bookmark" +msgstr "_Marcador" + +#: ../midori/sokoke.c:773 +msgid "_Add Bookmark" +msgstr "_Adicionar Marcador" + +#: ../midori/sokoke.c:774 +msgid "_Console" +msgstr "_Consola" + +#: ../midori/sokoke.c:775 +msgid "_Extensions" +msgstr "_Extensões" + +#: ../midori/sokoke.c:776 +msgid "_History" +msgstr "_Histórico" + +#: ../midori/sokoke.c:777 +msgid "_Homepage" +msgstr "_Página Inicial" + +#: ../midori/sokoke.c:778 +msgid "_Userscripts" +msgstr "Argumentos de _Utilizador" + +#: ../midori/sokoke.c:779 +msgid "User_styles" +msgstr "E_stilos de Utilizador" + +#: ../midori/sokoke.c:780 +msgid "New _Tab" +msgstr "Novo _Separador" + +#: ../midori/sokoke.c:781 +msgid "_Transfers" +msgstr "_Transferências" + +#: ../midori/sokoke.c:782 +msgid "_Closed Tabs and Windows" +msgstr "Separadores e Janelas Fe_chadas" + +#: ../midori/sokoke.c:783 +msgid "New _Window" +msgstr "Nova _Janela" + +#: ../midori/gjs.c:743 +#: ../midori/gjs.c:833 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s não tem a propriedade '%s'" + +#: ../midori/gjs.c:879 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "Não pode assinar %s para %s.%s" + +#: ../midori/gjs.c:889 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s. Não pode aceder a %s" + +#: ../panels/midori-addons.c:95 +#: ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "Argumentos de Utilizador" + +#: ../panels/midori-addons.c:96 +#: ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "Estilos de utilizador" + +#: ../panels/midori-addons.c:922 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Activar" + +#: ../panels/midori-addons.c:923 +#: ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "Activar" + +#: ../panels/midori-addons.c:932 +#: ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "_Desactivar" + +#: ../panels/midori-addons.c:933 +#: ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "Desactivar" + +#: ../panels/midori-bookmarks.c:103 +msgid "Bookmarks" +msgstr "Marcadores" + +#: ../panels/midori-bookmarks.c:236 +msgid "Edit the selected bookmark" +msgstr "Editar marcador seleccionado" + +#: ../panels/midori-bookmarks.c:244 +msgid "Delete the selected bookmark" +msgstr "Eliminar marcador seleccionado" + +#: ../panels/midori-bookmarks.c:257 +msgid "Add a new folder" +msgstr "Adicionar nova pasta" + +#: ../panels/midori-bookmarks.c:589 +msgid "Separator" +msgstr "Separador" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Consola" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Extensões" + +#: ../panels/midori-history.c:159 +msgid "Are you sure you want to remove all history items?" +msgstr "Tem a certeza que quer remover todo o histórico?" + +#: ../panels/midori-history.c:216 +msgid "Bookmark the selected history item" +msgstr "Marcar o item de histórico seleccionado" + +#: ../panels/midori-history.c:225 +msgid "Delete the selected history item" +msgstr "Eliminar item de histórico seleccionado" + +#: ../panels/midori-history.c:233 +msgid "Clear the entire history" +msgstr "Limpar todo o histórico" + +#: ../panels/midori-history.c:603 +#, c-format +msgid "A week ago" +msgstr "Uma semana atrás" + +#: ../panels/midori-history.c:609 +#, c-format +msgid "%d days ago" +msgstr "%d dias atrás" + +#: ../panels/midori-history.c:616 +msgid "Today" +msgstr "Hoje" + +#: ../panels/midori-history.c:618 +msgid "Yesterday" +msgstr "Ontem" + +#: ../panels/midori-plugins.c:87 +#: ../extensions/statusbar-features.c:54 +msgid "Plugins" +msgstr "Plugins" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "%s de %s" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "Autenticação Necessária " + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Precisa de um nome de utilizador e uma palavra-passe\n" +"para abrir esta localização:" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "Nome de Utilizador" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "Palavra-passe" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "O ícone '%s' não foi carregado" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "O ícone '%s' não foi carregado" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "As frames de animação estão corrompidas" + +#: ../katze/katze-utils.c:180 +#: ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Propriedade %s' é inválida para %s" + +#: ../katze/katze-utils.c:209 +#: ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "Escolha ficheiro" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "Escolha pasta" + +#: ../extensions/colorful-tabs.c:97 +msgid "Tint tabs distinctly" +msgstr "Cor distinta de separadores" + +#: ../extensions/colorful-tabs.c:133 +msgid "Colorful Tabs" +msgstr "Separadores Coloridos" + +#: ../extensions/colorful-tabs.c:134 +msgid "Tint each tab distinctly" +msgstr "Cor distinta para cada separador" + +#: ../extensions/mouse-gestures/main.c:176 +msgid "Mouse Gestures" +msgstr "Gestos de Rato" + +#: ../extensions/mouse-gestures/main.c:177 +msgid "Control Midori by moving the mouse" +msgstr "Controlar Midori movendo o rato" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 +#: ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "Titular de Página" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "Titular de _Página" + +#: ../extensions/statusbar-features.c:40 +msgid "Images" +msgstr "Imagens" + +#: ../extensions/statusbar-features.c:47 +msgid "Scripts" +msgstr "Argumentos" + +#~ msgid "Source" +#~ msgstr "Origem" +#~ msgid "URIs" +#~ msgstr "URIs" +#~ msgid "[URIs]" +#~ msgstr "[URIs]" +#~ msgid "_URL:" +#~ msgstr "_URL:" +#~ msgid "Root" +#~ msgstr "Administrador" +#~ msgid "HTTP Proxy" +#~ msgstr "HTTP Proxy" +#~ msgid "Open URL in New _Tab" +#~ msgstr "Abrir URL em Novo _Separador" +#~ msgid "_Icon (name or file):" +#~ msgstr "_Ícone (nome ou ficheiro):" +#~ msgid "Manage search engines" +#~ msgstr "Gerir motores de procura" + diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..d04623f3 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,2023 @@ +# Russian translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Troitskiy Nikita 2008 +# Anton Shestakov 2008-2009 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-04-19 20:03+0900\n" +"PO-Revision-Date: 2009-04-19 20:46+0800\n" +"Last-Translator: Anton Shestakov \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Легковесный Интернет-обозреватель" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1288 +#: ../midori/main.c:1388 +#: ../midori/main.c:1396 +#: ../midori/main.c:1407 +#: ../midori/midori-websettings.c:273 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Интернет-обозреватель" + +#: ../midori/main.c:94 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Не удалось загрузить настройки: %s\n" + +#: ../midori/main.c:149 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Значение «%s» недействительно для %s" + +#: ../midori/main.c:156 +#: ../midori/main.c:228 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Недопустимое значение параметра: «%s»" + +#: ../midori/main.c:332 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Не удалось открыть базу данных: %s\n" + +#: ../midori/main.c:364 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "Не удалось выполнить запрос к базе данных: %s\n" + +#: ../midori/main.c:418 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Не удалось удалить запись из журнала: %s\n" + +#: ../midori/main.c:442 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Не удалось очистить журнал: %s\n" + +#: ../midori/main.c:465 +#: ../midori/main.c:499 +#: ../midori/main.c:515 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Не удалось добавить запись в журнал: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:694 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Не удалось удалить устаревшие записи из журнала: %s\n" + +#: ../midori/main.c:722 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Не удалось сохранить настройки. %s" + +#: ../midori/main.c:751 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Не удалось сохранить средства поиска. %s" + +#: ../midori/main.c:770 +#: ../midori/main.c:798 +#: ../midori/main.c:827 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Не удалось сохранить закладки. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:850 +#: ../midori/main.c:873 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Не удалось сохранить содержимое корзины. %s" + +#: ../midori/main.c:946 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Не удалось сохранить сеанс. %s" + +#: ../midori/main.c:1073 +msgid "Midori seems to have crashed the last time it was opened. If this happened repeatedly, try one of the following options to solve the problem." +msgstr "Возможно, работа Midori была аварийно прекращена. Если это часто повторяется, можно выбрать действие для решения проблемы ниже." + +#: ../midori/main.c:1088 +msgid "Modify _preferences" +msgstr "Изменить _параметры" + +#: ../midori/main.c:1092 +msgid "Reset the last _session" +msgstr "Удалить _данные последнего сеанса" + +#: ../midori/main.c:1097 +msgid "Disable all _extensions" +msgstr "Отключить все _расширения" + +#: ../midori/main.c:1288 +msgid "No filename specified" +msgstr "Имя файла не задано" + +#: ../midori/main.c:1311 +msgid "An unknown error occured." +msgstr "Обнаружена неизвестная ошибка" + +#: ../midori/main.c:1336 +msgid "Run ADDRESS as a web application" +msgstr "Запустить АДРЕС как веб-приложение" + +#: ../midori/main.c:1336 +msgid "ADDRESS" +msgstr "АДРЕС" + +#: ../midori/main.c:1338 +msgid "Use FOLDER as configuration folder" +msgstr "Использовать файлы параметров из ПАПКИ" + +#: ../midori/main.c:1338 +msgid "FOLDER" +msgstr "ПАПКА" + +#: ../midori/main.c:1340 +msgid "Run the specified filename as javascript" +msgstr "Выполнить указанный файл как javascript" + +#: ../midori/main.c:1342 +msgid "Display program version" +msgstr "Отобразить версию программы" + +#: ../midori/main.c:1344 +msgid "Addresses" +msgstr "Адреса" + +#: ../midori/main.c:1385 +msgid "[Addresses]" +msgstr "[Адреса]" + +#: ../midori/main.c:1408 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Предложения, комментарии и сообщения об ошибках направляйте по адресу:" + +#: ../midori/main.c:1410 +msgid "Check for new versions at:" +msgstr "Искать обновления на:" + +#: ../midori/main.c:1454 +msgid "The specified configuration folder is invalid." +msgstr "Указана некорректная папка файлов параметров." + +#: ../midori/main.c:1489 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Midori уже запущена, но не отвечает.\n" + +#: ../midori/main.c:1539 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "Не удалось загрузить средства поиска. %s\n" + +#: ../midori/main.c:1551 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Не удалось загрузить закладки: %s\n" + +#: ../midori/main.c:1566 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Не удалось загрузить сеанс: %s\n" + +#: ../midori/main.c:1579 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Не удалось загрузить содержимое корзины: %s\n" + +#: ../midori/main.c:1592 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Не удалось загрузить журнал: %s\n" + +#: ../midori/main.c:1604 +msgid "The following errors occured:" +msgstr "Обнаружены следующие ошибки:" + +#: ../midori/main.c:1620 +msgid "_Ignore" +msgstr "_Игнорировать" + +#: ../midori/midori-array.c:195 +msgid "File not found." +msgstr "Файл не найден." + +#: ../midori/midori-array.c:203 +#: ../midori/midori-array.c:212 +msgid "Malformed document." +msgstr "Плохо сформированный документ." + +#: ../midori/midori-array.c:338 +#: ../midori/sokoke.c:625 +#, c-format +msgid "Writing failed." +msgstr "Ошибка записи." + +#: ../midori/midori-browser.c:280 +#: ../midori/midori-browser.c:3368 +#: ../midori/midori-browser.c:3374 +msgid "Reload the current page" +msgstr "Обновить страницу" + +#: ../midori/midori-browser.c:291 +#: ../midori/midori-browser.c:3371 +msgid "Stop loading the current page" +msgstr "Прекратить загрузку страницы" + +#: ../midori/midori-browser.c:353 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% загружено" + +#: ../midori/midori-browser.c:378 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Неожиданное действие «%s»." + +#: ../midori/midori-browser.c:541 +msgid "New folder" +msgstr "Создание папки" + +#: ../midori/midori-browser.c:541 +msgid "Edit folder" +msgstr "Изменить папку" + +#: ../midori/midori-browser.c:543 +msgid "New bookmark" +msgstr "Новая закладка" + +#: ../midori/midori-browser.c:543 +msgid "Edit bookmark" +msgstr "Изменение закладки" + +#: ../midori/midori-browser.c:573 +msgid "_Title:" +msgstr "_Заголовок:" + +#: ../midori/midori-browser.c:586 +#: ../midori/midori-searchaction.c:948 +msgid "_Description:" +msgstr "_Описание:" + +#: ../midori/midori-browser.c:605 +#: ../midori/midori-searchaction.c:962 +msgid "_Address:" +msgstr "_Адрес:" + +#: ../midori/midori-browser.c:624 +msgid "_Folder:" +msgstr "_Папка:" + +#: ../midori/midori-browser.c:629 +#: ../midori/midori-browser.c:670 +msgid "Toplevel folder" +msgstr "Корневая папка" + +#: ../midori/midori-browser.c:746 +msgid "Save file as" +msgstr "Сохранить файл как" + +#: ../midori/midori-browser.c:1523 +msgid "Open file" +msgstr "Открыть файл" + +#: ../midori/midori-browser.c:2803 +#: ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:809 +msgid "Open all in _Tabs" +msgstr "Открыть всё в отдельных _вкладках" + +#: ../midori/midori-browser.c:2810 +#: ../panels/midori-bookmarks.c:788 +#: ../panels/midori-history.c:815 +msgid "Open in New _Tab" +msgstr "Открыть в новой _вкладке" + +#: ../midori/midori-browser.c:2813 +#: ../panels/midori-bookmarks.c:790 +#: ../panels/midori-history.c:817 +msgid "Open in New _Window" +msgstr "Открыть в новом _окне" + +#: ../midori/midori-browser.c:2974 +msgid "Clear Private Data" +msgstr "Удаление личных данных" + +#: ../midori/midori-browser.c:2977 +msgid "_Clear private data" +msgstr "_Удалить личные данные" + +#: ../midori/midori-browser.c:2990 +msgid "Clear the following data:" +msgstr "Удалить следующие данные:" + +#: ../midori/midori-browser.c:2998 +#: ../midori/midori-preferences.c:639 +#: ../panels/midori-history.c:108 +msgid "History" +msgstr "Журнал" + +#: ../midori/midori-browser.c:3001 +msgid "Cookies" +msgstr "Фрагменты данных" + +#: ../midori/midori-browser.c:3004 +msgid "'Flash' Cookies" +msgstr "Фрагменты данных Flash" + +#: ../midori/midori-browser.c:3007 +msgid "Website icons" +msgstr "Значки веб-сайтов" + +#: ../midori/midori-browser.c:3093 +msgid "A lightweight web browser." +msgstr "Легковесный Интернет-обозреватель." + +#: ../midori/midori-browser.c:3101 +msgid "translator-credits" +msgstr "" +"Troitskiy Nikita \n" +"Anton Shestakov " + +#: ../midori/midori-browser.c:3302 +msgid "_File" +msgstr "_Файл" + +#: ../midori/midori-browser.c:3305 +msgid "Open a new window" +msgstr "Открыть в новом окне" + +#: ../midori/midori-browser.c:3308 +msgid "Open a new tab" +msgstr "Открыть в новой вкладке" + +#: ../midori/midori-browser.c:3311 +msgid "Open a file" +msgstr "Открыть файл" + +#: ../midori/midori-browser.c:3314 +msgid "Save to a file" +msgstr "Сохранить в файл" + +#: ../midori/midori-browser.c:3316 +msgid "_Close Tab" +msgstr "_Закрыть вкладку" + +#: ../midori/midori-browser.c:3317 +msgid "Close the current tab" +msgstr "Закрыть данную вкладку" + +#: ../midori/midori-browser.c:3319 +msgid "C_lose Window" +msgstr "З_акрыть окно" + +#: ../midori/midori-browser.c:3320 +msgid "Close this window" +msgstr "Закрыть данное окно" + +#: ../midori/midori-browser.c:3323 +msgid "Print the current page" +msgstr "Распечатать страницу" + +#: ../midori/midori-browser.c:3326 +msgid "Quit the application" +msgstr "Выйти из программы" + +#: ../midori/midori-browser.c:3328 +msgid "_Edit" +msgstr "_Правка" + +#: ../midori/midori-browser.c:3331 +msgid "Cut the selected text" +msgstr "Вырезать выделенный текст" + +#: ../midori/midori-browser.c:3334 +#: ../midori/midori-browser.c:3337 +msgid "Copy the selected text" +msgstr "Копировать выделенный текст" + +#: ../midori/midori-browser.c:3340 +msgid "Paste text from the clipboard" +msgstr "Вставить текст из буфера обмена" + +#: ../midori/midori-browser.c:3343 +msgid "Delete the selected text" +msgstr "Удалить выделенный текст" + +#: ../midori/midori-browser.c:3346 +msgid "Select all text" +msgstr "Выделить весь текст" + +#: ../midori/midori-browser.c:3349 +msgid "Find a word or phrase in the page" +msgstr "Поиск слова или фразы на странице" + +#: ../midori/midori-browser.c:3351 +msgid "Find _Next" +msgstr "Найти _следующее" + +#: ../midori/midori-browser.c:3352 +msgid "Find the next occurrence of a word or phrase" +msgstr "Найти следующее местонахождение слова или фразы" + +#: ../midori/midori-browser.c:3354 +msgid "Find _Previous" +msgstr "Найти _предыдущее" + +#: ../midori/midori-browser.c:3355 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Найти предыдущее местонахождение слова или фразы" + +#: ../midori/midori-browser.c:3358 +msgid "_Quick Find" +msgstr "_Быстрый поиск" + +#: ../midori/midori-browser.c:3359 +msgid "Quickly jump to a word or phrase" +msgstr "Перейти на слово или фразу" + +#: ../midori/midori-browser.c:3362 +msgid "Configure the application preferences" +msgstr "Настройка приложения" + +#: ../midori/midori-browser.c:3364 +msgid "_View" +msgstr "_Вид" + +#: ../midori/midori-browser.c:3365 +msgid "_Toolbars" +msgstr "_Панели инструментов" + +#: ../midori/midori-browser.c:3377 +msgid "Increase the zoom level" +msgstr "Увеличить масштаб" + +#: ../midori/midori-browser.c:3380 +msgid "Decrease the zoom level" +msgstr "Уменьшить масштаб" + +#: ../midori/midori-browser.c:3383 +msgid "Reset the zoom level" +msgstr "Сбросить значение масштаба" + +#: ../midori/midori-browser.c:3384 +msgid "_Encoding" +msgstr "_Кодировка" + +#: ../midori/midori-browser.c:3386 +msgid "_Automatic" +msgstr "_Автоматически" + +#: ../midori/midori-browser.c:3389 +#: ../midori/midori-websettings.c:200 +msgid "Chinese (BIG5)" +msgstr "Китайская (BIG5)" + +#: ../midori/midori-browser.c:3392 +#: ../midori/midori-websettings.c:201 +msgid "Japanese (SHIFT_JIS)" +msgstr "Японская (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3395 +#: ../midori/midori-websettings.c:202 +msgid "Russian (KOI8-R)" +msgstr "Кириллица (KOI8-R)" + +#: ../midori/midori-browser.c:3398 +#: ../midori/midori-websettings.c:203 +msgid "Unicode (UTF-8)" +msgstr "Юникод (UTF-8)" + +#: ../midori/midori-browser.c:3401 +#: ../midori/midori-websettings.c:204 +msgid "Western (ISO-8859-1)" +msgstr "Западно-европейская (ISO-8859-1)" + +#: ../midori/midori-browser.c:3404 +#: ../midori/midori-websettings.c:205 +#: ../midori/midori-websettings.c:277 +msgid "Custom..." +msgstr "Другая..." + +#: ../midori/midori-browser.c:3407 +#: ../midori/midori-view.c:1138 +msgid "View _Source" +msgstr "Ис_ходный код страницы" + +#: ../midori/midori-browser.c:3408 +msgid "View the source code of the page" +msgstr "Просмотр исходного кода страницы" + +#: ../midori/midori-browser.c:3410 +msgid "View Selection Source" +msgstr "Исходный код выделенного фрагмента" + +#: ../midori/midori-browser.c:3411 +msgid "View the source code of the selection" +msgstr "Просмотр исходного кода выделенного фрагмента" + +#: ../midori/midori-browser.c:3415 +msgid "Toggle fullscreen view" +msgstr "Переключить полноэкранный режим" + +#: ../midori/midori-browser.c:3417 +msgid "_Go" +msgstr "П_ереход" + +#: ../midori/midori-browser.c:3420 +msgid "Go back to the previous page" +msgstr "На предыдущую страницу" + +#: ../midori/midori-browser.c:3423 +msgid "Go forward to the next page" +msgstr "На следующую страницу" + +#: ../midori/midori-browser.c:3426 +msgid "Go to your homepage" +msgstr "На домашнюю страницу" + +#: ../midori/midori-browser.c:3428 +msgid "Empty Trash" +msgstr "Очистить" + +#: ../midori/midori-browser.c:3429 +msgid "Delete the contents of the trash" +msgstr "Удалить содержимое корзины" + +#: ../midori/midori-browser.c:3431 +#: ../midori/midori-view.c:1110 +msgid "Undo Close Tab" +msgstr "Отменить закрытие вкладок" + +#: ../midori/midori-browser.c:3432 +msgid "Open the last closed tab" +msgstr "Открыть последнюю закрытую вкладку" + +#: ../midori/midori-browser.c:3436 +#: ../panels/midori-bookmarks.c:232 +msgid "Add a new bookmark" +msgstr "Новая закладка" + +#: ../midori/midori-browser.c:3438 +#: ../panels/midori-bookmarks.c:261 +msgid "Add a new folder" +msgstr "Создать папку" + +#: ../midori/midori-browser.c:3439 +msgid "Add a new bookmark folder" +msgstr "Создать папку закладок" + +#: ../midori/midori-browser.c:3440 +msgid "_Tools" +msgstr "_Инструменты" + +#: ../midori/midori-browser.c:3442 +#: ../midori/midori-searchaction.c:493 +msgid "_Manage Search Engines" +msgstr "_Управление средствами поиска" + +#: ../midori/midori-browser.c:3443 +msgid "Add, edit and remove search engines..." +msgstr "Добавление, правка и удаление средства поиска..." + +#: ../midori/midori-browser.c:3446 +msgid "_Clear Private Data" +msgstr "Уда_лить личные данные" + +#: ../midori/midori-browser.c:3447 +msgid "Clear private data..." +msgstr "Удалить личные данные..." + +#: ../midori/midori-browser.c:3451 +msgid "_Previous Tab" +msgstr "_Предыдущая вкладка" + +#: ../midori/midori-browser.c:3452 +msgid "Switch to the previous tab" +msgstr "Переключиться на предыдущую вкладку" + +#: ../midori/midori-browser.c:3454 +msgid "_Next Tab" +msgstr "_Следующая вкладка" + +#: ../midori/midori-browser.c:3455 +msgid "Switch to the next tab" +msgstr "Переключиться на следующую вкладку" + +#: ../midori/midori-browser.c:3457 +msgid "_Help" +msgstr "_Справка" + +#: ../midori/midori-browser.c:3459 +msgid "_Contents" +msgstr "_Содержание" + +#: ../midori/midori-browser.c:3460 +msgid "Show the documentation" +msgstr "Документация" + +#: ../midori/midori-browser.c:3462 +msgid "_Frequent Questions" +msgstr "_Часто задаваемые вопросы" + +#: ../midori/midori-browser.c:3463 +msgid "Show the Frequently Asked Questions" +msgstr "Часто задаваемые вопросы (в сети)" + +#: ../midori/midori-browser.c:3465 +msgid "_Report a Bug" +msgstr "Соо_бщить об ошибке" + +#: ../midori/midori-browser.c:3466 +msgid "Open Midori's bug tracker" +msgstr "Открыть систему отчётов об ошибках Midori" + +#: ../midori/midori-browser.c:3469 +msgid "Show information about the program" +msgstr "О программе" + +#: ../midori/midori-browser.c:3476 +msgid "P_rivate Browsing" +msgstr "Кон_фиденциальный режим" + +#: ../midori/midori-browser.c:3477 +msgid "Don't save any private data while browsing" +msgstr "Не сохранять персональные данные во время навигации" + +#: ../midori/midori-browser.c:3482 +msgid "_Menubar" +msgstr "Панель _меню" + +#: ../midori/midori-browser.c:3483 +msgid "Show menubar" +msgstr "Показать строку меню" + +#: ../midori/midori-browser.c:3486 +msgid "_Navigationbar" +msgstr "Панель _навигации" + +#: ../midori/midori-browser.c:3487 +msgid "Show navigationbar" +msgstr "Показать панель навигации" + +#: ../midori/midori-browser.c:3490 +msgid "Side_panel" +msgstr "_Боковая панель" + +#: ../midori/midori-browser.c:3491 +msgid "Show sidepanel" +msgstr "Показать боковую панель" + +#: ../midori/midori-browser.c:3494 +msgid "_Bookmarkbar" +msgstr "Панель _закладок" + +#: ../midori/midori-browser.c:3495 +msgid "Show bookmarkbar" +msgstr "Показать панель закладок" + +#: ../midori/midori-browser.c:3498 +msgid "_Transferbar" +msgstr "П_ередачи" + +#: ../midori/midori-browser.c:3499 +msgid "Show transferbar" +msgstr "Показать вкладку передачи" + +#: ../midori/midori-browser.c:3502 +msgid "_Statusbar" +msgstr "Панель _состояния" + +#: ../midori/midori-browser.c:3503 +msgid "Show statusbar" +msgstr "Показать панель состояния" + +#: ../midori/midori-browser.c:3937 +msgid "_Separator" +msgstr "_Разделитель" + +#: ../midori/midori-browser.c:3944 +msgid "_Location..." +msgstr "_Адрес..." + +#: ../midori/midori-browser.c:3946 +msgid "Open a particular location" +msgstr "Открыть определённый адрес" + +#: ../midori/midori-browser.c:3970 +msgid "_Web Search..." +msgstr "_Поиск в сети..." + +#: ../midori/midori-browser.c:3972 +msgid "Run a web search" +msgstr "Запустить поиск в сети" + +#: ../midori/midori-browser.c:3993 +msgid "Reopen a previously closed tab or window" +msgstr "Открыть ранее закрытые вкладки или окна" + +#: ../midori/midori-browser.c:4006 +msgid "_Recently visited pages" +msgstr "_Недавно посещённые страницы" + +#: ../midori/midori-browser.c:4008 +msgid "Reopen pages that you visited earlier" +msgstr "Открывать страницы, посещённые ранее" + +#: ../midori/midori-browser.c:4021 +#: ../midori/sokoke.c:781 +msgid "_Bookmarks" +msgstr "_Закладки" + +#: ../midori/midori-browser.c:4023 +msgid "Show the saved bookmarks" +msgstr "Показать все сохранённые закладки" + +#: ../midori/midori-browser.c:4036 +msgid "_Window" +msgstr "_Окно" + +#: ../midori/midori-browser.c:4038 +msgid "Show a list of all open tabs" +msgstr "Показать список всех открытых вкладок" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4205 +msgid "_Inline Find:" +msgstr "_Найти:" + +#: ../midori/midori-browser.c:4230 +msgid "Previous" +msgstr "Назад" + +#: ../midori/midori-browser.c:4235 +msgid "Next" +msgstr "Далее" + +#: ../midori/midori-browser.c:4240 +msgid "Match Case" +msgstr "Учитывать регистр" + +#: ../midori/midori-browser.c:4248 +msgid "Highlight Matches" +msgstr "Подсветить совпадения" + +#: ../midori/midori-browser.c:4258 +msgid "Close Findbar" +msgstr "Закрыть вкладку поиска" + +#: ../midori/midori-browser.c:4598 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Неожиданный параметр «%s»" + +#: ../midori/midori-panel.c:309 +msgid "Detach chosen panel from the window" +msgstr "Отсоединить выбранную панель от главного окна" + +#: ../midori/midori-panel.c:311 +msgid "Whether to detach the chosen panel from the window" +msgstr "Отсоединить выбранную панель от главного окна" + +#: ../midori/midori-panel.c:321 +#: ../midori/midori-websettings.c:531 +msgid "Align sidepanel on the right" +msgstr "Расположить панель справа" + +#: ../midori/midori-panel.c:323 +#: ../midori/midori-websettings.c:532 +msgid "Whether to align the sidepanel on the right" +msgstr "Расположить боковую панель справа" + +#: ../midori/midori-panel.c:333 +#: ../midori/midori-panel.c:334 +msgid "Close panel" +msgstr "Закрыть панель" + +#: ../midori/midori-websettings.c:183 +#: ../midori/midori-view.c:1949 +msgid "Blank page" +msgstr "Пустая страница" + +#: ../midori/midori-websettings.c:184 +#: ../midori/midori-websettings.c:551 +msgid "Homepage" +msgstr "Домашняя страница" + +#: ../midori/midori-websettings.c:185 +msgid "Last open pages" +msgstr "Последние открытые страницы" + +#: ../midori/midori-websettings.c:220 +msgid "New tab" +msgstr "Новая вкладка" + +#: ../midori/midori-websettings.c:221 +msgid "New window" +msgstr "Новое окно" + +#: ../midori/midori-websettings.c:222 +msgid "Current tab" +msgstr "Текущая вкладка" + +#: ../midori/midori-websettings.c:237 +msgid "Default" +msgstr "По умолчанию" + +#: ../midori/midori-websettings.c:238 +msgid "Icons" +msgstr "Только значки" + +#: ../midori/midori-websettings.c:239 +msgid "Text" +msgstr "Только текст" + +#: ../midori/midori-websettings.c:240 +msgid "Both" +msgstr "Значки и текст" + +#: ../midori/midori-websettings.c:241 +msgid "Both horizontal" +msgstr "Значки и текст горизонтально" + +#: ../midori/midori-websettings.c:256 +msgid "All cookies" +msgstr "Все" + +#: ../midori/midori-websettings.c:257 +msgid "Session cookies" +msgstr "С информацией о сеансе" + +#: ../midori/midori-websettings.c:258 +#: ../panels/midori-addons.c:94 +msgid "None" +msgstr "Нет" + +#: ../midori/midori-websettings.c:274 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:275 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:276 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:329 +msgid "Remember last window size" +msgstr "Запоминать размер последнего окна" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to save the last window size" +msgstr "Запоминать последний размер окна" + +#: ../midori/midori-websettings.c:338 +msgid "Last window width" +msgstr "Ширина последнего окна" + +#: ../midori/midori-websettings.c:339 +msgid "The last saved window width" +msgstr "Ширина последнего сохранённого окна" + +#: ../midori/midori-websettings.c:347 +msgid "Last window height" +msgstr "Высота последнего сохранённого окна" + +#: ../midori/midori-websettings.c:348 +msgid "The last saved window height" +msgstr "Высота последнего сохранённого окна" + +#: ../midori/midori-websettings.c:373 +msgid "Last panel position" +msgstr "Позиция последней панели" + +#: ../midori/midori-websettings.c:374 +msgid "The last saved panel position" +msgstr "Последняя сохранённая позиция панели" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:383 +msgid "Last panel page" +msgstr "Последняя страница панели" + +#: ../midori/midori-websettings.c:384 +msgid "The last saved panel page" +msgstr "Последняя сохранённая страница панели" + +#: ../midori/midori-websettings.c:392 +msgid "Last Web search" +msgstr "Последний поиск" + +#: ../midori/midori-websettings.c:393 +msgid "The last saved Web search" +msgstr "Последний сохранённый поиск в сети" + +#: ../midori/midori-websettings.c:402 +msgid "Show Menubar" +msgstr "Показать меню" + +#: ../midori/midori-websettings.c:403 +msgid "Whether to show the menubar" +msgstr "Показывать панель меню" + +#: ../midori/midori-websettings.c:411 +msgid "Show Navigationbar" +msgstr "Показать панель навигации" + +#: ../midori/midori-websettings.c:412 +msgid "Whether to show the navigationbar" +msgstr "Показывать панель навигации" + +#: ../midori/midori-websettings.c:420 +msgid "Show Bookmarkbar" +msgstr "Показать закладки" + +#: ../midori/midori-websettings.c:421 +msgid "Whether to show the bookmarkbar" +msgstr "Показывать закладки" + +#: ../midori/midori-websettings.c:429 +msgid "Show Panel" +msgstr "Показать панель" + +#: ../midori/midori-websettings.c:430 +msgid "Whether to show the panel" +msgstr "Показывать панель" + +#: ../midori/midori-websettings.c:445 +msgid "Show Transferbar" +msgstr "Показать панель передач" + +#: ../midori/midori-websettings.c:446 +msgid "Whether to show the transferbar" +msgstr "Показывать панель передач" + +#: ../midori/midori-websettings.c:454 +msgid "Show Statusbar" +msgstr "Показать панель состояния" + +#: ../midori/midori-websettings.c:455 +msgid "Whether to show the statusbar" +msgstr "Показывать панель состояния" + +#: ../midori/midori-websettings.c:464 +msgid "Toolbar Style" +msgstr "Стиль панели инструментов" + +#: ../midori/midori-websettings.c:465 +msgid "The style of the toolbar" +msgstr "Стиль панели инструментов" + +#: ../midori/midori-websettings.c:481 +msgid "Show progress in location entry" +msgstr "Показывать прогресс загрузки страницы в адресной строке" + +#: ../midori/midori-websettings.c:482 +msgid "Whether to show loading progress in the location entry" +msgstr "Показывать ход загрузки страницы в виде полосы в адресной строке" + +#: ../midori/midori-websettings.c:497 +msgid "Search engines in location completion" +msgstr "Показывать средства поиска при автодополнении адреса" + +#: ../midori/midori-websettings.c:498 +msgid "Whether to show search engines in the location completion" +msgstr "Показывать средства поиска при вводе текста в адресную строку" + +#: ../midori/midori-websettings.c:506 +msgid "Toolbar Items" +msgstr "Элементы панели навигации" + +#: ../midori/midori-websettings.c:507 +msgid "The items to show on the toolbar" +msgstr "Элементы, которые будут показаны на панели инструментов" + +#: ../midori/midori-websettings.c:515 +msgid "Compact Sidepanel" +msgstr "Компактная боковая панель" + +#: ../midori/midori-websettings.c:516 +msgid "Whether to make the sidepanel compact" +msgstr "Не показывать подписи к значкам в боковой панели" + +#: ../midori/midori-websettings.c:541 +msgid "Load on Startup" +msgstr "Загружать при запуске" + +#: ../midori/midori-websettings.c:542 +msgid "What to load on startup" +msgstr "Загружать при запуске" + +#: ../midori/midori-websettings.c:552 +msgid "The homepage" +msgstr "Домашняя страница" + +#: ../midori/midori-websettings.c:567 +msgid "Show crash dialog" +msgstr "Показывать окно после сбоя" + +#: ../midori/midori-websettings.c:568 +msgid "Show a dialog after Midori crashed" +msgstr "Показывать окно действий после аварийного завершения работы" + +#: ../midori/midori-websettings.c:576 +msgid "Download Folder" +msgstr "Каталог загрузок" + +#: ../midori/midori-websettings.c:577 +msgid "The folder downloaded files are saved to" +msgstr "Каталог, в который будут сохраняться файлы" + +#: ../midori/midori-websettings.c:589 +msgid "Download Manager" +msgstr "Менеджер загрузок" + +#: ../midori/midori-websettings.c:590 +msgid "An external download manager" +msgstr "Внешний администратор загрузок" + +#: ../midori/midori-websettings.c:598 +msgid "Text Editor" +msgstr "Текстовый редактор" + +#: ../midori/midori-websettings.c:599 +msgid "An external text editor" +msgstr "Пользовательский текстовый редактор" + +#: ../midori/midori-websettings.c:614 +msgid "News Aggregator" +msgstr "" + +#: ../midori/midori-websettings.c:615 +#, fuzzy +msgid "An external news aggregator" +msgstr "Пользовательский текстовый редактор" + +#: ../midori/midori-websettings.c:623 +msgid "Location entry Search" +msgstr "Поиск из адресной строки" + +#: ../midori/midori-websettings.c:624 +msgid "The search to perform inside the location entry" +msgstr "Поиск, производимый при вводе фразы в адресную строку" + +#: ../midori/midori-websettings.c:632 +msgid "Preferred Encoding" +msgstr "Предпочтительная кодировка" + +#: ../midori/midori-websettings.c:633 +msgid "The preferred character encoding" +msgstr "Предпочтительная кодировка символов" + +#: ../midori/midori-websettings.c:643 +msgid "Always Show Tabbar" +msgstr "Всегда показывать строку вкладок" + +#: ../midori/midori-websettings.c:644 +msgid "Always show the tabbar" +msgstr "Всегда показывать строку закладок" + +#: ../midori/midori-websettings.c:652 +msgid "Close Buttons on Tabs" +msgstr "Кнопки закрытия на вкладках" + +#: ../midori/midori-websettings.c:653 +msgid "Whether tabs have close buttons" +msgstr "Наличие кнопки закрытия на вкладках" + +#: ../midori/midori-websettings.c:661 +msgid "Open new pages in" +msgstr "Открывать новую страницу в" + +#: ../midori/midori-websettings.c:662 +msgid "Where to open new pages" +msgstr "Расположение новых страниц при открытии" + +#: ../midori/midori-websettings.c:671 +msgid "Open external pages in" +msgstr "Открывать внешние страницы в" + +#: ../midori/midori-websettings.c:672 +msgid "Where to open externally opened pages" +msgstr "Расположение сторонних страниц при открытии" + +#: ../midori/midori-websettings.c:685 +msgid "Middle click opens Selection" +msgstr "Переходить на выделенный адрес по средней кнопке" + +#: ../midori/midori-websettings.c:686 +msgid "Load an address from the selection via middle click" +msgstr "Загружать выделенный адрес средней кнопкой мыши" + +#: ../midori/midori-websettings.c:694 +msgid "Open tabs in the background" +msgstr "Открывать вкладки в фоне" + +#: ../midori/midori-websettings.c:695 +msgid "Whether to open new tabs in the background" +msgstr "Открывать новые вкладки в фоне" + +#: ../midori/midori-websettings.c:703 +msgid "Open Tabs next to Current" +msgstr "Открывать новые вкладки рядом с текущей" + +#: ../midori/midori-websettings.c:704 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "Открывать новую вкладку в следующей за данной или за последней" + +#: ../midori/midori-websettings.c:712 +msgid "Open popups in tabs" +msgstr "Открывать всплывающие окна во вкладках" + +#: ../midori/midori-websettings.c:713 +msgid "Whether to open popup windows in tabs" +msgstr "Открывать всплывающие окна во вкладках" + +#: ../midori/midori-websettings.c:729 +msgid "Zoom Text and Images" +msgstr "Масштабировать текст и изображения" + +#: ../midori/midori-websettings.c:730 +msgid "Whether to zoom text and images" +msgstr "Изменять масштаб текста и изображений" + +#: ../midori/midori-websettings.c:745 +msgid "Find inline while typing" +msgstr "Искать текст на странице по мере его набора" + +#: ../midori/midori-websettings.c:746 +msgid "Whether to automatically find inline while typing" +msgstr "По мере ввода текста на странице будет осуществляться быстрый поиск по фразе" + +#: ../midori/midori-websettings.c:754 +msgid "Accept cookies" +msgstr "Принимать фрагменты данных" + +#: ../midori/midori-websettings.c:755 +msgid "What type of cookies to accept" +msgstr "Разрешённый тип фрагментов данных" + +#: ../midori/midori-websettings.c:764 +msgid "Original cookies only" +msgstr "Только оригинальные фрагменты данных" + +#: ../midori/midori-websettings.c:765 +msgid "Accept cookies from the original website only" +msgstr "Принимать фрагменты данных только с оригинального сайта" + +#: ../midori/midori-websettings.c:773 +msgid "Maximum cookie age" +msgstr "Хранить фрагменты данных" + +#: ../midori/midori-websettings.c:774 +msgid "The maximum number of days to save cookies for" +msgstr "Максимальное число дней хранения фрагментов данных" + +#: ../midori/midori-websettings.c:784 +msgid "Remember last visited pages" +msgstr "Запоминать посещённые страницы" + +#: ../midori/midori-websettings.c:785 +msgid "Whether the last visited pages are saved" +msgstr "Сохранять историю последних посещений" + +#: ../midori/midori-websettings.c:793 +msgid "Maximum history age" +msgstr "Максимальный возраст записей" + +#: ../midori/midori-websettings.c:794 +msgid "The maximum number of days to save the history for" +msgstr "Максимальное число дней хранения записей в журнале" + +#: ../midori/midori-websettings.c:802 +msgid "Remember last form inputs" +msgstr "Запоминать введённые в формы данные" + +#: ../midori/midori-websettings.c:803 +msgid "Whether the last form inputs are saved" +msgstr "Сохранять последние введённые данные в формы ввода" + +#: ../midori/midori-websettings.c:811 +msgid "Remember last downloaded files" +msgstr "Запоминать последние загруженные файлы" + +#: ../midori/midori-websettings.c:812 +msgid "Whether the last downloaded files are saved" +msgstr "Сохранять историю последних загрузок" + +#: ../midori/midori-websettings.c:822 +msgid "Proxy Server" +msgstr "Прокси-сервер" + +#: ../midori/midori-websettings.c:823 +msgid "The proxy server used for HTTP connections" +msgstr "Прокси-сервер для соединений по HTTP" + +#: ../midori/midori-websettings.c:838 +msgid "Detect proxy server automatically" +msgstr "Автоматически обнаруживать прокси-сервер" + +#: ../midori/midori-websettings.c:839 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "Брать данные о прокси-сервере из переменных окружения" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:855 +msgid "Identify as" +msgstr "Представляться как" + +#: ../midori/midori-websettings.c:856 +msgid "What to identify as to web pages" +msgstr "Строка, которая будет посылаться на запросы идентификации обозревателя" + +#: ../midori/midori-websettings.c:872 +msgid "Identification string" +msgstr "Строка идентификации" + +#: ../midori/midori-websettings.c:873 +msgid "The application identification string" +msgstr "Строка идентификации приложения" + +#: ../midori/midori-websettings.c:881 +msgid "Cache size" +msgstr "Размер кэша" + +#: ../midori/midori-websettings.c:882 +msgid "The allowed size of the cache" +msgstr "Разрешённый размер кэша" + +#. i18n: The title of the 404 - Not found error page +#. Error pages are special, we want to try loading the destination +#. again, not the error page which isn't even a proper page +#: ../midori/midori-view.c:637 +#: ../midori/midori-view.c:2473 +#, c-format +msgid "Not found - %s" +msgstr "Страница не найдена — %s" + +#: ../midori/midori-view.c:976 +msgid "Open _Link" +msgstr "_Открыть ссылку" + +#: ../midori/midori-view.c:978 +msgid "Open Link in New _Tab" +msgstr "Открыть ссылку в новой _вкладке" + +#: ../midori/midori-view.c:995 +msgid "Open Link in New _Window" +msgstr "Открыть ссылку в новом _окне" + +#: ../midori/midori-view.c:1004 +msgid "_Download Link destination" +msgstr "_Загрузить объект" + +#: ../midori/midori-view.c:1010 +msgid "_Save Link destination" +msgstr "_Сохранить объект" + +#: ../midori/midori-view.c:1019 +msgid "Download with Download _Manager" +msgstr "Загрузить с помощью _менеджера загрузок" + +#: ../midori/midori-view.c:1048 +msgid "Search _with" +msgstr "Найти _с помощью" + +#: ../midori/midori-view.c:1076 +msgid "_Search the Web" +msgstr "_Найти в сети" + +#: ../midori/midori-view.c:1086 +msgid "Open Address in New _Tab" +msgstr "Открыть ссылку в новой _вкладке" + +#: ../midori/midori-view.c:1234 +msgid "Open or download file" +msgstr "Открыть или загрузить файл" + +#: ../midori/midori-view.c:1251 +#, c-format +msgid "File Type: '%s'" +msgstr "Тип файла: «%s»" + +#: ../midori/midori-view.c:1254 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "Тип файла: %s («%s»)" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1258 +#, c-format +msgid "Open %s" +msgstr "Открыть %s" + +#: ../midori/midori-view.c:1661 +#, c-format +msgid "Inspect page - %s" +msgstr "Информация о странице — %s" + +#: ../midori/midori-view.c:1806 +#, c-format +msgid "Document cannot be displayed" +msgstr "Не удалось отобразить документ" + +#: ../midori/midori-view.c:1822 +#, c-format +msgid "No documentation installed" +msgstr "Документация не установлена" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "Параметры %s" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "Общие" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "Запуск" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "Установить текущую страницу в качестве домашней" + +#: ../midori/midori-preferences.c:423 +#: ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "Передачи" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:475 +msgid "Appearance" +msgstr "Внешний вид" + +#: ../midori/midori-preferences.c:476 +msgid "Font settings" +msgstr "Настройки шрифта" + +#: ../midori/midori-preferences.c:478 +msgid "Default Font Family" +msgstr "Семейство шрифта по умолчанию" + +#: ../midori/midori-preferences.c:484 +msgid "The default font size used to display text" +msgstr "Размер шрифта для отображения текста по умолчанию" + +#: ../midori/midori-preferences.c:487 +msgid "Minimum Font Size" +msgstr "Минимальный размер шрифта" + +#: ../midori/midori-preferences.c:490 +msgid "The minimum font size used to display text" +msgstr "Наименьший размер шрифта для отображения текста" + +#: ../midori/midori-preferences.c:497 +msgid "Encoding" +msgstr "Кодировка" + +#: ../midori/midori-preferences.c:500 +msgid "The character encoding to use by default" +msgstr "Кодировка символов, которая будет использоваться по умолчанию" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:507 +msgid "Behavior" +msgstr "Поведение" + +#: ../midori/midori-preferences.c:508 +msgid "Features" +msgstr "Возможности" + +#: ../midori/midori-preferences.c:511 +#: ../extensions/statusbar-features.c:54 +msgid "Load images automatically" +msgstr "Загружать изображения автоматически" + +#: ../midori/midori-preferences.c:512 +msgid "Load and display images automatically" +msgstr "Загружать и отображать изображения автоматически" + +#: ../midori/midori-preferences.c:515 +msgid "Shrink images automatically" +msgstr "Масштабировать изображения автоматически" + +#: ../midori/midori-preferences.c:516 +msgid "Automatically shrink standalone images to fit" +msgstr "Автоматически уменьшать отдельные изображения по размеру экрана" + +#: ../midori/midori-preferences.c:519 +msgid "Print background images" +msgstr "Печатать фоновые изображения" + +#: ../midori/midori-preferences.c:520 +msgid "Whether background images should be printed" +msgstr "Должны ли быть выведены на печать фоновые изображения" + +#: ../midori/midori-preferences.c:523 +msgid "Resizable text areas" +msgstr "Изменяемый размер текстовых полей" + +#: ../midori/midori-preferences.c:524 +msgid "Whether text areas are resizable" +msgstr "Текстовые поля могут изменять размер" + +#: ../midori/midori-preferences.c:527 +#: ../extensions/statusbar-features.c:63 +msgid "Enable scripts" +msgstr "Выполнять сценарии" + +#: ../midori/midori-preferences.c:528 +msgid "Enable embedded scripting languages" +msgstr "Выполнять встроенные сценарии на страницах" + +#: ../midori/midori-preferences.c:531 +#: ../extensions/statusbar-features.c:72 +msgid "Enable plugins" +msgstr "Использовать модули" + +#: ../midori/midori-preferences.c:532 +msgid "Enable embedded plugin objects" +msgstr "Разрешить встроенные объекты модулей на страницах" + +#: ../midori/midori-preferences.c:535 +msgid "Enforce 96 dots per inch" +msgstr "Всегда использовать разрешение 96 точек на дюйм" + +#: ../midori/midori-preferences.c:536 +msgid "Enforce a video dot density of 96 DPI" +msgstr "Принудительно использовать разрешение 96 точек на дюйм" + +#: ../midori/midori-preferences.c:539 +msgid "Enable developer tools" +msgstr "Включить средства разработчика" + +#: ../midori/midori-preferences.c:540 +msgid "Enable special extensions for developers" +msgstr "Включить особые расширения для разработчиков" + +#. Page "Interface" +#: ../midori/midori-preferences.c:547 +msgid "Interface" +msgstr "Интерфейс" + +#: ../midori/midori-preferences.c:548 +msgid "Navigationbar" +msgstr "Панель навигации" + +#: ../midori/midori-preferences.c:559 +msgid "Browsing" +msgstr "Навигация" + +#. Page "Network" +#: ../midori/midori-preferences.c:589 +#: ../midori/midori-preferences.c:590 +msgid "Network" +msgstr "Сеть" + +#: ../midori/midori-preferences.c:617 +msgid "MB" +msgstr "МБ" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:622 +msgid "Privacy" +msgstr "Конфиденциальность" + +#: ../midori/midori-preferences.c:623 +msgid "Web Cookies" +msgstr "Фрагменты данных" + +#: ../midori/midori-preferences.c:636 +#: ../midori/midori-preferences.c:646 +msgid "days" +msgstr "дней" + +#: ../midori/midori-searchaction.c:484 +#: ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "Очистить" + +#: ../midori/midori-searchaction.c:904 +msgid "Add search engine" +msgstr "Добавление средства поиска" + +#: ../midori/midori-searchaction.c:904 +msgid "Edit search engine" +msgstr "Правка средства поиска" + +#: ../midori/midori-searchaction.c:932 +msgid "_Name:" +msgstr "_Имя:" + +#: ../midori/midori-searchaction.c:976 +msgid "_Icon:" +msgstr "_Значок:" + +#: ../midori/midori-searchaction.c:990 +msgid "_Token:" +msgstr "_Признак:" + +#: ../midori/midori-searchaction.c:1195 +msgid "Manage Search Engines" +msgstr "Управление средствами поиска" + +#: ../midori/sokoke.c:117 +#: ../midori/sokoke.c:129 +msgid "Could not run external program." +msgstr "Не удалось выполнить внешнюю программу." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:448 +msgid "Warning: You are using a superuser account!" +msgstr "Внимание: используется учётная запись суперпользователя!" + +#: ../midori/sokoke.c:780 +msgid "_Bookmark" +msgstr "_Закладка" + +#: ../midori/sokoke.c:782 +msgid "_Add Bookmark" +msgstr "_Добавить закладку" + +#: ../midori/sokoke.c:783 +msgid "_Console" +msgstr "_Консоль" + +#: ../midori/sokoke.c:784 +msgid "_Extensions" +msgstr "_Дополнения" + +#: ../midori/sokoke.c:785 +msgid "_History" +msgstr "_Журнал" + +#: ../midori/sokoke.c:786 +msgid "_Homepage" +msgstr "Д_омашняя страница" + +#: ../midori/sokoke.c:787 +msgid "_Userscripts" +msgstr "_Сценарии пользователя" + +#: ../midori/sokoke.c:788 +msgid "User_styles" +msgstr "С_тили пользователя" + +#: ../midori/sokoke.c:789 +msgid "New _Tab" +msgstr "Но_вая вкладка" + +#: ../midori/sokoke.c:790 +msgid "_Transfers" +msgstr "_Передачи" + +#: ../midori/sokoke.c:791 +msgid "P_lugins" +msgstr "_Модули" + +#: ../midori/sokoke.c:792 +msgid "_Closed Tabs and Windows" +msgstr "За_крытые вкладки и окна" + +#: ../midori/sokoke.c:793 +msgid "New _Window" +msgstr "_Новое окно" + +#: ../panels/midori-addons.c:95 +#: ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "Сценарии" + +#: ../panels/midori-addons.c:96 +#: ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "Стили пользователя" + +#: ../panels/midori-addons.c:927 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Включить" + +#: ../panels/midori-addons.c:928 +#: ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "Включить" + +#: ../panels/midori-addons.c:937 +#: ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "_Отключить" + +#: ../panels/midori-addons.c:938 +#: ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "Отключить" + +#: ../panels/midori-bookmarks.c:107 +msgid "Bookmarks" +msgstr "Закладки" + +#: ../panels/midori-bookmarks.c:240 +msgid "Edit the selected bookmark" +msgstr "Редактировать закладку" + +#: ../panels/midori-bookmarks.c:248 +msgid "Delete the selected bookmark" +msgstr "Удалить закладку" + +#: ../panels/midori-bookmarks.c:593 +msgid "Separator" +msgstr "Разделитель" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Консоль" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Дополнения" + +#: ../panels/midori-history.c:163 +msgid "Are you sure you want to remove all history items?" +msgstr "Удалить все записи в журнале?" + +#: ../panels/midori-history.c:218 +msgid "Bookmark the selected history item" +msgstr "Добавить выделенную запись в закладки" + +#: ../panels/midori-history.c:227 +msgid "Delete the selected history item" +msgstr "Удалить запись из журнала" + +#: ../panels/midori-history.c:235 +msgid "Clear the entire history" +msgstr "Очистить весь журнал" + +#: ../panels/midori-history.c:600 +#, c-format +msgid "A week ago" +msgstr "Неделю назад" + +#: ../panels/midori-history.c:606 +#, c-format +msgid "%d days ago" +msgstr "%d дней назад" + +#: ../panels/midori-history.c:613 +msgid "Today" +msgstr "Сегодня" + +#: ../panels/midori-history.c:615 +msgid "Yesterday" +msgstr "Вчера" + +#: ../panels/midori-plugins.c:87 +msgid "Plugins" +msgstr "Модули" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "%s из %s" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "Требуется авторизация" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"Для просмотра этой страницы требуются\n" +"имя пользователя и пароль:" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "Имя пользователя" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "Пароль" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Не удалось загрузить именованный значок «%s»" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Не удалось загрузить системный значок «%s»" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Кадры анимации повреждены" + +#: ../katze/katze-utils.c:183 +#: ../katze/katze-utils.c:395 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Свойство «%s» недействительно для %s" + +#: ../katze/katze-utils.c:215 +#: ../katze/katze-utils.c:254 +msgid "Choose file" +msgstr "Выберите файл" + +#: ../katze/katze-utils.c:235 +msgid "Choose folder" +msgstr "Выберите папку" + +#: ../extensions/colorful-tabs.c:104 +msgid "Tint tabs distinctly" +msgstr "Цвета вкладок" + +#: ../extensions/colorful-tabs.c:140 +msgid "Colorful Tabs" +msgstr "Цветные вкладки" + +#: ../extensions/colorful-tabs.c:141 +msgid "Tint each tab distinctly" +msgstr "Каждая вкладка имеет свой цвет" + +#: ../extensions/cookie-manager.c:201 +msgid "At the end of the session" +msgstr "В конце сеанса" + +#: ../extensions/cookie-manager.c:204 +#, c-format +msgid "" +"Host: %s\n" +"Name: %s\n" +"Value: %s\n" +"Path: %s\n" +"Secure: %s\n" +"Expires: %s" +msgstr "" +"Адрес: %s\n" +"Имя: %s\n" +"Значение: %s\n" +"Путь: %s\n" +"Защищённый: %s\n" +"Срок истекает: %s" + +#: ../extensions/cookie-manager.c:210 +msgid "Yes" +msgstr "Да" + +#: ../extensions/cookie-manager.c:210 +msgid "No" +msgstr "Нет" + +#: ../extensions/cookie-manager.c:491 +msgid "Do you really want to delete all cookies?" +msgstr "Удалить все сохранённые фрагменты данных?" + +#: ../extensions/cookie-manager.c:493 +msgid "Question" +msgstr "Вопрос" + +#: ../extensions/cookie-manager.c:501 +msgid "Only the visible cookies are deleted which match the entered filter string." +msgstr "Будут удалены только видимые фрагменты, удовлетворяющие условиям фильтра." + +#: ../extensions/cookie-manager.c:679 +msgid "Name" +msgstr "Имя" + +#: ../extensions/cookie-manager.c:739 +msgid "_Expand All" +msgstr "_Развернуть всё" + +#: ../extensions/cookie-manager.c:747 +msgid "_Collapse All" +msgstr "_Свернуть всё" + +#: ../extensions/cookie-manager.c:818 +msgid "Delete All" +msgstr "Удалить всё" + +#: ../extensions/cookie-manager.c:820 +msgid "Deletes all shown cookies. If a filter is set, only those cookies are deleted which match the filter." +msgstr "Будут удалены только видимые фрагменты. Если активен фильтр, будут удалены только те фрагменты, которые удовлетворяют его условиям." + +#: ../extensions/cookie-manager.c:835 +msgid "Expand All" +msgstr "Развернуть всё" + +#: ../extensions/cookie-manager.c:842 +msgid "Collapse All" +msgstr "Свернуть всё" + +#: ../extensions/cookie-manager.c:873 +msgid "Filter:" +msgstr "Фильтр:" + +#: ../extensions/cookie-manager.c:878 +msgid "Enter a filter string to show only cookies whose name or domain field match the entered filter" +msgstr "Строка для фильтрации по имени фрагмента или адресу веб-сайта" + +#: ../extensions/cookie-manager.c:913 +#: ../extensions/cookie-manager.c:961 +msgid "Cookie Manager" +msgstr "Менеджер фрагментов данных" + +#: ../extensions/cookie-manager.c:945 +msgid "_Cookie Manager" +msgstr "Менеджер _фрагментов данных" + +#: ../extensions/cookie-manager.c:962 +msgid "List, view and delete cookies" +msgstr "Просмотр и удаление фрагментов данных" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "Жесты мышью" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "Управление Midori с помощью движений мыши" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:129 +#: ../extensions/page-holder.c:177 +msgid "Pageholder" +msgstr "Контейнер" + +#: ../extensions/page-holder.c:161 +msgid "_Pageholder" +msgstr "К_онтейнер" + +#~ msgid "%s has no property '%s'" +#~ msgstr "%s не обладает свойством «%s»" +#~ msgid "%s cannot be assigned to %s.%s" +#~ msgstr "%s не может быть назначен для %s.%s" +#~ msgid "%s.%s cannot be accessed" +#~ msgstr "%s.%s недоступен" +#~ msgid "" +#~ "Host: %s\n" +#~ "Path: %s\n" +#~ "Secure: %s\n" +#~ "Name: %s\n" +#~ "Value: %s" +#~ msgstr "" +#~ "Узел: %s\n" +#~ "Путь: %s\n" +#~ "Защищённый: %s\n" +#~ "Имя: %s\n" +#~ "Значение: %s" +#~ msgid "Images" +#~ msgstr "Изображения" +#~ msgid "Scripts" +#~ msgstr "Сценарии" +#~ msgid "Source" +#~ msgstr "Исходный код" +#~ msgid "_Icon (name or file):" +#~ msgstr "_Значок (имя или файл):" +#~ msgid "URIs" +#~ msgstr "Идентификаторы URI" +#~ msgid "[URIs]" +#~ msgstr "[Идентификаторы URI]" +#~ msgid "_URL:" +#~ msgstr "_URL:" +#~ msgid "Root" +#~ msgstr "Root" +#~ msgid "HTTP Proxy" +#~ msgstr "HTTP-прокси" +#~ msgid "Open URL in New _Tab" +#~ msgstr "Открыть URL в новой _вкладке" +#~ msgid "Enforce 96 DPI" +#~ msgstr "Всегда использовать 96 DPI" +#~ msgid "Manage search engines" +#~ msgstr "Управление средствами поиска" +#~ msgid "Open in Page_holder..." +#~ msgstr "Открыть в _контейнере..." + +#, fuzzy +#~ msgid "Last pageholder URI" +#~ msgstr "Текущий индекс URI" +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Последняя открытая ссылка в хранилище" +#~ msgid "_Fullscreen" +#~ msgstr "Полноэкранный режим" +#~ msgid "_Leave Fullscreen" +#~ msgstr "Выйти из полноэкранного режима" +#~ msgid "Settings" +#~ msgstr "Установки" +#~ msgid "Trash" +#~ msgstr "Корзина" +#~ msgid "The trash, collecting recently closed tabs and windows" +#~ msgstr "Корзина. Сохраняет закрытые вкладки и окна" +#~ msgid "Search Engines" +#~ msgstr "Средства поиска" +#~ msgid "The list of search engines" +#~ msgstr "Список средств поиска" +#~ msgid "Browser" +#~ msgstr "Обозреватель" +#~ msgid "The current browser" +#~ msgstr "Данный браузер" +#~ msgid "The current number of browsers" +#~ msgstr "Текущее число обозревателей" +#~ msgid "Kind" +#~ msgstr "Тип" +#~ msgid "The kind of addons" +#~ msgstr "Тип дополнения" +#~ msgid "The navigationbar" +#~ msgstr "Панель навигации" +#~ msgid "URI" +#~ msgstr "URI" +#~ msgid "The current URI" +#~ msgstr "Данная URI" +#~ msgid "Tab" +#~ msgstr "Вкладка" +#~ msgid "The current tab" +#~ msgstr "Данная вкладка" +#~ msgid "Statusbar" +#~ msgstr "Панель состояния" +#~ msgid "The statusbar" +#~ msgstr "Панель состояния" +#~ msgid "Statusbar Text" +#~ msgstr "Текст вкладки статуса" +#~ msgid "The text that is displayed in the statusbar" +#~ msgstr "Текст отображаемый во вкладке статуса" +#~ msgid "The list of search engines to be used for web search" +#~ msgstr "Список средств поиска используемые для поиска в сети" +#~ msgid "Open the selected bookmark in a new tab" +#~ msgstr "Открыть выбранные закладки в новых вкладках" +#~ msgid "Open the selected bookmark in a new window" +#~ msgstr "Открыть выбранные закладки в новом окне" +#~ msgid "Shadow Type" +#~ msgstr "Тип тени" +#~ msgid "Appearance of the shadow around each panel" +#~ msgstr "Внешний вид тени вокруг панели" +#~ msgid "Menu" +#~ msgstr "Меню" +#~ msgid "Menu to hold panel items" +#~ msgstr "Управление содержимым панелей" +#~ msgid "Show New Tab" +#~ msgstr "Показать новую вкладку" +#~ msgid "Show the New Tab button in the toolbar" +#~ msgstr "Показать кнопку Новая Вкладка в панели инструментов" +#~ msgid "Show Homepage" +#~ msgstr "Показать домашнюю страницу" +#~ msgid "Show the Homepage button in the toolbar" +#~ msgstr "Показать кнопку Домашняя Страница в панели инструментов" +#~ msgid "Show Web search" +#~ msgstr "Показать поиск" +#~ msgid "Show the Web search entry in the toolbar" +#~ msgstr "Показывать запись сетевого поиска в панели инструментов" +#~ msgid "Show the Trash button in the toolbar" +#~ msgstr "Показать кнопку Корзина в панели инструментов" +#~ msgid "Load Finished" +#~ msgstr "Загрузка завершена" +#~ msgid "The URI of the currently loaded page" +#~ msgstr "URI загруженной страницы" +#~ msgid "The title of the currently loaded page" +#~ msgstr "Заголовок загруженной страницы" +#~ msgid "The current loading status" +#~ msgstr "Статус загрузки" +#~ msgid "The current loading progress" +#~ msgstr "Процесс загрузки" +#~ msgid "Dialog" +#~ msgstr "Диалог" +#~ msgid "A dialog to manage search engines" +#~ msgstr "Диалог управления средствами поиска" +#~ msgid "Icon size" +#~ msgstr "Размер значков" +#~ msgid "Icon Name" +#~ msgstr "Имя иконки" +#~ msgid "The name of an icon containing animation frames" +#~ msgstr "Имя иконки содержащей анимационные рамки" +#~ msgid "The name of an icon to be used as the static image" +#~ msgstr "Имя иконки для статичного изобрадения" +#~ msgid "Icon '%s' couldn't be loaded" +#~ msgstr "Значок '%s' не может быть загружен" +#~ msgid "The descriptive text of the item" +#~ msgstr "Описание пункта" +#~ msgid "Token" +#~ msgstr "Признак" + diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 00000000..3096a930 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,1485 @@ +# Swedish translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Mikael Magnusson , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.0.18\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-03-23 21:05+0100\n" +"Last-Translator: Mikael Magnusson \n" +"Language-Team: Swedish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Liten webbläsare" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Webbläsare" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Bokmärk" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Bokmärken" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Konsol" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Historia" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Hemsida" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Beskrivning" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Ny _tabb" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Överföringar" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Stängda tabbar och fönster" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Nytt _fönster" + +#: ../midori/main.c:143 +#, fuzzy, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Konfigurationsfilen kunde inte laddas. %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Fil saknas." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Felaktigt dokument." + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Kunde inte skriva." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Överföringar" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Sessionen kunde inte sparad. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Visa programversion" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "" + +#: ../midori/main.c:1335 +#, fuzzy +msgid "[URIs]" +msgstr "[URL]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Var god skicka kommentarer, förslag och buggrapporter till:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Leta efter nya verioner på:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "" + +#: ../midori/main.c:1447 +#, fuzzy, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Bokmärkena kunde inte laddas. %s\n" + +#: ../midori/main.c:1463 +#, fuzzy, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Sessionen kunde inte laddas. %s\n" + +#: ../midori/main.c:1477 +#, fuzzy, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Papperskorgen kunde inte laddas. %s\n" + +#: ../midori/main.c:1491 +#, fuzzy, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Papperskorgen kunde inte laddas. %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Följande fel inträffade:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Sökmotorer kunde inte sparad. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Bokmärkena kunde inte sparad. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Papperskorgen kunde inte sparad. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Konfigurationsfilen kunde inte sparad. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Ladda om sidan" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Sluta ladda sidan" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% laddat" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "" + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Nytt bokmärke" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Redigera bokmärke" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Titel:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Beskrivning" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Mapp:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Rot" + +#: ../midori/midori-browser.c:668 +#, fuzzy +msgid "Save file as" +msgstr "Spara till fil" + +#: ../midori/midori-browser.c:1248 +#, fuzzy +msgid "Open file" +msgstr "Öppna en fil" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Öppna i ny _tabb" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Öppna i nytt _fönster" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Avskiljare" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "En liten webbläsare." + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Mikael Magnusson " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Fil" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Öppna i nytt fönster" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Öppna i ny tabb" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Öppna en fil" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Spara till fil" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Stäng tabb" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Stäng den här tabben" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "S_täng fönster" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Stäng det här fönstret" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Avsluta programmet" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Redigera" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Klippa ut markerad text" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Kopiera markerad text" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Klistra in text från klippbordet" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Ta bort markerad text" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Markera all text" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Hitta _nästa" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Hitta _förra" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Snabbsök" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Visa" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Verktygsfält" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Visa _källkod" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Visa källkod för markering" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Växla fullskärmsläge" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Gå" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Töm papperskorgen" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Ångra stäng tabb" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Ta bort markerad bokmärke" + +#: ../midori/midori-browser.c:3185 +#, fuzzy +msgid "Delete the selected history item" +msgstr "Ta bort markerad text" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "" + +#: ../midori/midori-browser.c:3191 +#, fuzzy +msgid "Bookmark the selected history item" +msgstr "Kopiera markerad text" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Verktyg" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Hantera sökmotorer" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Lägg till, ändra och ta bort sökmotorer..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Föregående tabb" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "_Nästa tabb" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Hjälp" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Innehåll" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "P_rivat läge" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "" + +#: ../midori/midori-browser.c:3231 +msgid "_Menubar" +msgstr "" + +#: ../midori/midori-browser.c:3232 +#, fuzzy +msgid "Show menubar" +msgstr "Visa statusrad" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "_Navigationsfält" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Visa navigeringsfält" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Sido_panel" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Visa sido_panel" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "_Bokmärkesfält" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Visa bokmärkesfält" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "Ö_verföringsfält" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Visa statusrad" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "_Statusrad" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Visa statusrad" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Plats..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_Webbsökning..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Öppna en tidigare stängd tabb eller fönster" + +#: ../midori/midori-browser.c:3729 +msgid "_Recently visited pages" +msgstr "" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "" + +#: ../midori/midori-browser.c:3746 +#, fuzzy +msgid "Show the saved bookmarks" +msgstr "Kopiera markerad bokmärke" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Fönster" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Bokmärken" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Historia" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "_Snabbsökning:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "_Gör skillnad på skiftläge" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Stäng sökfältet" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Stäng panel" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Tom sida" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Hemsida" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Kinesiska (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japanska (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Ryska (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Västerländsk (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "" + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Ny tabb" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Nytt fönster" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Nuvarande tabb" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Standard" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Ikoner" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Text" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Både och" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Båda horisontellt" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Alla kakor" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Sessionskakor" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Inga" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "" + +#: ../midori/midori-websettings.c:302 +#, fuzzy +msgid "Show Menubar" +msgstr "Visa statusrad" + +#: ../midori/midori-websettings.c:303 +msgid "Whether to show the menubar" +msgstr "" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Visa Navigeringsfält" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Visa Bokmärkesfält" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Visa Sidopanel" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Visa Statusrad" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Stil för verktygsfält" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "" + +#: ../midori/midori-websettings.c:358 +#, fuzzy +msgid "Toolbar Items" +msgstr "Stil för verktygsfält" + +#: ../midori/midori-websettings.c:359 +msgid "The items to show on the toolbar" +msgstr "" + +#: ../midori/midori-websettings.c:367 +#, fuzzy +msgid "Compact Sidepanel" +msgstr "Sido_panel" + +#: ../midori/midori-websettings.c:368 +#, fuzzy +msgid "Whether to make the sidepanel compact" +msgstr "Ifall aktivitetssymbolen ska animeras" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Ladda vid uppstart" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Nedladdningsmapp" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Sökmotor för Addressfältet" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Stängknappar på tabbar" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Ifall tabbar har stängknappar" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Öppna nya sidor i" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "" + +#: ../midori/midori-websettings.c:473 +#, fuzzy +msgid "Open external pages in" +msgstr "Öppna nya sidor i" + +#: ../midori/midori-websettings.c:474 +msgid "Where to open externally opened pages" +msgstr "" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Mittenklick öppnar markering" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Ladda en URL från markeringen via mittenklick" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Öppna tabbar i bakgrunden" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Öppna popups i tabbar" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Acceptera kakor" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Tillåt kakor enbart från den ursprungliga webbplatsen" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Maximal kakålder" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Cache-storlek" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Öppna länk i ny _tabb" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Öppna URL i ny _tabb" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Källkod" + +#: ../midori/midori-view.c:1527 +#, c-format +msgid "No documentation installed" +msgstr "" + +#: ../midori/midori-preferences.c:87 +#, fuzzy, c-format +msgid "Preferences for %s" +msgstr "%s inställningar" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Allmänt" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Uppstart" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Utseende" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Typsnittinställningar" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Beteende" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Funktioner" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +#, fuzzy +msgid "Enable scripts" +msgstr "_Beskrivning" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Gränssnitt" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Navigeringsfält" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Bläddring" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Nätverk" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "" + +#: ../midori/midori-preferences.c:500 +#, fuzzy +msgid "Web Cookies" +msgstr "Acceptera kakor" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Tom" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Lägg till sökmotor" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Redigera sökmotor" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Namn:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Ikon (namn eller fil):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Hantera sökmotorer" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "" + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Varning: Du använder ett administratörskonto!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +#, fuzzy +msgid "_Disable" +msgstr "_Fil" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsol" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Sidhållare" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Sidhållare" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "_Beskrivning" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Select _All" +#~ msgstr "Välj _alla" + +#~ msgid "_Fullscreen" +#~ msgstr "_Fullskärm" + +#~ msgid "_Leave Fullscreen" +#~ msgstr "_Lämna fullskärm" + +#~ msgid "Settings" +#~ msgstr "Inställningar" + +#~ msgid "The associated settings" +#~ msgstr "De associerade inställningarna" + +#~ msgid "Trash" +#~ msgstr "Papperskorgen" + +#~ msgid "The trash, collecting recently closed tabs and windows" +#~ msgstr "Soptunnan, samlar senast stängda tabbar och fönster" + +#~ msgid "Browser" +#~ msgstr "Bläsare" + +#~ msgid "Search Engines" +#~ msgstr "Sökmotorer" + +#~ msgid "Statusbar" +#~ msgstr "Statusrad" + +#~ msgid "The text that is displayed in the statusbar" +#~ msgstr "Texten som visas i statusraden" + +#~ msgid "Pa_ge Setup" +#~ msgstr "_Sidinställningar" + +#~ msgid "Undo the last modification" +#~ msgstr "Ångra senaste ändringen" + +#~ msgid "Redo the last modification" +#~ msgstr "Gör om senaste ändringen" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Visa i sid_hållare..." + +#~ msgid "_Manage Bookmarks" +#~ msgstr "_Hantera bokmärken" + +#~ msgid "Add, edit and remove bookmarks..." +#~ msgstr "Lägg till, ändra och ta bort bokmärken..." + +#~ msgid "Tab _Overview" +#~ msgstr "Tabbö_versikt" + +#~ msgid "_Work Offline" +#~ msgstr "_Arbeta offline" + +#~ msgid "Appearance of the shadow around each panel" +#~ msgstr "Utseende på skuggan runt varje panel" + +#~ msgid "Menu to hold panel items" +#~ msgstr "Meny för att visa panelföremål" + +#~ msgid "The index of the current page" +#~ msgstr "Indexet för nuvarande sida" + +#~ msgid "Show New Tab" +#~ msgstr "Visa Ny tabb" + +#~ msgid "Show Homepage" +#~ msgstr "Visa Hemsida" + +#~ msgid "Show Web search" +#~ msgstr "Visa Webbsökning" + +#~ msgid "Show Trash" +#~ msgstr "Visa Papperskorgen" + +#~ msgid "Tab Label Size" +#~ msgstr "Tabbstorlek" + +#~ msgid "The desired tab label size" +#~ msgstr "Önskad storlek på tabbetikett" + +#~ msgid "The URI of the currently loaded page" +#~ msgstr "URIn för den laddade sidan" + +#~ msgid "The title of the currently loaded page" +#~ msgstr "Titeln för den laddade sidan" + +#~ msgid "Symbolic size to use for the animation" +#~ msgstr "Symbolisk storlek för animeringen" + +#~ msgid "The name of an icon containing animation frames" +#~ msgstr "Namn på en ikon som innehåller animeringsbilder" + +#~ msgid "A GdkPixbuf containing animation frames" +#~ msgstr "En GdkPixbuf som innehåller animeringbilder" + +#~ msgid "The name of an icon to be used as the static image" +#~ msgstr "Namn på ikon att använda som statisk bild" + +#~ msgid "A GdkPixbuf to be used as the static image" +#~ msgstr "En GdkPixbuf att använda som statisk bild" + +#~ msgid "The stock ID of an icon to be used as the static image" +#~ msgstr "Katalog-ID för en ikon att använda som statisk bild" + +#~ msgid "Name" +#~ msgstr "Namn" + +#~ msgid "Icon" +#~ msgstr "Ikone" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 00000000..01e7540d --- /dev/null +++ b/po/tr.po @@ -0,0 +1,1380 @@ +# Turkish translations for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Mirat Can Bayrak +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-11-10 16:53+0200\n" +"Last-Translator: Mirat Can Bayrak \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Hafif web tarayıcı " + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Midori" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Web Tarayıcı" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Yer imi" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Yer İmleri" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Yer İmi Ekle" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Konsol" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Eklentiler" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Geçmiş" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "_Anasayfa" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Kullanıcı betikleri" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "Kullanıcı _stilleri" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Yeni _Tab" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Aktarımlar" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Kapatılmış Pencereler ve Tablar" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "Yeni _Pencere" + +#: ../midori/main.c:143 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Ayarlar yüklenemedi: %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "'%s' değeri şunun için yanlış : %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, fuzzy, c-format +msgid "Invalid configuration value '%s'" +msgstr "İşlenemeyen ayar değeri '%s'" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Dosya bulunamadı" + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Bozuk biçimli döküman" + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Şu veri tabanı açılamadı: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Şu geçmiş öğesi silinemedi: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Geçmiş temizlenemedi: %s\n" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Geçmiş öğesi eklenemedi: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Eski geçmiş öğeleri silinemedi: %s\n" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Yazma işlemi gerçekleştirilemedi" + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Aktarımlar" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Bu oturum kaydedilemedi. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "Belirtilen dosyayı javascript olarak kabul et ve çalıştır" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Program versiyonunu göster" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "URIs" + +#: ../midori/main.c:1335 +msgid "[URIs]" +msgstr "[URIs]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "" +"Lütfen yorumlarınızı, isteklerinizi ve yakaladığınız hataları şuraya " +"raporlayın:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Yeni versiyonlar için şurayı kontrol edin:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "Dosya ismi belirtlilmedi" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "Şu anda Midori'nin başka bir örneği çalışıyor fakat cevap vermiyor.\n" + +#: ../midori/main.c:1447 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Yer imleri yüklenemedi: %s\n" + +#: ../midori/main.c:1463 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Oturum yüklenemedi: %s\n" + +#: ../midori/main.c:1477 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Çöp kutusu yüklenemedi: %s\n" + +#: ../midori/main.c:1491 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Geçmiş yüklenemedi: %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Şu hatalar ortaya çıktı:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Arama motorları kaydedilemedi. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Yer imleri kaydedilemedi. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Çöp kutusu kaydedilemedi. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Ayarlar kaydedilemedi. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Bu sayfayı yeniden yükle" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Bu sayfayı yüklemeyi durdur" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% yüklendi" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "beklenmedik hareket '%s'." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Yeni yer imi" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Yer imini düzenle" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Başlık:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Açıklama:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_URL:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Klasör:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Root" + +#: ../midori/midori-browser.c:668 +msgid "Save file as" +msgstr "Dosyayı kaydet" + +#: ../midori/midori-browser.c:1248 +msgid "Open file" +msgstr "Dosya aç" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Yeni tabda aç" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Yeni Pencerede aç" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Ayraç" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "%d gün önce" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "Bugün" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "Dün" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Hafif bir web tarayıcısı" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Mirat Can Bayrak " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "Bütün geçmiş öğelerini silmek istediğinizden emin misiniz?" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Dosya" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Yeni bir pencerede aç" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Yeni bir tabda aç" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Bir dosya aç" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Bir dosyaya kaydet" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Tabı kapat" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Geçerli tabı kapat" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "Pen_cereyi Kapat" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Bu pencereyi kapat" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Geçerli sayfayı yazdır" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Uygulamadan çık" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Düzenle" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Seçili metni kes" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Seçili metni kopyala" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Metni panodan yapıştır" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Seçili metni sil" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Bütün metni seç" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Bir kelime yada ibareyi geçerli sayfada ara" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "So_nrakini Bul" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Kelime ya da ibarenin sonraki örneğini bul" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Öncekini Bu_l" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Kelime ya da ibarenin sonraki örneğini bul" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "Ç_abuk Bul" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Hemen kelime yada ibarenin olduğu noktaya zıpla" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Uygulamanın ayarlarını düzenle" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Görünüm" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "_Araç Çubukları" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Yakınlaştırma seviyesini arttır" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Yakınlaşma seviyesini azalt" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Yakınlaşma oranını sıfırla" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Ka_ynağı Gör" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Geçerli sayfanın kaynak kodunu gör" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Seçim kaynağını gör" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Geçerli seçime ait kaynak kodu gör" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Tam ekran modunu aç/kapat" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Git" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Önceki sayfaya geri dön" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Sonraki sayfaya git" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Anasayfaya git" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Çöp Kutusunu Boşalt" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Çöp Kutusu içerisindeki bütün içeriği sil" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Tab kapatmayı geri al" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Son kapatılan tabı geri açar" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Yeni bir yer imi ekle" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Seçili yer imini düzenle" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Seçili yer imini sil" + +#: ../midori/midori-browser.c:3185 +msgid "Delete the selected history item" +msgstr "Seçili geçmiş öğesini sil" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "Bütün geçmişi sil" + +#: ../midori/midori-browser.c:3191 +msgid "Bookmark the selected history item" +msgstr "Seçili geçmiş öğesini yer imlerine ekle" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Araçlar" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "Arama _Motorlarını Yönet" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Arama motorlarını ekle, sil ve düzenle..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "Ön_ceki Tab" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Önceki taba geç" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "So_nraki Tab" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Sonraki taba geç" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Yardım" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_İçerik" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Dökümantasyonu göster" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "_Sıkça sorulan sorular" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "Sıkça sorulan soruları gösterir" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "Hata _Raporla" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "Midori'nin hata takip sistemini açar" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Program hakkında bilgi gösterir" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "G_izli Gezinti" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Gezinirken hiç bir özel veriyi kaydetme" + +#: ../midori/midori-browser.c:3231 +msgid "_Menubar" +msgstr "_Menü Çubuğu" + +#: ../midori/midori-browser.c:3232 +msgid "Show menubar" +msgstr "Menü çubuğunu göster" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "_Gezinti araç Çubuğu" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Gezinti araç çubuğunu göster" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "Yan _panel" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Yan paneli göster" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "_Yer imi araç çubuğu" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Yer imi araç çubuğunu göster" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "_Aktarım araç çubuğu" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Aktarım araç çubuğunu göster" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "_Durum Çubuğu" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Durum çubuğunu göster" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "Kon_um..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Belirli bir konumu aç" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_Ağ Araması..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Bir ağ araması gerçekleştir" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Daha önce kapatılmış bir pencereyi ya da tabı yeniden aç" + +#: ../midori/midori-browser.c:3729 +msgid "_Recently visited pages" +msgstr "_Yeni ziyaret edilmiş sayfalar" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "Daha önce ziyaret edilmiş sayfaları yeniden aç" + +#: ../midori/midori-browser.c:3746 +msgid "Show the saved bookmarks" +msgstr "Kaydedilmiş yer imlerini göster" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Pencere" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "Açık tabların bir listesini göster" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Yer imleri" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Geçmiş" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "Sat_ıriçi bul:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Duruma Eşle" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "Eşlemeleri Işıklandır" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Arama çubuğunu Kapat" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Beklenmedik ayar '%s'" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Paneli kapat" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Blank page" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Anasayfa" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Son açılmış sayfalar" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Çince (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Japonca (Shift_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Kiril (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Batı Avrupa (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Özel..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Yeni sekme" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Yeni pencere" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Geçerli sekme" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Öntanımlı" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Simgeler" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Metin" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Her ikiside" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "İkiside yatay" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Tüm kurabiyeler" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Oturum kurabiyeleri" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Yok" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Son pencerenin ölçülerini hatırla" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Son pencerenin eni" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Son kaydedilmiş pencere eni" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Son pencere yüksekliği" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Son kaydedilmiş pencere yüksekliği" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Son panel pozisyonu" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Son kaydedilen panel pozisyonu" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Son panel sayfası" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Son kaydedilmiş panel sayfası" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Son ağ araması" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Kaydedilmiş son ağ araması" + +#: ../midori/midori-websettings.c:302 +msgid "Show Menubar" +msgstr "Menü Çubuğunu Göster" + +#: ../midori/midori-websettings.c:303 +msgid "Whether to show the menubar" +msgstr "" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Gezinti Araç Çubuğunu Göster" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Yer İmi Araç Çubuğunu Göster" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Paneli Göster" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Durum Çubuğunu Göster" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Araç Çubuğu Sitili" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Araç çubuğunun sitili" + +#: ../midori/midori-websettings.c:358 +msgid "Toolbar Items" +msgstr "Araç Çubuğu Öğeleri" + +#: ../midori/midori-websettings.c:359 +msgid "The items to show on the toolbar" +msgstr "Araç çubuğunun üzerinde gösterilecek öğeler" + +#: ../midori/midori-websettings.c:367 +msgid "Compact Sidepanel" +msgstr "Küçük Yan Panel" + +#: ../midori/midori-websettings.c:368 +msgid "Whether to make the sidepanel compact" +msgstr "" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Açılışta Yükle" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Açılışta ne yüklenecek" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "anasayfa" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "İndirilecek Klasör" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "İndirilen dosyaların kaydedileceği klasör" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "İndirme Yöneticisi" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Harici indirme yöneticisi" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "Metin Düzenleyici" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "Harici metin düzenleyici" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Konum girişi Arama" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "Konum girişi içerisinde yapılacak arama" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Tercih Edilen Kodlama" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Tercih edilen karakter kodlaması" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "Tab Çubuğunu Her Zaman Göster" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "Tab Çubuğunu Her Zaman Göster" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Tablardaki Düğmeleri Kapat" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Yeni sayfaları aç" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Yeni sayfalar nereye açılacak" + +#: ../midori/midori-websettings.c:473 +msgid "Open external pages in" +msgstr "Harici sayfaları şu şekilde aç" + +#: ../midori/midori-websettings.c:474 +msgid "Where to open externally opened pages" +msgstr "Harici açılan sayfalar nereye açılacak" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Orta tuş seçimi açar" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "Orta tuş ile seçim içinden bir url yükle" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Tabları arkaplanda aç" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "Tabları geçerliden sonrakine aç" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Popup pencereleri tablarda aç" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Kurabiyeleri kabul et" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Hangi tür kurabiyeler kabul edilecek" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Sadece orjinal kurabiyeler" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Sadece orjinal web sitesine ait kurabiyeleri kabul et" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Azami kurabiye ömrü" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Kurabiyelerin saklanacağı azami gün sayısı" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Son ziyaret edilen sayfaları hatırla" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Eğer son ziyaret edilen sayfalar kaydedilmiş ise" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Azami geçmiş yaşı" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Geçmişin saklanacağı azami gün sayısı" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Son form girişlerini hatırla" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Son form girişlerinin saklanacağı azami gün sayısı" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Son indirilmiş dosyaları hatırla" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Eğer son indirilmiş dosyalar kaydedildiyse" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "HTTP vekil sunucu" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "HTTP bağlantıları için kullanılan vekil sunucu" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Önbellek boyutu" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "İzin verilen önbellek boyutu" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Bağlantıyı Yeni _Tabda Aç" + +#: ../midori/midori-view.c:925 +#, fuzzy +msgid "_Save Link destination" +msgstr "Bağlantı Konumunu İnd_ir" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "Bağlantı Konumunu İnd_ir" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "URL'yi Yeni _Tabda aç" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "Sayfayı incele - %s" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Kaynak" + +#: ../midori/midori-view.c:1527 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Dökümantasyonu göster" + +#: ../midori/midori-preferences.c:87 +#, c-format +msgid "Preferences for %s" +msgstr "%s için tercihler" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Genel" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Açılış" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Görünüm" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Font seçenekleri" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "Öntanımlı Font Ailesi" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "Minimum Font Boyutu" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Davranış" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Özellikler" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "İmajları otomatik yükle" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "İmajları otomatik küçült" + +#: ../midori/midori-preferences.c:417 +#, fuzzy +msgid "Print background images" +msgstr "Arkaplanları yazdır" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "Yeniden boyutlandırılabilir metin alanları" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "Betiklere izin ver" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "Eklentilere İzin ver" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "Geliştirici araçlarına izin ver" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Arayüz" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Gezinti Araç Çubuğu" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Gözden Geçiriliyor" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Ağ" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "Gizlilik" + +#: ../midori/midori-preferences.c:500 +msgid "Web Cookies" +msgstr "Web Kurabiyeleri" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "günler" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Boş" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Arama motoru ekle" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Arama motoru düzenle" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_İsim:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_İkon (isim ya da dosya):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "_Alındı:" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Arama motorlarını yönet" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Harici program çalıştırılamadı" + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Dikkat: Süperkullanıcı hesabı kullanıyorsunuz!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Bilinmeyen hata oluştu" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s böyle bir özelliğe sahip değil '%s'" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s şuna eşitlenemiyor %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "Erişilemiyor: %s.%s " + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Kullanıcı Betikleri" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Kullanıcı Stilleri" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Etkin" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Kapalı" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Konsole" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Eklentiler" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "'%s' olarak isimlendirilmiş ikon yüklenemiyor" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "'%s' stok ikonu yüklenemedi" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Animasyon kareleri kırık" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "'%s' özelliği %s için geçersiz" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Dosya Seç" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Klasör seç" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Sayfa Tutucu" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Sayfa tutucu" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "Kullanıcı Betikleri" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Sayfa_tutucu içerisinde aç" + +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Geçerli sayfayı sayfa tutucu içinde aç" + +#~ msgid "Last pageholder URI" +#~ msgstr "Son sayfa tutacı URI" + +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Sayfa tutucu içinde son açılan URI" + +#~ msgid "Load Provisional" +#~ msgstr "Koşullu Yükle" + +#~ msgid "Load Committed" +#~ msgstr "İşlenmişi Yükle" + +#~ msgid "Load Finished" +#~ msgstr "Tamamlananı Yükle" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 00000000..35be8a9e --- /dev/null +++ b/po/uk.po @@ -0,0 +1,1371 @@ +# Ukrainian translation for midori package. +# Copyright (C) 2008 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Dmitry Nikitin 2008 +# +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 05:25+0100\n" +"PO-Revision-Date: 2008-11-21 17:49+0200\n" +"Last-Translator: Dmitry Nikitin \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Легкий переглядач Веб" + +#: ../midori.desktop.in.h:2 ../midori/main.c:1338 ../midori/main.c:1347 +#: ../midori/main.c:1370 ../midori/main.c:1394 +msgid "Midori" +msgstr "Мідорі" + +#: ../midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Переглядач Веб" + +#: ../midori/main.c:86 +msgid "_Bookmark" +msgstr "_Закладка" + +#: ../midori/main.c:87 ../midori/midori-browser.c:3744 +msgid "_Bookmarks" +msgstr "_Закладки" + +#: ../midori/main.c:88 +msgid "_Add Bookmark" +msgstr "_Додати закладку" + +#: ../midori/main.c:89 +msgid "_Console" +msgstr "_Консоль" + +#: ../midori/main.c:90 +msgid "_Extensions" +msgstr "_Розширення" + +#: ../midori/main.c:91 +msgid "_History" +msgstr "_Історія" + +#: ../midori/main.c:92 +msgid "_Homepage" +msgstr "Д_омашня" + +#: ../midori/main.c:93 +msgid "_Userscripts" +msgstr "_Скрипти користувача" + +#: ../midori/main.c:94 +msgid "User_styles" +msgstr "Ст_илі користувача" + +#: ../midori/main.c:95 +msgid "New _Tab" +msgstr "Нова _вкладка" + +#: ../midori/main.c:96 +msgid "_Transfers" +msgstr "_Завантаження" + +#: ../midori/main.c:97 +msgid "_Closed Tabs and Windows" +msgstr "_Закриті вкладки та вікна" + +#: ../midori/main.c:98 +msgid "New _Window" +msgstr "_Нове вікно" + +#: ../midori/main.c:143 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "Конфігурація не може бути завантажена: %s\n" + +#: ../midori/main.c:198 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "Значення '%s' є неправильним для %s" + +#: ../midori/main.c:205 ../midori/main.c:275 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "Неправильне значення конфігурації '%s'" + +#: ../midori/main.c:532 +msgid "File not found." +msgstr "Файл не знайдений." + +#: ../midori/main.c:540 ../midori/main.c:549 +msgid "Malformed document." +msgstr "Неправильний документ." + +#: ../midori/main.c:571 ../midori/main.c:603 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "Не вдалось відкрити базу даних: %s\n" + +#: ../midori/main.c:657 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "Невдача при видаленні об'єкту історії: %s\n" + +#: ../midori/main.c:681 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "Невдача при очищенні історії: %s\n" + +#: ../midori/main.c:714 ../midori/main.c:728 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "Невдача при додаванні об'єкту історії: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:844 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "Невдача видалення старого об'єкту історії: %s\n" + +#: ../midori/main.c:976 ../midori/sokoke.c:459 +#, c-format +msgid "Writing failed." +msgstr "Невдача при запису." + +#: ../midori/main.c:1000 ../midori/midori-preferences.c:350 +msgid "Transfers" +msgstr "Завантаження" + +#: ../midori/main.c:1040 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "Сесія не може бути збережена. %s" + +#: ../midori/main.c:1297 +msgid "Run the specified filename as javascript" +msgstr "Запустити визначений файл як джава-скрипт" + +#: ../midori/main.c:1299 +msgid "Display program version" +msgstr "Відобразити версію програми" + +#: ../midori/main.c:1301 +msgid "URIs" +msgstr "посилання URIs" + +#: ../midori/main.c:1335 +msgid "[URIs]" +msgstr "[URIs]" + +#: ../midori/main.c:1371 +msgid "Please report comments, suggestions and bugs to:" +msgstr "Будь ласка надсилайте звіти, коментарі, пропозиції баги для:" + +#: ../midori/main.c:1373 +msgid "Check for new versions at:" +msgstr "Перевірити наявність нової версії на:" + +#: ../midori/main.c:1394 +msgid "No filename specified" +msgstr "Не вказано назви файлу" + +#: ../midori/main.c:1411 +#, c-format +msgid "An instance of Midori is already running but not responding.\n" +msgstr "" +"Один із екземплярів програми Midori вже працює але не відповідає на запити.\n" + +#: ../midori/main.c:1447 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "Неможливо завантажити закладки: %s\n" + +#: ../midori/main.c:1463 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "Неможливо завантажити сесію: %s\n" + +#: ../midori/main.c:1477 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "Неможливо завантажити смітник: %s\n" + +#: ../midori/main.c:1491 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "Неможливо завантажити історію: %s\n" + +#: ../midori/main.c:1504 +msgid "The following errors occured:" +msgstr "Отримано наступні помилки:" + +#: ../midori/main.c:1520 +msgid "_Ignore" +msgstr "" + +#: ../midori/main.c:1688 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "Неможливо зберегти пошукову машину. %s" + +#: ../midori/main.c:1698 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "Неможливо зберегти закладки. %s" + +#: ../midori/main.c:1707 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "Неможливо зберегти смітник. %s" + +#: ../midori/main.c:1715 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "Неможливо зберегти конфігурацію. %s" + +#: ../midori/midori-browser.c:249 ../midori/midori-browser.c:3130 +#: ../midori/midori-browser.c:3136 +msgid "Reload the current page" +msgstr "Оновити поточну сторінку" + +#: ../midori/midori-browser.c:261 ../midori/midori-browser.c:3133 +msgid "Stop loading the current page" +msgstr "Зупинити завантаження поточної сторінки" + +#: ../midori/midori-browser.c:319 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% завантажено" + +#: ../midori/midori-browser.c:342 +#, c-format +msgid "Unexpected action '%s'." +msgstr "Несподівана дія '%s'." + +#: ../midori/midori-browser.c:508 +msgid "New bookmark" +msgstr "Нова закладка" + +#: ../midori/midori-browser.c:508 +msgid "Edit bookmark" +msgstr "Редагувати закладку" + +#: ../midori/midori-browser.c:530 +msgid "_Title:" +msgstr "_Назва:" + +#: ../midori/midori-browser.c:543 ../midori/midori-searchaction.c:841 +msgid "_Description:" +msgstr "_Опис:" + +#: ../midori/midori-browser.c:562 ../midori/midori-searchaction.c:855 +msgid "_URL:" +msgstr "_Посилання:" + +#: ../midori/midori-browser.c:578 +msgid "_Folder:" +msgstr "_Тека:" + +#: ../midori/midori-browser.c:582 +msgid "Root" +msgstr "Адмін" + +#: ../midori/midori-browser.c:668 +msgid "Save file as" +msgstr "Зберегти файл як" + +#: ../midori/midori-browser.c:1248 +msgid "Open file" +msgstr "Відкрити файл" + +#: ../midori/midori-browser.c:2328 +msgid "Open in New _Tab" +msgstr "Відкрити у новій _вкладці" + +#: ../midori/midori-browser.c:2330 +msgid "Open in New _Window" +msgstr "Відкрити у новому _вікні" + +#: ../midori/midori-browser.c:2601 +msgid "Separator" +msgstr "Роздільник" + +#: ../midori/midori-browser.c:2712 +#, c-format +msgid "A week ago" +msgstr "Тижневої давності" + +#: ../midori/midori-browser.c:2718 +#, c-format +msgid "%d days ago" +msgstr "%d днів тому" + +#: ../midori/midori-browser.c:2725 +msgid "Today" +msgstr "Сьогодні" + +#: ../midori/midori-browser.c:2727 +msgid "Yesterday" +msgstr "Вчора" + +#: ../midori/midori-browser.c:2816 +msgid "A lightweight web browser." +msgstr "Легкий переглядач Веб" + +#: ../midori/midori-browser.c:2824 +msgid "translator-credits" +msgstr "Dmitry Nikitin " + +#: ../midori/midori-browser.c:2958 +msgid "Are you sure you want to remove all history items?" +msgstr "Ви впевнені, що бажаєте видалити всі об'єкти з історії?" + +#: ../midori/midori-browser.c:3064 +msgid "_File" +msgstr "_Файл" + +#: ../midori/midori-browser.c:3067 +msgid "Open a new window" +msgstr "Відкрити в новому вікні" + +#: ../midori/midori-browser.c:3070 +msgid "Open a new tab" +msgstr "Відкрити в новій вкладці" + +#: ../midori/midori-browser.c:3073 +msgid "Open a file" +msgstr "Відкрити файл" + +#: ../midori/midori-browser.c:3076 +msgid "Save to a file" +msgstr "Зберегти в файл" + +#: ../midori/midori-browser.c:3078 +msgid "_Close Tab" +msgstr "_Закрити вкладку" + +#: ../midori/midori-browser.c:3079 +msgid "Close the current tab" +msgstr "Закрити поточну вкладку" + +#: ../midori/midori-browser.c:3081 +msgid "C_lose Window" +msgstr "З_акрити вікно" + +#: ../midori/midori-browser.c:3082 +msgid "Close this window" +msgstr "Закрити це вікно" + +#: ../midori/midori-browser.c:3085 +msgid "Print the current page" +msgstr "Надрукувати поточну строрінку" + +#: ../midori/midori-browser.c:3088 +msgid "Quit the application" +msgstr "Вийти з програми" + +#: ../midori/midori-browser.c:3090 +msgid "_Edit" +msgstr "_Редагувати" + +#: ../midori/midori-browser.c:3093 +msgid "Cut the selected text" +msgstr "Вирізати вибраний текст" + +#: ../midori/midori-browser.c:3096 ../midori/midori-browser.c:3099 +msgid "Copy the selected text" +msgstr "Копіювати вибраний текст" + +#: ../midori/midori-browser.c:3102 +msgid "Paste text from the clipboard" +msgstr "Вставити текст з буфера" + +#: ../midori/midori-browser.c:3105 +msgid "Delete the selected text" +msgstr "Видалити вибраний текст" + +#: ../midori/midori-browser.c:3108 +msgid "Select all text" +msgstr "Виділити весь текст" + +#: ../midori/midori-browser.c:3111 +msgid "Find a word or phrase in the page" +msgstr "Шукати слово чи фразу на сторінці" + +#: ../midori/midori-browser.c:3113 +msgid "Find _Next" +msgstr "Шукати _наступне" + +#: ../midori/midori-browser.c:3114 +msgid "Find the next occurrence of a word or phrase" +msgstr "Шукати наступне входження слова або фрази" + +#: ../midori/midori-browser.c:3116 +msgid "Find _Previous" +msgstr "Шукати _попереднє" + +#: ../midori/midori-browser.c:3117 +msgid "Find the previous occurrence of a word or phrase" +msgstr "Шукати попереднє входження слова або фрази" + +#: ../midori/midori-browser.c:3120 +msgid "_Quick Find" +msgstr "_Швидкий пошук" + +#: ../midori/midori-browser.c:3121 +msgid "Quickly jump to a word or phrase" +msgstr "Швидкий перехід на слово або фразу" + +#: ../midori/midori-browser.c:3124 +msgid "Configure the application preferences" +msgstr "Налаштувати властивості програми" + +#: ../midori/midori-browser.c:3126 +msgid "_View" +msgstr "_Перегляд" + +#: ../midori/midori-browser.c:3127 +msgid "_Toolbars" +msgstr "Панелі _Інструментів" + +#: ../midori/midori-browser.c:3139 +msgid "Increase the zoom level" +msgstr "Збільшити розмір перегляду" + +#: ../midori/midori-browser.c:3142 +msgid "Decrease the zoom level" +msgstr "Зменшити розмір перегляду" + +#: ../midori/midori-browser.c:3145 +msgid "Reset the zoom level" +msgstr "Відновити розмір перегляду" + +#: ../midori/midori-browser.c:3147 ../midori/midori-view.c:998 +msgid "View _Source" +msgstr "Перегляд _коду" + +#: ../midori/midori-browser.c:3148 +msgid "View the source code of the page" +msgstr "Переглянути вихідний код сторінки" + +#: ../midori/midori-browser.c:3150 +msgid "View Selection Source" +msgstr "Переглянути вибраний код" + +#: ../midori/midori-browser.c:3151 +msgid "View the source code of the selection" +msgstr "Переглянути вихідний код вибраного" + +#: ../midori/midori-browser.c:3155 +msgid "Toggle fullscreen view" +msgstr "Перемкнути в повноекранний режим" + +#: ../midori/midori-browser.c:3157 +msgid "_Go" +msgstr "_Перейти" + +#: ../midori/midori-browser.c:3160 +msgid "Go back to the previous page" +msgstr "Повернутись на попередню сторінку" + +#: ../midori/midori-browser.c:3163 +msgid "Go forward to the next page" +msgstr "Перейти до наступної сторінки" + +#: ../midori/midori-browser.c:3166 +msgid "Go to your homepage" +msgstr "Перейти на домашню сторінку" + +#: ../midori/midori-browser.c:3168 +msgid "Empty Trash" +msgstr "Спорожнити смітник" + +#: ../midori/midori-browser.c:3169 +msgid "Delete the contents of the trash" +msgstr "Видалити вміст смітника" + +#: ../midori/midori-browser.c:3171 ../midori/midori-view.c:970 +msgid "Undo Close Tab" +msgstr "Повернути закриту вкладку" + +#: ../midori/midori-browser.c:3172 +msgid "Open the last closed tab" +msgstr "Відкрити останню закриту вкладку" + +#: ../midori/midori-browser.c:3176 +msgid "Add a new bookmark" +msgstr "Додати нову закладку" + +#: ../midori/midori-browser.c:3179 +msgid "Edit the selected bookmark" +msgstr "Редагувати вибрану закладку" + +#: ../midori/midori-browser.c:3182 +msgid "Delete the selected bookmark" +msgstr "Видалити вибрану закладку" + +#: ../midori/midori-browser.c:3185 +msgid "Delete the selected history item" +msgstr "Видалити вибраний об'єкт історії" + +#: ../midori/midori-browser.c:3188 +msgid "Clear the entire history" +msgstr "Очистити історію" + +#: ../midori/midori-browser.c:3191 +msgid "Bookmark the selected history item" +msgstr "Додати в закладки вибраний об'єкт історії" + +#: ../midori/midori-browser.c:3193 +msgid "_Tools" +msgstr "_Інструменти" + +#: ../midori/midori-browser.c:3195 ../midori/midori-searchaction.c:465 +msgid "_Manage Search Engines" +msgstr "_Налаштувати пошукові машини" + +#: ../midori/midori-browser.c:3196 +msgid "Add, edit and remove search engines..." +msgstr "Додати, редагувати чи видалити пошукові машини..." + +#: ../midori/midori-browser.c:3200 +msgid "_Previous Tab" +msgstr "_Попередня вкладка" + +#: ../midori/midori-browser.c:3201 +msgid "Switch to the previous tab" +msgstr "Перемкнути до попередньої вкладки" + +#: ../midori/midori-browser.c:3203 +msgid "_Next Tab" +msgstr "_Наступна вкладка" + +#: ../midori/midori-browser.c:3204 +msgid "Switch to the next tab" +msgstr "Перемкнути до наступної вкладки" + +#: ../midori/midori-browser.c:3206 +msgid "_Help" +msgstr "_Допомога" + +#: ../midori/midori-browser.c:3208 +msgid "_Contents" +msgstr "_Зміст" + +#: ../midori/midori-browser.c:3209 +msgid "Show the documentation" +msgstr "Показати документацію" + +#: ../midori/midori-browser.c:3211 +msgid "_Frequent questions" +msgstr "_Найуживаніші питання" + +#: ../midori/midori-browser.c:3212 +msgid "Show the Frequently Asked Questions" +msgstr "Показати найуживаніші запитання" + +#: ../midori/midori-browser.c:3214 +msgid "_Report a bug" +msgstr "П_овідомити про помилку" + +#: ../midori/midori-browser.c:3215 +msgid "Open Midori's bug tracker" +msgstr "Відкрити баг-трекер Midori" + +#: ../midori/midori-browser.c:3218 +msgid "Show information about the program" +msgstr "Відобразити інформацію про програму" + +#: ../midori/midori-browser.c:3225 +msgid "P_rivate Browsing" +msgstr "_Режим приватності" + +#: ../midori/midori-browser.c:3226 +msgid "Don't save any private data while browsing" +msgstr "Не зберізати будь яких даних під час перегляду Веб" + +#: ../midori/midori-browser.c:3231 +msgid "_Menubar" +msgstr "Панель _меню" + +#: ../midori/midori-browser.c:3232 +msgid "Show menubar" +msgstr "Показати панель меню" + +#: ../midori/midori-browser.c:3235 +msgid "_Navigationbar" +msgstr "Панель _навігації" + +#: ../midori/midori-browser.c:3236 +msgid "Show navigationbar" +msgstr "Показати панель навігації" + +#: ../midori/midori-browser.c:3239 +msgid "Side_panel" +msgstr "_Бічна панель" + +#: ../midori/midori-browser.c:3240 +msgid "Show sidepanel" +msgstr "Показати бічну панель" + +#: ../midori/midori-browser.c:3243 +msgid "_Bookmarkbar" +msgstr "Панель _закладок" + +#: ../midori/midori-browser.c:3244 +msgid "Show bookmarkbar" +msgstr "Показати панель закладок" + +#: ../midori/midori-browser.c:3247 +msgid "_Transferbar" +msgstr "Панель за_вантажень" + +#: ../midori/midori-browser.c:3248 +msgid "Show transferbar" +msgstr "Показати панель завантажень" + +#: ../midori/midori-browser.c:3251 +msgid "_Statusbar" +msgstr "Панель _стану" + +#: ../midori/midori-browser.c:3252 +msgid "Show statusbar" +msgstr "Показати панель стану" + +#: ../midori/midori-browser.c:3669 +msgid "_Location..." +msgstr "_Місцезнаходження..." + +#: ../midori/midori-browser.c:3671 +msgid "Open a particular location" +msgstr "Відкрити поточне місцезнаходження" + +#: ../midori/midori-browser.c:3695 +msgid "_Web Search..." +msgstr "_Пошук у Веб..." + +#: ../midori/midori-browser.c:3697 +msgid "Run a web search" +msgstr "Запустити пошук у Веб" + +#: ../midori/midori-browser.c:3716 +msgid "Reopen a previously closed tab or window" +msgstr "Знову відкрити закриту вкладку чи вікно" + +#: ../midori/midori-browser.c:3729 +msgid "_Recently visited pages" +msgstr "_Останні відвідані сторінки" + +#: ../midori/midori-browser.c:3731 +msgid "Reopen pages that you visited earlier" +msgstr "Знову відкрити сторінки, що були переглянуті раніше" + +#: ../midori/midori-browser.c:3746 +msgid "Show the saved bookmarks" +msgstr "Показати збережені закладки" + +#: ../midori/midori-browser.c:3759 +msgid "_Window" +msgstr "_Вікно" + +#: ../midori/midori-browser.c:3761 +msgid "Show a list of all open tabs" +msgstr "Показати список відкритих вкладок" + +#: ../midori/midori-browser.c:3883 +msgid "Bookmarks" +msgstr "Закладки" + +#: ../midori/midori-browser.c:3926 ../midori/midori-preferences.c:517 +msgid "History" +msgstr "Історія" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3969 +msgid "_Inline find:" +msgstr "Знайти _входження:" + +#: ../midori/midori-browser.c:4004 +msgid "Match Case" +msgstr "Входження" + +#: ../midori/midori-browser.c:4012 +msgid "Highlight Matches" +msgstr "Підсвітити входження" + +#: ../midori/midori-browser.c:4021 +msgid "Close Findbar" +msgstr "Закрити панель пошуку" + +#: ../midori/midori-browser.c:4262 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "Невавершені властивості '%s'" + +#: ../midori/midori-panel.c:223 ../midori/midori-panel.c:224 +msgid "Close panel" +msgstr "Закрити панель" + +#: ../midori/midori-websettings.c:131 ../midori/midori-view.c:1635 +msgid "Blank page" +msgstr "Пуста сторінка" + +#: ../midori/midori-websettings.c:132 ../midori/midori-websettings.c:387 +msgid "Homepage" +msgstr "Домашня сторінка" + +#: ../midori/midori-websettings.c:133 +msgid "Last open pages" +msgstr "Останні відкриті сторінки" + +#: ../midori/midori-websettings.c:148 +msgid "Chinese (BIG5)" +msgstr "Китайська (BIG5)" + +#: ../midori/midori-websettings.c:149 +msgid "Japanese (SHIFT_JIS)" +msgstr "Японська (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:150 +msgid "Russian (KOI8-R)" +msgstr "Російська (KOI8-R)" + +#: ../midori/midori-websettings.c:151 +msgid "Unicode (UTF-8)" +msgstr "Юнікод (UTF-8)" + +#: ../midori/midori-websettings.c:152 +msgid "Western (ISO-8859-1)" +msgstr "Західний (ISO-8859-1)" + +#: ../midori/midori-websettings.c:153 +msgid "Custom..." +msgstr "Інша..." + +#: ../midori/midori-websettings.c:168 +msgid "New tab" +msgstr "Нова вкладка" + +#: ../midori/midori-websettings.c:169 +msgid "New window" +msgstr "Нове вікно" + +#: ../midori/midori-websettings.c:170 +msgid "Current tab" +msgstr "Поточна вкладка" + +#: ../midori/midori-websettings.c:185 +msgid "Default" +msgstr "Типово" + +#: ../midori/midori-websettings.c:186 +msgid "Icons" +msgstr "Значки" + +#: ../midori/midori-websettings.c:187 +msgid "Text" +msgstr "Текст" + +#: ../midori/midori-websettings.c:188 +msgid "Both" +msgstr "Обидва" + +#: ../midori/midori-websettings.c:189 +msgid "Both horizontal" +msgstr "Обидва горизонтально" + +#: ../midori/midori-websettings.c:204 +msgid "All cookies" +msgstr "Всі куки" + +#: ../midori/midori-websettings.c:205 +msgid "Session cookies" +msgstr "Куки сесії" + +#: ../midori/midori-websettings.c:206 ../panels/midori-addons.c:97 +msgid "None" +msgstr "Нічого" + +#: ../midori/midori-websettings.c:246 +msgid "Remember last window size" +msgstr "Запам'ятати останній розмір вікна" + +#: ../midori/midori-websettings.c:247 +msgid "Whether to save the last window size" +msgstr "Властивості збереження розміру вікна" + +#: ../midori/midori-websettings.c:255 +msgid "Last window width" +msgstr "Ширина останнього вікна" + +#: ../midori/midori-websettings.c:256 +msgid "The last saved window width" +msgstr "Остання збережена ширина вікна" + +#: ../midori/midori-websettings.c:264 +msgid "Last window height" +msgstr "Висота останнього вікна" + +#: ../midori/midori-websettings.c:265 +msgid "The last saved window height" +msgstr "Остання збережена висота вікна" + +#: ../midori/midori-websettings.c:273 +msgid "Last panel position" +msgstr "Остання позиція панелі" + +#: ../midori/midori-websettings.c:274 +msgid "The last saved panel position" +msgstr "Остання збережена позиція панелі" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:283 +msgid "Last panel page" +msgstr "Остання сторінка панелі" + +#: ../midori/midori-websettings.c:284 +msgid "The last saved panel page" +msgstr "Остання збережена сторінка панелі" + +#: ../midori/midori-websettings.c:292 +msgid "Last Web search" +msgstr "Останній пошук у Веб" + +#: ../midori/midori-websettings.c:293 +msgid "The last saved Web search" +msgstr "Останній збережений пошук у Веб" + +#: ../midori/midori-websettings.c:302 +msgid "Show Menubar" +msgstr "Показати панель меню" + +#: ../midori/midori-websettings.c:303 +msgid "Whether to show the menubar" +msgstr "Налаштування відображення панелі меню" + +#: ../midori/midori-websettings.c:311 +msgid "Show Navigationbar" +msgstr "Показати панель навігації" + +#: ../midori/midori-websettings.c:312 +msgid "Whether to show the navigationbar" +msgstr "Налаштування відображення панелі навігації" + +#: ../midori/midori-websettings.c:320 +msgid "Show Bookmarkbar" +msgstr "Показати панель закладок" + +#: ../midori/midori-websettings.c:321 +msgid "Whether to show the bookmarkbar" +msgstr "Налаштування відображення панелі закладок" + +#: ../midori/midori-websettings.c:329 +msgid "Show Panel" +msgstr "Показати панель" + +#: ../midori/midori-websettings.c:330 +msgid "Whether to show the panel" +msgstr "Налаштування відображення панелі" + +#: ../midori/midori-websettings.c:338 +msgid "Show Statusbar" +msgstr "Показати панель стану" + +#: ../midori/midori-websettings.c:339 +msgid "Whether to show the statusbar" +msgstr "Налаштування відображення панелі стану" + +#: ../midori/midori-websettings.c:348 +msgid "Toolbar Style" +msgstr "Стиль панелі" + +#: ../midori/midori-websettings.c:349 +msgid "The style of the toolbar" +msgstr "Стиль панелі" + +#: ../midori/midori-websettings.c:358 +msgid "Toolbar Items" +msgstr "Об'єкти панелі інструментів" + +#: ../midori/midori-websettings.c:359 +msgid "The items to show on the toolbar" +msgstr "Об'єкти, що відображаються у панелі інструментів" + +#: ../midori/midori-websettings.c:367 +msgid "Compact Sidepanel" +msgstr "Компактна бічна панель" + +#: ../midori/midori-websettings.c:368 +msgid "Whether to make the sidepanel compact" +msgstr "Налаштування відображення компактної бічної панелі" + +#: ../midori/midori-websettings.c:377 +msgid "Load on Startup" +msgstr "Завантажити при старті" + +#: ../midori/midori-websettings.c:378 +msgid "What to load on startup" +msgstr "Що завантажувати при старті" + +#: ../midori/midori-websettings.c:388 +msgid "The homepage" +msgstr "Домашню сторінку" + +#: ../midori/midori-websettings.c:396 +msgid "Download Folder" +msgstr "Теку завантажень" + +#: ../midori/midori-websettings.c:397 +msgid "The folder downloaded files are saved to" +msgstr "Завантажені файли зберігати в" + +#: ../midori/midori-websettings.c:405 +msgid "Download Manager" +msgstr "Менеджер завантажень" + +#: ../midori/midori-websettings.c:406 +msgid "An external download manager" +msgstr "Зовнішній менеджер завантажень" + +#: ../midori/midori-websettings.c:414 +msgid "Text Editor" +msgstr "Текстовий редактор" + +#: ../midori/midori-websettings.c:415 +msgid "An external text editor" +msgstr "Зовнішній текстовий редактор" + +#: ../midori/midori-websettings.c:423 +msgid "Location entry Search" +msgstr "Місце початку пошуку" + +#: ../midori/midori-websettings.c:424 +msgid "The search to perform inside the location entry" +msgstr "Здійснювати пошук всередині місця входження" + +#: ../midori/midori-websettings.c:432 +msgid "Preferred Encoding" +msgstr "Улюблене кодування" + +#: ../midori/midori-websettings.c:433 +msgid "The preferred character encoding" +msgstr "Улюблене кодування символів" + +#: ../midori/midori-websettings.c:443 +msgid "Always Show Tabbar" +msgstr "Завжди відображати панель сторінок" + +#: ../midori/midori-websettings.c:444 +msgid "Always show the tabbar" +msgstr "Завжди відображати панель вкладок" + +#: ../midori/midori-websettings.c:452 +msgid "Close Buttons on Tabs" +msgstr "Кнопки закриття на вкладках" + +#: ../midori/midori-websettings.c:453 +msgid "Whether tabs have close buttons" +msgstr "Чи матимуть вкладки кнопки закриття" + +#: ../midori/midori-websettings.c:462 +msgid "Open new pages in" +msgstr "Відкривати нові сторінки в" + +#: ../midori/midori-websettings.c:463 +msgid "Where to open new pages" +msgstr "Де відкривати нові сторінки" + +#: ../midori/midori-websettings.c:473 +msgid "Open external pages in" +msgstr "Відкривати зовнішні виклики сторінок в" + +#: ../midori/midori-websettings.c:474 +msgid "Where to open externally opened pages" +msgstr "Де відкривати сторінки зовнішнього виклику" + +#: ../midori/midori-websettings.c:483 +msgid "Middle click opens Selection" +msgstr "Середня кнопка відкриває виділене" + +#: ../midori/midori-websettings.c:484 +msgid "Load an URL from the selection via middle click" +msgstr "" +"Завантажувати посилання URL з виділеного через клацання середньої кнопки" + +#: ../midori/midori-websettings.c:492 +msgid "Open tabs in the background" +msgstr "Відкривати вкладки в фонових" + +#: ../midori/midori-websettings.c:493 +msgid "Whether to open new tabs in the background" +msgstr "Чи відкривати нові вкладки в фоновому режимі" + +#: ../midori/midori-websettings.c:501 +msgid "Open Tabs next to Current" +msgstr "Відкривати вкладки у наступних після поточної" + +#: ../midori/midori-websettings.c:502 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "" +"Чи відкривати нові вкладки у наступній за нею чи після останньої вкладки" + +#: ../midori/midori-websettings.c:510 +msgid "Open popups in tabs" +msgstr "Відкривати спливаючі вікна у вкладках" + +#: ../midori/midori-websettings.c:511 +msgid "Whether to open popup windows in tabs" +msgstr "Чи відкривати спливаючі вікна у вкладках" + +#: ../midori/midori-websettings.c:537 +msgid "Accept cookies" +msgstr "Приймати cookies" + +#: ../midori/midori-websettings.c:538 +msgid "What type of cookies to accept" +msgstr "Якого типу cookies приймати" + +#: ../midori/midori-websettings.c:547 +msgid "Original cookies only" +msgstr "Тільки оригінальніcookies" + +#: ../midori/midori-websettings.c:548 +msgid "Accept cookies from the original website only" +msgstr "Приймати cookies тільки з поточного сайту" + +#: ../midori/midori-websettings.c:556 +msgid "Maximum cookie age" +msgstr "Тривалість життя cookie" + +#: ../midori/midori-websettings.c:557 +msgid "The maximum number of days to save cookies for" +msgstr "Максимальне число днів зберігання cookies для" + +#: ../midori/midori-websettings.c:567 +msgid "Remember last visited pages" +msgstr "Запам'ятати останні відвідані сторінки" + +#: ../midori/midori-websettings.c:568 +msgid "Whether the last visited pages are saved" +msgstr "Чи зберігати останні відвідані сторінки" + +#: ../midori/midori-websettings.c:576 +msgid "Maximum history age" +msgstr "Тривалість життя історії" + +#: ../midori/midori-websettings.c:577 +msgid "The maximum number of days to save the history for" +msgstr "Максимальне число днів для зберігати історію для" + +#: ../midori/midori-websettings.c:585 +msgid "Remember last form inputs" +msgstr "Запам'ятовувати введене" + +#: ../midori/midori-websettings.c:586 +msgid "Whether the last form inputs are saved" +msgstr "Чи зберігати введене останнього разу" + +#: ../midori/midori-websettings.c:594 +msgid "Remember last downloaded files" +msgstr "Запам'ятовувати останні завантажені файли" + +#: ../midori/midori-websettings.c:595 +msgid "Whether the last downloaded files are saved" +msgstr "Чи зберігати останні завантажені файли" + +#: ../midori/midori-websettings.c:605 +msgid "HTTP Proxy" +msgstr "Проксі HTTP" + +#: ../midori/midori-websettings.c:606 +msgid "The proxy used for HTTP connections" +msgstr "Проксі, що використовується для HTTP з'єднань" + +#: ../midori/midori-websettings.c:614 +msgid "Cache size" +msgstr "Розмір кешу" + +#: ../midori/midori-websettings.c:615 +msgid "The allowed size of the cache" +msgstr "Дозволений розмір кешу" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:632 +#, c-format +msgid "Not found - %s" +msgstr "" + +#: ../midori/midori-view.c:902 +msgid "Open Link in New _Tab" +msgstr "Відкривати посилання у нових в_кладках" + +#: ../midori/midori-view.c:925 +msgid "_Save Link destination" +msgstr "Збер_ігати віддаленні посилання" + +#: ../midori/midori-view.c:933 +msgid "_Download Link destination" +msgstr "За_вантажувати віддалені посилання" + +#: ../midori/midori-view.c:955 +msgid "Open URL in New _Tab" +msgstr "Відкривати URL у нових вкла_дках" + +#: ../midori/midori-view.c:1365 +#, c-format +msgid "Inspect page - %s" +msgstr "Перевірка сторінки - %s" + +#: ../midori/midori-view.c:1503 +msgid "Source" +msgstr "Вихідний код" + +#: ../midori/midori-view.c:1527 +#, fuzzy, c-format +msgid "No documentation installed" +msgstr "Показати документацію" + +#: ../midori/midori-preferences.c:87 +#, c-format +msgid "Preferences for %s" +msgstr "Властивості для %s" + +#. Page "General" +#: ../midori/midori-preferences.c:338 +msgid "General" +msgstr "Основні" + +#: ../midori/midori-preferences.c:339 +msgid "Startup" +msgstr "Початкові" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:386 +msgid "Appearance" +msgstr "Зовнішній вигляд" + +#: ../midori/midori-preferences.c:387 +msgid "Font settings" +msgstr "Властивості шрифту" + +#: ../midori/midori-preferences.c:389 +msgid "Default Font Family" +msgstr "Типове сімейство шрифтів" + +#: ../midori/midori-preferences.c:397 +msgid "Minimum Font Size" +msgstr "Мінімальний розмір шрифту" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:407 +msgid "Behavior" +msgstr "Заголовок" + +#: ../midori/midori-preferences.c:408 +msgid "Features" +msgstr "Опції" + +#: ../midori/midori-preferences.c:411 ../extensions/statusbar-features.c:32 +msgid "Load images automatically" +msgstr "Автоматично завантажувати зображення" + +#: ../midori/midori-preferences.c:414 +msgid "Shrink images automatically" +msgstr "Автоматично зменшувати зображення" + +#: ../midori/midori-preferences.c:417 +msgid "Print background images" +msgstr "Друкувати фонові зображення" + +#: ../midori/midori-preferences.c:420 +msgid "Resizable text areas" +msgstr "Межі тексту змінюють розмір" + +#: ../midori/midori-preferences.c:423 ../extensions/statusbar-features.c:39 +msgid "Enable scripts" +msgstr "Дозволити скрипти" + +#: ../midori/midori-preferences.c:426 ../extensions/statusbar-features.c:46 +msgid "Enable plugins" +msgstr "Дозволити розширення" + +#: ../midori/midori-preferences.c:429 +msgid "Enable developer tools" +msgstr "Дозволити утиліти розробника" + +#. Page "Interface" +#: ../midori/midori-preferences.c:437 +msgid "Interface" +msgstr "Інтерфейс" + +#: ../midori/midori-preferences.c:438 +msgid "Navigationbar" +msgstr "Панель навігації" + +#: ../midori/midori-preferences.c:453 +msgid "Browsing" +msgstr "Перегляд сторінок" + +#: ../midori/midori-preferences.c:480 ../midori/midori-preferences.c:481 +msgid "Network" +msgstr "Мережа" + +#: ../midori/midori-preferences.c:492 +msgid "MB" +msgstr "МБ" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:498 +msgid "Privacy" +msgstr "Приватність" + +#: ../midori/midori-preferences.c:500 +msgid "Web Cookies" +msgstr "Веб Cookies" + +#: ../midori/midori-preferences.c:513 ../midori/midori-preferences.c:524 +msgid "days" +msgstr "днів" + +#: ../midori/midori-searchaction.c:456 ../katze/katze-arrayaction.c:273 +msgid "Empty" +msgstr "Порожня" + +#: ../midori/midori-searchaction.c:797 +msgid "Add search engine" +msgstr "Додати пошукову машину" + +#: ../midori/midori-searchaction.c:797 +msgid "Edit search engine" +msgstr "Редагувати пошукову машину" + +#: ../midori/midori-searchaction.c:825 +msgid "_Name:" +msgstr "_Назва:" + +#: ../midori/midori-searchaction.c:869 +msgid "_Icon (name or file):" +msgstr "_Значок (назва або файл):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Token:" +msgstr "_Ознака:" + +#: ../midori/midori-searchaction.c:1060 +msgid "Manage search engines" +msgstr "Керувати пошуковими машинами" + +#: ../midori/sokoke.c:63 ../midori/sokoke.c:75 +msgid "Could not run external program." +msgstr "Неможливо запустити зовнішню програму." + +#: ../midori/sokoke.c:282 +msgid "Warning: You are using a superuser account!" +msgstr "Попередження: Ви використовуєте права адміністратора!" + +#: ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "Отримано невідому помилку." + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s не має властивостей '%s'" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s не може бути призначено для %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s неможливо отримати доступ" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:144 +msgid "Userscripts" +msgstr "Скрипти користувача" + +#: ../panels/midori-addons.c:99 ../panels/midori-addons.c:146 +msgid "Userstyles" +msgstr "Стилі користувача" + +#: ../panels/midori-addons.c:1006 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "_Увімкнути" + +#: ../panels/midori-addons.c:1015 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "_Вимкнути" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "Консоль" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "Розширення" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "Названий значок '%s' не може бути завантажений" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "Значок лічильника '%s' не може бути завантажений" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "Фрейми анімації пошкоджені" + +#: ../katze/katze-utils.c:154 ../katze/katze-utils.c:352 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "Властивості '%s' неправильні для %s" + +#: ../katze/katze-utils.c:178 ../katze/katze-utils.c:217 +msgid "Choose file" +msgstr "Вибрати файл" + +#: ../katze/katze-utils.c:198 +msgid "Choose folder" +msgstr "Вибрати теку" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:109 ../extensions/page-holder.c:144 +msgid "Pageholder" +msgstr "Тримач сторінок" + +#: ../extensions/page-holder.c:128 +msgid "_Pageholder" +msgstr "_Тримач сторінки" + +#: ../extensions/statusbar-features.c:30 +msgid "Images" +msgstr "" + +#: ../extensions/statusbar-features.c:37 +#, fuzzy +msgid "Scripts" +msgstr "Скрипти користувача" + +#: ../extensions/statusbar-features.c:44 +msgid "Plugins" +msgstr "" + +#~ msgid "Open in Page_holder..." +#~ msgstr "Відкрити в тримачі _сторінок..." + +#~ msgid "Open the current page in the pageholder" +#~ msgstr "Відкрити поточну сторінку в тримачі сторінок" + +#~ msgid "Last pageholder URI" +#~ msgstr "Останнє посилання тримача сторінок" + +#~ msgid "The URI last opened in the pageholder" +#~ msgstr "Останнє посилання відкрите у тримачі сторінок" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 00000000..fb6c85af --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,1707 @@ +# Simplified Chinese translations for midori package. +# Copyright (C) 2009 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Stanley Zhang 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-03-22 22:19+0100\n" +"PO-Revision-Date: 2009-03-25 15:33+0800\n" +"Last-Translator: Stanley Zhang \n" +"Language-Team: Simplified Chinese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "轻量的 Web 浏览器" + +#: ../data/midori.desktop.in.h:2 +#: ../midori/main.c:1580 +#: ../midori/main.c:1672 +#: ../midori/main.c:1681 +#: ../midori/main.c:1692 +#: ../midori/midori-websettings.c:269 +msgid "Midori" +msgstr "Midori" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "Web 浏览器" + +#: ../midori/main.c:103 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "设置无法加载: %s\n" + +#: ../midori/main.c:158 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "值 '%s' 在 '%s' 中无效" + +#: ../midori/main.c:165 +#: ../midori/main.c:235 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "无效的设置值 '%s'" + +#: ../midori/main.c:477 +msgid "File not found." +msgstr "没有找到文件." + +#: ../midori/main.c:485 +#: ../midori/main.c:494 +msgid "Malformed document." +msgstr "异常的文件." + +#: ../midori/main.c:516 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "打开数据库失败: %s\n" + +#: ../midori/main.c:548 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "执行数据库操作失败: %s\n" + +#: ../midori/main.c:602 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "移除历史项目失败: %s\n" + +#: ../midori/main.c:626 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "清空历史失败: %s\n" + +#: ../midori/main.c:649 +#: ../midori/main.c:683 +#: ../midori/main.c:699 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "添加历史项失败: %s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:879 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "删除旧的历史项目失败: %s\n" + +#: ../midori/main.c:907 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "配置无法保存. %s" + +#: ../midori/main.c:936 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "搜索引擎无法保存. %s" + +#: ../midori/main.c:1066 +#: ../midori/sokoke.c:617 +#, c-format +msgid "Writing failed." +msgstr "写失败." + +#: ../midori/main.c:1087 +#: ../midori/main.c:1114 +#: ../midori/main.c:1142 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "书签无法保存. %s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1166 +#: ../midori/main.c:1190 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "垃圾箱无法保存. %s" + +#: ../midori/main.c:1261 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "会话无法保存. %s" + +#: ../midori/main.c:1377 +msgid "Midori seems to have crashed the last time it was opened. If this happend repeatedly, try one of the following options to solve the problem." +msgstr "Midori 好像在上次运行时崩溃了. 如果这种情况反复出现,请尝试以下的选项来解决此问题." + +#: ../midori/main.c:1392 +msgid "Modify _preferences" +msgstr "修改首选项(_p)" + +#: ../midori/main.c:1396 +msgid "Reset the last _session" +msgstr "重置最后的会话(_s)" + +#: ../midori/main.c:1401 +msgid "Disable all _extensions" +msgstr "关闭所有的扩展(_e)" + +#: ../midori/main.c:1580 +msgid "No filename specified" +msgstr "没有指定文件名" + +#: ../midori/main.c:1603 +#: ../midori/gjs.c:515 +msgid "An unknown error occured." +msgstr "发生了一个未知的错误." + +#: ../midori/main.c:1626 +msgid "Run the specified filename as javascript" +msgstr "将指定的文件当作 Javascript 执行" + +#: ../midori/main.c:1628 +msgid "Display program version" +msgstr "显示程序版本" + +#: ../midori/main.c:1630 +msgid "Addresses" +msgstr "地址" + +#: ../midori/main.c:1669 +msgid "[Addresses]" +msgstr "[地址]" + +#: ../midori/main.c:1693 +msgid "Please report comments, suggestions and bugs to:" +msgstr "请将意见、建议和问题反馈到:" + +#: ../midori/main.c:1695 +msgid "Check for new versions at:" +msgstr "在此检查新版本:" + +#: ../midori/main.c:1722 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "已经有一个 Midori 在运行,但没有响应.\n" + +#: ../midori/main.c:1772 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "搜索引擎无法加载. %s\n" + +#: ../midori/main.c:1784 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "书签无法加载: %s\n" + +#: ../midori/main.c:1799 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "会话无法加载: %s\n" + +#: ../midori/main.c:1812 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "垃圾箱无法加载: %s\n" + +#: ../midori/main.c:1825 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "历史记录无法加载: %s\n" + +#: ../midori/main.c:1837 +msgid "The following errors occured:" +msgstr "发生以下错误:" + +#: ../midori/main.c:1853 +msgid "_Ignore" +msgstr "忽略(_I)" + +#: ../midori/midori-browser.c:278 +#: ../midori/midori-browser.c:3262 +#: ../midori/midori-browser.c:3268 +msgid "Reload the current page" +msgstr "重新载入当前页" + +#: ../midori/midori-browser.c:289 +#: ../midori/midori-browser.c:3265 +msgid "Stop loading the current page" +msgstr "停止载入当前页" + +#: ../midori/midori-browser.c:351 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% 已加载" + +#: ../midori/midori-browser.c:376 +#, c-format +msgid "Unexpected action '%s'." +msgstr "意外的活动 '%s'." + +#: ../midori/midori-browser.c:553 +msgid "New folder" +msgstr "新建目录" + +#: ../midori/midori-browser.c:553 +msgid "Edit folder" +msgstr "编辑目录" + +#: ../midori/midori-browser.c:555 +msgid "New bookmark" +msgstr "新建书签" + +#: ../midori/midori-browser.c:555 +msgid "Edit bookmark" +msgstr "编辑书签" + +#: ../midori/midori-browser.c:585 +msgid "_Title:" +msgstr "标题(_T): " + +#: ../midori/midori-browser.c:598 +#: ../midori/midori-searchaction.c:855 +msgid "_Description:" +msgstr "描述(_D):" + +#: ../midori/midori-browser.c:617 +#: ../midori/midori-searchaction.c:869 +msgid "_Address:" +msgstr "地址(_A):" + +#: ../midori/midori-browser.c:636 +msgid "_Folder:" +msgstr "目录(_F):" + +#: ../midori/midori-browser.c:641 +#: ../midori/midori-browser.c:682 +msgid "Toplevel folder" +msgstr "最上层目录" + +#: ../midori/midori-browser.c:762 +msgid "Save file as" +msgstr "文件另存为" + +#: ../midori/midori-browser.c:1538 +msgid "Open file" +msgstr "打开文件" + +#: ../midori/midori-browser.c:2837 +#: ../panels/midori-bookmarks.c:776 +#: ../panels/midori-history.c:810 +msgid "Open all in _Tabs" +msgstr "在新标签页中打开所有项(_T)" + +#: ../midori/midori-browser.c:2844 +#: ../panels/midori-bookmarks.c:782 +#: ../panels/midori-history.c:816 +msgid "Open in New _Tab" +msgstr "在新标签页中打开(_T)" + +#: ../midori/midori-browser.c:2847 +#: ../panels/midori-bookmarks.c:784 +#: ../panels/midori-history.c:818 +msgid "Open in New _Window" +msgstr "在新窗口中打开(_W)" + +#: ../midori/midori-browser.c:3001 +msgid "A lightweight web browser." +msgstr "轻量级的 Web 浏览器." + +#: ../midori/midori-browser.c:3009 +msgid "translator-credits" +msgstr "张翼 " + +#: ../midori/midori-browser.c:3196 +msgid "_File" +msgstr "文件(_F)" + +#: ../midori/midori-browser.c:3199 +msgid "Open a new window" +msgstr "新建窗口" + +#: ../midori/midori-browser.c:3202 +msgid "Open a new tab" +msgstr "新建标签页" + +#: ../midori/midori-browser.c:3205 +msgid "Open a file" +msgstr "打开文件" + +#: ../midori/midori-browser.c:3208 +msgid "Save to a file" +msgstr "保存到文件" + +#: ../midori/midori-browser.c:3210 +msgid "_Close Tab" +msgstr "关闭标签页(_C)" + +#: ../midori/midori-browser.c:3211 +msgid "Close the current tab" +msgstr "关闭当前标签页" + +#: ../midori/midori-browser.c:3213 +msgid "C_lose Window" +msgstr "关闭窗口(_l)" + +#: ../midori/midori-browser.c:3214 +msgid "Close this window" +msgstr "关闭此窗口" + +#: ../midori/midori-browser.c:3217 +msgid "Print the current page" +msgstr "打印当前页" + +#: ../midori/midori-browser.c:3220 +msgid "Quit the application" +msgstr "退出程序" + +#: ../midori/midori-browser.c:3222 +msgid "_Edit" +msgstr "编辑(_E)" + +#: ../midori/midori-browser.c:3225 +msgid "Cut the selected text" +msgstr "剪切选中的文本" + +#: ../midori/midori-browser.c:3228 +#: ../midori/midori-browser.c:3231 +msgid "Copy the selected text" +msgstr "复制选中的文本" + +#: ../midori/midori-browser.c:3234 +msgid "Paste text from the clipboard" +msgstr "从剪贴板粘帖文本" + +#: ../midori/midori-browser.c:3237 +msgid "Delete the selected text" +msgstr "删除选中的文本" + +#: ../midori/midori-browser.c:3240 +msgid "Select all text" +msgstr "选取所有文本" + +#: ../midori/midori-browser.c:3243 +msgid "Find a word or phrase in the page" +msgstr "在页面中查找词或短语" + +#: ../midori/midori-browser.c:3245 +msgid "Find _Next" +msgstr "查找下一个(_N)" + +#: ../midori/midori-browser.c:3246 +msgid "Find the next occurrence of a word or phrase" +msgstr "查找下一处" + +#: ../midori/midori-browser.c:3248 +msgid "Find _Previous" +msgstr "查找上一个(_P)" + +#: ../midori/midori-browser.c:3249 +msgid "Find the previous occurrence of a word or phrase" +msgstr "查找上一处" + +#: ../midori/midori-browser.c:3252 +msgid "_Quick Find" +msgstr "快速查找(_Q)" + +#: ../midori/midori-browser.c:3253 +msgid "Quickly jump to a word or phrase" +msgstr "快速跳转到一个词或短语" + +#: ../midori/midori-browser.c:3256 +msgid "Configure the application preferences" +msgstr "设置程序首选项" + +#: ../midori/midori-browser.c:3258 +msgid "_View" +msgstr "查看(_V)" + +#: ../midori/midori-browser.c:3259 +msgid "_Toolbars" +msgstr "工具栏(_T)" + +#: ../midori/midori-browser.c:3271 +msgid "Increase the zoom level" +msgstr "提高放大倍数" + +#: ../midori/midori-browser.c:3274 +msgid "Decrease the zoom level" +msgstr "缩小放大倍数" + +#: ../midori/midori-browser.c:3277 +msgid "Reset the zoom level" +msgstr "重置放大倍数" + +#: ../midori/midori-browser.c:3278 +msgid "_Encoding" +msgstr "编码(_E)" + +#: ../midori/midori-browser.c:3280 +msgid "_Automatic" +msgstr "自动(_A)" + +#: ../midori/midori-browser.c:3283 +#: ../midori/midori-websettings.c:196 +msgid "Chinese (BIG5)" +msgstr "繁体中文 (BIG5)" + +#: ../midori/midori-browser.c:3286 +#: ../midori/midori-websettings.c:197 +msgid "Japanese (SHIFT_JIS)" +msgstr "日语 (SHIFT_JIS)" + +#: ../midori/midori-browser.c:3289 +#: ../midori/midori-websettings.c:198 +msgid "Russian (KOI8-R)" +msgstr "俄语 (KOI8-R)" + +#: ../midori/midori-browser.c:3292 +#: ../midori/midori-websettings.c:199 +msgid "Unicode (UTF-8)" +msgstr "Unicode (UTF-8)" + +#: ../midori/midori-browser.c:3295 +#: ../midori/midori-websettings.c:200 +msgid "Western (ISO-8859-1)" +msgstr "西方 (ISO-8859-1)" + +#: ../midori/midori-browser.c:3298 +#: ../midori/midori-websettings.c:201 +#: ../midori/midori-websettings.c:273 +msgid "Custom..." +msgstr "定制 ..." + +#: ../midori/midori-browser.c:3301 +#: ../midori/midori-view.c:1111 +msgid "View _Source" +msgstr "查看源码(_S)" + +#: ../midori/midori-browser.c:3302 +msgid "View the source code of the page" +msgstr "查看本页的源代码" + +#: ../midori/midori-browser.c:3304 +msgid "View Selection Source" +msgstr "查看选中部分的源代码" + +#: ../midori/midori-browser.c:3305 +msgid "View the source code of the selection" +msgstr "查看选中部分的源代码" + +#: ../midori/midori-browser.c:3309 +msgid "Toggle fullscreen view" +msgstr "全屏浏览" + +#: ../midori/midori-browser.c:3311 +msgid "_Go" +msgstr "位置(_G)" + +#: ../midori/midori-browser.c:3314 +msgid "Go back to the previous page" +msgstr "返回上一页" + +#: ../midori/midori-browser.c:3317 +msgid "Go forward to the next page" +msgstr "转到下一页" + +#: ../midori/midori-browser.c:3320 +msgid "Go to your homepage" +msgstr "回到主页" + +#: ../midori/midori-browser.c:3322 +msgid "Empty Trash" +msgstr "清空垃圾箱" + +#: ../midori/midori-browser.c:3323 +msgid "Delete the contents of the trash" +msgstr "删除垃圾箱中的内容" + +#: ../midori/midori-browser.c:3325 +#: ../midori/midori-view.c:1083 +msgid "Undo Close Tab" +msgstr "撤销关闭标签页" + +#: ../midori/midori-browser.c:3326 +msgid "Open the last closed tab" +msgstr "打开最后关闭的标签页" + +#: ../midori/midori-browser.c:3330 +#: ../panels/midori-bookmarks.c:228 +msgid "Add a new bookmark" +msgstr "添加一个新书签" + +#: ../midori/midori-browser.c:3331 +msgid "_Tools" +msgstr "工具(_T)" + +#: ../midori/midori-browser.c:3333 +#: ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "管理搜索引擎(_M)" + +#: ../midori/midori-browser.c:3334 +msgid "Add, edit and remove search engines..." +msgstr "添加, 编辑和移除搜索引擎" + +#: ../midori/midori-browser.c:3338 +msgid "_Previous Tab" +msgstr "上一个标签页(_P)" + +#: ../midori/midori-browser.c:3339 +msgid "Switch to the previous tab" +msgstr "转到上一个标签页" + +#: ../midori/midori-browser.c:3341 +msgid "_Next Tab" +msgstr "下一个标签页(_N)" + +#: ../midori/midori-browser.c:3342 +msgid "Switch to the next tab" +msgstr "转到上一个标签页" + +#: ../midori/midori-browser.c:3344 +msgid "_Help" +msgstr "帮助(_H)" + +#: ../midori/midori-browser.c:3346 +msgid "_Contents" +msgstr "内容(_C)" + +#: ../midori/midori-browser.c:3347 +msgid "Show the documentation" +msgstr "显示文档" + +#: ../midori/midori-browser.c:3349 +msgid "_Frequent Questions" +msgstr "常见问题(_F)" + +#: ../midori/midori-browser.c:3350 +msgid "Show the Frequently Asked Questions" +msgstr "显示常见问题" + +#: ../midori/midori-browser.c:3352 +msgid "_Report a Bug" +msgstr "反馈错误(_R)" + +#: ../midori/midori-browser.c:3353 +msgid "Open Midori's bug tracker" +msgstr "打开 Midori 的错误跟踪器" + +#: ../midori/midori-browser.c:3356 +msgid "Show information about the program" +msgstr "显示此程序的信息" + +#: ../midori/midori-browser.c:3363 +msgid "P_rivate Browsing" +msgstr "隐私浏览(_r)" + +#: ../midori/midori-browser.c:3364 +msgid "Don't save any private data while browsing" +msgstr "在浏览时不保存任何隐私数据" + +#: ../midori/midori-browser.c:3369 +msgid "_Menubar" +msgstr "菜单栏(_M)" + +#: ../midori/midori-browser.c:3370 +msgid "Show menubar" +msgstr "显示菜单栏" + +#: ../midori/midori-browser.c:3373 +msgid "_Navigationbar" +msgstr "导航栏(_N)" + +#: ../midori/midori-browser.c:3374 +msgid "Show navigationbar" +msgstr "显示导航栏" + +#: ../midori/midori-browser.c:3377 +msgid "Side_panel" +msgstr "侧边栏(_p)" + +#: ../midori/midori-browser.c:3378 +msgid "Show sidepanel" +msgstr "显示侧边栏" + +#: ../midori/midori-browser.c:3381 +msgid "_Bookmarkbar" +msgstr "书签栏(_B)" + +#: ../midori/midori-browser.c:3382 +msgid "Show bookmarkbar" +msgstr "显示书签栏" + +#: ../midori/midori-browser.c:3385 +msgid "_Transferbar" +msgstr "传输栏(_T)" + +#: ../midori/midori-browser.c:3386 +msgid "Show transferbar" +msgstr "显示传输栏" + +#: ../midori/midori-browser.c:3389 +msgid "_Statusbar" +msgstr "状态栏(_S)" + +#: ../midori/midori-browser.c:3390 +msgid "Show statusbar" +msgstr "显示状态栏" + +#: ../midori/midori-browser.c:3821 +msgid "_Separator" +msgstr "分割符(_S)" + +#: ../midori/midori-browser.c:3828 +msgid "_Location..." +msgstr "位置(_L)" + +#: ../midori/midori-browser.c:3830 +msgid "Open a particular location" +msgstr "打开一个指定位置" + +#: ../midori/midori-browser.c:3854 +msgid "_Web Search..." +msgstr "搜索 Web(_W)" + +#: ../midori/midori-browser.c:3856 +msgid "Run a web search" +msgstr "执行 Web 搜索" + +#: ../midori/midori-browser.c:3875 +msgid "Reopen a previously closed tab or window" +msgstr "重新打开以前关闭的标签页或窗口" + +#: ../midori/midori-browser.c:3888 +msgid "_Recently visited pages" +msgstr "最近访问的页面(_R)" + +#: ../midori/midori-browser.c:3890 +msgid "Reopen pages that you visited earlier" +msgstr "重新打开以前访问过的页面" + +#: ../midori/midori-browser.c:3903 +#: ../midori/sokoke.c:772 +msgid "_Bookmarks" +msgstr "书签(_B)" + +#: ../midori/midori-browser.c:3905 +msgid "Show the saved bookmarks" +msgstr "显示保存的书签" + +#: ../midori/midori-browser.c:3918 +msgid "_Window" +msgstr "窗口(_W)" + +#: ../midori/midori-browser.c:3920 +msgid "Show a list of all open tabs" +msgstr "显示所有标签页的列表" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:4085 +msgid "_Inline Find:" +msgstr "查找(_I):" + +#: ../midori/midori-browser.c:4110 +msgid "Previous" +msgstr "上一个" + +#: ../midori/midori-browser.c:4115 +msgid "Next" +msgstr "下一个" + +#: ../midori/midori-browser.c:4120 +msgid "Match Case" +msgstr "区分大小写" + +#: ../midori/midori-browser.c:4128 +msgid "Highlight Matches" +msgstr "高亮显示匹配" + +#: ../midori/midori-browser.c:4138 +msgid "Close Findbar" +msgstr "关闭查找栏" + +#: ../midori/midori-browser.c:4444 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "意外的设置 '%s'" + +#: ../midori/midori-panel.c:229 +#: ../midori/midori-websettings.c:511 +msgid "Align sidepanel on the right" +msgstr "侧边栏摆放到右侧" + +#: ../midori/midori-panel.c:231 +#: ../midori/midori-websettings.c:512 +msgid "Whether to align the sidepanel on the right" +msgstr "是否让侧边栏摆放到右侧" + +#: ../midori/midori-panel.c:241 +#: ../midori/midori-panel.c:242 +msgid "Close panel" +msgstr "关闭侧边栏" + +#: ../midori/midori-websettings.c:179 +#: ../midori/midori-view.c:1888 +msgid "Blank page" +msgstr "空白页面" + +#: ../midori/midori-websettings.c:180 +#: ../midori/midori-websettings.c:531 +msgid "Homepage" +msgstr "主页" + +#: ../midori/midori-websettings.c:181 +msgid "Last open pages" +msgstr "最后打开页面" + +#: ../midori/midori-websettings.c:216 +msgid "New tab" +msgstr "新建标签页" + +#: ../midori/midori-websettings.c:217 +msgid "New window" +msgstr "新建窗口" + +#: ../midori/midori-websettings.c:218 +msgid "Current tab" +msgstr "当前标签页" + +#: ../midori/midori-websettings.c:233 +msgid "Default" +msgstr "缺省" + +#: ../midori/midori-websettings.c:234 +msgid "Icons" +msgstr "图标" + +#: ../midori/midori-websettings.c:235 +msgid "Text" +msgstr "文字" + +#: ../midori/midori-websettings.c:236 +msgid "Both" +msgstr "图标及文字" + +#: ../midori/midori-websettings.c:237 +msgid "Both horizontal" +msgstr "水平摆放的图标和文字" + +#: ../midori/midori-websettings.c:252 +msgid "All cookies" +msgstr "所有 Cookies" + +#: ../midori/midori-websettings.c:253 +msgid "Session cookies" +msgstr "会话 Cookies" + +#: ../midori/midori-websettings.c:254 +#: ../panels/midori-addons.c:94 +msgid "None" +msgstr "无" + +#: ../midori/midori-websettings.c:270 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:271 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:272 +msgid "Internet Explorer" +msgstr "Internet Explorer" + +#: ../midori/midori-websettings.c:325 +msgid "Remember last window size" +msgstr "记住上次窗口的大小" + +#: ../midori/midori-websettings.c:326 +msgid "Whether to save the last window size" +msgstr "是否保存上次窗口的大小" + +#: ../midori/midori-websettings.c:334 +msgid "Last window width" +msgstr "上次窗口的宽度" + +#: ../midori/midori-websettings.c:335 +msgid "The last saved window width" +msgstr "上次保存的窗口宽度" + +#: ../midori/midori-websettings.c:343 +msgid "Last window height" +msgstr "上次窗口的高度" + +#: ../midori/midori-websettings.c:344 +msgid "The last saved window height" +msgstr "上次保存的窗口高度" + +#: ../midori/midori-websettings.c:369 +msgid "Last panel position" +msgstr "上次的侧边栏位置" + +#: ../midori/midori-websettings.c:370 +msgid "The last saved panel position" +msgstr "上次保存的侧边栏位置" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:379 +msgid "Last panel page" +msgstr "上次的侧边栏页" + +#: ../midori/midori-websettings.c:380 +msgid "The last saved panel page" +msgstr "上次保存的侧边栏页" + +#: ../midori/midori-websettings.c:388 +msgid "Last Web search" +msgstr "上次的 Web 搜索" + +#: ../midori/midori-websettings.c:389 +msgid "The last saved Web search" +msgstr "上次保存的 Web 搜索" + +#: ../midori/midori-websettings.c:398 +msgid "Show Menubar" +msgstr "显示菜单栏" + +#: ../midori/midori-websettings.c:399 +msgid "Whether to show the menubar" +msgstr "是否显示菜单栏" + +#: ../midori/midori-websettings.c:407 +msgid "Show Navigationbar" +msgstr "显示导航栏" + +#: ../midori/midori-websettings.c:408 +msgid "Whether to show the navigationbar" +msgstr "是否显示导航栏" + +#: ../midori/midori-websettings.c:416 +msgid "Show Bookmarkbar" +msgstr "显示书签栏" + +#: ../midori/midori-websettings.c:417 +msgid "Whether to show the bookmarkbar" +msgstr "是否显示书签栏" + +#: ../midori/midori-websettings.c:425 +msgid "Show Panel" +msgstr "显示侧边栏" + +#: ../midori/midori-websettings.c:426 +msgid "Whether to show the panel" +msgstr "是否显示侧边栏" + +#: ../midori/midori-websettings.c:441 +msgid "Show Transferbar" +msgstr "显示传输栏" + +#: ../midori/midori-websettings.c:442 +msgid "Whether to show the transferbar" +msgstr "是否显示传输栏" + +#: ../midori/midori-websettings.c:450 +msgid "Show Statusbar" +msgstr "显示状态栏" + +#: ../midori/midori-websettings.c:451 +msgid "Whether to show the statusbar" +msgstr "是否显示状态栏" + +#: ../midori/midori-websettings.c:460 +msgid "Toolbar Style" +msgstr "工具栏样式" + +#: ../midori/midori-websettings.c:461 +msgid "The style of the toolbar" +msgstr "工具栏的样式" + +#: ../midori/midori-websettings.c:477 +msgid "Show progress in location entry" +msgstr "在地址输入框中显示进度" + +#: ../midori/midori-websettings.c:478 +msgid "Whether to show loading progress in the location entry" +msgstr "是否在地址输入框中显示加载进度" + +#: ../midori/midori-websettings.c:486 +msgid "Toolbar Items" +msgstr "工具栏中的项目" + +#: ../midori/midori-websettings.c:487 +msgid "The items to show on the toolbar" +msgstr "在工具栏中显示的项目" + +#: ../midori/midori-websettings.c:495 +msgid "Compact Sidepanel" +msgstr "紧凑侧边栏" + +#: ../midori/midori-websettings.c:496 +msgid "Whether to make the sidepanel compact" +msgstr "是否让侧边栏紧凑显示" + +#: ../midori/midori-websettings.c:521 +msgid "Load on Startup" +msgstr "启动时加载" + +#: ../midori/midori-websettings.c:522 +msgid "What to load on startup" +msgstr "启动时加载的项目" + +#: ../midori/midori-websettings.c:532 +msgid "The homepage" +msgstr "主页" + +#: ../midori/midori-websettings.c:547 +msgid "Show crash dialog" +msgstr "显示崩溃提示对话框" + +#: ../midori/midori-websettings.c:548 +msgid "Show a dialog after Midori crashed" +msgstr "当 Midori 崩溃后显示提示对话框" + +#: ../midori/midori-websettings.c:556 +msgid "Download Folder" +msgstr "下载目录" + +#: ../midori/midori-websettings.c:557 +msgid "The folder downloaded files are saved to" +msgstr "下载的文件将保存到此目录" + +#: ../midori/midori-websettings.c:569 +msgid "Download Manager" +msgstr "下载管理器" + +#: ../midori/midori-websettings.c:570 +msgid "An external download manager" +msgstr "外部的下载管理器" + +#: ../midori/midori-websettings.c:578 +msgid "Text Editor" +msgstr "文本编辑器" + +#: ../midori/midori-websettings.c:579 +msgid "An external text editor" +msgstr "外部的文本编辑器" + +#: ../midori/midori-websettings.c:587 +msgid "Location entry Search" +msgstr "地址栏查找" + +#: ../midori/midori-websettings.c:588 +msgid "The search to perform inside the location entry" +msgstr "在地址输入框中执行的查找" + +#: ../midori/midori-websettings.c:596 +msgid "Preferred Encoding" +msgstr "首选的编码" + +#: ../midori/midori-websettings.c:597 +msgid "The preferred character encoding" +msgstr "首选的字符编码集" + +#: ../midori/midori-websettings.c:607 +msgid "Always Show Tabbar" +msgstr "总是显示标签栏" + +#: ../midori/midori-websettings.c:608 +msgid "Always show the tabbar" +msgstr "总是显示标签栏" + +#: ../midori/midori-websettings.c:616 +msgid "Close Buttons on Tabs" +msgstr "标签栏上显示关闭按钮" + +#: ../midori/midori-websettings.c:617 +msgid "Whether tabs have close buttons" +msgstr "是否在标签栏上显示关闭按钮" + +#: ../midori/midori-websettings.c:625 +msgid "Open new pages in" +msgstr "打开新的页面在" + +#: ../midori/midori-websettings.c:626 +msgid "Where to open new pages" +msgstr "在那里打开新的页面" + +#: ../midori/midori-websettings.c:635 +msgid "Open external pages in" +msgstr "打开外部页面在" + +#: ../midori/midori-websettings.c:636 +msgid "Where to open externally opened pages" +msgstr "在那里打开外部页面" + +#: ../midori/midori-websettings.c:649 +msgid "Middle click opens Selection" +msgstr "鼠标中键打开地址" + +#: ../midori/midori-websettings.c:650 +msgid "Load an address from the selection via middle click" +msgstr "用鼠标中键单击打开选中地址" + +#: ../midori/midori-websettings.c:658 +msgid "Open tabs in the background" +msgstr "在后台打开标签页" + +#: ../midori/midori-websettings.c:659 +msgid "Whether to open new tabs in the background" +msgstr "是否在后台打开标签页" + +#: ../midori/midori-websettings.c:667 +msgid "Open Tabs next to Current" +msgstr "在当前标签页后打开新标签" + +#: ../midori/midori-websettings.c:668 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "是否在当前标签页后打开新标签或者在最后的标签页后打开" + +#: ../midori/midori-websettings.c:676 +msgid "Open popups in tabs" +msgstr "在标签页中打开弹出窗口" + +#: ../midori/midori-websettings.c:677 +msgid "Whether to open popup windows in tabs" +msgstr "是否在标签页中打开弹出窗口" + +#: ../midori/midori-websettings.c:693 +msgid "Zoom Text and Images" +msgstr "缩放文字和图像" + +#: ../midori/midori-websettings.c:694 +msgid "Whether to zoom text and images" +msgstr "是否缩放文字和图像" + +#: ../midori/midori-websettings.c:709 +msgid "Find inline while typing" +msgstr "输入时自动补全" + +#: ../midori/midori-websettings.c:710 +msgid "Whether to automatically find inline while typing" +msgstr "是否输入时自动补全地址" + +#: ../midori/midori-websettings.c:718 +msgid "Accept cookies" +msgstr "接收 Cookies" + +#: ../midori/midori-websettings.c:719 +msgid "What type of cookies to accept" +msgstr "接收什么类型的 Cookies" + +#: ../midori/midori-websettings.c:728 +msgid "Original cookies only" +msgstr "只接收原始 Cookies" + +#: ../midori/midori-websettings.c:729 +msgid "Accept cookies from the original website only" +msgstr "只接收原始网站的 Cookies" + +#: ../midori/midori-websettings.c:737 +msgid "Maximum cookie age" +msgstr "最长 Cookie 有效期" + +#: ../midori/midori-websettings.c:738 +msgid "The maximum number of days to save cookies for" +msgstr "最长保存 Cookie 多少天" + +#: ../midori/midori-websettings.c:748 +msgid "Remember last visited pages" +msgstr "记录上次访问的页面" + +#: ../midori/midori-websettings.c:749 +msgid "Whether the last visited pages are saved" +msgstr "是否记录上次访问的页面" + +#: ../midori/midori-websettings.c:757 +msgid "Maximum history age" +msgstr "最长历史有效期" + +#: ../midori/midori-websettings.c:758 +msgid "The maximum number of days to save the history for" +msgstr "最长保存历史多少天" + +#: ../midori/midori-websettings.c:766 +msgid "Remember last form inputs" +msgstr "记录上次的表格输入" + +#: ../midori/midori-websettings.c:767 +msgid "Whether the last form inputs are saved" +msgstr "是否记录上次的表格输入" + +#: ../midori/midori-websettings.c:775 +msgid "Remember last downloaded files" +msgstr "记录上次下载的文件" + +#: ../midori/midori-websettings.c:776 +msgid "Whether the last downloaded files are saved" +msgstr "是否保存上次下载的文件" + +#: ../midori/midori-websettings.c:786 +msgid "Proxy Server" +msgstr "代理服务器" + +#: ../midori/midori-websettings.c:787 +msgid "The proxy server used for HTTP connections" +msgstr "HTTP 连接所使用的代理服务器" + +#: ../midori/midori-websettings.c:802 +msgid "Detect proxy server automatically" +msgstr "自动检测代理服务器" + +#: ../midori/midori-websettings.c:803 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "是否自动检测系统环境中的代理服务器设置" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:819 +msgid "Identify as" +msgstr "识别为" + +#: ../midori/midori-websettings.c:820 +msgid "What to identify as to web pages" +msgstr "让页面识别为什么" + +#: ../midori/midori-websettings.c:836 +msgid "Identification string" +msgstr "识别字符串" + +#: ../midori/midori-websettings.c:837 +msgid "The application identification string" +msgstr "应用程序识别字符串" + +#: ../midori/midori-websettings.c:845 +msgid "Cache size" +msgstr "缓存大小" + +#: ../midori/midori-websettings.c:846 +msgid "The allowed size of the cache" +msgstr "允许的缓存大小" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:656 +#, c-format +msgid "Not found - %s" +msgstr "没有找到 - %s" + +#: ../midori/midori-view.c:988 +msgid "Open _Link" +msgstr "打开链接(_L)" + +#: ../midori/midori-view.c:990 +msgid "Open Link in New _Tab" +msgstr "在新标签页中打开链接(_T)" + +#: ../midori/midori-view.c:1007 +msgid "Open Link in New _Window" +msgstr "在新窗口中打开链接(_W)" + +#: ../midori/midori-view.c:1016 +#: ../midori/midori-view.c:1030 +msgid "_Download Link destination" +msgstr "下载链接目标(_D)" + +#: ../midori/midori-view.c:1022 +msgid "_Save Link destination" +msgstr "保存链接目标(_S)" + +#: ../midori/midori-view.c:1053 +msgid "_Search the Web" +msgstr "搜索 Web(_S)" + +#: ../midori/midori-view.c:1062 +msgid "Open Address in New _Tab" +msgstr "在新标签页中打开地址(_T)" + +#: ../midori/midori-view.c:1201 +msgid "Open or download file" +msgstr "打开或下载文件" + +#: ../midori/midori-view.c:1210 +#, c-format +msgid "File Type: %s ('%s')" +msgstr "文件类型: %s ('%s')" + +#. i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz" +#: ../midori/midori-view.c:1214 +#, c-format +msgid "Open %s" +msgstr "打开 %s" + +#: ../midori/midori-view.c:1610 +#, c-format +msgid "Inspect page - %s" +msgstr "检查页面 - %s" + +#: ../midori/midori-view.c:1755 +#, c-format +msgid "Document cannot be displayed" +msgstr "文档无法显示" + +#: ../midori/midori-view.c:1771 +#, c-format +msgid "No documentation installed" +msgstr "没有安装文档" + +#: ../midori/midori-preferences.c:91 +#, c-format +msgid "Preferences for %s" +msgstr "%s 的设置项" + +#. Page "General" +#: ../midori/midori-preferences.c:398 +msgid "General" +msgstr "常规" + +#: ../midori/midori-preferences.c:399 +msgid "Startup" +msgstr "启动" + +#: ../midori/midori-preferences.c:415 +msgid "Use current page as homepage" +msgstr "设置当前页为主页" + +#: ../midori/midori-preferences.c:423 +#: ../panels/midori-transfers.c:88 +msgid "Transfers" +msgstr "文件传输" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:462 +msgid "Appearance" +msgstr "外观" + +#: ../midori/midori-preferences.c:463 +msgid "Font settings" +msgstr "字体设置" + +#: ../midori/midori-preferences.c:465 +msgid "Default Font Family" +msgstr "缺省的字体" + +#: ../midori/midori-preferences.c:471 +msgid "The default font size used to display text" +msgstr "显示文字的缺省字体大小" + +#: ../midori/midori-preferences.c:474 +msgid "Minimum Font Size" +msgstr "最小字体尺寸" + +#: ../midori/midori-preferences.c:477 +msgid "The minimum font size used to display text" +msgstr "显示文字的最小字体尺寸" + +#: ../midori/midori-preferences.c:484 +msgid "Encoding" +msgstr "编码" + +#: ../midori/midori-preferences.c:487 +msgid "The character encoding to use by default" +msgstr "缺省的字符编码" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:494 +msgid "Behavior" +msgstr "行为" + +#: ../midori/midori-preferences.c:495 +msgid "Features" +msgstr "特性" + +#: ../midori/midori-preferences.c:498 +#: ../extensions/statusbar-features.c:42 +msgid "Load images automatically" +msgstr "自动加载图像" + +#: ../midori/midori-preferences.c:499 +msgid "Load and display images automatically" +msgstr "自动加载和显示图像" + +#: ../midori/midori-preferences.c:502 +msgid "Shrink images automatically" +msgstr "自动缩小图像" + +#: ../midori/midori-preferences.c:503 +msgid "Automatically shrink standalone images to fit" +msgstr "自动缩小单独的图像以适合屏幕" + +#: ../midori/midori-preferences.c:506 +msgid "Print background images" +msgstr "打印背景图" + +#: ../midori/midori-preferences.c:507 +msgid "Whether background images should be printed" +msgstr "是否打印页面的背景图" + +#: ../midori/midori-preferences.c:510 +msgid "Resizable text areas" +msgstr "可缩放的文本区" + +#: ../midori/midori-preferences.c:511 +msgid "Whether text areas are resizable" +msgstr "文本区能否缩放" + +#: ../midori/midori-preferences.c:514 +#: ../extensions/statusbar-features.c:49 +msgid "Enable scripts" +msgstr "启用脚本" + +#: ../midori/midori-preferences.c:515 +msgid "Enable embedded scripting languages" +msgstr "启用网页中的脚本" + +#: ../midori/midori-preferences.c:518 +#: ../extensions/statusbar-features.c:56 +msgid "Enable plugins" +msgstr "启用插件" + +#: ../midori/midori-preferences.c:519 +msgid "Enable embedded plugin objects" +msgstr "启用页面中的插件对象" + +#: ../midori/midori-preferences.c:522 +msgid "Enforce 96 dots per inch" +msgstr "强制每英寸96点" + +#: ../midori/midori-preferences.c:523 +msgid "Enforce a video dot density of 96 DPI" +msgstr "强制画面点密度为 96DPI" + +#: ../midori/midori-preferences.c:526 +msgid "Enable developer tools" +msgstr "启用开发工具" + +#: ../midori/midori-preferences.c:527 +msgid "Enable special extensions for developers" +msgstr "启用给开发者的特殊扩展" + +#. Page "Interface" +#: ../midori/midori-preferences.c:539 +msgid "Interface" +msgstr "界面" + +#: ../midori/midori-preferences.c:540 +msgid "Navigationbar" +msgstr "导航条" + +#: ../midori/midori-preferences.c:549 +msgid "Browsing" +msgstr "浏览" + +#. Page "Network" +#: ../midori/midori-preferences.c:579 +#: ../midori/midori-preferences.c:580 +msgid "Network" +msgstr "网络" + +#: ../midori/midori-preferences.c:607 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:612 +msgid "Privacy" +msgstr "隐私" + +#: ../midori/midori-preferences.c:613 +msgid "Web Cookies" +msgstr "网页 Cookies" + +#: ../midori/midori-preferences.c:626 +#: ../midori/midori-preferences.c:636 +msgid "days" +msgstr "天" + +#: ../midori/midori-preferences.c:629 +#: ../panels/midori-history.c:104 +msgid "History" +msgstr "历史" + +#: ../midori/midori-searchaction.c:455 +#: ../katze/katze-arrayaction.c:277 +msgid "Empty" +msgstr "清空" + +#: ../midori/midori-searchaction.c:811 +msgid "Add search engine" +msgstr "添加搜索引擎" + +#: ../midori/midori-searchaction.c:811 +msgid "Edit search engine" +msgstr "编辑搜索引擎" + +#: ../midori/midori-searchaction.c:839 +msgid "_Name:" +msgstr "名称(_N)" + +#: ../midori/midori-searchaction.c:883 +msgid "_Icon:" +msgstr "图标(_I)" + +#: ../midori/midori-searchaction.c:897 +msgid "_Token:" +msgstr "记号(_T):" + +#: ../midori/midori-searchaction.c:1077 +msgid "Manage Search Engines" +msgstr "管理搜索引擎" + +#: ../midori/sokoke.c:109 +#: ../midori/sokoke.c:121 +msgid "Could not run external program." +msgstr "无法运行外部程序." + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:440 +msgid "Warning: You are using a superuser account!" +msgstr "警告: 你正在使用超级用户帐号!" + +#: ../midori/sokoke.c:771 +msgid "_Bookmark" +msgstr "书签(_B)" + +#: ../midori/sokoke.c:773 +msgid "_Add Bookmark" +msgstr "添加书签(_A)" + +#: ../midori/sokoke.c:774 +msgid "_Console" +msgstr "控制台(_C)" + +#: ../midori/sokoke.c:775 +msgid "_Extensions" +msgstr "扩展(_E)" + +#: ../midori/sokoke.c:776 +msgid "_History" +msgstr "历史(_H)" + +#: ../midori/sokoke.c:777 +msgid "_Homepage" +msgstr "主页(_H)" + +#: ../midori/sokoke.c:778 +msgid "_Userscripts" +msgstr "用户脚本(_U)" + +#: ../midori/sokoke.c:779 +msgid "User_styles" +msgstr "用户样式(_s)" + +#: ../midori/sokoke.c:780 +msgid "New _Tab" +msgstr "新建标签页(_T)" + +#: ../midori/sokoke.c:781 +msgid "_Transfers" +msgstr "传输(_T)" + +#: ../midori/sokoke.c:782 +msgid "_Closed Tabs and Windows" +msgstr "关闭的标签页和窗口(_C)" + +#: ../midori/sokoke.c:783 +msgid "New _Window" +msgstr "新建窗口(_W)" + +#: ../midori/gjs.c:743 +#: ../midori/gjs.c:833 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s 没有 '%s' 属性" + +#: ../midori/gjs.c:879 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s 不能被指定到 %s.%s" + +#: ../midori/gjs.c:889 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s 不能访问" + +#: ../panels/midori-addons.c:95 +#: ../panels/midori-addons.c:141 +msgid "Userscripts" +msgstr "用户脚本" + +#: ../panels/midori-addons.c:96 +#: ../panels/midori-addons.c:143 +msgid "Userstyles" +msgstr "用户样式" + +#: ../panels/midori-addons.c:922 +#: ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "启用(_E)" + +#: ../panels/midori-addons.c:923 +#: ../panels/midori-extensions.c:145 +msgid "Enable" +msgstr "启用" + +#: ../panels/midori-addons.c:932 +#: ../panels/midori-extensions.c:154 +msgid "_Disable" +msgstr "关闭(_D)" + +#: ../panels/midori-addons.c:933 +#: ../panels/midori-extensions.c:155 +msgid "Disable" +msgstr "关闭" + +#: ../panels/midori-bookmarks.c:103 +msgid "Bookmarks" +msgstr "书签" + +#: ../panels/midori-bookmarks.c:236 +msgid "Edit the selected bookmark" +msgstr "编辑选中的书签" + +#: ../panels/midori-bookmarks.c:244 +msgid "Delete the selected bookmark" +msgstr "删除选中的书签" + +#: ../panels/midori-bookmarks.c:257 +msgid "Add a new folder" +msgstr "添加一个新目录" + +#: ../panels/midori-bookmarks.c:589 +msgid "Separator" +msgstr "分隔符" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "控制台" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "扩展" + +#: ../panels/midori-history.c:159 +msgid "Are you sure you want to remove all history items?" +msgstr "确认删除所有的历史项?" + +#: ../panels/midori-history.c:216 +msgid "Bookmark the selected history item" +msgstr "将选中的历史项加入书签" + +#: ../panels/midori-history.c:225 +msgid "Delete the selected history item" +msgstr "删除选中的历史项" + +#: ../panels/midori-history.c:233 +msgid "Clear the entire history" +msgstr "清空全部历史" + +#: ../panels/midori-history.c:603 +#, c-format +msgid "A week ago" +msgstr "一周以前" + +#: ../panels/midori-history.c:609 +#, c-format +msgid "%d days ago" +msgstr "%d 天以前" + +#: ../panels/midori-history.c:616 +msgid "Today" +msgstr "今天" + +#: ../panels/midori-history.c:618 +msgid "Yesterday" +msgstr "昨天" + +#: ../panels/midori-plugins.c:87 +#: ../extensions/statusbar-features.c:54 +msgid "Plugins" +msgstr "插件" + +#: ../panels/midori-transfers.c:256 +#, c-format +msgid "%s of %s" +msgstr "第 %s 项, 共 %s 项" + +#: ../katze/katze-http-auth.c:97 +msgid "Authentication Required" +msgstr "需要认证" + +#: ../katze/katze-http-auth.c:113 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "需要输入用户名和密码来打开此位置:" + +#: ../katze/katze-http-auth.c:127 +msgid "Username" +msgstr "用户名" + +#: ../katze/katze-http-auth.c:138 +msgid "Password" +msgstr "密码" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "图标 '%s' 无法加载" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "库存图标 '%s' 无法加载" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "动画帧损坏" + +#: ../katze/katze-utils.c:180 +#: ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "属性 '%s' 在 '%s' 中无效" + +#: ../katze/katze-utils.c:209 +#: ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "选择文件" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "选择目录" + +#: ../extensions/colorful-tabs.c:97 +msgid "Tint tabs distinctly" +msgstr "多彩标签页" + +#: ../extensions/colorful-tabs.c:133 +msgid "Colorful Tabs" +msgstr "多彩标签页" + +#: ../extensions/colorful-tabs.c:134 +msgid "Tint each tab distinctly" +msgstr "用不同颜色区分标签页" + +#: ../extensions/mouse-gestures/main.c:176 +msgid "Mouse Gestures" +msgstr "鼠标手势" + +#: ../extensions/mouse-gestures/main.c:177 +msgid "Control Midori by moving the mouse" +msgstr "用鼠标移动控制 Midori" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 +#: ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "常驻页面" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "常驻页面(_P)" + +#: ../extensions/statusbar-features.c:40 +msgid "Images" +msgstr "图像" + +#: ../extensions/statusbar-features.c:47 +msgid "Scripts" +msgstr "脚本" + +#~ msgid "Source" +#~ msgstr "源码" + diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 00000000..376971df --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,1579 @@ +# Traditional Chinese Messages for midori package. +# Copyright (C) 2009 THE midori'S COPYRIGHT HOLDER +# This file is distributed under the same license as the midori package. +# Wei-Lun Chao , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: midori 0.1.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-22 19:30+0100\n" +"PO-Revision-Date: 2009-03-06 15:33+0800\n" +"Last-Translator: Wei-Lun Chao \n" +"Language-Team: Chinese (traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../data/midori.desktop.in.h:1 +msgid "Lightweight web browser" +msgstr "Midori 輕量網頁瀏覽器" + +#: ../data/midori.desktop.in.h:2 ../midori/main.c:1599 ../midori/main.c:1705 +#: ../midori/main.c:1714 ../midori/main.c:1725 +#: ../midori/midori-websettings.c:265 +msgid "Midori" +msgstr "綠網頁瀏覽器" + +#: ../data/midori.desktop.in.h:3 +msgid "Web Browser" +msgstr "網頁瀏覽器" + +#: ../midori/main.c:106 +#, c-format +msgid "The configuration couldn't be loaded: %s\n" +msgstr "無法載入組態:%s\n" + +#: ../midori/main.c:161 +#, c-format +msgid "Value '%s' is invalid for %s" +msgstr "「%s」值對於 %s 無效" + +#: ../midori/main.c:168 ../midori/main.c:238 +#, c-format +msgid "Invalid configuration value '%s'" +msgstr "無效的組態值「%s」" + +#: ../midori/main.c:480 +msgid "File not found." +msgstr "找不到檔案。" + +#: ../midori/main.c:488 ../midori/main.c:497 +msgid "Malformed document." +msgstr "異常文件。" + +#: ../midori/main.c:519 +#, c-format +msgid "Failed to open database: %s\n" +msgstr "開啟資料庫時失敗:%s\n" + +#: ../midori/main.c:551 +#, c-format +msgid "Failed to execute database statement: %s\n" +msgstr "執行資料庫敘述時失敗:%s\n" + +#: ../midori/main.c:605 +#, c-format +msgid "Failed to remove history item: %s\n" +msgstr "移除歷史項目時失敗:%s\n" + +#: ../midori/main.c:629 +#, c-format +msgid "Failed to clear history: %s\n" +msgstr "清空歷史時失敗:%s\n" + +#: ../midori/main.c:652 ../midori/main.c:686 ../midori/main.c:702 +#, c-format +msgid "Failed to add history item: %s\n" +msgstr "加入歷史項目時失敗:%s\n" + +#. i18n: Couldn't remove items that are older than n days +#: ../midori/main.c:882 +#, c-format +msgid "Failed to remove old history items: %s\n" +msgstr "移除舊的歷史項目時失敗:%s\n" + +#: ../midori/main.c:910 +#, c-format +msgid "The configuration couldn't be saved. %s" +msgstr "無法儲存組態。%s" + +#: ../midori/main.c:939 +#, c-format +msgid "The search engines couldn't be saved. %s" +msgstr "無法儲存搜尋引擎。%s" + +#: ../midori/main.c:1069 ../midori/sokoke.c:580 +#, c-format +msgid "Writing failed." +msgstr "寫入失敗。" + +#: ../midori/main.c:1090 ../midori/main.c:1117 ../midori/main.c:1145 +#, c-format +msgid "The bookmarks couldn't be saved. %s" +msgstr "無法儲存書籤。%s" + +#. i18n: Trash, or wastebin, containing closed tabs +#: ../midori/main.c:1169 ../midori/main.c:1193 +#, c-format +msgid "The trash couldn't be saved. %s" +msgstr "無法儲存回收筒。%s" + +#: ../midori/main.c:1224 ../midori/midori-preferences.c:404 +msgid "Transfers" +msgstr "傳送" + +#: ../midori/main.c:1265 +#, c-format +msgid "The session couldn't be saved. %s" +msgstr "無法儲存執行階段。%s" + +#: ../midori/main.c:1401 +msgid "" +"Midori seems to have crashed the last time it was opened. If this happened " +"repeatedly, try one of the following options to solve the problem." +msgstr "" +"Midori 似乎於上次開啟時發生當機。如果這種情況重複出現,請試著以下列選項之一來" +"解決問題。" + +#: ../midori/main.c:1416 +msgid "Modify _preferences" +msgstr "修改偏好設定(_P)" + +#: ../midori/main.c:1420 +msgid "Reset the last _session" +msgstr "重置上次執行階段(_S)" + +#: ../midori/main.c:1425 +msgid "Disable all _extensions" +msgstr "停用所有擴充功能(_E)" + +#: ../midori/main.c:1599 +msgid "No filename specified" +msgstr "未指定任何檔名" + +#: ../midori/main.c:1631 ../midori/gjs.c:514 +msgid "An unknown error occured." +msgstr "發生不明錯誤。" + +#: ../midori/main.c:1654 +msgid "Run the specified filename as javascript" +msgstr "將指定檔名當做 javascript 來執行" + +#: ../midori/main.c:1656 +msgid "Display program version" +msgstr "顯示程式版本" + +#: ../midori/main.c:1658 +msgid "Addresses" +msgstr "位址" + +#: ../midori/main.c:1702 +msgid "[Addresses]" +msgstr "[位址]" + +#: ../midori/main.c:1726 +msgid "Please report comments, suggestions and bugs to:" +msgstr "請回報意見、建議和錯誤給:" + +#: ../midori/main.c:1728 +msgid "Check for new versions at:" +msgstr "檢查看看新版本於:" + +#: ../midori/main.c:1755 +msgid "An instance of Midori is already running but not responding.\n" +msgstr "一份 Midori 已經在執行中卻無反應。\n" + +#: ../midori/main.c:1823 +#, c-format +msgid "The search engines couldn't be loaded. %s\n" +msgstr "無法載入搜尋引擎。%s\n" + +#: ../midori/main.c:1835 +#, c-format +msgid "The bookmarks couldn't be loaded: %s\n" +msgstr "無法載入書籤:%s\n" + +#: ../midori/main.c:1850 +#, c-format +msgid "The session couldn't be loaded: %s\n" +msgstr "無法載入執行階段:%s\n" + +#: ../midori/main.c:1863 +#, c-format +msgid "The trash couldn't be loaded: %s\n" +msgstr "無法載入回收筒:%s\n" + +#: ../midori/main.c:1876 +#, c-format +msgid "The history couldn't be loaded: %s\n" +msgstr "無法載入歷史:%s\n" + +#: ../midori/main.c:1888 +msgid "The following errors occured:" +msgstr "發生下列錯誤:" + +#: ../midori/main.c:1904 +msgid "_Ignore" +msgstr "忽略(_I)" + +#: ../midori/midori-browser.c:259 ../midori/midori-browser.c:2925 +#: ../midori/midori-browser.c:2931 +msgid "Reload the current page" +msgstr "重新載入目前頁面" + +#: ../midori/midori-browser.c:271 ../midori/midori-browser.c:2928 +msgid "Stop loading the current page" +msgstr "停止載入目前頁面" + +#: ../midori/midori-browser.c:333 +#, c-format +msgid "%d%% loaded" +msgstr "%d%% 已載入" + +#: ../midori/midori-browser.c:358 +#, c-format +msgid "Unexpected action '%s'." +msgstr "未預期的動作「%s」。" + +#: ../midori/midori-browser.c:534 +msgid "New folder" +msgstr "新資料夾" + +#: ../midori/midori-browser.c:534 +msgid "Edit folder" +msgstr "編輯資料夾" + +#: ../midori/midori-browser.c:536 +msgid "New bookmark" +msgstr "新書籤" + +#: ../midori/midori-browser.c:536 +msgid "Edit bookmark" +msgstr "編輯書籤" + +#: ../midori/midori-browser.c:566 +msgid "_Title:" +msgstr "標題(_T):" + +#: ../midori/midori-browser.c:579 ../midori/midori-searchaction.c:855 +msgid "_Description:" +msgstr "描述(_D):" + +#: ../midori/midori-browser.c:598 ../midori/midori-searchaction.c:869 +msgid "_Address:" +msgstr "位址(_A):" + +#: ../midori/midori-browser.c:616 +msgid "_Folder:" +msgstr "資料夾(_F):" + +#: ../midori/midori-browser.c:621 ../midori/midori-browser.c:658 +msgid "Toplevel folder" +msgstr "最上層資料夾" + +#: ../midori/midori-browser.c:733 +msgid "Save file as" +msgstr "檔案另存為" + +#: ../midori/midori-browser.c:1340 +msgid "Open file" +msgstr "開啟檔案" + +#: ../midori/midori-browser.c:2530 ../panels/midori-bookmarks.c:754 +#: ../panels/midori-history.c:788 +msgid "Open in New _Tab" +msgstr "在新分頁中開啟(_T)" + +#: ../midori/midori-browser.c:2532 ../panels/midori-bookmarks.c:756 +#: ../panels/midori-history.c:790 +msgid "Open in New _Window" +msgstr "在新視窗中開啟(_W)" + +#: ../midori/midori-browser.c:2674 +msgid "A lightweight web browser." +msgstr "輕量網頁瀏覽器。" + +#: ../midori/midori-browser.c:2682 +msgid "translator-credits" +msgstr "趙惟倫 " + +#: ../midori/midori-browser.c:2859 +msgid "_File" +msgstr "檔案(_F)" + +#: ../midori/midori-browser.c:2862 +msgid "Open a new window" +msgstr "開啟新視窗" + +#: ../midori/midori-browser.c:2865 +msgid "Open a new tab" +msgstr "開啟新分頁" + +#: ../midori/midori-browser.c:2868 +msgid "Open a file" +msgstr "開啟檔案" + +#: ../midori/midori-browser.c:2871 +msgid "Save to a file" +msgstr "儲存到檔案" + +#: ../midori/midori-browser.c:2873 +msgid "_Close Tab" +msgstr "關閉分頁(_C)" + +#: ../midori/midori-browser.c:2874 +msgid "Close the current tab" +msgstr "關閉目前分頁" + +#: ../midori/midori-browser.c:2876 +msgid "C_lose Window" +msgstr "關閉視窗(_L)" + +#: ../midori/midori-browser.c:2877 +msgid "Close this window" +msgstr "關閉這個視窗" + +#: ../midori/midori-browser.c:2880 +msgid "Print the current page" +msgstr "列印目前頁面" + +#: ../midori/midori-browser.c:2883 +msgid "Quit the application" +msgstr "退出應用程式" + +#: ../midori/midori-browser.c:2885 +msgid "_Edit" +msgstr "編輯(_E)" + +#: ../midori/midori-browser.c:2888 +msgid "Cut the selected text" +msgstr "剪下所選文字" + +#: ../midori/midori-browser.c:2891 ../midori/midori-browser.c:2894 +msgid "Copy the selected text" +msgstr "複製所選文字" + +#: ../midori/midori-browser.c:2897 +msgid "Paste text from the clipboard" +msgstr "從剪貼簿貼上文字" + +#: ../midori/midori-browser.c:2900 +msgid "Delete the selected text" +msgstr "刪除所選文字" + +#: ../midori/midori-browser.c:2903 +msgid "Select all text" +msgstr "選取所有文字" + +#: ../midori/midori-browser.c:2906 +msgid "Find a word or phrase in the page" +msgstr "在頁面中尋找字詞或片語" + +#: ../midori/midori-browser.c:2908 +msgid "Find _Next" +msgstr "找下一個(_N)" + +#: ../midori/midori-browser.c:2909 +msgid "Find the next occurrence of a word or phrase" +msgstr "尋找下一個出現的字詞或片語" + +#: ../midori/midori-browser.c:2911 +msgid "Find _Previous" +msgstr "找上一個(_P)" + +#: ../midori/midori-browser.c:2912 +msgid "Find the previous occurrence of a word or phrase" +msgstr "尋找上一個出現的字詞或片語" + +#: ../midori/midori-browser.c:2915 +msgid "_Quick Find" +msgstr "快速尋找(_Q)" + +#: ../midori/midori-browser.c:2916 +msgid "Quickly jump to a word or phrase" +msgstr "快速跳到字詞或片語" + +#: ../midori/midori-browser.c:2919 +msgid "Configure the application preferences" +msgstr "組配應用程式偏好設定" + +#: ../midori/midori-browser.c:2921 +msgid "_View" +msgstr "檢視(_V)" + +#: ../midori/midori-browser.c:2922 +msgid "_Toolbars" +msgstr "工具列(_T)" + +#: ../midori/midori-browser.c:2934 +msgid "Increase the zoom level" +msgstr "增加縮放等級" + +#: ../midori/midori-browser.c:2937 +msgid "Decrease the zoom level" +msgstr "減少縮放等級" + +#: ../midori/midori-browser.c:2940 +msgid "Reset the zoom level" +msgstr "重置縮放等級" + +#: ../midori/midori-browser.c:2942 ../midori/midori-view.c:1076 +msgid "View _Source" +msgstr "檢視原始碼(_S)" + +#: ../midori/midori-browser.c:2943 +msgid "View the source code of the page" +msgstr "檢視頁面的原始碼" + +#: ../midori/midori-browser.c:2945 +msgid "View Selection Source" +msgstr "檢視所選原始碼" + +#: ../midori/midori-browser.c:2946 +msgid "View the source code of the selection" +msgstr "檢視所選部份的原始碼" + +#: ../midori/midori-browser.c:2950 +msgid "Toggle fullscreen view" +msgstr "切換全螢幕檢視" + +#: ../midori/midori-browser.c:2952 +msgid "_Go" +msgstr "前往(_G)" + +#: ../midori/midori-browser.c:2955 +msgid "Go back to the previous page" +msgstr "回到上一頁" + +#: ../midori/midori-browser.c:2958 +msgid "Go forward to the next page" +msgstr "前往下一頁" + +#: ../midori/midori-browser.c:2961 +msgid "Go to your homepage" +msgstr "前往您的首頁" + +#: ../midori/midori-browser.c:2963 +msgid "Empty Trash" +msgstr "清空回收筒" + +#: ../midori/midori-browser.c:2964 +msgid "Delete the contents of the trash" +msgstr "刪除回收筒的內容" + +#: ../midori/midori-browser.c:2966 ../midori/midori-view.c:1048 +msgid "Undo Close Tab" +msgstr "復原關閉分頁" + +#: ../midori/midori-browser.c:2967 +msgid "Open the last closed tab" +msgstr "開啟上次關閉的分頁" + +#: ../midori/midori-browser.c:2971 ../panels/midori-bookmarks.c:228 +msgid "Add a new bookmark" +msgstr "加入新的書籤" + +#: ../midori/midori-browser.c:2972 +msgid "_Tools" +msgstr "工具(_T)" + +#: ../midori/midori-browser.c:2974 ../midori/midori-searchaction.c:464 +msgid "_Manage Search Engines" +msgstr "管理搜尋引擎(_M)" + +#: ../midori/midori-browser.c:2975 +msgid "Add, edit and remove search engines..." +msgstr "加入、編輯和移除搜尋引擎…" + +#: ../midori/midori-browser.c:2979 +msgid "_Previous Tab" +msgstr "上一個分頁(_P)" + +#: ../midori/midori-browser.c:2980 +msgid "Switch to the previous tab" +msgstr "切換至上一個分頁" + +#: ../midori/midori-browser.c:2982 +msgid "_Next Tab" +msgstr "下一個分頁(_N)" + +#: ../midori/midori-browser.c:2983 +msgid "Switch to the next tab" +msgstr "切換至下一個分頁" + +#: ../midori/midori-browser.c:2985 +msgid "_Help" +msgstr "求助(_H)" + +#: ../midori/midori-browser.c:2987 +msgid "_Contents" +msgstr "內容(_C)" + +#: ../midori/midori-browser.c:2988 +msgid "Show the documentation" +msgstr "顯示文件" + +#: ../midori/midori-browser.c:2990 +msgid "_Frequent Questions" +msgstr "常見問題(_F)" + +#: ../midori/midori-browser.c:2991 +msgid "Show the Frequently Asked Questions" +msgstr "顯示常見問題集" + +#: ../midori/midori-browser.c:2993 +msgid "_Report a Bug" +msgstr "回報錯誤(_R)" + +#: ../midori/midori-browser.c:2994 +msgid "Open Midori's bug tracker" +msgstr "開啟 Midori 錯誤追蹤器" + +#: ../midori/midori-browser.c:2997 +msgid "Show information about the program" +msgstr "顯示程式相關資訊" + +#: ../midori/midori-browser.c:3004 +msgid "P_rivate Browsing" +msgstr "私人瀏覽(_R)" + +#: ../midori/midori-browser.c:3005 +msgid "Don't save any private data while browsing" +msgstr "瀏覽時不儲存任何私人資料" + +#: ../midori/midori-browser.c:3010 +msgid "_Menubar" +msgstr "選單列(_M)" + +#: ../midori/midori-browser.c:3011 +msgid "Show menubar" +msgstr "顯示選單列" + +#: ../midori/midori-browser.c:3014 +msgid "_Navigationbar" +msgstr "導覽列(_N)" + +#: ../midori/midori-browser.c:3015 +msgid "Show navigationbar" +msgstr "顯示導覽列" + +#: ../midori/midori-browser.c:3018 +msgid "Side_panel" +msgstr "側邊欄(_P)" + +#: ../midori/midori-browser.c:3019 +msgid "Show sidepanel" +msgstr "顯示側邊欄" + +#: ../midori/midori-browser.c:3022 +msgid "_Bookmarkbar" +msgstr "書籤列(_B)" + +#: ../midori/midori-browser.c:3023 +msgid "Show bookmarkbar" +msgstr "顯示書籤列" + +#: ../midori/midori-browser.c:3026 +msgid "_Transferbar" +msgstr "傳送列(_T)" + +#: ../midori/midori-browser.c:3027 +msgid "Show transferbar" +msgstr "顯示傳送列" + +#: ../midori/midori-browser.c:3030 +msgid "_Statusbar" +msgstr "狀態列(_S)" + +#: ../midori/midori-browser.c:3031 +msgid "Show statusbar" +msgstr "顯示狀態列" + +#: ../midori/midori-browser.c:3436 +msgid "_Separator" +msgstr "分隔符號(_S)" + +#: ../midori/midori-browser.c:3443 +msgid "_Location..." +msgstr "位置(_L)…" + +#: ../midori/midori-browser.c:3445 +msgid "Open a particular location" +msgstr "開啟特定位置" + +#: ../midori/midori-browser.c:3469 +msgid "_Web Search..." +msgstr "網頁搜尋(_W)…" + +#: ../midori/midori-browser.c:3471 +msgid "Run a web search" +msgstr "執行網頁搜尋" + +#: ../midori/midori-browser.c:3490 +msgid "Reopen a previously closed tab or window" +msgstr "重新開啟之前關閉的分頁或視窗" + +#: ../midori/midori-browser.c:3503 +msgid "_Recently visited pages" +msgstr "最近造訪的頁面(_R)" + +#: ../midori/midori-browser.c:3505 +msgid "Reopen pages that you visited earlier" +msgstr "重新開啟您之前造訪過的頁面" + +#: ../midori/midori-browser.c:3518 ../midori/sokoke.c:735 +msgid "_Bookmarks" +msgstr "書籤(_B)" + +#: ../midori/midori-browser.c:3520 +msgid "Show the saved bookmarks" +msgstr "顯示已儲存書籤" + +#: ../midori/midori-browser.c:3533 +msgid "_Window" +msgstr "視窗(_W)" + +#: ../midori/midori-browser.c:3535 +msgid "Show a list of all open tabs" +msgstr "顯示所有開啟分頁的清單" + +#. i18n: A panel at the bottom, to search text in pages +#: ../midori/midori-browser.c:3697 +msgid "_Inline Find:" +msgstr "列內尋找(_I):" + +#: ../midori/midori-browser.c:3722 +msgid "Previous" +msgstr "上一個" + +#: ../midori/midori-browser.c:3727 +msgid "Next" +msgstr "下一個" + +#: ../midori/midori-browser.c:3732 +msgid "Match Case" +msgstr "符合大小寫" + +#: ../midori/midori-browser.c:3740 +msgid "Highlight Matches" +msgstr "標識相符者" + +#: ../midori/midori-browser.c:3750 +msgid "Close Findbar" +msgstr "關閉尋找列" + +#: ../midori/midori-browser.c:4034 +#, c-format +msgid "Unexpected setting '%s'" +msgstr "未預期的設定「%s」" + +#: ../midori/midori-panel.c:229 ../midori/midori-websettings.c:479 +msgid "Align sidepanel on the right" +msgstr "側邊欄靠右對齊" + +#: ../midori/midori-panel.c:231 ../midori/midori-websettings.c:480 +msgid "Whether to align the sidepanel on the right" +msgstr "是否要將側邊欄靠右對齊" + +#: ../midori/midori-panel.c:241 ../midori/midori-panel.c:242 +msgid "Close panel" +msgstr "關閉側邊欄" + +#: ../midori/midori-websettings.c:175 ../midori/midori-view.c:1811 +msgid "Blank page" +msgstr "空白頁面" + +#: ../midori/midori-websettings.c:176 ../midori/midori-websettings.c:499 +msgid "Homepage" +msgstr "首頁" + +#: ../midori/midori-websettings.c:177 +msgid "Last open pages" +msgstr "上次開啟頁面" + +#: ../midori/midori-websettings.c:192 +msgid "Chinese (BIG5)" +msgstr "中文 (BIG5)" + +#: ../midori/midori-websettings.c:193 +msgid "Japanese (SHIFT_JIS)" +msgstr "日文 (SHIFT_JIS)" + +#: ../midori/midori-websettings.c:194 +msgid "Russian (KOI8-R)" +msgstr "俄文 (KOI8-R)" + +#: ../midori/midori-websettings.c:195 +msgid "Unicode (UTF-8)" +msgstr "萬國碼 (UTF-8)" + +#: ../midori/midori-websettings.c:196 +msgid "Western (ISO-8859-1)" +msgstr "西歐 (ISO-8859-1)" + +#: ../midori/midori-websettings.c:197 ../midori/midori-websettings.c:269 +msgid "Custom..." +msgstr "自訂…" + +#: ../midori/midori-websettings.c:212 +msgid "New tab" +msgstr "新分頁" + +#: ../midori/midori-websettings.c:213 +msgid "New window" +msgstr "新視窗" + +#: ../midori/midori-websettings.c:214 +msgid "Current tab" +msgstr "目前分頁" + +#: ../midori/midori-websettings.c:229 +msgid "Default" +msgstr "預設" + +#: ../midori/midori-websettings.c:230 +msgid "Icons" +msgstr "圖示" + +#: ../midori/midori-websettings.c:231 +msgid "Text" +msgstr "文字" + +#: ../midori/midori-websettings.c:232 +msgid "Both" +msgstr "兩者" + +#: ../midori/midori-websettings.c:233 +msgid "Both horizontal" +msgstr "水平並列" + +#: ../midori/midori-websettings.c:248 +msgid "All cookies" +msgstr "所有訊餅" + +#: ../midori/midori-websettings.c:249 +msgid "Session cookies" +msgstr "執行階段訊餅" + +#: ../midori/midori-websettings.c:250 ../panels/midori-addons.c:96 +msgid "None" +msgstr "無" + +#: ../midori/midori-websettings.c:266 +msgid "Safari" +msgstr "Safari" + +#: ../midori/midori-websettings.c:267 +msgid "Firefox" +msgstr "Firefox" + +#: ../midori/midori-websettings.c:268 +msgid "Internet Explorer" +msgstr "網路探險家" + +#: ../midori/midori-websettings.c:309 +msgid "Remember last window size" +msgstr "記住上次視窗大小" + +#: ../midori/midori-websettings.c:310 +msgid "Whether to save the last window size" +msgstr "是否要儲存上次視窗大小" + +#: ../midori/midori-websettings.c:318 +msgid "Last window width" +msgstr "上次視窗寬度" + +#: ../midori/midori-websettings.c:319 +msgid "The last saved window width" +msgstr "上次儲存的視窗寬度" + +#: ../midori/midori-websettings.c:327 +msgid "Last window height" +msgstr "上次視窗高度" + +#: ../midori/midori-websettings.c:328 +msgid "The last saved window height" +msgstr "上次儲存的視窗高度" + +#: ../midori/midori-websettings.c:353 +msgid "Last panel position" +msgstr "上次側邊欄位置" + +#: ../midori/midori-websettings.c:354 +msgid "The last saved panel position" +msgstr "上次儲存的側邊欄位置" + +#. i18n: The internal index of the last opened panel +#: ../midori/midori-websettings.c:363 +msgid "Last panel page" +msgstr "上次側邊欄頁面" + +#: ../midori/midori-websettings.c:364 +msgid "The last saved panel page" +msgstr "上次儲存的側邊欄頁面" + +#: ../midori/midori-websettings.c:372 +msgid "Last Web search" +msgstr "上次網頁搜尋" + +#: ../midori/midori-websettings.c:373 +msgid "The last saved Web search" +msgstr "上次儲存的網頁搜尋" + +#: ../midori/midori-websettings.c:382 +msgid "Show Menubar" +msgstr "顯示選單列" + +#: ../midori/midori-websettings.c:383 +msgid "Whether to show the menubar" +msgstr "是否要顯示選單列" + +#: ../midori/midori-websettings.c:391 +msgid "Show Navigationbar" +msgstr "顯示導覽列" + +#: ../midori/midori-websettings.c:392 +msgid "Whether to show the navigationbar" +msgstr "是否要顯示導覽列" + +#: ../midori/midori-websettings.c:400 +msgid "Show Bookmarkbar" +msgstr "顯示書籤列" + +#: ../midori/midori-websettings.c:401 +msgid "Whether to show the bookmarkbar" +msgstr "是否要顯示書籤列" + +#: ../midori/midori-websettings.c:409 +msgid "Show Panel" +msgstr "顯示側邊欄" + +#: ../midori/midori-websettings.c:410 +msgid "Whether to show the panel" +msgstr "是否要顯示側邊欄" + +#: ../midori/midori-websettings.c:418 +msgid "Show Statusbar" +msgstr "顯示狀態列" + +#: ../midori/midori-websettings.c:419 +msgid "Whether to show the statusbar" +msgstr "是否要顯示狀態列" + +#: ../midori/midori-websettings.c:428 +msgid "Toolbar Style" +msgstr "工具列樣式" + +#: ../midori/midori-websettings.c:429 +msgid "The style of the toolbar" +msgstr "工具列的樣式" + +#: ../midori/midori-websettings.c:445 +msgid "Show progress in location entry" +msgstr "在位置欄中顯示進度" + +#: ../midori/midori-websettings.c:446 +msgid "Whether to show loading progress in the location entry" +msgstr "是否要在位置欄中顯示載入進度" + +#: ../midori/midori-websettings.c:454 +msgid "Toolbar Items" +msgstr "工具列項目" + +#: ../midori/midori-websettings.c:455 +msgid "The items to show on the toolbar" +msgstr "顯示在工具列上的項目" + +#: ../midori/midori-websettings.c:463 +msgid "Compact Sidepanel" +msgstr "壓縮側邊欄" + +#: ../midori/midori-websettings.c:464 +msgid "Whether to make the sidepanel compact" +msgstr "是否要壓縮側邊欄" + +#: ../midori/midori-websettings.c:489 +msgid "Load on Startup" +msgstr "啟動時載入" + +#: ../midori/midori-websettings.c:490 +msgid "What to load on startup" +msgstr "啟動時要載入什麼" + +#: ../midori/midori-websettings.c:500 +msgid "The homepage" +msgstr "首頁" + +#: ../midori/midori-websettings.c:515 +msgid "Show crash dialog" +msgstr "顯示當機對話框" + +#: ../midori/midori-websettings.c:516 +msgid "Show a dialog after Midori crashed" +msgstr "Midori 當機之後顯示對話框" + +#: ../midori/midori-websettings.c:524 +msgid "Download Folder" +msgstr "下載資料夾" + +#: ../midori/midori-websettings.c:525 +msgid "The folder downloaded files are saved to" +msgstr "儲存下載檔案的資料夾" + +#: ../midori/midori-websettings.c:533 +msgid "Download Manager" +msgstr "下載管理員" + +#: ../midori/midori-websettings.c:534 +msgid "An external download manager" +msgstr "外部下載管理員" + +#: ../midori/midori-websettings.c:542 +msgid "Text Editor" +msgstr "文字編輯器" + +#: ../midori/midori-websettings.c:543 +msgid "An external text editor" +msgstr "外部文字編輯器" + +#: ../midori/midori-websettings.c:551 +msgid "Location entry Search" +msgstr "位置欄搜尋" + +#: ../midori/midori-websettings.c:552 +msgid "The search to perform inside the location entry" +msgstr "於位置欄之內進行的搜尋" + +#: ../midori/midori-websettings.c:560 +msgid "Preferred Encoding" +msgstr "偏好的編碼" + +#: ../midori/midori-websettings.c:561 +msgid "The preferred character encoding" +msgstr "偏好的字元編碼" + +#: ../midori/midori-websettings.c:571 +msgid "Always Show Tabbar" +msgstr "固定顯示頁標列" + +#: ../midori/midori-websettings.c:572 +msgid "Always show the tabbar" +msgstr "固定顯示分頁頁標列" + +#: ../midori/midori-websettings.c:580 +msgid "Close Buttons on Tabs" +msgstr "關閉按鈕位於頁標" + +#: ../midori/midori-websettings.c:581 +msgid "Whether tabs have close buttons" +msgstr "頁標上是否有關閉按鈕" + +#: ../midori/midori-websettings.c:590 +msgid "Open new pages in" +msgstr "開啟新頁面於" + +#: ../midori/midori-websettings.c:591 +msgid "Where to open new pages" +msgstr "何處開啟新頁面" + +#: ../midori/midori-websettings.c:601 +msgid "Open external pages in" +msgstr "開啟外部頁面於" + +#: ../midori/midori-websettings.c:602 +msgid "Where to open externally opened pages" +msgstr "何處開啟外部開啟的頁面" + +#: ../midori/midori-websettings.c:615 +msgid "Middle click opens Selection" +msgstr "按下滑鼠中鍵開啟所選" + +#: ../midori/midori-websettings.c:616 +msgid "Load an address from the selection via middle click" +msgstr "透過按下滑鼠中鍵以載入所選位址" + +#: ../midori/midori-websettings.c:624 +msgid "Open tabs in the background" +msgstr "在背景中開啟分頁" + +#: ../midori/midori-websettings.c:625 +msgid "Whether to open new tabs in the background" +msgstr "是否要在背景中開啟分頁" + +#: ../midori/midori-websettings.c:633 +msgid "Open Tabs next to Current" +msgstr "於目前之下開啟分頁" + +#: ../midori/midori-websettings.c:634 +msgid "Whether to open new tabs next to the current tab or after the last one" +msgstr "是否要開啟新分頁於目前分頁之下或最後一頁之後" + +#: ../midori/midori-websettings.c:642 +msgid "Open popups in tabs" +msgstr "在分頁中開啟對話框" + +#: ../midori/midori-websettings.c:643 +msgid "Whether to open popup windows in tabs" +msgstr "是否要在分頁中開啟彈出視窗" + +#: ../midori/midori-websettings.c:694 +msgid "Zoom Text and Images" +msgstr "縮放文字和圖像" + +#: ../midori/midori-websettings.c:695 +msgid "Whether to zoom text and images" +msgstr "是否要縮放文字和圖像" + +#: ../midori/midori-websettings.c:705 +msgid "Accept cookies" +msgstr "接受訊餅" + +#: ../midori/midori-websettings.c:706 +msgid "What type of cookies to accept" +msgstr "要接受什麼型態的訊餅" + +#: ../midori/midori-websettings.c:719 +msgid "Original cookies only" +msgstr "只限原本的訊餅" + +#: ../midori/midori-websettings.c:720 +msgid "Accept cookies from the original website only" +msgstr "只接受來自原始網站的訊餅" + +#: ../midori/midori-websettings.c:728 +msgid "Maximum cookie age" +msgstr "最大訊餅時限" + +#: ../midori/midori-websettings.c:729 +msgid "The maximum number of days to save cookies for" +msgstr "訊餅的最大儲存日數限制" + +#: ../midori/midori-websettings.c:739 +msgid "Remember last visited pages" +msgstr "記住上次造訪的頁面" + +#: ../midori/midori-websettings.c:740 +msgid "Whether the last visited pages are saved" +msgstr "是否要儲存上次造訪的頁面" + +#: ../midori/midori-websettings.c:748 +msgid "Maximum history age" +msgstr "最大造訪歷史時限" + +#: ../midori/midori-websettings.c:749 +msgid "The maximum number of days to save the history for" +msgstr "造訪歷史的最大儲存日數限制" + +#: ../midori/midori-websettings.c:757 +msgid "Remember last form inputs" +msgstr "記住上次表單輸入" + +#: ../midori/midori-websettings.c:758 +msgid "Whether the last form inputs are saved" +msgstr "是否要儲存上次表單輸入" + +#: ../midori/midori-websettings.c:766 +msgid "Remember last downloaded files" +msgstr "記住上次下載檔案" + +#: ../midori/midori-websettings.c:767 +msgid "Whether the last downloaded files are saved" +msgstr "是否要儲存上次下載的檔案" + +#: ../midori/midori-websettings.c:777 +msgid "Proxy Server" +msgstr "代理伺服器" + +#: ../midori/midori-websettings.c:778 +msgid "The proxy server used for HTTP connections" +msgstr "用於 HTTP 連接的代理伺服器" + +#: ../midori/midori-websettings.c:797 +msgid "Detect proxy server automatically" +msgstr "自動偵測代理伺服器" + +#: ../midori/midori-websettings.c:798 +msgid "Whether to detect the proxy server automatically from the environment" +msgstr "是否要自動從環境中偵測代理伺服器" + +#. i18n: This refers to an application, not the 'user agent' string +#: ../midori/midori-websettings.c:818 +msgid "Identify as" +msgstr "識別為" + +#: ../midori/midori-websettings.c:819 +msgid "What to identify as to web pages" +msgstr "要讓網頁識別為什麼" + +#: ../midori/midori-websettings.c:839 +msgid "Identification string" +msgstr "識別字串" + +#: ../midori/midori-websettings.c:840 +msgid "The application identification string" +msgstr "應用程式識別字串" + +#: ../midori/midori-websettings.c:852 +msgid "Cache size" +msgstr "快取大小" + +#: ../midori/midori-websettings.c:853 +msgid "The allowed size of the cache" +msgstr "允許的快取大小" + +#. i18n: The title of the 404 - Not found error page +#: ../midori/midori-view.c:629 +#, c-format +msgid "Not found - %s" +msgstr "找不到 - %s" + +#: ../midori/midori-view.c:959 +msgid "Open _Link" +msgstr "開啟鏈結(_L)" + +#: ../midori/midori-view.c:961 +msgid "Open Link in New _Tab" +msgstr "在新分頁中開啟鏈結(_T)" + +#: ../midori/midori-view.c:978 +msgid "Open Link in New _Window" +msgstr "在開新視窗中開啟鏈結(_W)" + +#: ../midori/midori-view.c:988 +msgid "_Save Link destination" +msgstr "儲存鏈結網址(_S)" + +#: ../midori/midori-view.c:996 +msgid "_Download Link destination" +msgstr "下載鏈結網址(_D)" + +#: ../midori/midori-view.c:1018 +msgid "_Search the Web" +msgstr "搜尋網頁(_S)" + +#: ../midori/midori-view.c:1027 +msgid "Open Address in New _Tab" +msgstr "在新分頁中開啟位址(_T)" + +#: ../midori/midori-view.c:1501 +#, c-format +msgid "Inspect page - %s" +msgstr "檢閱頁面 - %s" + +#: ../midori/midori-view.c:1654 +msgid "Source" +msgstr "原始碼" + +#: ../midori/midori-view.c:1678 +#, c-format +msgid "Document cannot be displayed" +msgstr "無法顯示文件" + +#: ../midori/midori-view.c:1694 +#, c-format +msgid "No documentation installed" +msgstr "沒有已安裝文件" + +#: ../midori/midori-preferences.c:93 +#, c-format +msgid "Preferences for %s" +msgstr "偏好設定用於 %s" + +#. Page "General" +#: ../midori/midori-preferences.c:390 +msgid "General" +msgstr "一般" + +#: ../midori/midori-preferences.c:391 +msgid "Startup" +msgstr "啟動" + +#. Page "Appearance" +#: ../midori/midori-preferences.c:440 +msgid "Appearance" +msgstr "外觀" + +#: ../midori/midori-preferences.c:441 +msgid "Font settings" +msgstr "字型設定" + +#: ../midori/midori-preferences.c:443 +msgid "Default Font Family" +msgstr "預設字族" + +#: ../midori/midori-preferences.c:449 +msgid "The default font size used to display text" +msgstr "用來顯示文字的預設字型大小" + +#: ../midori/midori-preferences.c:452 +msgid "Minimum Font Size" +msgstr "最小字型尺寸" + +#: ../midori/midori-preferences.c:455 +msgid "The minimum font size used to display text" +msgstr "用來顯示文字的最小字型尺寸" + +#: ../midori/midori-preferences.c:462 +msgid "Encoding" +msgstr "編碼" + +#: ../midori/midori-preferences.c:465 +msgid "The character encoding to use by default" +msgstr "預設使用的字元編碼" + +#. Page "Behavior" +#: ../midori/midori-preferences.c:472 +msgid "Behavior" +msgstr "行為" + +#: ../midori/midori-preferences.c:473 +msgid "Features" +msgstr "特徵" + +#: ../midori/midori-preferences.c:476 ../extensions/statusbar-features.c:40 +msgid "Load images automatically" +msgstr "自動載入圖像" + +#: ../midori/midori-preferences.c:477 +msgid "Load and display images automatically" +msgstr "自動載入與顯示圖像" + +#: ../midori/midori-preferences.c:480 +msgid "Shrink images automatically" +msgstr "自動收縮圖像" + +#: ../midori/midori-preferences.c:481 +msgid "Automatically shrink standalone images to fit" +msgstr "自動收縮單獨圖像以符合頁面" + +#: ../midori/midori-preferences.c:484 +msgid "Print background images" +msgstr "列印背景圖像" + +#: ../midori/midori-preferences.c:485 +msgid "Whether background images should be printed" +msgstr "是否應該列印背景圖像" + +#: ../midori/midori-preferences.c:488 +msgid "Resizable text areas" +msgstr "可變更大小的文字區" + +#: ../midori/midori-preferences.c:489 +msgid "Whether text areas are resizable" +msgstr "是否文字區可變更大小" + +#: ../midori/midori-preferences.c:492 ../extensions/statusbar-features.c:47 +msgid "Enable scripts" +msgstr "啟用命令稿" + +#: ../midori/midori-preferences.c:493 +msgid "Enable embedded scripting languages" +msgstr "啟用嵌入式命令稿語言" + +#: ../midori/midori-preferences.c:496 ../extensions/statusbar-features.c:54 +msgid "Enable plugins" +msgstr "啟用外掛程式" + +#: ../midori/midori-preferences.c:497 +msgid "Enable embedded plugin objects" +msgstr "啟用嵌入式外掛程式物件" + +#: ../midori/midori-preferences.c:500 +msgid "Enforce 96 dots per inch" +msgstr "強制每英吋 96 點" + +#: ../midori/midori-preferences.c:501 +msgid "Enforce a video dot density of 96 DPI" +msgstr "強制畫面像點密度為 96 DPI" + +#: ../midori/midori-preferences.c:504 +msgid "Enable developer tools" +msgstr "啟用開發工具" + +#: ../midori/midori-preferences.c:505 +msgid "Enable special extensions for developers" +msgstr "啟用給開發者的特殊擴充功能" + +#. Page "Interface" +#: ../midori/midori-preferences.c:515 +msgid "Interface" +msgstr "介面" + +#: ../midori/midori-preferences.c:516 +msgid "Navigationbar" +msgstr "導覽列" + +#: ../midori/midori-preferences.c:525 +msgid "Browsing" +msgstr "瀏覽" + +#: ../midori/midori-preferences.c:562 ../midori/midori-preferences.c:563 +msgid "Network" +msgstr "網路" + +#: ../midori/midori-preferences.c:590 +msgid "MB" +msgstr "MB" + +#. Page "Privacy" +#: ../midori/midori-preferences.c:597 +msgid "Privacy" +msgstr "私密性" + +#: ../midori/midori-preferences.c:604 +msgid "Web Cookies" +msgstr "網頁訊餅" + +#: ../midori/midori-preferences.c:617 ../midori/midori-preferences.c:629 +msgid "days" +msgstr "天" + +#: ../midori/midori-preferences.c:622 ../panels/midori-history.c:104 +msgid "History" +msgstr "歷史" + +#: ../midori/midori-searchaction.c:455 ../katze/katze-arrayaction.c:279 +msgid "Empty" +msgstr "清空" + +#: ../midori/midori-searchaction.c:811 +msgid "Add search engine" +msgstr "加入搜尋引擎" + +#: ../midori/midori-searchaction.c:811 +msgid "Edit search engine" +msgstr "編輯搜尋引擎" + +#: ../midori/midori-searchaction.c:839 +msgid "_Name:" +msgstr "名稱(_N):" + +#: ../midori/midori-searchaction.c:883 +msgid "_Icon:" +msgstr "圖示(_I):" + +#: ../midori/midori-searchaction.c:897 +msgid "_Token:" +msgstr "符記(_T):" + +#: ../midori/midori-searchaction.c:1074 +msgid "Manage Search Engines" +msgstr "管理搜尋引擎" + +#: ../midori/sokoke.c:109 ../midori/sokoke.c:121 +msgid "Could not run external program." +msgstr "無法執行外部程式。" + +#. i18n: A superuser, or system administrator, may not be 'root' +#: ../midori/sokoke.c:403 +msgid "Warning: You are using a superuser account!" +msgstr "警告:您正在使用超級使用者帳號!" + +#: ../midori/sokoke.c:734 +msgid "_Bookmark" +msgstr "書籤(_B)" + +#: ../midori/sokoke.c:736 +msgid "_Add Bookmark" +msgstr "加入書籤(_A)" + +#: ../midori/sokoke.c:737 +msgid "_Console" +msgstr "主控臺(_C)" + +#: ../midori/sokoke.c:738 +msgid "_Extensions" +msgstr "擴充功能(_E)" + +#: ../midori/sokoke.c:739 +msgid "_History" +msgstr "歷史(_H)" + +#: ../midori/sokoke.c:740 +msgid "_Homepage" +msgstr "首頁(_H)" + +#: ../midori/sokoke.c:741 +msgid "_Userscripts" +msgstr "使用者命令稿(_U)" + +#: ../midori/sokoke.c:742 +msgid "User_styles" +msgstr "使用者樣式(_S)" + +#: ../midori/sokoke.c:743 +msgid "New _Tab" +msgstr "新分頁(_T)" + +#: ../midori/sokoke.c:744 +msgid "_Transfers" +msgstr "傳送(_T)" + +#: ../midori/sokoke.c:745 +msgid "_Closed Tabs and Windows" +msgstr "關閉的分頁和視窗(_C)" + +#: ../midori/sokoke.c:746 +msgid "New _Window" +msgstr "開新視窗(_W)" + +#: ../midori/gjs.c:742 ../midori/gjs.c:832 +#, c-format +msgid "%s has no property '%s'" +msgstr "%s 沒有任何「%s」屬性" + +#: ../midori/gjs.c:878 +#, c-format +msgid "%s cannot be assigned to %s.%s" +msgstr "%s 無法被指派為 %s.%s" + +#: ../midori/gjs.c:888 +#, c-format +msgid "%s.%s cannot be accessed" +msgstr "%s.%s 無法被存取" + +#: ../panels/midori-addons.c:97 ../panels/midori-addons.c:143 +msgid "Userscripts" +msgstr "使用者命令稿" + +#: ../panels/midori-addons.c:98 ../panels/midori-addons.c:145 +msgid "Userstyles" +msgstr "使用者樣式" + +#: ../panels/midori-addons.c:1005 ../panels/midori-extensions.c:144 +msgid "_Enable" +msgstr "啟用(_E)" + +#: ../panels/midori-addons.c:1014 ../panels/midori-extensions.c:153 +msgid "_Disable" +msgstr "停用(_D)" + +#: ../panels/midori-bookmarks.c:103 +msgid "Bookmarks" +msgstr "書籤" + +#: ../panels/midori-bookmarks.c:236 +msgid "Edit the selected bookmark" +msgstr "編輯已選書籤" + +#: ../panels/midori-bookmarks.c:244 +msgid "Delete the selected bookmark" +msgstr "刪除已選書籤" + +#: ../panels/midori-bookmarks.c:257 +msgid "Add a new folder" +msgstr "加入新的資料夾" + +#: ../panels/midori-bookmarks.c:589 +msgid "Separator" +msgstr "分隔符號" + +#: ../panels/midori-console.c:87 +msgid "Console" +msgstr "主控臺" + +#: ../panels/midori-extensions.c:87 +msgid "Extensions" +msgstr "擴充功能" + +#: ../panels/midori-history.c:159 +msgid "Are you sure you want to remove all history items?" +msgstr "確定要移除所有歷史項目?" + +#: ../panels/midori-history.c:216 +msgid "Bookmark the selected history item" +msgstr "已選歷史項目加入書籤" + +#: ../panels/midori-history.c:225 +msgid "Delete the selected history item" +msgstr "刪除已選歷史項目" + +#: ../panels/midori-history.c:233 +msgid "Clear the entire history" +msgstr "清空整個歷史" + +#: ../panels/midori-history.c:603 +#, c-format +msgid "A week ago" +msgstr "一週之前" + +#: ../panels/midori-history.c:609 +#, c-format +msgid "%d days ago" +msgstr "%d 天之前" + +#: ../panels/midori-history.c:616 +msgid "Today" +msgstr "今天" + +#: ../panels/midori-history.c:618 +msgid "Yesterday" +msgstr "昨天" + +#: ../panels/midori-plugins.c:87 ../extensions/statusbar-features.c:52 +msgid "Plugins" +msgstr "外掛程式" + +#: ../katze/katze-http-auth.c:101 +msgid "Authentication Required" +msgstr "認證所需" + +#: ../katze/katze-http-auth.c:117 +msgid "" +"A username and a password are required\n" +"to open this location:" +msgstr "" +"需要使用者名稱和密碼\n" +"以開啟這個位置:" + +#: ../katze/katze-http-auth.c:131 +msgid "Username" +msgstr "使用者名稱" + +#: ../katze/katze-http-auth.c:142 +msgid "Password" +msgstr "密碼" + +#: ../katze/katze-throbber.c:828 +#, c-format +msgid "Named icon '%s' couldn't be loaded" +msgstr "無法載入名為「%s」的圖示" + +#: ../katze/katze-throbber.c:841 +#, c-format +msgid "Stock icon '%s' couldn't be loaded" +msgstr "無法載入庫存圖示「%s」" + +#: ../katze/katze-throbber.c:907 +msgid "Animation frames are broken" +msgstr "動畫訊框不完整" + +#: ../katze/katze-utils.c:180 ../katze/katze-utils.c:389 +#, c-format +msgid "Property '%s' is invalid for %s" +msgstr "屬性「%s」對於 %s 無效" + +#: ../katze/katze-utils.c:209 ../katze/katze-utils.c:248 +msgid "Choose file" +msgstr "選擇檔案" + +#: ../katze/katze-utils.c:229 +msgid "Choose folder" +msgstr "選擇資料夾" + +#: ../extensions/mouse-gestures/main.c:216 +msgid "Mouse Gestures" +msgstr "滑鼠手勢" + +#: ../extensions/mouse-gestures/main.c:217 +msgid "Control Midori by moving the mouse" +msgstr "藉由移動滑鼠來控制 Midori" + +#. i18n: A panel showing a user specified web page +#: ../extensions/page-holder.c:116 ../extensions/page-holder.c:153 +msgid "Pageholder" +msgstr "長駐頁面" + +#: ../extensions/page-holder.c:137 +msgid "_Pageholder" +msgstr "長駐頁面(_P)" + +#: ../extensions/statusbar-features.c:38 +msgid "Images" +msgstr "圖像" + +#: ../extensions/statusbar-features.c:45 +msgid "Scripts" +msgstr "命令稿" diff --git a/tests/bookmarks.c b/tests/bookmarks.c new file mode 100644 index 00000000..b27138cf --- /dev/null +++ b/tests/bookmarks.c @@ -0,0 +1,157 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori.h" +#include "midori-bookmarks.h" + +static void +bookmarks_panel_create (void) +{ + MidoriApp* app; + MidoriBookmarks* bookmarks; + gpointer value; + + app = g_object_new (MIDORI_TYPE_APP, NULL); + + bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, NULL); + value = katze_object_get_object (bookmarks, "app"); + g_assert (value == NULL); + gtk_widget_destroy (GTK_WIDGET (bookmarks)); + + bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, NULL); + value = katze_object_get_object (bookmarks, "app"); + g_assert (value == app); + gtk_widget_destroy (GTK_WIDGET (bookmarks)); + + bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, NULL); + g_object_set (bookmarks, "app", app, NULL); + value = katze_object_get_object (bookmarks, "app"); + g_assert (value == app); + gtk_widget_destroy (GTK_WIDGET (bookmarks)); +} + +static KatzeItem* +bookmark_new (const gchar* uri, + const gchar* title) +{ + return g_object_new (KATZE_TYPE_ITEM, "uri", uri, "name", title, NULL); +} + +static KatzeArray* +folder_new (const gchar* title) +{ + KatzeArray* folder; + + folder = katze_array_new (KATZE_TYPE_ARRAY); + g_object_set (folder, "name", title, NULL); + return folder; +} + +static void +bookmarks_panel_fill (void) +{ + MidoriApp* app; + KatzeArray* array; + MidoriBookmarks* bookmarks; + GList* children; + GtkWidget* treeview; + GtkTreeModel* model; + GtkTreeIter iter; + KatzeItem* bookmark; + KatzeArray* folder; + guint n; + gpointer value; + + app = g_object_new (MIDORI_TYPE_APP, NULL); + array = katze_array_new (KATZE_TYPE_ARRAY); + g_object_set (app, "bookmarks", array, NULL); + value = katze_object_get_object (app, "bookmarks"); + g_assert (value == array); + bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, NULL); + children = gtk_container_get_children (GTK_CONTAINER (bookmarks)); + treeview = g_list_nth_data (children, 0); + g_list_free (children); + g_assert (GTK_IS_TREE_VIEW (treeview)); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview)); + g_assert (GTK_IS_TREE_MODEL (model)); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 0); + bookmark = bookmark_new ("http://www.example.com", "Example"); + katze_array_add_item (array, bookmark); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 1); + katze_array_remove_item (array, bookmark); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 0); + bookmark = bookmark_new ("http://www.example.com", "Example"); + katze_array_add_item (array, bookmark); + folder = folder_new ("Empty"); + katze_array_add_item (array, folder); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 2); + katze_array_remove_item (array, folder); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 1); + folder = folder_new ("Empty"); + katze_array_add_item (array, folder); + folder = folder_new ("Kurioses"); + katze_array_add_item (array, folder); + bookmark = bookmark_new ("http://www.ende.de", "Das Ende"); + katze_array_add_item (folder, bookmark); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 3); + folder = folder_new ("Miscellaneous"); + katze_array_add_item (array, folder); + gtk_tree_model_iter_nth_child (model, &iter, NULL, 3); + n = gtk_tree_model_iter_n_children (model, &iter); + g_assert_cmpint (n, ==, 0); + bookmark = bookmark_new ("http://thesaurus.reference.com/", "Thesaurus"); + katze_array_add_item (folder, bookmark); + n = gtk_tree_model_iter_n_children (model, &iter); + g_assert_cmpint (n, ==, 1); + bookmark = bookmark_new ("http://en.wikipedia.org/", "Wikipedia"); + katze_array_add_item (folder, bookmark); + n = gtk_tree_model_iter_n_children (model, &iter); + g_assert_cmpint (n, ==, 2); + katze_array_remove_item (folder, bookmark); + n = gtk_tree_model_iter_n_children (model, &iter); + g_assert_cmpint (n, ==, 1); + katze_array_remove_item (array, folder); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 3); + katze_array_add_item (array, folder); + /* katze_array_clear (folder); + n = gtk_tree_model_iter_n_children (model, &iter); + g_assert_cmpint (n, ==, 0); */ + katze_array_clear (array); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 0); +} + +int +main (int argc, + char** argv) +{ + /* libSoup uses threads, therefore if WebKit is built with libSoup + or Midori is using it, we need to initialize threads. */ + if (!g_thread_supported ()) g_thread_init (NULL); + g_test_init (&argc, &argv, NULL); + gtk_init_check (&argc, &argv); + + g_test_add_func ("/bookmarks/panel/create", bookmarks_panel_create); + g_test_add_func ("/bookmarks/panel/fill", bookmarks_panel_fill); + + return g_test_run (); +} diff --git a/tests/browser.c b/tests/browser.c new file mode 100644 index 00000000..1ee15369 --- /dev/null +++ b/tests/browser.c @@ -0,0 +1,63 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori.h" +#include "midori-stock.h" +#include "sokoke.h" + +static void +browser_create (void) +{ + MidoriApp* app; + MidoriBrowser* browser; + GtkActionGroup* action_group; + GList* actions; + + app = midori_app_new (); + browser = midori_app_create_browser (app); + gtk_widget_destroy (GTK_WIDGET (browser)); + + app = midori_app_new (); + browser = midori_app_create_browser (app); + action_group = midori_browser_get_action_group (browser); + actions = gtk_action_group_list_actions (action_group); + while (actions) + { + GtkAction* action = actions->data; + if (g_strcmp0 (gtk_action_get_name (action), "WindowClose")) + if (g_strcmp0 (gtk_action_get_name (action), "EncodingCustom")) + gtk_action_activate (action); + actions = g_list_next (actions); + } + g_list_free (actions); + gtk_widget_destroy (GTK_WIDGET (browser)); + g_object_unref (app); +} + +int +main (int argc, + char** argv) +{ + /* libSoup uses threads, therefore if WebKit is built with libSoup + or Midori is using it, we need to initialize threads. */ + if (!g_thread_supported ()) g_thread_init (NULL); + g_test_init (&argc, &argv, NULL); + gtk_init_check (&argc, &argv); + sokoke_register_stock_items (); + + g_test_add_func ("/browser/create", browser_create); + + return g_test_run (); +} diff --git a/tests/completion.c b/tests/completion.c new file mode 100644 index 00000000..86ddb5df --- /dev/null +++ b/tests/completion.c @@ -0,0 +1,295 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori.h" + +typedef struct +{ + const gchar* uri; + const gchar* name; +} CompletionItem; + +static const CompletionItem items[] = { + { "http://one.com", "One" }, + { "http://one.com/", "One" }, /* Duplicate */ + { "http://one.com/", "One One" }, /* Duplicate */ + { "http://one.com", "One Two" }, /* Duplicate */ + { "http://two.com", "Two" }, + { "http://three.com", "Three" }, + { "http://one.com/one/", "One off" }, + { "http://four.org", "One" }, + { "https://four.org", "Four" }, + { "ftp://four.org/", "ごオルゴ" }, + { "http://muenchen.de/weißwürste/", "Münchner Weißwürste" }, /* Umlauts */ + }; +static const guint items_n = 9; + +static void +completion_count (void) +{ + MidoriLocationAction* action; + GtkWidget* toolitem; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + GtkTreeModel* model; + guint n, i; + + action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, NULL); + toolitem = gtk_action_create_tool_item (GTK_ACTION (action)); + alignment = gtk_bin_get_child (GTK_BIN (toolitem)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry)); + + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 0); + midori_location_action_add_item (action, "http://one.com", NULL, "One"); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 1); + midori_location_action_clear (action); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, 0); + for (i = 0; i < G_N_ELEMENTS (items); i++) + midori_location_action_add_item (action, items[i].uri, + NULL, items[i].name); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, items_n); + /* Adding the exact same items again shouldn't increase the total amount */ + for (i = 0; i < G_N_ELEMENTS (items); i++) + midori_location_action_add_item (action, items[i].uri, + NULL, items[i].name); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, items_n); +} + +/* Components to construct test addresses, the numbers take into account + how many items minus duplicates are unique. */ +static const gchar* protocols[] = { + "http", "https", "ftp" + }; +static const guint protocols_n = 3; +static const gchar* subs[] = { + "", "www.", "ww2.", "ftp." + }; +static const guint subs_n = 4; +static const gchar* slds[] = { + "one", "two", "four", "six", "seven"/*, "Seven", "SEVEN"*/ + }; +static const guint slds_n = 5; +static const gchar* tlds[] = { + "com", "org", "net", "de", "co.uk", "com.au"/*, "Com.Au", "COM.AU"*/ + }; +static const guint tlds_n = 6; +static const gchar* files[] = { + "/", "/index.html", "/img.png", /*"/weißwürste",*/ "/images/" + /*, "/Images", "/IMAGES/"*/ + }; +static const guint files_n = 4; + +static const gchar* inputs[] = { + "http://www.one.com/index", "http://two.de/images", "http://six.com.au/img"/*, + "http://muenchen.de/weißwürste/"*/ + }; +static const gchar* additions[] = { + "http://www.one.com/invention", "http://two.de/island", "http://six.com.au/ish" + }; + +static void location_action_fill (MidoriLocationAction* action) +{ + guint i, j, k, l, m; + + for (i = 0; i < G_N_ELEMENTS (protocols); i++) + for (j = 0; j < G_N_ELEMENTS (subs); j++) + for (k = 0; k < G_N_ELEMENTS (slds); k++) + for (l = 0; l < G_N_ELEMENTS (tlds); l++) + for (m = 0; m < G_N_ELEMENTS (files); m++) + { + gchar* uri = g_strdup_printf ("%s://%s%s.%s%s", + protocols[i], subs[j], slds[k], tlds[l], files[m]); + midori_location_action_add_item (action, uri, NULL, uri); + g_free (uri); + } +} + +static void +completion_fill (void) +{ + MidoriLocationAction* action; + GtkWidget* toolitem; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + GtkTreeModel* model; + guint i, items_added, items_added_effective, n; + gdouble elapsed; + + action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, NULL); + toolitem = gtk_action_create_tool_item (GTK_ACTION (action)); + alignment = gtk_bin_get_child (GTK_BIN (toolitem)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + + g_print ("...\n"); + + items_added = G_N_ELEMENTS (protocols) * G_N_ELEMENTS (subs) + * G_N_ELEMENTS (slds) * G_N_ELEMENTS (tlds) * G_N_ELEMENTS (files); + items_added_effective = protocols_n * subs_n * slds_n * tlds_n * files_n; + g_print ("Adding %d items, effectively %d items:\n", + items_added, items_added_effective); + + /* Since adding items when the action is frozen is very fast, + we run it 5 times and take the average time. */ + elapsed = 0.0; + for (i = 0; i < 5; i++) + { + midori_location_action_clear (action); + midori_location_action_freeze (action); + g_test_timer_start (); + location_action_fill (action); + elapsed += g_test_timer_elapsed (); + midori_location_action_thaw (action); + } + model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry)); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, items_added_effective); + g_print ("%f seconds, the action is frozen\n", elapsed / 5.0); + + midori_location_action_clear (action); + g_test_timer_start (); + location_action_fill (action); + elapsed = g_test_timer_elapsed (); + model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry)); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, items_added_effective); + g_print ("%f seconds, the action updates normally\n", elapsed); + + /* We don't clear the action intentionally in order to see + how long adding only duplicates takes. */ + g_test_timer_start (); + location_action_fill (action); + elapsed = g_test_timer_elapsed (); + model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry)); + n = gtk_tree_model_iter_n_children (model, NULL); + g_assert_cmpint (n, ==, items_added_effective); + g_print ("%f seconds, adding exact duplicates\n", elapsed); + + g_print ("..."); +} + +static guint matches = 0; +static guint matches_expected = 0; + +static gboolean +entry_completion_insert_prefix_cb (GtkEntryCompletion* completion, + const gchar* prefix, + MidoriLocationAction* action) +{ + GtkWidget* entry = gtk_entry_completion_get_entry (completion); + const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry)); + + if (!g_strrstr (prefix, text)) + g_print ("Match failed, input: %s, result: %s\n", + text, prefix); + g_assert (g_strrstr (prefix, text)); + midori_location_action_delete_item_from_uri (action, text); + midori_location_action_add_uri (action, text); + + matches++; + + return FALSE; +} + +static void +completion_match (void) +{ + MidoriLocationAction* action; + GtkWidget* toolitem; + GtkWidget* alignment; + GtkWidget* location_entry; + GtkWidget* entry; + GtkEntryCompletion* completion; + guint i; + + action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, NULL); + + midori_location_action_freeze (action); + location_action_fill (action); + midori_location_action_thaw (action); + + toolitem = gtk_action_create_tool_item (GTK_ACTION (action)); + alignment = gtk_bin_get_child (GTK_BIN (toolitem)); + location_entry = gtk_bin_get_child (GTK_BIN (alignment)); + entry = gtk_bin_get_child (GTK_BIN (location_entry)); + completion = gtk_entry_get_completion (GTK_ENTRY (entry)); + g_signal_connect (completion, "insert-prefix", + G_CALLBACK (entry_completion_insert_prefix_cb), action); + gtk_entry_completion_set_inline_completion (completion, TRUE); + gtk_entry_completion_set_popup_single_match (completion, FALSE); + + for (i = 0; i < G_N_ELEMENTS (inputs); i++) + { + matches_expected++; + gtk_entry_set_text (GTK_ENTRY (entry), inputs[i]); + gtk_entry_completion_complete (completion); + gtk_entry_completion_insert_prefix (completion); + if (matches != matches_expected) + g_print ("Match failed, input: %s, result: %s\n", + inputs[i], gtk_entry_get_text (GTK_ENTRY (entry))); + g_assert_cmpint (matches, ==, matches_expected); + } + for (i = 0; i < G_N_ELEMENTS (additions); i++) + { + midori_location_action_add_uri (action, additions[i]); + midori_location_action_delete_item_from_uri (action, additions[i]); + midori_location_action_add_uri (action, additions[i]); + } + for (i = 0; i < G_N_ELEMENTS (inputs); i++) + { + matches_expected++; + gtk_entry_set_text (GTK_ENTRY (entry), inputs[i]); + gtk_entry_completion_complete (completion); + gtk_entry_completion_insert_prefix (completion); + if (matches != matches_expected) + g_print ("Match failed, input: %s, result: %s\n", + inputs[i], gtk_entry_get_text (GTK_ENTRY (entry))); + g_assert_cmpint (matches, ==, matches_expected); + } + for (i = 0; i < G_N_ELEMENTS (additions); i++) + { + matches_expected++; + gtk_entry_set_text (GTK_ENTRY (entry), additions[i]); + gtk_entry_completion_complete (completion); + gtk_entry_completion_insert_prefix (completion); + if (matches != matches_expected) + g_print ("Match failed, input: %s, result: %s\n", + additions[i], gtk_entry_get_text (GTK_ENTRY (entry))); + g_assert_cmpint (matches, ==, matches_expected); + } +} + +int +main (int argc, + char** argv) +{ + g_test_init (&argc, &argv, NULL); + gtk_init_check (&argc, &argv); + + g_test_add_func ("/completion/count", completion_count); + g_test_add_func ("/completion/fill", completion_fill); + g_test_add_func ("/completion/match", completion_match); + + return g_test_run (); +} diff --git a/tests/extensions.c b/tests/extensions.c new file mode 100644 index 00000000..aba3a41c --- /dev/null +++ b/tests/extensions.c @@ -0,0 +1,142 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori.h" + +const gpointer magic = (gpointer)0xdeadbeef; + +static void +extension_activate_cb (MidoriExtension* extension, + MidoriApp* app) +{ + g_object_set_data (G_OBJECT (extension), "activated", magic); +} + +static void +extension_deactivate_cb (MidoriExtension* extension) +{ + g_object_set_data (G_OBJECT (extension), "deactivated", magic); +} + +static void +extension_create (void) +{ + MidoriApp* app; + MidoriExtension* extension; + + app = midori_app_new (); + extension = g_object_new (MIDORI_TYPE_EXTENSION, NULL); + g_assert (!midori_extension_is_prepared (extension)); + g_object_set (extension, "name", "TestExtension", + "version", "1.0", NULL); + g_assert (!midori_extension_is_prepared (extension)); + g_object_set (extension, "description", "Nothing but a test.", + "authors", "John Doe", NULL); + /* FIXME: We should require to connect to "activate" + g_assert (!midori_extension_is_prepared (extension)); */ + g_signal_connect (extension, "activate", + G_CALLBACK (extension_activate_cb), NULL); + g_assert (midori_extension_is_prepared (extension)); + g_assert (!midori_extension_is_active (extension)); + g_signal_emit_by_name (extension, "activate", app); + g_assert (midori_extension_is_active (extension)); + g_assert (midori_extension_get_app (extension) == app); + g_assert (g_object_get_data (G_OBJECT (extension), "activated") == magic); + g_signal_connect (extension, "deactivate", + G_CALLBACK (extension_deactivate_cb), NULL); + midori_extension_deactivate (extension); + g_assert (!midori_extension_is_active (extension)); + g_assert (g_object_get_data (G_OBJECT (extension), "deactivated") == magic); +} + +static MidoriExtension* +extension_mock_object (void) +{ + MidoriExtension* extension; + + extension = g_object_new (MIDORI_TYPE_EXTENSION, + "name", "TestExtension", + "version", "1.0", + "description", "Nothing but a test.", + "authors", "John Doe", + NULL); + return extension; +} + +static void +extension_settings (void) +{ + MidoriApp* app; + MidoriExtension* extension; + gboolean nihilist; + gint age; + const gchar* lastname; + + app = midori_app_new (); + extension = extension_mock_object (); + midori_extension_install_boolean (extension, "nihilist", TRUE); + nihilist = midori_extension_get_boolean (extension, "nihilist"); + g_assert (!nihilist); + g_signal_connect (extension, "activate", + G_CALLBACK (extension_activate_cb), NULL); + g_signal_emit_by_name (extension, "activate", app); + nihilist = midori_extension_get_boolean (extension, "nihilist"); + g_assert (nihilist); + midori_extension_set_boolean (extension, "nihilist", FALSE); + nihilist = midori_extension_get_boolean (extension, "nihilist"); + g_assert (!nihilist); + midori_extension_deactivate (extension); + + extension = extension_mock_object (); + midori_extension_install_integer (extension, "age", 88); + age = midori_extension_get_integer (extension, "age"); + g_assert_cmpint (age, ==, 0); + g_signal_connect (extension, "activate", + G_CALLBACK (extension_activate_cb), NULL); + g_signal_emit_by_name (extension, "activate", app); + age = midori_extension_get_integer (extension, "age"); + g_assert_cmpint (age, ==, 88); + midori_extension_set_integer (extension, "age", 66); + age = midori_extension_get_integer (extension, "age"); + g_assert_cmpint (age, ==, 66); + midori_extension_deactivate (extension); + + extension = extension_mock_object (); + midori_extension_install_string (extension, "lastname", "Thomas Mann"); + lastname = midori_extension_get_string (extension, "lastname"); + g_assert_cmpstr (lastname, ==, NULL); + g_signal_connect (extension, "activate", + G_CALLBACK (extension_activate_cb), NULL); + g_signal_emit_by_name (extension, "activate", app); + lastname = midori_extension_get_string (extension, "lastname"); + g_assert_cmpstr (lastname, ==, "Thomas Mann"); + midori_extension_set_string (extension, "lastname", "Theodor Fontane"); + lastname = midori_extension_get_string (extension, "lastname"); + g_assert_cmpstr (lastname, ==, "Theodor Fontane"); + midori_extension_deactivate (extension); +} + +int +main (int argc, + char** argv) +{ + g_test_init (&argc, &argv, NULL); + gtk_init_check (&argc, &argv); + + g_test_add_func ("/extensions/create", extension_create); + g_test_add_func ("/extensions/settings", extension_settings); + + return g_test_run (); +} diff --git a/tests/magic-uri.c b/tests/magic-uri.c new file mode 100644 index 00000000..b8fbe445 --- /dev/null +++ b/tests/magic-uri.c @@ -0,0 +1,185 @@ +/* + Copyright (C) 2008-2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "compat.h" +#include "sokoke.h" + +#define SM "http://www.searchmash.com/search/" + +static void +test_input (const gchar* input, + const gchar* expected) +{ + static KatzeArray* search_engines = NULL; + if (G_UNLIKELY (!search_engines)) + { + KatzeItem* item; + + search_engines = katze_array_new (KATZE_TYPE_ITEM); + item = g_object_new (KATZE_TYPE_ITEM, + "uri", SM "%s", + "token", "sm", NULL); + katze_array_add_item (search_engines, item); + g_object_unref (item); + item = g_object_new (KATZE_TYPE_ITEM, + "uri", SM, + "token", "se", NULL); + katze_array_add_item (search_engines, item); + g_object_unref (item); + } + + gchar* uri = sokoke_magic_uri (input, search_engines); + if (g_strcmp0 (uri, expected)) + { + g_error ("Input: %s\nExpected: %s\nResult: %s", + input ? input : "NULL", + expected ? expected : "NULL", + uri ? uri : "NULL"); + } + g_free (uri); +} + +static void +magic_uri_uri (void) +{ + gchar* a, *b; + + test_input ("ftp://ftp.mozilla.org", "ftp://ftp.mozilla.org"); + test_input ("ftp://ftp.mozilla.org/pub", "ftp://ftp.mozilla.org/pub"); + test_input ("http://www.example.com", "http://www.example.com"); + test_input ("http://example.com", "http://example.com"); + test_input ("example.com", "http://example.com"); + test_input ("example.com", "http://example.com"); + test_input ("/home/user/midori.html", "file:///home/user/midori.html"); + a = g_get_current_dir (); + b = g_strconcat ("file://", a, G_DIR_SEPARATOR_S, "magic-uri.c", NULL); + g_free (a); + test_input ("magic-uri.c", b); + g_free (b); + test_input ("localhost", "http://localhost"); + test_input ("localhost:8000", "http://localhost:8000"); + test_input ("localhost/rss", "http://localhost/rss"); + test_input ("192.168.1.1", "http://192.168.1.1"); + test_input ("192.168.1.1:8000", "http://192.168.1.1:8000"); + test_input ("file:///home/mark/foo/bar.html", + "file:///home/mark/foo/bar.html"); + test_input ("foo:123@bar.baz", "http://foo:123@bar.baz"); + /* test_input ("foo:f1o2o3@bar.baz", "http://f1o2o3:foo@bar.baz"); */ + /* test_input ("foo:foo@bar.baz", "http://foo:foo@bar.baz"); */ +} + +static void +magic_uri_idn (void) +{ + #if HAVE_LIBIDN + test_input ("http://www.münchhausen.at", "http://www.xn--mnchhausen-9db.at"); + test_input ("http://www.خداوند.com/", "http://www.xn--mgbndb8il.com/"); + test_input ("айкидо.com", "http://xn--80aildf0a.com"); + test_input ("http://東京理科大学.jp", "http://xn--1lq68wkwbj6ugkpigi.jp"); + test_input ("https://青のネコ", "https://xn--u9jthzcs263c"); + #else + test_input ("http://www.münchhausen.at", "http://www.münchhausen.at"); + test_input ("http://www.خداوند.com/", "http://www.خداوند.com/"); + test_input ("айкидо.com", "http://айкидо.com"); + test_input ("http://東京理科大学.jp", "http://東京理科大学.jp"); + test_input ("https://青のネコ.co.jp", "https://青のネコ.co.jp"); + #endif + test_input ("http://en.wikipedia.org/wiki/Kölsch_language", + "http://en.wikipedia.org/wiki/Kölsch_language"); + test_input ("en.wikipedia.org/wiki/Kölsch_language", + "http://en.wikipedia.org/wiki/Kölsch_language"); + test_input ("sm Küchenzubehör", SM "Küchenzubehör"); + test_input ("sm 東京理科大学", SM "東京理科大学"); + test_input ("file:///home/mark/frühstück", + "file:///home/mark/frühstück"); +} + +static void +magic_uri_search (void) +{ + test_input ("sm midori", SM "midori"); + test_input ("sm cats dogs", SM "cats dogs"); + test_input ("se cats dogs", SM "cats dogs"); + test_input ("dict midori", NULL); + test_input ("cats", NULL); + test_input ("cats dogs", NULL); + test_input ("gtk 2.0", NULL); + test_input ("gtk2.0", NULL); + test_input ("pcre++", NULL); + test_input ("sm pcre++", SM "pcre%2B%2B"); + test_input ("midori0.1.0", NULL); + test_input ("midori 0.1.0", NULL); + test_input ("search:cats", NULL); + test_input ("search:twotoasts.de", NULL); + test_input ("g cache:127.0.0.1", NULL); + test_input ("g cache:127.0.0.1/foo", NULL); + test_input ("g cache:twotoasts.de/foo", NULL); + test_input ("sm cache:127.0.0.1", SM "cache:127.0.0.1"); + test_input ("sm cache:127.0.0.1/foo", SM "cache:127.0.0.1/foo"); + test_input ("sm cache:twotoasts.de/foo", SM "cache:twotoasts.de/foo"); + test_input ("de.po verbose", NULL); + test_input ("verbose de.po", NULL); + test_input ("g de.po verbose", NULL); + test_input ("sm de.po verbose", SM "de.po verbose"); + test_input ("sm warning: configure /dev/net: virtual", + SM "warning: configure /dev/net: virtual"); + test_input ("g \"ISO 9001:2000 certified\"", NULL); + test_input ("g conference \"April 2, 7:00 am\"", NULL); + test_input ("max@mustermann.de", NULL); + test_input ("g max@mustermann.de", NULL); +} + +static void +magic_uri_pseudo (void) +{ + test_input ("javascript:alert(1)", "javascript:alert(1)"); + test_input ("mailto:christian@twotoasts.de", "mailto:christian@twotoasts.de"); + test_input ("data:text/html;charset=utf-8,TestTest", + "data:text/html;charset=utf-8,TestTest"); +} + +static void +magic_uri_performance (void) +{ + gsize i; + + g_test_timer_start (); + + for (i = 0; i < 1000; i++) + { + magic_uri_uri (); + magic_uri_idn (); + magic_uri_search (); + magic_uri_pseudo (); + } + + g_print ("\nTime needed for URI tests: %f ", g_test_timer_elapsed ()); +} + +int +main (int argc, + char** argv) +{ + g_test_init (&argc, &argv, NULL); + gtk_init_check (&argc, &argv); + + g_test_add_func ("/magic-uri/uri", magic_uri_uri); + g_test_add_func ("/magic-uri/idn", magic_uri_idn); + g_test_add_func ("/magic-uri/search", magic_uri_search); + g_test_add_func ("/magic-uri/pseudo", magic_uri_pseudo); + g_test_add_func ("/magic-uri/performance", magic_uri_performance); + + return g_test_run (); +} diff --git a/tests/properties.c b/tests/properties.c new file mode 100644 index 00000000..deb6266e --- /dev/null +++ b/tests/properties.c @@ -0,0 +1,183 @@ +/* + Copyright (C) 2009 Christian Dywan + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +#if HAVE_CONFIG_H + #include +#endif + +#include "midori.h" +#include "midori-bookmarks.h" +#include "sokoke.h" + +#define pspec_is_writable(pspec) (pspec->flags & G_PARAM_WRITABLE \ + && !(pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))) + +static void +properties_object_get_set (GObject* object) +{ + GObjectClass* class; + GParamSpec** pspecs; + guint i, n_properties; + + class = G_OBJECT_GET_CLASS (object); + pspecs = g_object_class_list_properties (class, &n_properties); + for (i = 0; i < n_properties; i++) + { + GParamSpec *pspec = pspecs[i]; + GType type = G_PARAM_SPEC_TYPE (pspec); + const gchar* property = g_param_spec_get_name (pspec); + void* value = NULL; + + /* Skip properties of parent classes */ + if (pspec->owner_type != G_OBJECT_TYPE (object)) + continue; + + g_object_get (object, property, &value, NULL); + if (type == G_TYPE_PARAM_BOOLEAN) + { + gboolean current_value = value ? TRUE : FALSE; + gboolean default_value = G_PARAM_SPEC_BOOLEAN (pspec)->default_value; + if (current_value != default_value) + g_error ("Set %s.%s to default (%d), but returned '%d'", + G_OBJECT_TYPE_NAME (object), property, + G_PARAM_SPEC_BOOLEAN (pspec)->default_value, current_value); + if (pspec_is_writable (pspec)) + { + g_object_set (object, property, !default_value, NULL); + g_object_get (object, property, ¤t_value, NULL); + if (current_value == default_value) + g_error ("Set %s.%s to non-default (%d), but returned '%d'", + G_OBJECT_TYPE_NAME (object), property, + !G_PARAM_SPEC_BOOLEAN (pspec)->default_value, current_value); + g_object_set (object, property, default_value, NULL); + g_object_get (object, property, ¤t_value, NULL); + if (current_value != default_value) + g_error ("Set %s.%s to default again (%d), but returned '%d'", + G_OBJECT_TYPE_NAME (object), property, + G_PARAM_SPEC_BOOLEAN (pspec)->default_value, current_value); + } + } + else if (type == G_TYPE_PARAM_STRING) + { + g_free (value); + if (pspec_is_writable (pspec)) + { + g_object_set (object, property, + G_PARAM_SPEC_STRING (pspec)->default_value, NULL); + g_object_get (object, property, &value, NULL); + if (g_strcmp0 (value, G_PARAM_SPEC_STRING (pspec)->default_value)) + g_error ("Set %s.%s to %s, but returned '%s'", + G_OBJECT_TYPE_NAME (object), property, + G_PARAM_SPEC_STRING (pspec)->default_value, (gchar*)value); + g_free (value); + } + } + else if (type == G_TYPE_PARAM_ENUM) + { + GEnumClass* enum_class = G_ENUM_CLASS ( + g_type_class_ref (pspec->value_type)); + gint j; + + if (pspec_is_writable (pspec)) + { + g_object_set (object, property, + G_PARAM_SPEC_ENUM (pspec)->default_value, NULL); + for (j = enum_class->minimum; j < enum_class->maximum; j++) + { + GEnumValue* enum_value = g_enum_get_value (enum_class, j); + if (!enum_value) + g_error ("%s.%s has no value %d", + G_OBJECT_TYPE_NAME (object), property, j); + GEnumValue* enum_value_ = g_enum_get_value_by_name (enum_class, + enum_value->value_name); + if (!enum_value) + g_error ("%s.%s has no value '%s'", + G_OBJECT_TYPE_NAME (object), property, enum_value->value_name); + g_assert_cmpint (enum_value->value, ==, enum_value_->value); + g_object_set (object, property, j, NULL); + } + } + + g_type_class_unref (enum_class); + } + } + g_free (pspecs); +} + +static void +properties_object_test (gconstpointer object) +{ + if (GTK_IS_OBJECT (object)) + g_object_ref_sink ((GObject*)object); + + properties_object_get_set ((GObject*)object); + + if (GTK_IS_OBJECT (object)) + gtk_object_destroy (GTK_OBJECT (object)); + g_object_unref ((GObject*)object); +} + +static void +properties_type_test (gconstpointer type) +{ + GObject* object; + + object = g_object_new ((GType)type, NULL); + properties_object_test ((gconstpointer)object); +} + +GtkWidget* +midori_dummy_viewable_new (const gchar* stock_id, + const gchar* label, + GtkWidget* toolbar); + +GtkWidget* dummy_viewable_new (void) +{ + GtkWidget* toolbar = gtk_toolbar_new (); + return midori_dummy_viewable_new (GTK_STOCK_ABOUT, "Test", toolbar); +} + +int +main (int argc, + char** argv) +{ + /* libSoup uses threads, therefore if WebKit is built with libSoup + or Midori is using it, we need to initialize threads. */ + if (!g_thread_supported ()) g_thread_init (NULL); + g_test_init (&argc, &argv, NULL); + gtk_init_check (&argc, &argv); + sokoke_register_stock_items (); + + g_test_add_data_func ("/properties/app", + (gconstpointer)MIDORI_TYPE_APP, properties_type_test); + g_test_add_data_func ("/properties/browser", + (gconstpointer)MIDORI_TYPE_BROWSER, properties_type_test); + g_test_add_data_func ("/properties/extension", + (gconstpointer)MIDORI_TYPE_EXTENSION, properties_type_test); + g_test_add_data_func ("/properties/location-action", + (gconstpointer)MIDORI_TYPE_LOCATION_ACTION, properties_type_test); + g_test_add_data_func ("/properties/location-entry", + (gconstpointer)MIDORI_TYPE_LOCATION_ENTRY, properties_type_test); + g_test_add_data_func ("/properties/panel", + (gconstpointer)MIDORI_TYPE_PANEL, properties_type_test); + g_test_add_data_func ("/properties/preferences", + (gconstpointer)MIDORI_TYPE_PREFERENCES, properties_type_test); + g_test_add_data_func ("/properties/search-action", + (gconstpointer)MIDORI_TYPE_SEARCH_ACTION, properties_type_test); + g_test_add_data_func ("/properties/view", + (gconstpointer)MIDORI_TYPE_VIEW, properties_type_test); + g_test_add_data_func ("/properties/viewable", + (gconstpointer)dummy_viewable_new (), properties_object_test); + g_test_add_data_func ("/properties/web-settings", + (gconstpointer)MIDORI_TYPE_WEB_SETTINGS, properties_type_test); + + return g_test_run (); +} diff --git a/tests/wscript_build b/tests/wscript_build new file mode 100644 index 00000000..2de915cb --- /dev/null +++ b/tests/wscript_build @@ -0,0 +1,30 @@ +#! /usr/bin/env python +# WAF build script for midori +# This file is licensed under the terms of the expat license, see the file EXPAT. + +tests = os.listdir ('tests') +for test in tests: + folder = 'tests' + os.sep + test + if os.path.isdir (folder): + files = os.listdir (folder) + target = test + source = '' + for fila in files: + if fila[-2:] == '.c': + source += ' ' + test + os.sep + fila + if not source: + Utils.pprint ('RED', folder + ': No source files found') + continue + else: + if test[-2:] != '.c': + continue + target = test[:-2] + source = test + + obj = bld.new_task_gen ('cc', 'program') + obj.target = 'test-' + target + obj.includes = '.. ../midori ../panels' + obj.source = source + obj.uselib = 'UNIQUE LIBSOUP GIO GTK SQLITE WEBKIT LIBXML' + obj.uselib_local = 'panels' + obj.unit_test = 1 diff --git a/waf b/waf new file mode 100755 index 0000000000000000000000000000000000000000..3de0239bbacadea9f7deebf3b9fba4033c228554 GIT binary patch literal 78495 zcmcG#cQ~8x`#!FN(mHClRtd3#*n89nqPEyof*^K@y{gpSd(_^e_Nd*`+M{++R8#nIK-9Ch6S_&_>)f-D`K?OixQ?r4lP$kF-w)zKAm*B)?Z zi8e=K4RC^x&M1%*%Gn-`!JsTaPR@>QXba#1V~xZBPbk2Mot>jQfDdHu=wN}yPI9@6 zon()~h~2%*%MJRUkX%5HmjA*61O|+Ab-{p~Q5YnE5o-`>=IDk3j5&EaqphqlcR?VK zgChoQj^YHm(Jml6AU>>(|G2x3>3?DYNHDiUqU}-6+;{Kt{cj9_um2+9Ul@SsEL;JO z{(pdh%>ZB)8;ymdxvM?O0dq|-7CRIm-x26^2H7JqC}%X%&gDNuUuOpk=)dy{1jWw{ z)By_QfV4+p*}#rKx&kGGHR6e73}lAFrXEO@BTz#Yj?O?C0KGtr_Kp}Jr`NG!T&@uT zPThc!mO$TMl3g4vG49wbV%-Bp0djFdnPaO0n1{yJiZiwz9R5~@iwlr+01`q8t_{*w zS3u~=Xu&|hwT70uE?gca50W(iA(UVs86AX@x)z90MjPm51j(q$1HT3!n7)P174Tm_CWxb~+2N2pFaU~-tP1R}Js=i&xE4$f!Fd<1 z_Rkd-KEMHhLWL8gtpSsRV=rL(Fd$MHEdx#1e|^0S^e7 zYsY{IfDoV?03oZR4Zo%au7-eVY3XPn;Oc7Zca_xjfZzd)GQd=9zT`pbYS(E4GODg+ zfHjKc;F@Aike(6@XxGBh21JF>lEIRpjnIP2VYBw{VSqn`x)uWTpBO=EFhv!(B1}yV zhDD=}wW0^thOq+~fdj}C0ZOmk>d62;fjR*EVrvRO_4o3>Y7gKS$QKB%0Fsf{1#AG2 zuLs`+GOP{%ry77JZ5=tKf9U4ER?oX=dnZR{Kwbb@bn$e#iw301(}mj_<>7{M##Xrm zj|U$QKMxO&r5MN=i3XMwqaM-{kgw;iXlIlQNaI?yK~j<+K5l--yI2FP8rlYO>UuH? ztXK_jbm0cn9qsJsAa<7kt}9DS35g4_PYcq4|9|gM$8H6;&S&c zkOOTXA(D)|+=5usS}-88>jpt#K|wxIb3T4Pa~?rKQFDHjr5O*>!i?X7M_5=uK$sC= zP8%pc6-jI?PIgEPR`?|)Spn7N=VQHAPgZj=CnR)|nH^fekwx>1^d@#AD3K>TJdeSTG0r7|k7>on4)<+Z8Yo#KvsF&Ulx= z-5PC&0`UU#3GC1gC}5l=w=)W9fqjD|n*c}^RyDEj#jc?^g2S z*n#l?n*YYf0FW;sDT%dqjSV}H?|Psa5QOdB|EDE>V8CC$z_Ssr7#FWG5He5z<|sBf zUQQ4zV2=GiEqvG(XMjb(+TUg1Vhx-k?0|h2>1+wG_qSj{e_Oeo?J>?M)OAw+RjMFB zK>w!px@NEI8(S*&NL%1o;_SkPtqtr9z|+52V+F1ej*fONtn2{Xza{@4JJ=FpltVgT zGxN6?u5)UKHUkzDu(1Ip}fDTSp_v@m{cbngt92))&a*ddC+7VStLpI3vw5Y##sD`J^od`MnPm5XJwf0l+kN6dM5NfB3;R z0tvrM0JcE6xm=%7nE;IhHceouN?u0;O!-GDv0B5%`nMZfFW034tPpoVg#U)&jm)^f;{YT<~rt9Sn z;*tWPJg&EkzsMw^f3*S7fx84i+<*s0C_ohyYlPVa_<>^UknJBO=LG#r!U6Z#ia}#5 z#^@id=DZeR*1s>%zgi5uadg748vhUcXvlS8|E~c4#Rpc!0c8ciuyX$!2vF!iy#Ku& zfFywde>Vg%5O%Z+AQ;B~isO3SVwnQA#s7B*Kn(w;^e>?Qi%TA04jd>-&fpDfJOpGUp5RU2v}d7pnvDj9@4g4yndX91ubT8SOLJG4TuMe?CMsaB+QcaOh%M z>*8#g*)-W2!YhZyXRJVOC>=~eCAVvic8b8ZyFFjk9; z596rRRt@Et&Y-P%P^Bh2!%A2ZxYC1BCPV&S37s5e{w8i`HRh zFqGp3t_|j$*saH0QMfqv0UR&#*vQ%CUucplX-*&tLP^<(HBfKR^R#L!Vq?>K(-rgH zueAzqf}w{qRhah+TbYZ=LuXQ_GvdvUT6bdJbnN&njvTk`)7$$tNwqCZ{XBl2?KOus z@5QW4JU;9;07DVVIJvS%xBB0OJ=Qd8?+x8*9G6inmi+dW@)Z-8jq;tao9?Z!A+;Sy zf>%VwsM?PmM^ABTC5~g^O!sGr3tuAtY**PGc5Kt7Q6IN&@3jl=@F%2vT5NN3+Z^@E zTqXNa`I)V(aFhJjOnd#OHM`2=tR0^iw~)^Z_FuXgl4-UoW9^!nmmE8eO&j*STW6l^ zc#r(@_U)b6TK;%6>K-wC zd-2S%3L53z&|2>rr2)^sv7Af1=u6o5^iBax~g`GBxoo&}_Sr zkK604<3s|~zhXsd<1_R|unC7wZu--+wU#|$6WMdf6TXZe)_NdbqO zV-2k_T&+Le5qY~ONch~}>e#0fcbH#uRBS18jONIc8s6WUaaf=4_3DJD zbDT>D<7sZzal7D>FW&a?yjzZH{*n#dv(v~MAy$TBN1w(9zV$i@ySOjx7_?_@w*Q<^ zo1bqAgl$zxw!6D$od)>$dN1p~Be1q6BXaq*@@muF9dKa6VLTu-7=1rePu<(rEM6*# z`i{bvhqLZ4yolsxrw>~<&Tw*WmMU{E&dt5?fVOVh?>Ov4>$UqF=g&7;NgB6BHk1Z6 z>Qigl85GLd*V&+F8fSuc$hOq0yxpw4+ah|HJI;*vCfZI7m)n~bUkBHW+fP5Vb$d*( z4{dTWYTpr$mpaN?a)*~lZXNf2@t!`j4GCfv2*4r6c|peVI5i3{ghQ2qr>KXrYfU+0L}}Q zuuxt>A}v$1^sFgfN$}($7$PZ1qa-k)DpUllG#mm+t;BRWRT*^~j~DO;`qFS}uNQ|n ze77d8|5@=jnL;qeawXOuJ^lNW5VUtWX!a+%W(=%g?C7yz|#a_o~ue+2nnS&aixFSmE79K z9g^1E;0?l|;CT~V`wqx*g7eQw4Gk*X(5_R*V*ZFRyXXV#i)4@d}Z7`&l*b~?|cGiZcJuX$sZ6iZ=1!s>cY3;#xZ=tmi^j~c_F zb(TLj0H0VP*E_lMA>l;%_^ibKjEk1cw!L-h89NJ zTdOsy~@=Vt-ckXqV+p?RRlh-DvN>XIk7b$GBOJdTwr=$B)arLt|0m22RxjQ z>jRm>2_8=vCRNn%p}`QAsFE>dWjLOog++28h?1YfS~k((RTP{u!nF6(f*D^B+Aa~! z)Sqm~kzhH2K(QkXB7?*0;QTyDuJqK%&*K^FxRf@OumXW}FvKkR9-l>M;u9q%k~;EK z&2-h^)C6Rzil$jUQeZBE$sm=B+MIJxGdZ!JldoXXkh8*G(Q4Plr}-UmEO zzC61m(~tRfER20QDH4qJB(M0uw#bt%WG*3$KTWBtG3}S7&28TguROY z*vK|Wde7`5oaIBmvQiXGsXr*UHn~36PGQVW(~d(&9t;VSwGl{<(qvB5qT!;>w}IfA z^(ZIkPgtZSMOe==DSs>jLn_is1GzZjDu&^30)o(al4PAI3Z*2bq6iLyI)#Gwreo}; zmW*M+d@3a+5f=Go)8lUhz{4p~Maq!SFC2HBUIu^U>f(V3t1G{nt1>9b#s4Tq) z43V)z=UKcYDM%unv%x>^&Cy zJ=Am{UAX_p3;(iFd*EGxeO;rOihT*gu_g2jeOVwR!XP;KVj9DW^FJ5j_nHVNXmD2a9m`rHQ!oC+0?vhs(<8eF7(5@g~KbpyGsu9B3=L6OPxr{IEBtoTSka0|CoKRkpA z3=PL4WLriaoc;EaMd6|%GvYz;T#ZkRfE5{$BO-D@*uW@r)N&e@& z1&qg4=Fd2jmkf^nOeERt0QXEu$WacZ{F6t)ligk`c65k9I{TKT>AsrftFw10Fg_S{#E zI_g#^o1~7o5xFRXS?05BtFw0l(K_aZy;peO4-cA&+r5ufZHcy|p8eVXV4*1ylvodj zE=Ec(SalC%i5$i=!qk<0^Vpsz3~+QuhAVE{8T2}jKwie(wvh%yAQ`K&kygW;`#!9$ zUnH~hT&8zp&Z8th9-7BwJ%y&vm2@ZTXv}~9!GJ<^YSk9&X}cTnaOKaUHd|x$`I7?) z3mGBe4HT8lkt+$@Umbqh=$ZKDqz8Y0Z#dO6Yd6Gas_9Q3vYY*JZ?llx;6xgqBae$$o?Y>2+yl<%1?6ezXKW6v8#cYz3FxDkgoQ(I?ZC2-# zdaQnE1VhRVvrg|s7B4tjKPyG3vnYqmO-6{@xf1-oc$ocLb$ zANH-U_^#_=&HgP*eWgBo?;_ijNcU|D*X7@o%ZspAhm6DRV0I%G8t|z(2H;rzT4zpi=S@&!0CUdYa`tGk_g?g`p0T|jcdj4LwU#`CmGoc`}%s? zPvuoGL;^E9_xvMut9HZWM(@R?m?4cSlR3k(8$GL~R;E7UAa{2!qhe++$NP(f;Mg1d zA78k{yd;nxl5|J&HacseY z5n)kMjGabGElOjXhB?yC?UW8_dJ~v@ji$F>)yK>!GCQbJrSAyY6{sdda$% zFd4?9_?nn~p1tR5d}d%0+|wmRQM<{Zy}?1IygG-s{$@M(ioFx0o_Ke4emkwhCBI{h ziTAr;zq&J}Mx#B}W6?RBfM<^m*;mU&(i_K!bb1xsVE`Y{ARABvNF4hW7oi5Fm1P!ya#ltf0*&z;QPvYs#)fobl+lpUZB|E z+SldGMVhze84~ojr{>JPLd4-o;X{`jXu|acdha0yKCaQ)WdV2%&UWq+TGU{0s%n`? zJ6@62laySgo+Oel-)Fi?uD!jlXJtSD?0+E4~GWOoLB`oc3ur(~R1)$`F3l ze-iHb!8?PNiw&(ZyFW5i>`V@iuL^^q5DJ|&qfRRhJCE2XwbyTJ3s3b#)>+950_9h4 zrfe6ncBSOjHoSqA4~_aVYi5T`@NXPX4uS{A@!@VNYyID&$?x#)#mnapj|ltUsl8}; z4yF%JBxP>Fydp^be%t3TjH_zmR+!D1%&2HLQ^VF)_<()#?RhEpEypdj{F$B9OuMGi z3s2!hJd?&0=1b3+Q-L*#Y@*{nr{At?i>6Yv2RlYjW;`(Og7Ar8iF`7+Z{J$D2NoRs zto+?xlv%GfcS$tI&?9GfoOr&d%c@JtB&_V;NtD)`f5e7~oo85g99Lo&i8Xt9a-W&J z-;r3la8$O7N<@PC1oO@poYg5i>e@8_)v7vbK_GQ(jkM=XxV-||{u%*M`A9tjy=oDXEnZjmmh$I_P!U7bO*}r0{7|H>_QgftB=2#sEDSO~ zAoF|K7LS+k>tXf!rVisFWZ|`nkJ|2Y<*Z-jRxK$~cd{~9C(m5M!pfLH2lF|VvdWnx zDOv60<*?S>NcwJ2M2^U}`?0+tqkRp}C0OyMf153?Wfr5JGUIu9lM2aO~> z*D5ieibII}92hc5kisomVweRv>lAxAX7-HD%_v&=&bbNMSP1{N3)y@|ijfII!bN2; zZC}mDf$#avc9wOQjp{8k>R0nGMRhp{y&EE08T{D)e0qPM_4uMmHRQ=c@D_B+`aM-l z?r%%W;*a8TqM~Un-it0N-1nqLO8kPojvf{vu7bbF4F@xXS7D?k4}3*A>Rt_4t#7|x zIp(MtX&zCzjOdRi@DpmaQZ6JAeRw--=qn=HPLg)PLm#(wvF)}VYZN^gQZojY6t9(1 z`XIejDpW;eU{1gyD@0qS&M4vOA;a2~$a~rLwpf_7y$#uPO3wBuUeBbZc&|3x@1l<6 zsIL34<2hfOV)@Rywcb@ZktD@1&2WB0_dg!p!wFfK`{yN>v|T<1{;H>JaGs=n!cSd(qGp-Ne%spf9=dG% zAk(^nl_V#u&W;US#p8!hJ{i%JkNO;V#i~~bzjvlBzGbm9I2aFxDx#WZ*sAr3@cKRr zS$%upKFl5}+ky9oKbcwQ#t6%+Nwcoz8AVZc<@cd^;1hhG5AWvOtSU)^H5xbcex~D- zu}e1RDnC_G4%Q+kW#q9Kmduhm=qfzj5_@x=Hnt&I?a8*~#mFi*_K?AFxgU1(ne(%y z4c&qd?#)jahy<1&OuZ;IQ}v(e(pv;pih5_05+pym<&wx6P2FFgvvq%FLDm1@jNyWw zc`V`lT>Cqos-dL%amA&{02p#O3VcE?&Px>yw9WTYj9(ZM?jkxy)eG`Im9$Jj_qWK+AT5@S#stB&MBl znlnMn)w`89-W1LNvW5zRa@7xNx_`bI^+7*zHHc#72SYwFRy15bdD_xM^JMiVJcYpL zIfF2+m$$Bln{DiLK?q6pkQM85Hp^ziuRS${OngeDWMD|Qu#a@&{zMkh`j@n<2fU8> zRcm$K#4*X+3{8D^3fxoqllY3sSXwf?0BoYiIcy~3h(B83uV4K(2&f96AEE;1) zxNwV^Dm1_21g$*FcyCxQhRj-Eo7l_m?T-AUwYO8x!1U3mh2W=i0~1^wPxtXhdu?6y z%r5+A9uGG6AdOpwEnJDBX}|PV91D*-BS0m`+vl?-oZ*p-ac1FQXc-uK=ZB3?`xpI- zh?J1~54j35{ENYc1gSR7lP_Q+#GBe(P1% ztCLl-?h6yg#NWQ`W_`8pHjzwPDJ73q2%5=!zPrx)_5G3*9%2~Gj-hpIUe|Wn39brz z-oI{GtoC5!g8Zj@2hRm@pJTk;ghG-$?buS4#Obqz4jTT6%<%Y?&;$}V6CWHu|5CpV zu5&*s(^tv}<8N8EFj4pH5k(cu-8bgxB}V5GgR_onw)|xnZDaP!^QTj;Z9sn_C+kbY z`%)eQl5^{LwtSzjvZQ`0a=l)3J3+tof2y9$O+ZNk@>-vNm<)-$Peweg_P~3&(ki)Q zzU&#n*0CJroRT;LTPf9BFk~=)eWl;}-tLinu!nd99;1Sn6-9oU$g6By8{hpD-weaa z;YW=L0!YfBY%r8Bu*WFX=!^7tqdN88pYUQ?b-eO`wQia$+Hx@T_<0a>;j(Vz?53*_%k9@#TK`DoC?O#6#UDlC@y!F3jwWgs{5EMNt?y@9V!=*YU*LBi$ zRzqR7Wa<7>dA{&Gbo$%7JTUafeLYHzHC}daF#e7Kvu|(b%QRc$kH+;G2T~2I7SXxt z0)q!3<~viIWrfF60n{?HF(-x`=Kdchcpd#kR)ZF{PX285BrI!^-me9*1g+!|H=cV5 z2_LEkTe^h}frDbrUL?ZJg#ZegZeFfddPI#w*SX~kZ&gnx>BEiu<%W0IAXH9~gQ z?(IP%dFNI=RfgkWYwF1@ez$-I90lNmWMXC~(H3c!d&9~H*W+f3y`vd70oG!1t5ZS4 z3-lBix*sDf(P@=3`*WW@{>Zm6={#MJNj>l(8N6#X) zTywCh{GB_KvVPU}apBmV(J5JJ8*$RSGt{do6`t40HAO$%+U23^@8!xJ&;0`rEluDi z(AwDb*^WNU#G+23iomqn#H#IHnPMs_iqhE;J zC`RcV7P7S`zxWf*=1$m35YfFh_1axkFpsiZ3wLCHi=Z)m%xh|jM`POQ8_6QcKK?k= z^fCDM_^UzfYR^yPgaw$z0!tQ7vT!{|{mXriX8(mv#Ue@R6d}q{x~I1$i&GpMMQ>Nv zT~1#W=--Rw=Ob02fA~C&Y4BGE1nxckS#!5Hncz~-v?q=yiC8ApwUjIMocF8`*-qR` z|K0cOwIZd|(=!c(l$VST10wRLnl6*HPPK#Mw%d}>)H4y)jz#3ovp4qIGJ??xC+U-= zj00Q=(}>1)&3D!5Z#pi>Lux86x#7Te=Jxx*gzWH*p!{mGnr>P!(?mG)za z5IX_CsfH(tr^zxeO^5sjNL9K{IlFn8-1>o?xEQ5&vsB0RzKRafESfF-;29A^ zzbc3~~aZ(l$9bEOjXyq^XPC0^<086To8bZKKM1<4@hRJpX9FaCO&*Lg+O z{5`*zMKA~!+He7eCYo37=uoa9!y?0~yMZ?nNOJ3_K`wDB+MoOaad6Q4q?3ZK~Vi_2i zSXdr)P^f-bq3=6^4U35HvNHP_tWN1rnwC5QLn7KM-&?00tyeP7ZIpc^?KD@LXYp8j zc{DQj;B)rJLX}j7kL>Dl%NH}<&>rU;{_1;7RkY*t({1c*hifPBi&K8vmPx3LyW+Mp zrJu|0L8+7&|LvqUFS44SM~z@}?eEhz6PoAKW#jkw-bR1iL{TFIn(^t??^x{8IkGSjMi}7ARmU?7pCHhv5z>xMII_`(gq~f2> zPaK!KHd_vsRE&Q}OlZ7imL^s4{SGJ+|B5OY5^$EqbXZyYg*8w8{z6H&ePHK(177cQ zO$?KlmnZ?m{U9Ry!RC)G`lXYNTZ8#@2@@m3@Kq@$>kOHn`XY)=sjV)Cbx@k0?v6v!@M)nim{~*=2rPnA>$i8{b>- z(~OkZ6g@rt@GwPU(r=$SSr!gix7{#r4XMj6~i%4HkD0P8D`9$QF^&SE~Q+k zr&>-Gf)@;pSO$E^4$>?ZNwr=1zfaQ|rI87pRZ48sv=*5W-_N|oZ0)vOnDOmXiC69# zi5vc}S|S;H;fwasvbvrh94(T6zA@A_7LE-)VOj)3TR(eIu6bKlF(0M%q0u6p+-MauC@kup6P%q%8lL@~OR#UOkTID0PxFp6b(xf7vf3 zMpO>fGJm3!*liM&Nz{ABHWlITd6~uEUJo`Yw$7HoBRI5gMK8L_aC4xvL;HG&WPU6* zZSQoPZo|olaXUzNh47tZZIlCMU&T{1?LX!#Odz{O6aAd8UFtLIOw>MumzKP3)=6$b;)S{o z3Do`Z7AJqr9M^CxVh~ijy|vgLny{y zc|Dc9`DFg2N`v8;8g77|VGrgY*9>K>jDpPcq%M29jU+3yGlG#oUV%Xd+-0$EAWZ`-pf##tWF#0j?}CSt*nYjx^Y_M(PVq>x3;c2{^iRNp5@_Y zPwv-)r_=GIkC^XA-2KY2B*a{$hn z3UWfWKCe0|sz^|03i+VQJkA0Ydo8?m)VuR3%R?%dEczzr1C{+2LcwZzB)XZW+dZwz zKBxDIcK95JmYK#k;>vkqyF$~CvCGKdAM9(|ti7q&U zAGW#KAoOhF}2@)5zJ6bR@Bu~^%T9ZF+-+gdDoKdv#Ayjw zw{{^#Jjupo=9Y1J`4OuJt;E^ad8$8dB=ThQUb z<*dPJyH&Pl+7*8}y24QW#}(g9t3pYY&zte{Y3-4v^w)`LU)-ekviuSjZrFHwsvUV0 z5Ts!oPt1vo3ztuy<$8;RwaiMu)AHL?Q*1DiztqGTW2HSL%<89v8O%$*q(8`cEm8Dc z%`7lG;j#oyoO3jZX!-dGWtOE$F!gqgAk8(8Xe^s&`^0>QT;>eX6B=FK^(nx1P&hW0 z@#sZ5sVb?uTvB&(({Q`oBqD_>i3Qpd-X|&4=GMMTNT{t(KwQ-zG_?nM<{sS1+1cPe zOyZ)<+bOa(o`cq6+Vx=`Mxmbkuwq!^cf3=ZQ^2*qKjO!Wu-b3`9CDBGS%=SBnaw%WZAhWYC@+bND>eWR+4r>0DWP_2^RfiS+U*=kKcF(5-u{ro+I^SG*0^fxxHqV+SApBUvb%X($$-XLEJ7m-bHU;UaXDy0SU>xS{wZov16Tf%RTtK7WWvXqs;3 z2P8zQkp!WCW1mv<)`6q+@@JiXDM~X}yI5sI(1%tPD#-mFGo@PO=Jf3==&Fnrj{f>V z^9?@W&mD>1T%iN|Lt89--kX@nGY|!SVM}~ydGlqr2pA$Sh1cgHt5_jQvPB<&qp@|{ z%fFX6Tl;fJ9v#&LZ+mywolDzK2e|&6Y|$@+YiFYqiaK5}Ot4u5`55ZMU0ey7Ljy`z z1&Zy&4-~p!8GL>NEjCkE=nRA5#!|s2q-y1D@oFl`0YPfJnMcabSD=9(Fa3_g4(>%-HI_31~n;*>7u@ubTRe7*FRtD&+l15{QNv= zJzv-O`JvzE1^2%H93*YEUGXj#wC`~0Pvfa$Y*N;L{`T?&WgPy-yMHUW!RPq{YBVq7 zTEbveODpDN29?a>KP3LNB3poS>M0kZFba>X$c@YwKCiSAM=L7xOHz7yl|#j{0RJ|n z%pJj-B0&r#be7HHc<7jtR~qX(=M9uUSL8B8{7CW@zW6OQY%XXc?nJCnmUeqGWHL>S z3@c(H210Iq*_Mr7>b_r=pr*e)b^l7z29I7M0f_M%IJMPWv0L1PhF-vsdMGdrGt1GnyvxwWBedoUZ%nG<-p_J zp0=FFF$<}MzjV{DBpBHyna|TaE7I9k>W3s`r5&O$^SxkCqC{x1QpM(^!=JBUEwK6YF zvYmyfqP238aKrJ-+2Slj7oNL=q3GR8#Pxo@y)XKFK3 zIwgj*-%m<7Zod9PhTC)Bp}exvR-#q$3gu`Oyf^h**I3l^FhRg^b!$d2Z?02-TM|{4 z?Iy9f@m4W-acq3JZ2BT3df26;__r_!XM^o|1>8i6pnjY{m zW63gb`Ih2vS;-r>c1gqM6H-h0?ke}FcLeo)rcmpLGrvb4@piU*c@ngpM82&irqbwo#xJ?&umte`ljH z?OEus-#zI`%*_>>1#am+wEIIrp#4fKytXUa?`QPzs-B@QSM@G=Gr6rGG5cxxdsJHF z!|I0URF@((xA(0nkMQ{vza3jXTXJv}R3CPZAN8!E8mC_uS))#}8e_Nd>F8{ih@xv?9$^! zc-p-1Gj{DtnZXlVC_F*ao1Aq1a>xi{0Yi6vOPcw;$iL*jt9az|6nT4$IG8~7wTd~i ziN0>br$a5qy_?}wuzP9&>Z>Yx;!`c+q)9Dy-4A04uG$O_cl82Y4dx>_VHXk6Rbcg9?Ca^8IAccYE|(86IznmG7sA>**M z(DMtm+}59z`wnWZOe`Af0q;((zDy=JI>%!>m$$l zR9e-Z(O%#V=Ki182T7Fg5?=>psjuo~Oi24S?!eFYcz?Yk#($W*LAjf?6JIMomje%K zr&ZNBDGh!o8|E{emS4-~K~hmfQ($eqE-_6UGH%+Qzg-s;yHHy2>w&p?^r zgL={Zr}UY|mtK5O^Mf;&KEZrQGEeCk zH0M9*McqocQ(Krd`cAm$CL0N%RYOjO3GS35jhW*&npw_NSyhR;NWl&(Eegj`L}&~& zo=9jovD%-lpe?JAF3<(z66zkq-4U(D^ko`pu9)2Pb^HcY5$x(uu5zB_2weOCp+VEb?NB% zxQ9+qA3b@pKj2b6?xSTM7;fFuFH+2WxI{V0}D)H$qoxbEEe9awSZql1!a3PO!!)luLV_gqD7;c32S)kyBD6U zocZ57@|C0sqga~H{Zk8lPx)R*US2+ujwB;qgVH?$zd3{_xJXxAON+qHT){UTuxdQV)DPJbU-)O%#9p>@aU_ zU}7-Jy~M*ii-|lVTDHm}AM|d-v$Xm?L8W-A%Ul=v!BoYPN_RCd{?6Xem-LsPe|LS5 z(N*G22vuXy=zaxC`~rO2h-bmkMg5S^1`M4aV#_OKD5_3H^lr@altLJYEfSS(aV`Gb zdat0`tek4jmCuHR;VrpY5|n^Yngv-rbqj5SvqK9KjdmodmXtC|raTZZ>4Px^jjkZ} z*c$TqFib-hm4uk{2s0NLDwL|h!LGZU!UNHCx@X2$P5UNyV7)l{`3L6Nfo0xcR(*Xd zs&Hg@890rnx_?oQ&!|z3(m-|Ll?98qAor6Xp3B7H{U3H5Q@W)J^2RSs@gGd>tu2~a z+jtfGWVWply}P;*wwOL{Kv1FR>eQ&wlE_Or@v10g?M%oyd$5JcU%jK%=J;R=6>Tqd z&hUHsa%9wh%r*)5&Ygumq)FViW%?3>zf{x;F2$o>*9kCldpGlXC7O5N$Kz{H=9k}& z(Q8D0H2xv$0-c|KWHjkJyji|!U`E%e)8wcwYtpGVI_qh>C*1w?(D;FPWF9&qJB*>v zc3U7d&LL-^-rwD~>QF(_@#m^vXR&xh>-v2U3z@Um7YkV)XZ%gs^5V*d&Xr`2)PkGp z+J}iTp8a9NSLU0XaY*Wlfd0{uX#U7-S$YY-&r<3HB;Ct|$~P!tA&M=i^P^o7ntIei@h?>-1RK&^~}QBW*g*$&Q|cNj4eiOL}=ul**mW8@sv*q zD$z&|bbr|9+jb6}XxL{Jw-x(g->C%wL&r-|MAPT9$#7+jLM8>g;Z`qu;per()XTNo zeapERFj(o(6IQ>7@}*WN_jD4w&A@d|5|@F`b1z&6_}>8Ba9OxngBy7Yrx*F!p6Goq z?pY}x3Bh0F-4y$aZ^LC*T&ol8+}-@vdpwug6<#}7+OSM*kOlQc{u+T3$_cxsHGm;b ziMO(9*Q*(yv~g+My(nqu-{vwx@w1P3dB~LL?9OUdUMA_ZmJ)?moUH$_(RX^ln3dth z?$BleL!@w;$L!7|%T~N9YH70Sd)ZC90aGo^mTGA~-D;e3^;qxHs~1X#J&W6~^6b2`c}{63bt+x1K|vCWZ^OMHfE2K(H4RU8bQR?#+AKaA5`>Y6 zTDJyM85)-Av5*Hom7Md>;K(rlF_dOE6!QL~0-44+--<0>%KJoT3z-BLhWKIj3I{5} z2_f-Sf#B$E3kds(OL4~?n@0^992$@!Wltj3XSbU3UWRLh?#QgT_|i*?lf2tEHFH-b zH5)MG5-+3}4BE?jDk|msNM2}OD9fSsQ4?1JXH8F6JCjePwN{2_lmYkjyIqwos*hyI z&Xu~@B{k|QI(LEFqbw={HW_xOzneS!F!EzV!)^`X+ON2{d7q#&y9wV(_B~e>s2@tm zAM0{?RZPZfKd4oB=udZLwS9Txvguf@xGPtFdxcj8pV-tk(C7|#3g=g%9AaBs1uw&!YQY8E=h?o-h2 zBe{%``oLCXX6US^XiekHiUXo8HgfR;rp8-#j})*$W;_zXD-0&_IKF%>x+7@cS#coo zh2&hny(u$J7BrnLo)by>OT5hVhR@?vRl zEn37oydl%Or11Y90|~!G2S((3j*4Dk?Eb~fz7+6gFUuIY%ra*j(la^rk4)HSFaDa+ zm8Zw=mtI^Nl!{kf~P5oR5z@cB}tk<~v)>CVrTVbbYN`on(7;of5RR zjbY{D9aAjZiBwcU{qIWaRl}9h_O0WxgLHIZ<6A!VYYWP&#q}60LMOBlDZ)gyf0~aZ zO5@eSlx*&srNDhR?IlJXL*dtB;MYIC2gJeU6NGjYJN3u)$!ICuTh@U}Wy9C!u}duS zLqJz6L=ZcXMWA`jb_t^_I}U`%d=iM7HJv4jeO6Qv6UyFu{AZ6(s>hZa%gc7T2VdjU zaVau)LQW6YV2r$E;KP_|$DCn%JbF;(w?ui*75JHcK2hl9?9G_OT9RQqyCbDK-JI@% zfl?XLVL!+(!h_oN5SifpdU5lkIQqYvdm;Cbc!C!+y*&GQ&h%_x5t-FZ3@A3hpQX2Y z`uJgGZB=O?_@c}?4~qzsahfkX-JXwiI?AF}0^d~?gFO_D5*U+3uv66a^%&ol@WJa%X00)U$9v?S>Lvr=u6i8~4JQF?SC3cH&A>^Rqy* z=7{51%Fc0Cv(uz*p^0SA(>72zru|-U>D2n1)B(7ZRBj9(z5TRmv5MYMRCh>)l z9B88w(UbH2bHT=p1qFp+4$vw^9+JsU^UB3u$(r1DPrmLJU#o?PJaYl5>)7#`746bU z1(fS_Y7_o*)VGq?cZH(0IsVywI4WZ~Y^Sd#+LB1*SY(ex{-)+` zze|quYUI}`_>Xth{ueUiVjd8+|f_Yf67!-6ZL;-*cKI<=LEmBP-^3t>fyg zk@n>L zgx?(B!J3cs8|l0)jX>-F0rT2Ao`f3hkoAd8gW%`O9+hof(4{peq>W6C9+D2Jr>`=> zoYtHms&pS8oloCSpF+lXC6)70;anb!<)nm9Y#$3NBP-ErR0eA_Fk7G7ZI*GY{AJnd zrM6=oLoc=?E4pUo$GmxS$yl_&K_zJ6TEi*UxaH| zzmD@As%7|COE1DJ%b(x!q%0bI?&>}p-Ev-IeDKit72*|H4D5o+$;Ra?2YhjbnC9eP zCID?CE1sQzw7_=R_V8TZC)Ym$`g`{9r+mjI|6dkeKa?TyKA8%-qU!2Xa6>W=q@m1#ib|

B*cCdwcvsQ0(Q>Q5BMe3=vXPz*loavYSH00HX|<&e z3_+}pOR`c2J1t3XB{{acaR`#%oQ^!RvpZH0rLncDccW} zqk~LCBYeOoZ2u!G99I}~d7qT#Lw&Tno4OA&Qj6Uhk-tAXL+-Cr<71(= zu@m}D^-_|~*TLI*$EN=$)pN$N<;<@AamSZj_0RQAkgV&5oAS3Bt8Y?;QIuzlVEUh> z6uPToMYL?gTnNxw@%enWT=c%zviB9X!WuPhDx?Sxt9FXxg~eOyCvAnd^GNEn{MQxV zr(Iem?qzlGj+&gTM=3)6lhL9?|F8MjO6|lU_ms=7#WFWnlr?B`*m8_8PP5?;V(81K z6FQZg)k{^;;S_OCQ>!$}-E*(230VBHxuGhd&*4^9^Wzy(6L`Tap?%F<@QSj~2W{R_>DqLq9u!Xy^s?$zIAs|x7(u7htUzt8` zTivoZ>*tI!?-i&#m+s?iamJVRRhfT{6XN`NyH84q4~gxEcG3{ncDmz9-xI?9*;91k zURdEGDVIaW=Z^Gjgm}J~n&+29Yv|=&G-pI;*DYOh#ySw#%(fO*{R>*vZ6T>f)bFx; zB3YFqFK@zTGJ7`ryzw>6eaL)M`IfysMfW)c^tO~QFSq4=?(sZM`Dfafo^#(OJV zlRh)?&dbM+x-(6lUxg9l0Chz~(5+I@bB`|@U{!4~j~HOvB4@8SUr15l@bet22&ryY zMQg4+J~vr24(YG%ts^gI(fR9b=%n^XeR=V@a^y4PBQLxkdBZ3|5MS?^B6f_>>YVs) zl~;Q3DHEw3)_YGCc5hgEkI76OlR%d}>%-uEcX{~drDi%_^le9FHQpnpyK`PR#_AsZ zv0Ex`?7~NE_O{&ajrCQc9&vDlR;cQ#xIZZ0l&5At74oYsEzzT7vIm?N`lezVSc-SL;&_p&WZ zL{0`V(%X6El#TgP%V7JqQYsv@ZJ?4w#)RiQQue+JLqm71H9q26)Y^=USX9)8o%S?(mkrAC4rP__@p3 z*nD3P)1>D_cX6@Os$auF!c`Wts#_Q#lF*2Wr5rfCb#w5tB{D3im6>4ut4n#dy$d;> zF`P4r7};U5pr znw7WU=lvf)FMP&2%y_wcw)k~*6Zv~EJ8Zt|@ygTc;7tE1>q+06mFD=jpZ9j6S$THT@t?S0Chj2>u&(68CuJB3S>ODl@ZHPA9nqe+cd~cO5y-+)u zILPK_Q6u!*i0Sg*HP-KOb(7kuO)pjvys&;RE4f*ODHKId8!IJXsi%f^Se3$TI6URT z4wX-7X%eX8td5!Krq9>1>DyS5IBbr!B&TMpzuMYfvQ;!LA!HUbBfLfwrLIKbzSuM~ zbDs;^I#JPZx4D87A9IwTNeS0}A2qYb#+>S>!;JASTwALA_j};A8UE>{BQM{S#3rxHcGO{_%vUpxscdxnHxmwl6ymIfP*C)DQDkD0LfMolD?DtC&y?ot zgX4bs%&BA`JYLB<>8y9|`_<`qdd?r(cJ_}hGGaE()8t*;H;g-lZQqXmKYrEXKgnC~ zbx-9!o)oO!ClAlQTCi>Vl=OH}Bt>fJkF+>`3_LkU~P zhbQBEZFFrAlJa~&lJdcMRA27N8sIj6sh2t7ReJc@sNJ_-m)P(6kVd>79eZAky*1lN z5tgg=2}EMK^ui-Axt~t2F?IoVKeWfD`%Q#(*I;RR*@HguW`uN{FM+0LU!bWxO5@i^ z{m8Y7BGx44tZq7ProYnqE$Ne^f04L(Z5bI#CQy+;?uqmsZ`bSkuoXUe&HuM;c+rTa zq#d^ZCk(oDa_a2sq$4l>Cpk&`uYP`0uS~2gZ)e2jJ#>Z+0b@q7Zc56~XkqRi`HJ zi_WRr>Z*NbH>_`yidA|)NOSW1yv4rWSNc6a@em~H!lzJKXS&O=sj4nZ zuF0jcW6;q>8{zH7GRau}YnQces+mf^s^p>KzisEsB}ulY<2`@D&unz_+}vKtJ{At- zeBJfcT<92Cf$h@xlTBWBZ?<#K*CQ`sWF3w_HykXc6%?u^&mW$WgNjzege!i%Q?j~J zBP-O}CBvg^>%I`dPChq3PJVGcBV6mkK5kUzGrh+t_dOPr-0N&o`oLOfs&pc*l+*`~ z)DUPlPPoIB{^B;%9Me@DBYK5eDwUm@q(w{D?2bpV7ORmB%Bw!o7khI z%<}(ii(D)feY1|cBMT-tP$(BEHN@(C;qms@QA&qeW#jT_n-`*$UwDfTMDXmW`2HM> z?l@fgByv-`1;ueygx5b9X6{zXStd9f)P>#LB5r8NPFY+uMm~o*Wm@>rK)~m9wepH& zy#6n8d^*1;R(>&^e73GNv95L^Odi+L*)C5zk4@afzKte@wzY!uoqfLB``O0(H#4F< zl^@TKluKxx`#X2LJ#Pib>9CZ%yF_i?e4SR;=q=HMtL=qMC=pv{sc>DOm^||tAGoLSK+23K=n*Vjzn{(U3nEPJM3*H}*-MFv4 z2TaT2$~vD_ucdI3hG(F!J0|0@Ej}ofP2i_eBP)ItBP%A_ZR^#Zk_7WuTt3)2tv)i& zj>?ZT$2K#R_SZ^~gnaK(fL})~FE_L2QG`VAQ`0yIp2{8FpqA@{p|A9@^;MUsGXT8a ze(S-6G!v;dU5z>0C(VEmb zUa&Exl=Llx-$nsCZx?@edDCx3QO9V(&Io4gs5uiKVl62D}FTC6ntaZQ>G{}-Awj8M7t7vC9B`# z==0xEg6Qap>+3EMmL&(2(bEy*I747|!l-Gt$JYrYd8Q}bWAWr|-}`T;O|I40$>j!7 zk42Dd?fRAPuUD7zk$pZjR0~z9b@wIj<7GdA^>~IpE>uh<3tz40_|15mK0ee#CUN9Pp+IJ# zwJ+~UML_HQNs=%<-$BbVCGg&D`=x!tFR>V>yMzFtX#r_6cB5a|oth&nk}qrRb3OuE z)X_eX1l5^|kv38^Muy*gYSjoA*gWCe+K$T}AWb{p%(HVD*pM6#Q95xj`8weqjkI8}G+;ed$ z&Jg%Px&4yT+n%kj8Y>Ax7m}|`(5$iY@^hU&dEFW^h2-L@cDZ*Y>u?a5m(k^BfHd^LuWP_|j`5FSpXQuVmm+9_t=GPSR+O)U1p-_q-I} z%}U~BqCC<#**ZBGrYNHB$pc_7t=+3BeY&L4Rp*QS7Ffi7Ihq7=VFh<%ubTejTq)31 z4}32HkS{vmrwHC?7=!SJx%N-*z_2${J^1fZPIn}?;ri6M&x zD2%D-A@f`#D~t)=&Wt_XdHe6?;pmH#qiM&1hc_LM@=MNLx}p%QOh3#oH7=f-Q0AY|063BLz>F-<%gL$i&Z7)$ou0c z&E4>%5gnC8^u^}w1-HsgdJ+^)m}o1D7iO<_WGT)NcmYKoVonyfpF!0$s1u-`{|Qd} z{;oOg!j7AE`z+#e)2cGm39c(?XvrWBuZH9ZO*R;7aNRfB*EB{9=Q7{8amqWCg+r)Q zBP;j$P9rZINv_)RXyyd^Lu;_axnGrT^*qZgd*CMO?{^s=#V{m zRUUuI&z#FCuIa;-3xu*w4`&J8UY^ z!(`vznLiaNo8q*R8w*0o)A?Cktiy2xW}`AqBhB);XE4c`uc(e9jGv zFk`P9!l9%ZA9{q@$c#>?=(3Y*S|^smFp^r-@i1S#M;@i@1#YQ@5&-mqZ6B|r+L9s<<^G({cJ7rfo)K*Lk zQ*T5JXQLa_2)u`#L37I9pCI<||Qv`LzsRo_NNPAtNjD&JT@JVM1Z? z17n%%Grr!Yy7b=UHcUvH)aq~g2^u3SgPg~x(oZ{W!s#TT9Af8UW`{eQ5J{>E+u}R9(c69BQJ|AR6=)mPk5XWwFHX=hrUM7vc?j# zxg#sHD#hPz>#Wz8U27eFIMZ=#(QyBsUd(tzH=B9pO!a8o=j9`vuyHt0m*9uZb>*vz zvqxlZhqIH3+iTNeV!TF^G_vIQbV5T%qnMrPL5`kVvv98d{yZUesPDvd-|mHfPyGGz zO@cx0nV%`a)>W~onpc`-2<&ISfm2UAico@CuMzPTF=ev_%a;y_3TFbY`4$@Fp0TP~RjLWV?8xyUs zEqe%DQkovowU^$r8du|?def_U8Obv)Fy09>)&nVHn&GLh(MDZ=2|V{MXRpS zcWfT)H-7Ubeg z6_i_HQ3f>-N+T~drJ+yo+xGy5br*JL7x;fCSL2!?{t{}V6|)y@aY)uz6f)IxJkT>#7F)oC0f%3s^ zV!|L~5A1(ov)R->A2;@IrS&uQu&}|FFB!)5?%WnBYaClq>$Vg1-1P;FU0!=yTf3_L&|O)X zCaClp+|>G=T*bMO+(R+2G^1}2-M@E88kTs`CpswEQV!{k*ZqkhA~R!Li7)Jcs>^pH zRayz=LA0WYMcTF?1q()S(ZT5^p}&EQdnH1}8jesCk7LdwD+!gdRu&=CreO#Va*Ei3C;>2&cGNvveJjNdm{htQ6e0pQHHd)kWPc<= zppF6DL-u~wgU7xON~39TjZETxbTJMNYS<$yG94yOQ2OA7hJ=ljL1-d0O85)yh~mv8 zg^OA6RH4QeK~L{bdDI(c__un%(n03tpngg0S!5^3PNV(Y_Bt(Jl4lR;9^JkSKC(U@ zyM5hYymGoWK;w}#o_8UNN=v5UH6pfxunv<)gN0N|*-jD0U=t6)KGM&(ePYeT9B!1i zj&`fk!s%_$zOHQ+H^(_E?6yT@;CRL7s6ldGl;w50Ea>^r z50B@+yQZEek>g%!6(90A@K-Q@5u|gfW-$ec%%mx3IrSjimt=@?IHixPri^CYuDl9UgfrY{`1jgW?m6k0FQTO~$cF;h* z6cI&t1V<66_dX+*Ndv=Luvt9_W-nG-4_Eww0Y^P?x0pF|a7r?dXyEdz?ixanhKi_P+TSq?BiJVxr{o8ZxDRumuF7fw-RN7# zz8v|wu;s06QNH0z2CJ<_l^jRo<*+rJWIY~<2$-7v z{>>nLS95m&DMIMdKq}$;3FS@Jq zJeS6)EM)MljqzqxZOe{8ZOwz_Q9fz1K93DJ**b`+f z5K>MtV8pJ=mG|JMVr_g{EEP`1A3+msiAZorOwX`;LuSFcd2>SNhudfz;ymTT5rI>> zT&JgYa8(XS@8E|;jwId%onnmZ6RA)36j1P zv_<>>izG1^J7pAM?z9;6Z#p;LPBF%YL2Q|zV1O5)Up=*w+i(eB(r7n85@|4nCgo~& z!XeJ*^uj?=w9Ik1$&iX7o|sW`g<&i$Z4-iK7PMOK>qY4~rdX*WDJA22nO&9;{ymf* zIK_0;n4p$uWnSJ4QQ57#uEV%yqzH_jXnBGm2zSPy?;_v~Id@ki;mY0fv8UOjq#Y-( zf5UzVPXkS5nES!WPgKMb-FH3JwL!b2KC6|OWZXkrH~?K~N#K%`TdhV|1ur0rZxq@HzErmM?d z-JZGMQWA;;_E83@(CXB7NOD=I2RfXaEN4jNXSd zb{dMIc$&>3w>Y}hU}}asG>p!}k8x4~upV){)V~h(!fhm6xMvlfnL|!kghTqR&>3(| zu=pgs6wp<$cTuk00scxh(KMbpld-xk+Ipr2Hk|7Y ztBJ_&>gFBfa0nMO<&OBa$4^zpilyd?RTT79GA)x_mc$QM7yAWvZ~eye3VXXJfGH@Z?Ie zEi~M19P_E55+g6r&mRA(A#AW9!{Fr_;HkvXR~XcuJDZEqPqPz-V6V`9zF&gYpcVR0+uQx@FufqF`2f&BU`8715{Z-+ z#v-%&zq$S+1GM8=R7vX96i@ScWbn(Jl<%3bSH;bPyZz$&nDnB=!+_`#9o!w7`#ye8 zF*wzpyweZEu4OsVh=cx{+)#2S=KH@s?89vuY;-^sYCtC#0<9VUU+ahZPx3!%hRG8C zAIVCn&ZRoPWT<}kcC3^o=>E{Eg|m3lKe6CP3_LgPPtYiz^#ZXM(GgeC&H}zuq#YK~ z_G!#p=R$=*GXY=5;AqHA85c3ato`J--M)R6$UMq&{_DIgQ2syGtNX9_GFxbZ-!E_3 zd?-!DoOa@$qvP=P5 z?c6#4IKqAS_=3J0>+%J6pSdz}+8Oh@*Gb=@!HLzhw6wwNw0h=XX0Z6*FH?cb~a!5Rs6Ok*tkv&tJFM>(S|tkElJK zO}I(J8)f^bd{3Nx?OANG5fixM4=t<~K~Ru^5G9(4L0FzB^grVN9O~^n{qgQN`1nFX zjC=jxn<}xo(tBc22M8Z~2dV-0L@m}*b*`UG;BNb0>IL*%MhwjbVlsclz(c{I1J#E9 z<(qo+d7;^3;o*5pTZ#v=yIvLVavSZaEc{78o*l)B#n0B&6P;GmebC9e{HqE79G(yLq`o*6mSFZmzOjF(ap|2;t>3#QFq$92d}0js59+ z*~Bd)g>se6tlVZzsE^A|=Y%6K=tDZUOeBCcv2X${uxR{xx;pzjJR;GJAVM$mH(yJO zf2K1>$1#!3{(Jq}yAMKS$mo5O)!XcqCYMC7%hBa$tb_V^zauYpvD9`s`=RpcjDL=T ze+a^lyH>kDbiHYQ*{_N5mMqMEkuYo2;9Kk21IvEzlgEKl@wV@#6xXK7*<7qbu#L6{ z#pj=w$?5R)19LY@H(ph3lwOVBCYrVF;SxHYP>3@&s6{!hTFIj>2=HHD_hZo!CfJNY zHU+MKo3{1WLSOFglQx{D?8cj6(R4Kxr4&`fA$cK2Qv0UehgAQ3NzI0(?eu@T)({pZmSI;zZff z!^`b@ju3PwABuTgyF!h&Q4GP+Ouc`<<=ygsU-JcjiFn5RyVN=60$y+Uyblw^$y0U$ zUv*Xp{>|P$Y+ng1oW$_)Gl!?x24=K?Vy~b*=4y@jKdYo*Y*59^>B_~IBP+S4;k)R& zny+-;sgu3918e^e=HG{B&G<*L{a;dwLYSm_HCHbpWfDbiW5HTGQIn~LaG^_&JH&4E zYCg}gXY?3!n{)gb)lOrF{VS(kvoiPz@a*=By#(Z6(vA~iZ#YHlbgKS(BltXvWNS}; zFEIOlagMZt93%Q|=d}@++^ysM-`x1`yb&1v(JeZG*6AYK{VKjE*s@YzhmI~rz*vcQ z%PA#uQUoD;LIl2dBQJjix9YZ4Ugot-ANzkAsxOfRkD~c$=9zSl7!%A^9pTKxaChF) zYR<7VdU0J7>jjy6$!d665?qNp%V2*>@{8i-=@*bqBv_l0eB%NmFNHKY zR!=WW&holN(_afeerCo#1D9>hbF^a~%nKtDR=OiE^hOC5vn(zwYZFp=S6+HtwoZ`t@;=2AUiZ46r8EoQI5u4D z?xifqpUX{@r8%mK(;D)ZVy;a{X$Vn529)~pfz4KXsVf|zyTfU1_(*niPVQ)~iW}yf z*vvgjnU2oh@aI#DiP(S5JaD1*Ia3qR@W)9V>&jtI86U%UzxJ{7R;)s!)yrjewNuET z?tS&wW7EooN*bW{#dmW&qV0WTaw{<9 zVI~_mSzT%!_%nRfF?&1{mxS%M0-6P^+{|E(`SI;J##UFGzV7Utddk$jDjZpJWy?!p zh(L{p9X>oWsOi2VD{JhZ=!UdVur1Rmb7_ncB%bb1#Xk3yJ{-nH0%_0>Uax)&vN4ILy z+6SA36&kn7_VdJJP~5y^oSOK3#&tEu&FrY7(QPh~(juSRq`@m~FR|s$KJFhvG;~kA z#V6H0pCykU*DZXV{C1{b?Pj2H3ziP{;+BwFPL%NsN7Vn0F|gNB3lYA(aCMB$anp?9 z=FuC=>0&CkRn&{r{5;Tun?r(Rm5GNz+1`7J>3$Y)e$p13TKB}8Du^M+ik*{tOY@4c z#W1){ntF^soUw~>9u8v<;dzE_1ahEcYnW!VLK;YL>i#X`C8j!~3ze{;2ezxV&=i2I zln_2VyGYqg*emPUu3mD=%34cPA{V&tsuab`Zle?#uu?@H&OZ8U@=h91sT0|!`(5Tk z$%2T6J~Vbd$d4DU(+7xd|A(_xLr3WnOZ5@z%Q|$bx!?Ek99Djt z-2Uo0H&cn9SdEqa1{QO4WyeqH^Xk_JqPk})>y7Zm%wdLrW^JD8&Afa#c|Ef>eskEz zdkFLSr_Byb!2up^l8i8&;N8Cm2SGY{_ce16O^&fP#Qa#sW5NBqAGsOt!YY9m$yMvQv$o=hx2G*uY>s`&k1R3_Zfr zPxbRPy~8oeW}Nuwos~<;yP2m&e-r#!yuz}DlD2cVJQf_g9x56h9HEAwH+n7Ru5Ht# zfpyTNVU9$Oo8uK%Ks@xnqaRE)^J4druI6lfZerCqvPEV!{d>e%hjXujXOqLve#TlEQHEh85vlZxN{|^ZJ;?hNt%8{+QJ8hJo z{XHF?TJ}upzvYn@S}n*=_AaK?K78lN|D6r|jl5MVsQ& zOBl8ePfe^tQZ{YPzmFfQNX%KzwDe3(?^9N^LynIMKK=R$`|-8iz9U-E75|=&i+vh+)|91 z`u~nRe7}}Cg=LQi`0C;EmdJ@oagCZb=2C782NG^J0a>xc?l>YXOyzZDuyZ61rs8p% z<*p*Ey2==JZ}kzFiqHTu9GyFvFw%<-8wZ>EDxJiXvR6m$x<@#ftqui?8E%xYD@quPl1l zob~`bNS7oT48jR?_?@X5*5!OPAg|WpP>yy@R#P4Wl}z-&jmyILK<+@>?6#pLNYWF=nh+r69i%txI;(q9nd@f5AA zbswkOYb7;#d3p4~h+AE;_nasxM2oM}+JYeJ=k0u8wU8u;UX=%;Bo3Q)8oI4-WvHMW^#7bj!e^lo&1vRP? zg3>s-O(94j|7{!^Iz$)Orcbn(J#k)WpYVC}Q3Wj1STdH7}M9BNMMLvC) zXHV%p%(Zf*JC_3+=i%iCKiN&ry=*3AUheTcN$C&m*UMe=NW0e2>iZXU9*#yPt{yAX zM|W=(_%=*7v!rf&(Z5V9Zf1}}ggcJ#>x6fm>L0QsYHlNF`DP^9u;{shNx|iQy$rKo zjIc(oK*-9lUK zc-NbMICDN_JSaXOo;)8r?}5(q-E3twm}lJh?e&JjMO)Xu&7YJLh2JQd9wEznZUURj zYSdf-tzL3dA=9RlwUI8JuKP0h#g+Ld0U1z%@~~g5{66o0;KR%2pU7r@6ILJF@yth` zY{rl*Z$VS#B?K?%Uxso))AxMi2DMbH<#cYaiBy=^$>2VB^2D6%?SzFtIDxl9r!Ztf-DUbjsm2z0|_lWFWWO==rm`v&y?(!VF{V=iyn8u&%nC%68WX ztuU_Y9;84j1uPlh;Ja?k&tHsl)7M`MdA^1}W6Q-*>x1c@*Lvb|E$p|XMD?ngnm6k= zK2`6!x9F>N^`q3rJ7s10>bI`V;(8iv)+OmemhqTUc+*ziM!e6vBsa|)&qHs&QPfYiJViH5o}n zwULRIeS5~!T(RHDgRB+79{#-V%4~D(8sx{4_xO5r#~0`4#kUpfh-mX2yH}RP*mb@$ z^7rz2nxea%wxdIP^&>BC@x5wXAXF$_bNNZplbc+89n6-sW@|ylPIGd?`eOVoxGtM& z<~47O0w|^{YJMSK3v;ok>sAwiC$9{1*I}~TpJN>^+NcG1Z6cw4Ze4Ua+aned{^rUloUOC9}8p67rHa zM8xfTCUw)iZ|Akk`sdTaue;)!?diNZShyVL$+Hs1-c{bSzk=hOSsw0gcXI!@?Ck~~ z4#V@sk;L00F9^JPu~*{ogSQ7twZw>ZHV{Fhr`1zswVsRRvAiz~bexpi`x(r?!W_nH z##^V8>wgFFG-lk;LuGLlx?cF}mokTe!v{pm%epU^LO;9hc=_qLgKJn;q3yd?S=bq( zqPr#Aoe>G>hdiR3lO>$AR!f>Ouazow)H1EGVa?o5)eE)0TIxBX`W6w4B`K?&#(W;$ zFvYy%`${Rr?M~G2xZJD+!+gF3wQ}38d~(H2ni0A4?|4#U<0GAGo93zQt%&D%_v_-r z1g1RD+aE~t-&ox|If;Hi2TuKc{~33@)811LZ5>?5cR?qbIJVe?GOx$zNwF>PIUgQ1 z9T|1h<&JgtmxvkoLk9S?pX(NohrAs+|%!Ga?%Xb_3^ zH>>f%A024*>^V$=2xX=Oi^N~h_vfa)vX(E)3!#Q|60Z?LVpHbFJNLWS#x@}=cO;If z_YxMp%mi_}_UU6pknP@NnPYF3yCPp_Gxd7QKz&=*Xz1<79;d>7w5hK(#BOzVBjb2H z)gAPMR|R_6UfNNg0X~*^G*?ZdkP>4?m^LWW2f?EHZ*Vhe_}idDuvXGleU_V33%2&C z&(gdjFU##ju3fw1CgjMA+sZRRx=0+}?y7embGo8y5XJXb2^Bc7&_QW@5KU$Ne}_KL z^YZhbZ(-r|?>Hli9%z4@U+Fm6@iJjr;CR8p`0I6Fk4(N_sh+%L7^p*~x_sUp(tv4B zmsC7s6v>i6kc^)rD|m(kPQ-X3>wJ7c<#qYS9NMpOUiPhrAW43{JM8nuF&6vy_{wwo zd$`)%Ez_Nb`SYxKm*Xy;`#U~g>*4%k&E;VxKWVCSR(?z)D__2*wC1+CS@@p*!?*mj zcm5`nBQF~NpYHvPME{m(KbTL_Zzs|vzi35&UP+dJv_DA1YxA%5hAdO|zs^etpk#l+ zftjg4TLM7Tk0$u0zRfKyvJ3!jJ0mX}fSK=cLa~2vSMQUv)1R)qP6rS5t|$5{__tve zgBwXxP{GZ#ECwb-YM6iy#fUVOOO=9K+d>4MSG5`i;r=?CV-z&1S*Rbu z|C27hvzTilsj;BLQ2aZ$x|3jPBP+Uk-=7mhHn0KMd zIid&WK=_9z>;UCJ8o!`5CfmZ2nFwnMRG&_^&v;||cVCu0yRBUkh-*w|*^@Y5DjlS# z?FR#`6lSBnO(=LMg&c}zjGP@bkqKXVkg?3@xG*La*jSAOH5>mfddBFFf04+fIeW^k zSFzAbi+ya2d^^7?o7d_zhsxf=zWt6Kfv-F@Q-a9mDD-G zBP+#Fy5PD^JId>>gbaY-dP(10BP+){x8JLVadyK|O30D~AVvfjp#~w}OGQFOBxEI1 z)gvp|p~-+l*cS0P@1gc*9udYX`(Z z`HwV$BvLA7G@kC=jt!F&5~`AmqE~az4!^6iNsy9O zSKd9jSAFf(Q3-z$8>4sUgJ8iuQ)d_$w-x#PzMu-neg zujr*IpvWNLu%d_{f;Hzvk|7Cz``hjFW-l-X=RVQee&$RvLS^CGV5+%c$DG47h&VcE z2{>$nkm!Va7+Y~B^UHjQ>L$6ju2+Y456a(fyIoKX8MavgtVAAOXh5# zgp*M&RFs1NhMVEpuA>e~NVgwA?vSJ+WJmF(mLIgj;~H`+ls5cP2t|+&^BQ3&FNPT7 zMP)4`FV7b}tQ?U%icn}!f%LqYlOT53KdOV>o`m3`kn)vB~(l&Gq}My zNMwFdGEXBbRVm&EoFHkjMmP=w1F?IgnNGR9?cckpyTWA+ohcMan?kmZ6mCuVPS*y4Kcj)g-(1U*ay)O=5e%hdhH>RXzXx_-uH zQld|)IfuOI->7AL~)~KDVdqcFwd%Q8M z$#9~J@7pb@4ADlm_aiGebf(kbaNcQn<}EEHx?87=%jM)&u6yN2h4mKX_*GR^JQc`v z_m@KZS}mFCG=`p|Ki4Jf`ww=#$DzNxJP-XIK{iA$c#s@}{aki!=4EgWcYrz{ zy!KYepvPiK5jxyA+&Q>(JpKisS0Pb(z*FdLmVpCd7uA94)ND9K$bS-m?ezTh>MiHJ zS-o2V-RB>e;k`RxwFK&b$e|&CTlmt;M7R__V~0J`??)IyOO|6XW(&VZ zeU+pG>ySto*Ib$dF~JN0x6H|FwD&Jb2=4kIyp!<1;jKM)JU(wY*gddhs;}Y;RyDW9 zZC3S#C^jO9Mj{2XQW{1OvExVwixj!uc%j8Hok896mHSR}h~VJ3OfCR}0C;4;4j{#t zt&0wmt-Zl>r0xzmPc`PR8+1pLH2HIT+eT z5BQJc)&~zZCeOfUN zROfV@`oNv#9YALWMI1+yoBBQ6fcx3(;#=fC?86YSRetx$OFhsb855YRmu|Ksg|O{9 zpUuuY0!?tuz?6f=ro%`;U8OgHs1sA)6;rPxv}PkK)v`fOKOV`%1oS56;&`0B8Kh$0 zHi^UiH*fN*ReI}k1Diz5JgEmF?%5oBx@8M+gAq$5-TnL%ruhYpwD4;a6QiMe+3?Cg zVH6I?aFvEpRlsV$a|JxPDd48wa4j@5`Ab@;lbt2V3?e;1;;I%MYU=YJk^)S0=F$YK0Z2D+HQ)L8?- z@iUb3vRFX%EeG|D83=8f4$>pLv${_2g)O@SIyrNA`LSXdFgCSp9%iA>Bj$JulTTq| z+qCL~=BvonJWZdeHgXYp_Z3Y^Z(m_YwEM5o*%+x9M4rEOq$&OZ-xxAK%bG*)g5H05 z?Rw8~+8NL9sb*B&kKr~=FDJeBgk$pSU|Tr@{eKC;kWX+KBQM{)Bt}9>BQKDz=2n8mvbr5U!(e_i`@;W8fU8JAD4?WDqL_6$_wRRy9FY#- zj5Vnm|{@iWG00{0<+e>$rTMW>zCFzYnMJ=8(aa z3%Dy05v0?!lEUvV< zl6wQ{iB64~0im48QhyimO{Z+(oQH{4aqqTP2uA5;1^4Ledg6PtmB6 zTQKAZ$$`4!YAusA&M>oZk8J{sUw#8U|4LuxE{I~xCnC7#BQJ~*q@lH^hXsU*fH9Cb zO;^|t(gE$u$8+64kZ|mBwjw%=&Z$LU24Zg!oEw-Uk#NpNue^rcX5lR&t_DXvFg2@1 zEa1alu;n7atx0x$B{X!nHw<$CQqS-r|Q5VnfK+H7#tA1O(vz< z1x6697RSrteR*i&cX3nMC4$gxcfn{6)PpJLZQkbkco%$W=e#=b7fDcvD1*FR`NcMx z2t!EkN%2)PADfjXp1s|J>q%ryr0EDk6jedCj$06=A%;`XJi3G@_D)0IeDyIsrw&oiKxj5Ad#||1Z!u$|UcDNV>E+1R z?Rp4qn^9tPkpjR(TrxL6izIhQk`RmLE8DLFkTmRs>NdeH5pJ!N8iw*ro5pOABN2oc zfx#m$iDMTq^6lyQ-(cJ190HEaY6&6L^Xs^-W=w~ZeEq$d9^xY_;V^_Mb@pY-UJ!^v zI5cw*6+yL~+Ms*c??0RBK8rr1+XEmVFl7)UFIrI(5+7m_xsw=cTxBQomtg68PUkMN z{pCNGgUh>?*n#H^i|k8+7FY$NQ5SF?@OchIvCWy!wJG`$Izw&%&!-8nT7 zh&xrLfg{8M06|8MVeWEMz7*j*0k*?7as{XsdqO3NpbX9{%d-QqbSQfc!f7pXspvjC zHk|{q9&6en4u-Ld>=U{|8J8|BeR{Qz1C=D8LptDaj_!UjEMU?3!SN;P;Sul?H3(=x zZ?k~kRzgRpz~G1QrHX3O!{P4C1sV2)Hl@xOuBDVrXuYZQSAG4O3pw)+q;icK7 zE}Tos-c{Lj4ufgY!PbTYhg#_0v6CY&z)V?Uj<5!vEbKGUXLuQU8p$G;u@ z+DB`zt^mj~NZVnaS(R5$fb{>WKkI%0duf|@;QmvGsv0L9;<#cTLo;xAQMXN zBP(qbgf1Z>smn>o2JM>aO0C`PgSuUq1Fe+HtR?i}z8n*NB1>VmX7~{|d>WhP^Q7%e zjIQ|fp?z7ahb#%^PK|-}N5vpP-Y}^ok|Esy)<8&D4_zEfuFs!`%yJBTKS}EHXz@LN zxIlscfhq?z(*U|kf_OYV9U7G{axAZ%9lJF`%h$%@2%CMc)N1&zoC!f~#YNHHj zvF+^-FH^is8N?<;Ze$5iBQL|D+a17JIcr9RazC*1D04^OCL=3xtA&7k1Sn`#@zgJI z`{mT_B2br*{YEOe86E=(-}^jK9=oTq2fn|XuB~)7^Bf+Ki>$;WD}pdU?eX#(!0i6Vu7hY=$$QURr<`QBc$ zngcGIYH9|#B#DUrPm}m&DqCG29{8bfZgrY(C!P|$;7x|9m?Kx;_bVjS9 z$R0g^Iq7aouY1#SRCoK2qab-a*r& z)M*@$^kz}S4^QDuT0J>d5TR+&&MOc4*IKzY(U8K84 znxce}gi_gRz~A`V_TZ(=kYCoUuXwgeh@gY!dymonj($P*pC5>zrMs|^HY@m1!1NJr zu%B}5Oi>Kb$cg0#x#dtD3|1Wg*@0pP`>xcPE^ubyY{-u`SbA-{(}Nuv#gIJ zE1kLJ3^T-vd!h^=kFFndBttMhmD|Xv+Z4*F3e`X~h zLs-Z>5etQ{3k4Y#Lc?l_t445`zrxs;vs#{XhKpd@ z$ePhgt7k!=-jU2tsyL(`M4CA84B2p-n-pnoJc+}2>j?Duq4{o(~*)fxSq+4B;5 z)E?mOAqjQzpClDupM9c;&EejYkADz`mag@pPu^@wNeKvPIy0N@N$EqQpz^|HCu?WDvubR>#m(Ic_Fm#nb12!i@?vZ2cKy+i@~D< z%3@$PSamYznuGWWkeTDAm#T!)LKYObaE0iR{U$;$whos6?|)?65@v$Wb+}<*i0GiH z=4n|_H${GUG4g-8*Ix8!r{r9BIe+o zYf-dap9sc(%NT(B24`+wZo5bHLrPyvYdA#6=IHYII8K&AxJDj#G$`Si^F^=1kn_1w z9$8LLNWW7eqYfp2-)~`V&MUD%{PCwptasMEr+jMBu0id2Ksayt=^yd5k~(UK(KFbG zo04B5wsOUADx1O=s`Gav(R7O+<<7X7tvXmXgPs*ZbjtBEOO})0Lj;tGf4OT%UzW*av^$OHFYl$)!2+gpU<22 zOWfP1S+9>fH}oT>FPDa%5O%+FpKXPDu&E0pFI<_ms3s#TXlN;^EGvyq7awHnol|E{ zVKubAASg${OKy*Y{~hZ#32~`E!lfh10~ccNZwJaIRh8MwTe`5N2_s^5Ly3o2tgMWo z5*c&j6r#g@l6YqBfm#mkos)5L>#~2(U&fB!Vz|^7xS)#uPeIwv4zoVcrqg|y7$Z5&px-G*`^HgjhxfFQ`VxGn8>%(ZW_q#8b5c z(ZH<<43bUVA2(dh7b9Iv)uu?lz8&YPTGIqj7ucN%2IfzqP-(=BN4!#N&~7-}0}nf~ zDzjABRgDWQ-GgG*d+bsG!z?hfPvq`6DK%>53n~gJWl-({*U+*Ja=G zR z^VoKGMFWiTOxaI^Gw-AJBP*RDkEb6=k<&9($;cyg-amGt0eU2?uy({lK>>3b=@{oa z&EN+~)Z};F#3%KNSFMw7Shmuo_2ciZgwt!^7&77>;O;xY9GZlm(ITR9qq-T#B8uLAide=8tW3-SkGa9t zLL27%9AFHO8yS$27+<-2U$?54mXjbca(Jcp`!}DXTYh|peXYQ6r-Ya5Y6rCbgE=Cz zs;Wq9+ZCwDCSu>5kxOtxmzbL* zgbo`R!0S)WZ=u-&MbvALKt4oL-=iZy^@lcu$P?CiNa0e``am>&5$w5FBkfM;z3uwc-W0H~v zD*;=OI5;gT?%FQ>M<#}=1Ghx7z8~4Wl@CSEkzWvq`#v)oMZy-=bE2&#MYG6j zI|Ch3Oh*9FNo3`xdP<`YGm!^VmKb-3BFB_%v%lCqydp6jV@hX<=6)k9HW$md(X5_x zW@VnBq_WnUF|=B3u>F%Y$vXKezQiRH^ShjtoAYe;jRRz(DqtVF5h}*}`&R z+IndB6|;dP1_K@7LP=%B%HEFX!LUQ{bqUOL#U|<1(AAXqTf2k^5iTSX0B!< zE0hidLdoO(v%Km*drX>#7YrMkp~K*C%Sbtq%~>NW2}MGq;boT8B}SzYD0AFjsXijZ;e$nydllChYUC)H!H1X|fv_45$9t7%JlFvk8y)V= z=?F?DYmiqnwNFy)wUI!E-FI75rZ53jZsEOQ6d7d8rz1@7bxg?vLydQhCiMAP~ zt+!}5Gtu4Mtm=^Pf#Q2p=?&Z zaYNIR9NnH810#ptS;6LHbPhx{40_$Jk;C=QT+)9JO-@NDrxq$Vme`9Hj1fz(>`d zECS$wWP;Id*ir8AK%AH!W{D*uD+otW>K?7bbp#=HZr~mTiHxO2!1DW~zV05eP*gi^ zjM(Ukf|a8aa7BP&Mg+K?bk&I7QIBP-@4l1QEgrG~n*#)_hF zW%ii|nYt#MQW8S_YM)3_GQQg6_}6*KBP-E(UI`_EYt6v)WAi)0lPMV$%^rajBx(}M zJW6*W34?U*O9I&8BP$wB7uaDj1CKO@PL53A_9Y$w}zB&jka%*?Dd>hV+gX!H|H11=rVjB2h2SCq2l$ z$qD|jCm?55)vxCK=}XKb3^aGOp=OlvU=`=#in&)|?BK)bA9vj*CsIeL+^Tb#>`W<% zPS$g{6w4IU2S5&ULt&u7W10!TTZsuTrJ>`dw;DrZVD7tb zh)Wlvc2U6=Of>BD6N57$+2AsL-<~KkjYJVXuK9PtP42I+U)NsGk7??n4xwzpk(kvt z8~SDrW8%7TNRKU(?OKdR%Pp%WM#CYCO{K($hO0wfhUPM6i(D-NBF-mtQvsmi$ZQfx z2|*hU=d^wVv{G+D;j-L0*Plkf_XuX$DN&#|B>K#gv6wd7X;|%>@`v43MSPL4&@Ob& zhDp){=#*1$k-DZr2E??4VIvjY!G0tmJMMRrsz}F$!X8VLK(ccrAvLpB0s01y6n7&p z+JVisUzfNxG*_5SkPbvUg34F>{f@(*BQNaT)3ns7TO8C6BVg323pF4CvQr>7lb>LQ zgdw(Eu5R)Wqze{`k(qMM{_ADqd~uE@WJtCcx#4E^Bjmn@y)pqoOq$ z4v$}=JdU8i(2#bVjC1yax$e9poj7TnNSq>WyoY^bI<8%Xq2F%# z2wzC2I4q8k6C*DffnjVd4xRja2>B4~j08%8w45zY{g8xuTB!1bC*~tk41mv}s;wl} zjO^Z|Lj(Rx`iJ}fx)J|p{e7KMu&$4FpD(!JgHU^bJ6|#*E7XWBL^;oWqjH3#ktAUW zBS1f@A{H!j_u}=ybSJd)7$S!_8m;(t6@4#puwszoC&MGmc1sm=Yo9+X1d!gFIHT2d}OeFHiiTl&_rR!q+23Uv^{5*s(vTPn#5Mz5Ig_E1VO!YMhQC5^n2Dyg zd5PrHl0tPF{TD8UP~LUJMJF05*)Bj!F`}T2JE9OL9IQ1Nk*xz#S#-_`F)<9%1>TV| zLW`t7;fkd$o(E)mugZ8|+wmhS2)KtME3#}o7ib*fQ4XR=iA|@>7PK1Yq~J@%cTYTU zij_95jJ{Wt-^_UTCdO>YgnyoNxL z*PW2QkG@2-kbT1|Y^;q7k(hp=kn;eCx_pnvdPmNK{&WxXt1$sf^;2z% zL1d{uJ551W9CS&kh+SwbsjP;&yXS^0wIeT*ED5+3Ks{H@I~rKE;{{6HBI zSbHAAdUXrz!m_qv6@)wpEdMdm_fkwk^&l#ol7j))@%j`e*}vw%<~_uO0fdD#2Tz3g zXBy8-r2s<+gBX5n37?kxvj@PUsHKn#R$FDXwwBv!iYv|dxB#e=Wq@t1(QsOtaD=r{#JdR`|FB^Gz>}vkmAcI&} z(lL{}EkD_3kFgRD+*9J@hWP`vp`>i;BQL~CAnsriDI-f0mKF~=O&3@KyaN>C@8LsY z$y_Pxxo)pk%XLg2p9YOUE8b|;J>0E(`JEqjG5rzFGrkPOykz~EB!s6B){m$1?Bl2B zh9k$sOI%DgS-W$0BP+L#MUm@Dyl}*jR+YBt|Ap)>inOTS!Okp8&)f5qfl(DZ8L2% zDl2M%l~mhhrm~H-O|7!pvntf{oZZB)e31^Fx2g*!fqIlR5hN6m5Q2<~BfCd0pTK-# z4j>08hGE3B_3}}M%#-OiV;?F|K?W}x;>s9Al9*^7l|};(dB#BbI*i=n zgCH7EdY)`}FCaOA$Xk9SOQ!CYxlya%E?P{(Xv9)#G?Z=aZMTckW$;`V1JI45iMUPB zR3H$L85B%FdC^eNyKkY><163ZcXsIiFOsfM4*=YeY*$L29Ttlq2zs;>Fr?IaXZgFg zeBUSK`2T14f3r{;BAg<4dME|vH%MF4bqUKuoKdVXJ-19?0qsM*=aGzrBY;?LH3!cl zD^MiwGUS`(a__bvX9p;T`3UGBhM0taAE2P6B!q>Kr5~ z!dD|JHe?fzzFS*gW@majSrI}=vb$7B2_z)mWS#&zq}4i6=}*BBz6^~)9r%>@B6w*- zQNY|&9T=v%8RyrlpzF|b@jK>%u~}-Y54qNJJQ7}s?7wdwefjOs=~yh=;Hn4u!~l>( ze$QyKA=^kH$`$P0?BMaz9?OBg?k30{2FEgmP(!O`{6@CLuydC&xo&YYE_e9n4oJVn zY2hdMZ!=TEL_xwGLX9@A3p>d1r*S2h192lO8BEDF(KZBtWKO|8$Ccm`qH>+>Sp{NS!&uQCbS zwSm|e`CI1ZT*)LsDl7;>P)`B_i8|=NaC|o3O^G%!SKEzuS6$Tv?yiYaQCTx%Epoa@ zZG6G6i8=DhCZHg70FKnQDC#~g{~2DKa=uzotS(tcp)uOidEy|L^D|D@^ZgfW;sb?& zqcdbAzM}PsM*=5v9`$fC&y#wobS5T&fcG`5#Yj-&28DVdG+5Ek)?vx^Ab>tU2aaoW z^7qaj)D95ccV54Hvqoxb8=Qd1c-wiWT@I#pB>ZRdqh+^DTFPs&^e1GSqe^IK zJo-BjQec=L(CHeABg?c*=HeKX*d^F{Nlm_E7{w|!8P5~5jNT&TT20F1PU+V?4swF^ zKb*fz#!aRpE6lNJ2G~lil%OTYwb*0($CjwBQ4rJW?SO`-5>RuzB?7k&2)0^)`O5+x zTZiBEw#}`O=^-tXrNui#Di;3R7{?D{A&5=FIhQ*fo&EC3SvSGcak<|u#Dj*|E~CW< zr?Zxvr0o%O2fHg}!+qBH!|cY0PFPL$*NinHR9S+BZXsU`^o*2S2rSD z1b~bk(1j;8e0#QKio$G`oDxYQ496E`@8$T-up}{6he@TtMhjrrQWA#pbuN&lfi+M{ zTLj!2C`NR2Z?XPZ9c&wJ+AGs7^lWG85NWk2wo&EI=4q!k(!!U0C?hMhlWVMsG{JWeeYo~% z`1w{fsYUy`*zqKsR8^?IB`)a@*2hgkomR@)OOencEB0qA@AFD4reo;$H!JcvGYCu^ zy5L;PLtdxCBQLFFbm>7I7FIDW%FcY!R$xzQCi4)IH5NfxwqsEyXA3x+l4=AdY$>PS z^2RH~`p9Dr6+L>}XRnZ3ZI|0ubx?rp!@j_GNzKgHr$Q5M3E7ndl-rT5$C$1VlR#fa zXzsrE3|H}ay`0Js6IJ@MY!DY11S2b1HB;PR*8?`CpW{X(F)j|lxwJi6JEo~rYV@m{ zMM}mg0aIe`Q*|BO$+tGH(>BN~i!7muLF{d9Fah<`1461%1&9z6p=N}4GZ--;7!U-2 zM`6-)iILI6H8KxoT0BiQiEl@++{EN)(_q}uK@vy=B0?#=gP2$d&~8p;6MP7q?EUL0 z%cy83;(t6)O$@t9HPEOxU%%lx+~?w9m|C|Pj+b)PvPy!4WGYD{l1xhjX8G-iXzvmj zIX+rDJDY|cn-5=aYDqm$fPUu#dMJ z9Y!d37;%TfhdB0G%%`Q@JLn@TLQ!WRKxOrpRRc$fF*1c-Zq5d&oCDIB7+!0$IB^`m zyP5FxiRS~%oSr$CZj^c_QFZ}z=yry}O0|}4c=4X%+;zq7MAtd*iO|g&)%a|!kRmI| z+>q848u)cOb>#BvwCP-MX2BR{5)n=C*(zCV51E|y`s*rZ7<`?27~^_ro?ws~H$I{! z9UML|!YX%Vd58LKP|EC2PgNNls(f~ZTn0gqsCAk?d=AD+T?m?yHAvUjm*}+DSW4DS z%-OLxGN@E6TX?MqS-EkSptX$m=G!l!`PLcvGr9+3nC1V5UPh0DPy*wo*msGV3R$!4A*iR&3=e0 z5EMlOQA2?R20;lVyGVSTLbYq_=t?5(a+zA&O&q3p&R>!BD)YBeW$lR|LLcMX zJckT3?&2i%h9H+jET!ssSODpSk~ksPr75}OczzvIq@848A=El}QdDNN9GUTGG(q)t z@bvc##zP}3AU&HSFB_aO4BXPXJ>5%=N<7>-@u#S0CXr*$;;XH^tDGkGfZ7tImr2hx zCs%I~1NX4rq!XPNnDG|7uO8lb489<_&xr!IdoF$h9LoTxaL z7`G@!2%@74^r8FHWE3=K_FN_mt%D;kIff<8*)Eu$hExvvyg^|$D0Ctepne}bT3dS# z5S%`q>0BsQNHH1FX2XX1vmmgHfD$=^=Ykr~DD}*G45L z)N4DII7Jk=eu6{xXOw)7dz%N{U@D6|7GY_1C~P=j{#w1*=QHp5@CHZjvOi$GeY;qq z8eHpwn#mVfevXn@2(Dr}lvz!f$)Orfs^pnuoC3lCJ@X5`j8N**Z!tf7}0B15%qz zt)HfEBDcajeAeV#D#Lg7xz;J9=>Y0dKQG|*)!gjCL^?3C1@ z<<1GL+wAc)JP6y*Q-y}vbM@Boh5feM?Y~2!3~m2hgmgng38Em@BaN2M4kZN!31p3| zsb?60Nx}xWx*d>9F~KuT?Tecj+2kH=^zbHWY9YE}kY$@9wYWG)K}(S{K(_;SKKYo0 z-iIjwH9Lw=3=}T|MO`$d#m2vj5Y&+3m7)o;w}Cir7YGCCWSwk?g>NG-Su|=%B$^4z zaV2aHpW;Kqj&4B)-BH_n62;Rv;#P-H@6QqkrA1Q#-v({n>z9~#k-*b-F_8WAW`bZt z;j8euya<&W<1@FfO@k#OutI1f55&D2IOXDEt&CzGMlhOkpC!2BF_|dbyCW-0od-1F zk-$;y23x@v%zhmsD`n;f^J0*0dL@QN2^I%3BhxPriR{^+?>|Wl!(rSx9ZL1`i{0nxfMF8fX{ z8^HaMA1P9!?qgEoLY-?ZF6J&@q&^JGW(c;xGO8jQLxbQvjV9x?%{^pMdI)MQ8Z^>? z$%!(yiJ6jGQp!Z77|~IsG;3yIpaNrIOc^#pXd^Fb4Am7WO(cF7Q^z26?D`fsOwj^~3IW(jI!z{943D0~OL zcd_RqFVN@yb=!6) zY?Bd#0}k2e$3drIsDdqW$d$rVn^{|Vnx>>G2(&QX%-p`pk$`c}uikKTC#VL4ux5bT z^fom%S9`J1SsMliIpiH(v6+b@g1+!IvRF2>d*Mc*WS+>UH+=hPHkGV2HDCc*1Bd}^ zK=!l4LJQU2ctg=G6E;XOkkE?NL;@7~ZTIgg98?HwoC7~dXR?KnD`rqQ#Q=qsY&=QwYc`E55!k1@RbB?|8cuOM!^r1`I0H`rB~0`oz1UN`xhmaV*8R_h{YIaT}Li5uJ6JBP;7VPB@2GsmDq~+K6&~Boq7ppn%(hGxkn%()K^NhEh)rfRJbv%<<|sI#-m)HQ`^dCknpr8gu@ zE@9uEn6j=1h`c7Eo}nyVD3D4W6r@r4J|`6^)4F%WMj&z>n0bN+qBgg>r?oW<^i8wq zsS}fO<ClmBrPz3PCOl%%4y?%wYO2%1z;A*#)3l}t`_>}S zX3@pI_?_;*RigWFTr`clZLzSL`#Q-a?Fd6zI(=Ep&)Ki1<>NePiXxr*4(YVjp=@m! zgGjkkRw^8LZDiiaLt&(jw$|p*yT)+gHDNWT_+9qcna$JIuv}5&ZpEo$8 zZ?cBVB;6MnIMyg#BN^yz5s%T7<;-z_E2?#D8p))`53?oI@zn8m8PpX~Lvxxd8}*!J z0BJCgizXR#PswjpW}&(&ZM1EU^|mF_vf<#ys{sc_aKXABV1o~;)=GI^s4%)o*5t-6 z+brcRu<&z+d^s_Ex;izcm6ln%fxTEzLFIO{G}X`xFfunxkZw6*lLb_}!1OXWSaVJX zy$`Qwby&;qB=CZVlL%BAWz0!3N>bX}VTv*@LpZT)nn6k;F!QEmo}iVAsv-mASua+n zH09@)M?*YU-WV;U?ISPwym`0JM$khod2b9&L^DDJ?&ze!2;CG5w9lEt5NmTho4vOq zD~FbbL!7Q%jnRs5p>jeN(V5u6WN zaz&xt^5+XlHnk71{8QH3qEw3v`D1G2<=%$7eJ4Z4btCd^%S+jIR`Dg4?wW*!ygH=f zj&_lx6FwQ6bsON~Fx8?n({!~r!W_W?$Xw8yc73s8RQo#*oL0DVqhhpd^f@Ch>uncg zskd}t;t(RHdP?6AAqYZLD20haky}Vv(4!-o<66E4&_Z0wc5j%Poi&Jiba1r3ah}$G zob%c%ii0)~Iu=K1o4v`1Tie6is2&}J&?iPntjybf4-mF6KNF%hOq5~WVj?em5itD2 z#|xuEhfPtKi!X~s>u;N;iK*E;D&66l-Nc(3-;Ir3;NtZ=R70hw!8&?qP{_S;Z0f>? zcSaLRB`c_jtGO_)he_HZ78%;e#mUncMU6Fyd{q*~$k7D@qMWFgHkpMjZw{tKGTdLa z;}4k1Qt+E-A1ce05pC9Kslv4!a;A$bCW)>rvL32o-IePx;%^>Pk!BANnhtQ+hIQ9Z z3o+C&kFiWd<=$D|20e+UUYnTbS=Q?YFzq8N-n~saFy>)<%hPh+OAO8#0*SmZ*5Y`> zu2j^%FKLu~H;tNkwZA~-0J9msr;jZU2WQomwL@&alqiVwQpY@BgT3tLF6J2zB-Z(I zO^YKIDB9q~5{%?GI#HsWv~h$mxi-B=ZE*Cmh#h5RJ<|}fAhb-mmTZIJvdrNriX2TQ zMpwFcwrdXABP)kG&S0!Bhq7fK9ZqA!ChaI&5lu@fvhCnjwd zRdUuALu8_Cmcj>1XKh=irKKD`QcFb;I)swA<|IjN8HO?B zv8MkXuRBr|R0~i{z;_bW%8Vir=n@`Y`Nr)_EX0NPM#j1%n=C8?0yOT_iPF?i&9$>Z z3`aL}tTqA=o2Fk363RIvwK+?E9r9t!V-jm>UqCj=(<3iS2htl|G8Fg>xCfY>+baXM z9d;at1nJ}x!WuDtt5*=d-t5U)Mnn%3>j!MXkVxBolSDivcguXS+Rq~^O33=*fWC>v zXC3p6pHnJ(A=6QOFx2Vxw8T<)6Q_>vrcYG$>%4}&aydMLecx2A3=`HIF zG`r2t&@{FjX0m%VQB~zTaPFGi!NWAOw^^wx#Hy2n;h7W1reKeRADcYKB zyiPH#OV>@V)js@Sb8t8if)l1p7&VG(K_WTE2%ASEFL!d0BeIb=&&AAmZD!B4hH3E? zn#V|{ewJ4IXwK5z1-O+CaocF-$GNmoGMO21!SeW$W253_u!&COD(Owp99Ecy8^a)B z1$9F9Phaqx(+(Ym#B0QqGYQlUGQXv zx?C9MFxb>(i>T`8G>q&^0YcY6G;AehWPp@)82h-qvEjQfc{d0EKDfOU*+F6gVMFTZ*k2YZXRGDlIKlp%TvOtgJL(8d8v>AxlOeDGB{-3;p1`5lle&NCEZp z8x-dRIhG8xPl#As8Bvy$LX}!0E3g`k zWQ{D6m8^;}loE+b6k$e6Pz30`LI`3&;j{y>eGuvx2|A56B%uK#FX<8?r#cAJnmnP0 zqO@7mmSRV5)*Qc6u&9i6LWNTlp8(7?PZU;x$a5edMl4_{7$Qgj)e#y% zggk~6V8CGkK}?pyjY}DpgeV||n6I#QHbav6!0Ank@d@MceuG)2BnB>R802)YsXddX ztFY)`;`9YVL+ODeD3XGrNDuGmP^G{g#~4jBf5sy(^v>j-?$^}w@U^JHO4c+&+gohL zl=G_ZH%jR|^UpH5WCJ5FW`snDj1)3KuvsTp94S)mxaGuC9G3&idGQ6G%ViK}OtQ*U zL>RGU5Y$ob-kg1R-QUx@*AB%T#r^g-7`f~*Yi|TV{|&S&>(C>vwtHmxF(&OC^As=$?JH+gAS;%;#ma5 zMzq>g*0WoC+pgIj7eqAkvYk3h4xKABKYLJYA!0v|F!}-M@=N$12EZdPDW*zAviX*h zpMgpkDP$6p;!@!OPqykI=T$}t0W;Rc!5m*tqh1`ettxn#560<}_D2Ow=1l!x3yPCZ zCN35#KT>Wki~Hsg2%z1_%HG;rd_qJC_rhjKi6rNeE~UPnZP~kqVm)+uX`*4C-y2b8^|2MefkfLU?q8D4E3rk*(9hu{hkY zUWsPQA+Fe{Om8a>D~2)&+i4zi{gW1qYf#uzm!%^3KM)sUs^w(7=IoB``;~uG_yjBp`>3WElkFKzhmIT%aEKm>5q+ zHQ$+Q1|i74wG6h0*wEy-#AKJ0pKa=^>~z75CLyyiwOh5grkc4%G{!D|oYQ|dJzM8a z`qEJGl4mVGDR!DVEY00Q1k#ScYucoJ7(?D!X$3BR>Ow#mL`FmqIDnowGl+GcdG8w= zq*T192w1mPF=OwdT4+w5TMphK&F<~7zSF!l?7<25PM?-e)UK?GVn zCL=35l$=cF9qe?BtPzC6pxmB@5F;-(h1_Lkp>eVzj9$CByM@N%ySj*UgHY1l3mmw; zL(N=mhr6|CjHcAfAz*WGip@krvnZyQ%$vb7RM<#Z;zUEUB->2D&mweeW^`fmdVK9g zE0`#%zYJnt@o?jsqRAyAFA-06wu%dPQt;T3;fN6A#Xk^q%jb7mF{Jag!_3g;EznGe zN}qiq}>HMODA*sMrV78i@U@g8YT2*t(zY+JjH+*1Flgmb{6J;eL1QeK*AsHD0 z0U$8oG#yL>j?57>3@ST9BQG&z)(37fVIwaxpIHmKYGgA#{~mMB^z+5#&NFJlBEc$@ z@phDI! zwG(ZcZK)vMUd!5H7ta3&~VI+(cNJu~-1c??NJ>=9EdWR)a^foMthC;ut6jwc3ZoAOqh$Y+uz|LN5`~qdg9g|5OUk- z8P>r2Ss*NeoyfwQ{4jy6krEptE1+u(V!=W#TCyk%K-0x^O$RN2_9)o-QHGjdXRgM^ z+0}0tGXwz+{tSBn#pK?p=pC##0{S;_)buDY%SI3Z(3@1Y0roNrE6HiBYa3vnuV zt{}`b@>gg+Nk56CQUH-y5E1h6IC;+`(5thv3-7|gf0yui1SFy`%#HDPeX<2UFZklYSv}r}7G`7si9{%Yiv`pAVOg2)QC2Bx1 zF@->3Adrme*eE23aiI%)vhAryv#WH=ZG^RxTM_81tjdzhpylUin^+iKX2 zRp{4g7oFL*X-df2JI_3oCN#@3F)i#}wT#wm+ue5CTdQR$2pW{Oq*%*ZDrod}xm{+l zj8c_y-87i3VvJCQLWbmNAgm((#`yfknjV@_99MuI5m=K*Z9U}o&BqTJN(-f04 zLTb6LjkJr+HEvq9GR)T7#;tWSfm5VFY=U6i73D@SDja>OL9tb@hRti_TUU!)Dk?E5 zm|_QqfD|?uf=DW`BBOYLP@74ENiwNzsMSqnlSEk~D<+CcG_sLpLb97SNs}Whv8ptd z!y6hgqKPS`En?YiXtypSFT6;^3`K4L5+g6P!6=F$P=f&hq6iDv5JV~>y5I<4h#(pv z5XJwlrh4ddJl-|tb@p@M#T7Sg6A`Rn2XxYd%^5r&B*lB%48g-YHbWzub%dCbI^b04 zIow-Ew6Iwf;v2=VMlhmto_qRX=oE090Z_w#gu%e<(FxH<6S8U5J-$1qR57w0-B2+F zBnc2C2@vsgDlq636X4b(FDwJm^*#sL4{;9@+Dd7YtXmI|y!i4%*}z;mK16vu;sMGc zCitW^PJ`;M0CLY!uAf8?Wy*S(gzGsuSb345BpThED3~CUBP&}o9jv>~FViKAo6wLT*ry`sPv|e&T}V z&b#1LDsX07DrKjfBidfJGZu`i5rAodnsFfaR4Plt{KG}>vRrc8p>7Z=2aCksTbCTR z+g?SD;c?Bin0{oEqySfzMS&_4O)p7OxH6|SMZgxH0=R|TtN?uiGBOBA7N3XX2{Lyd z$Bbq0=Ym*1P+%ui!n-H*e?ZwGdRamA z#RLdk3yX+L`e}@qgs8z#tRpWW6xJDN3n%!7Q9O_*U)i&?oJH>%Tg=5t6xKs>Q&7f9 zfzfG~jv0J}g}|{%StBomx5fqFp-OWph@52;I=n+hK|~PIE%#?kBP&fZjig00q$+RL zDUP#!`_xi;(O6(Y5a_DxxE6gNrbvkrE5LMz2HD0lKOo1S;<5Sl;rDN$RN!aYrhDG< zQ=Q4^AoPeb1>H-$5X6^-EDV6w{f4^kfuR@fAD9%Mpq+lM@%;o5POwAH5XknLl;_w} z@_dIYOTeN}*W>I*#(jkli(Eeto7j(TN_2=KCE4)$ifXp+_8bp<(6y3whIAG^K~&bc zcPu)FWPo%FFgGJBhQuN)&(Qx4xZ{prJ3ank@DfLy<()0M3m3V3I~tG6LVTnQ^CVK2 z+rIV@!G{mP^CoU&#;pSx#(dQY(7s~&rWEGjF)Ku?pOBaac|y~n)dLbj-nT$CAht?n z`xy_A${+}V@)C~maC5iR!467QP;Y3mmiG>l5faY`pBKzzbmUo#J35D962p<~BP+KM z#^^?0FM%se(m9?kXEC^X8`N{*2L0hqAfp%^dlo6dF>YW{zCebVH1gcLLkTQ{hsXEz z*G#8FJs%FjNX@K{+@Y{GoP_`dq7YQhH3akGP-`nw^&2F) zwpPgDJ!TkflHow2s?ep`3sHxvgM`AQv6nevoQ=UIv2c5ER6&Ry7)l(r30n*)_&A88 z9e++rBQH#pswmKG7;wg9$cqmLh{E{+hHjbF_W<)>fWHrX5b?mh=I5>Ws9C!$kl+lw zr-jmWeGB$qq%dhCE5lC{!K|a8pQo^G1H?-B@EAG)6RlpD*)M#6KCN%BBL5iDU8U(!sYH^MVkxkL7+KaZG5|fbj5XiH0m}ZFQiaBkTT948qIvQRaI0~ zRaUGxLrNQz+YTxV1GZy5$nSW4!@FpoViZ7BV-!!>nUX3eqH*jLSl^w`^4aXnNk01Z zQG1(e_*V0DcOb!A7dF)+D@!J^V&=8FmXyU7uZ3;Owau=Y)$=#9TYV!hy;wsUppaf9 z9H)dTAgodXjxq9rn18r*Pno)`4;F=HF?A*hZ6lUnb*BF{$bKmf(*)xrh72n*{1tPN zfy5*;7-$jBF7+ zU3n7E-7zC8jW0c}X7Rj5TO%*F5d;_A2pNKk}5{(nK_ z9IADRY8Ty1jt+)s9&bMV6Dbm3Ar=0FXM)HuO~B297x4Ujv)7KK>8+!1M^1q^{#Gjo z&=gpP@%nK_rr2cZ*{r^+Si9f_(E*15#)4GYP-pUckDfD;LNFkxn@JFN-E3<=8Qbsq zwwQ1=CU0pZWFZt2WI{nhB!X~k0xg4h|H4_~u1-Nn7pfR43aSx(r^ z6)@ePfE@s&o09biY*Q5NtkzX4>XM~z4g-o2bFVtt@Tw3?O<>J4#4_CdmtG0-Pt*H; zG}%i=d2vMBef&8eBcf+a7&h4M+q6n6`Tc_S4mne6&BAGa+vUp`I-uHpBq$`1B1x^- zt{SH~Vd?p2A1&WRfcSTXDu$irp%q@(iGk-rkr(*LCsq|u#v zPD5q3V|(o=+i&VO{#Ftx5R3@1+!ahvH`wNEdw5u=c0X1{q>aOpGSSh_n;)Rbe1mIohQz7j)Q_s#&r?=I^Mjbt04flOR!Q$d{{P)_U+JgW*>#*$P|Tu> zOt&lh@G?6^mDGkOLuM^CU<{+$ROk6Dn8gXil@xlS#gJkKA~gUMCfbPqNkFrd4&p%Ct`HwP^lcGFLqSpDn%hG0eMLjl8lNhBFGgEBa}u$PP01MIT)nY73l@yE?uhR zMz~n1M};O1^4>e$#^)&9td+bM5Yl4|ETY9& zQn#`rFUb)mrj2Ae4sUu;QD=)K(v!s_FG0-gOF!KIPg|!GDQXOpw3oXpcFfD+qG4$? zPLR|+1C8^|F~HoD82>N2%wVm{F(SytWDuC=W=AdDmZ`*lQK0DT6Ik=WhcytLbbot; z@8|EIY9T$4sK!PkD=4j~jV7Thy4P;H>dh&oc~fhC1R_~3C*X~>cK1B6<-x^3(x@}E z9K-hZ%Ts=u`aLTYY7=cttRrFP5Dq5K<*=B7`S8Ho~RglG{1&RYL4`J$VXcWQ#sC>ZLDndg<*;YF$ zK6C>YEs9;*hUKkthcp4J04P|0KiWf@6%bTe3rI>N6-WDp#zP>XBQMDml>)RRE+Z?7 z2ZAeU8GCWe*wUod%-K0wR8uPm>pysP7!@NgiKxX4gb}zU#H5H}imxQV zGClUn7J^J@45NJ`FDyl5$vO_2%&C(IpRi_^FaNG$|<3B~?Od2y(uRHlN@3>XDr`BM8kYDzei5oe&g@XoDDa zy==_WI?G@rN^L3!M)xKnzSHmk=SM(nyF^csK?eQv;dsXNHUaLV{HKMY<`d7wS**rev@_ zBP)Nd>}2=$=r86gZH`JcXI@pp-7Tt$$>--7^{BoM9fZ!2-s|G~w%-To{!fbfkFtat z6&j*yh?*rxqDyGoOHws&wbGYnHb#vpC6;MYF;bRI8#M{GV%Z@pEt#auGd9MSl9f_b zNNur-i*2X`iMO`>*XaFO5J~J0$?8bNH*44xgOVYw0l*OUMW2p=Q6y15zp$aSMwe*= zM>%y(APE2-&@Q0;aelaxAbcZGP_%4Clvegv?t0W2?)bG}828)w9JNd!NNI-iB%Ub{FWa-l)M6oAXGvTcFDD@Z`L;4)`}*} zOHFI+w?MP|G*$mj&h0gXGdCqO5{)8;_C_R(L6YAiFU1>PyHeZ9b$0$gw`)$7!6_00 z5Kk~}YD(`aC0AtNs=hMC>S8{@V< z=%pU?K0l1R%0(PwkH@p?aWGPsKu`%p1o@NE*)&F9Ge=T2WU0TSM7@MD^lc(pAK92A zEH1OV8Rn-(NJd6J5JE)`eU3Na>5n4HNo@gEsw{|y7of0rSvN)L)lEUaRTqWivq4){ zT-zfnNklKloRdp6KOV7EN6#>Wbi<^QVCdx|FVUkJiIL4d*d|?)> z6f@b4&7^Ct9NdeopG|2zm=&Y5D)k%V63i9GcAROWy;L=js@iP<8Y7MAMS2|R&r5P| zJ8P2zBKq&Q?1r91fbGtd;Yy)Pc7%-r5O6V|ZDB%`!CFRy9`@T6dDE|xxclpx=BE%G zh$W7$zQS-50d@!(yBFPeTa@W}3Dkw?qU5MaI(Kx(f_*8_uXrAik&xK%H6tszSqTVQ z^3K&&lg)e7`Vl%r9-Q-XGDnvTLdf(8aU&}vBas6g=nlRWOc)|4F_H+!mP*KpBN!F3 zB%N?g2|q^+C#U49u=QdkwNwKf$kGvlq*yjdVi{%og9H>q1J3xXO4?8?CWL&o8wuBd2@4l`LeXpi@5^8 zXq7{;eqqc{lVQ0TrgYA_mr~SiPd%SqnFReGugO2_;m$?dPb)+AH)kr$e_P=`Oj!j= zAtr3WI0vMtPyLS9S48R=&&Kvp@*dRjOCv9*X?r|8yC$&cQ$MNb)14Yo_RZdI=lHuC zhu=!f)$t*SDYB+yi5S5m!Y{uYeax)X)>FZ+X5+|HLjx@ivwKsubB1l|u(!M}hTdf{ z#QeW^Gk~5k6tSpYm4+nxJ*UQge8^`!9}`Sxp>)m2hB2)2gjp=Hnus&$0T^>}21{Y2 zchq?qa9)Q^sI}t+J)2UQS&CYvI_F%uNeLr`jog@bPVSD*4v`Ms;5im#uthx>6^Djq zQ}eobH84_AdcB}w7cOKRleGs2N8R?aeH{)t#F!8*BP*q&g^Z~L;4Pp|r4+W5cU+C5 zl)yPKv?OAfSd=3#&_al0im*uf7)+Mv`;B;|sr12QPe3T1P|_9KuxjF<;=>Zn&o`tD z6Q^Ea8&z}k&3^zuIwB-vXMX*sk+8tL-&dUWzLKxio&0w?p7ayQiVx|EvO*&-j{5oc z0p-#mf+?D#$sOWIFqlC*&!l$HkdjHDw=DzL3w4t%C6Pa6#5l}4C<(5%N|1pZy~rNGkevV+nT;Bjv_GXw5&X~5CZr#o zA=gEP5)l_lpbHeJ2#i?AuaV7^!76a45kOJ`3mgv1a+((#h%#1gQDK{5DrQ-XBQHjq zO-ZAy#-zJLa>bi&CCW^@nyD5lu@q3&!o^LQBQKUTV;;J*>Jn)g14n~6lyG2a9AV{U zP+th7s*AA}E;lWxTAnh;DIrTm0Ux2tbAwMQO*($qzstY2FSV9uaV`()SD6NxM$@TkIH)gxb zv0T{mBDYLyo0UTPbD5faPG3}#tXiJ4&^o!%R7CRy9d;-wZ7`suFW;)ZT@^kx+d zV$aAEO{9=M1)Qd)s9}Zfn^IE;axZzQu;9dqR60jErK+O;S>wxgjWknliN{rXj9~zb zk|7W>5KS5Yhi9R|+*ZtL-rbpxfa%xReCA^S&(yhC~VCpqI+sXuc)H$5XS@kKVQ zUUd`@ax^td9vWkvV8hAO@LDN|6pohV8U2uC%Faoj$we{wNAT3dCKDkh@spnB)G>sF zBQE|_NhC9vftomMLmc=&dotYuck><3njZE}(zmA!Fq2Yub{$~p{oG1i+0`67j_y7@ z_i8pQXO6OM7pRT15bTwah8vDQjPgB5`h4iUmrY8dY}c@xtaHJVy%;0&{7$SXWnv+! zw6VPf?4aIXk2xBWWbnMg-vm$fID^|@bc0s1V=z-|P9%zivus?Z9<}yDINlk|^lhFK zx04j)b=FJS&QkgHj(_?>yml}|;cZ!6Bkcct>28GIsr798;^6I6-DlKw=e#qwsw1KQ0 zo3vU@G-QCg%+$4j;(2cj%sL%juG9=c%!jre8t5hHYz67PQ6npqfo37>87Lt}bC+#1 zB`CzDSriNqszVZ>me^DXaAcAU7<4jq5R703Mg<^{(U7slLXT1;|E=`Wa5n}`i5>&O z<}qUy6EUt>94^$=oE&tJQR$l1g?a?`h!=dK5l9|lnKE?)) zu&g*Giv)x3C7q`od?7uspwBtw;`|by04zejrUD}!!IzVMK=V3a<)DFRf ze|}f?{v7tf@3jQqlScYeiUNrV##|cQz?Q8r8*h|5A&9d!s_*XCteBUhO^csz^?v{C z{)+wi8bH+sofJlQSSVeP4tS4$H34dp!C-t~^;Lo!lLYA_EBJ4DQ8w;kL_U$~qR+uu zf@?G?fOO4HK!|4{jW*0+`3a*^ldUFpLU$eG@%w8d^Tv2<+6!j=t0E)KG;8)@e;^2qHAHX%e;DivWj4i$z-H2C=Qu+Ygx z0MoZ(emkWQ{3oOLg)#aR_{8Vs*qi;b=SBKkkTo-xnd&f2#9$WCFzx%ZnV&W~XZK3_ z47$k)ECLcqcqk@@tLf6p2luifc+;=uZ20lv*CV!x+;TdmKT(?fTNyRWlaf~=veA=L?s5F| zIg_sEG5DTOl2Q>md$&FL@YUw`coG@PLPC7;M5qjblKKJG&@#jfkwl)&t#TlIh{#;1 zD%WZdY$FyUATT0|5+b1`qPLB@o0_hq*{+t=uF}F3gkV4nA*)%cy;}PtD?ceKmK)fG zh%A-yZnq~eyoEi-L$g-LyA<34m|_8W+f=E8>=tA=fu;M!G*QYQ!4qO0n|iK->@OlA z2I8a)%=}3YhEZkDQSmM$bTwKoNSndbQ%WQ%apgm|DwwqDhq-KS^1ZEzyQ}>@`=Ei{ zG|PI`i@MqQ?#VNgWJ&M&VY>m{p*zr;na{-e0gpMHy&c?UjmQ_KiKB-aeEa??tDIFh z1|i>cr=mcP^RHeKy)=A5Hj?~?7DFfNrN+3@@vu?rmhVD^c!suxD~hj|BAJ3CFNi18 zR3gG3l~As^xgKIoZXv_b!Mi|gu$rS;IN~XIA=BDUJZjDD#@Gx9L#|?x&Vsve` zKX=lz!TkrsN)|zdgH*L_l%kf$ertKX!P6)%L^alh$gx5UsJbTQmfY<`$%mF@d9a?b z$$BFzBK!Up7>9jrERda@Lm#UK5Yb2712}zse(%F%d~bbr36B1SqaOq)9J{VuJUZtV zWcvLaj|1+9Op-!J)fR^o7VlFKf}l~USy>C$C`muUg~oT)3x-U+N0wKCnVFoS&CE35 z$|#kgM>+oS(Fk;M(j5p`;oe}2AUR0{U?NJ?kyVm~g_HK$ICq$V;NJP04iQ6xP2|G| zrx}Ad)K>Fu8nG)aN+2W}P!iZ`Ww;E0($dh;hM9K&q^PA4nUyd|i~6jRg2BbGJp7pNi#&d}CQrR#S9S`NV9pv8jJaZF%%Uh5Ar_9=&LwIC z6fP~ZQ3xXNan3i5CncG*nyo{5ry-?s$#<2?`TxwFYQJ=|Jb6Kc#DWPXHkgUQxmZpB zo42-U)hYaw)WTwD&jqGTNE8@j3+ofVDo31z&rWFR*~yv(>5ahVjmiMT5U{503}L@g zv1rCTid_FxrNJS3{WZo#BQFm7DN%Yy!2R=|((dmIm?S>Fy6@A6om)cZ$Htf`%Ru8X z#RfCp*lF(NFb}O)Y(EAE9ASDXNf{+$3DJWLOPJpd`BRx4Ok=~QO~XlNDO%+y-shKk ze=2p?foX%n)$mQbv%jx%Yj&ekOkLar*&vo}N);f5Qsym|k{U}RZza+ODsErP7|28t zZi#Kf5s4sV@E2i)(Xomm2!dc4CKFR7m6&OPnMQbpmI#rY{}s2lm-<& zvCCx^g?%OZS|#L&gSuWjbl^Zo z-M8vM(uPQ2Nej-~QK1?hmG&)c+!gv}j{P6Ie~aC@4~F-tWA>Y9Y%MCcYsMgSQhAo8 z4}^yvI8cMn&5`Q)7(eE)9X#7Dts#8{n6d_9&igY8ClZq zGm=tejbl%wk9A~koG}$D?Od7^fI;fx`U=g(qjiIx3ptDvVX)-WR7? z@2T6{-5S}`=uU_d7^N)?Gi=F;Z3q#FGY-F#p8UGPJ>1j8)Wj5Z^Zws@`11HRIep$x zVcL}uvqspNB^HMz6-hWy^$gmW?CLThe8V)`X!k1N|cPHfFIK%F+|Q@IX9bs|$F z0FY!=gjo8(6MpsuBP)jMV5B~hBQFNQERk4>-2{LkC{9Y0xZsqff)!a7-7MPct+891 zb5%KZ#cs4kp|$6o*6BgEBQHx#tW|X?DAsCiw=H_B$)wa2F_KYka)AL5_wi=S zw=&*aHpr;SPnmt!tUXyd#Xw3IqMs)+$xp5~QrG8wFw>$$5(H90?%k}nZrp=Ot&+C0 zH*Myy5GiOZ7XJj1WVB2LK};!Q9$8XV-c{zsNwa2Vw)`#WXXhx)NfZbSUaN5iL{dRn z6jY3rHi@$YTD@lOyK;q;%_D4RszFT&vTbZaSjo<4*2denb|o~EMN?whBQLCJl)JiW zT7e4!g+E|?B_654fu#1HhrY@^@HzvaCvr(LVk}s&SV0*UB1w>$k_JD&zbd2Jw?k4d zFE>IkB1R+y!MF$<9~>Q6+^}#=M^@DkLIgqx97wWySfNTDa32_{L{Kgz5D5}W>g{tD z)yr*0+byB0=U*oRYvQ zC^7)7xhMeGW)?W@HZykQUA8=P%zdk(FF&z4C|Gk^QsV%s2saNSFOM6aU_#N1kWBKt z9lDg95suo@DD~OQnKcuO5vgI!xnI56g!zFKep;66EFDj@Mii3oJEa5njK*pFcck-s zU(sW3H=`kfG{gpm#>A6DePNy4bF+Tf%JAL{DW|w+iag@T>Aunlv|P*`F{XhmAWS4B z#vH=RBQF&U>QB$3jVaySxacSEN+==6V>+Aa6|vz@)yE@IuhV9T+4a%q7pINuY3rVg z5;n|A-3F7Pr4jPYY~k~mI-|O4Ro%;Ggd6#POuVy7NbHB0_73b5PMYf=?*dC){(5Pk zfOMEKZ1Zr8Lc{uSaAV!1l#hsd->$i->1H*D2xQF$xsd!Z^U|Ni_45`WyK7515kP-$ z+53tCsML0~=Y5cH2M$fnv(W4?(1`dDQT9N#NeHWXG-tP}uSs4lz6EKHklbHER*`^Po*u(&yahAR>$x&Rvl46rzW z1~8Hzp@khCNz1s)LX`IJb0aTtXof+tPAOVaiH~ zylF6@%!PnF7A%2x3n7rWU`nG5Dv<`Pk>iXpF(WTbEg8C|;WWa-a8qVU7DAyTFM~1M zE>)v#nuXIw_y`q^gBb5R3+%ro||@b`$3FLoT+Fij(id?5L(6kXf@P zo3#C6uA2QvySXqEG&_~lP+H7N2uNfapDPKp-fnCvp4cc70thwF0ca7~BqF47AdI#@ z&;q%7eBB{n^bCOeqle8OoXSwv6^!qbUUGW{0&JQ3Pu|EZ>1hO)_&O7UcLb#i>f!zK z`pBN@q!8V|KM}X_iUMV}bU@^5Lm!Ef!xLBOBAXeynt`*NC9kh3cCTc|T(jw+yciqx zhcbFxLmK!57P2Glxe>ZDLm%dcZve=_r6O49X%r(bB94eZcc}#UgcCTVNU8FA_yp7Z zd~7E%3|^wm8FXC0D&E^3;sv8@0=|r_J?4eu^AL<6WZaGn5!G*<)YaU;GrgpY6My*> z4;~;yZz^P9P!s$f4=jhXmyKLCOcD?plMlpfWLGAOj;HNJahh2}poa z0%eEPhk7C!yvdNKA93G9K${@Iy%e*x5V(Xvp;M|Pg27?~-@hLEBUYogGsjn-JYOs` z?-0?cQ!HY8H(5Nq1C`$LiK&M<&|OhAgBTJ>2*xmo^@#{kfTDCnSx|%~YzqL!_>XiF z<-I?HqpE_ST8!7x5de%75<(C~5fsV;XOjsJ zy%s|`BQF6VkV+O1qz6PwR*49#2yKH&6Aa2UpU0{7DlWK$2$N^gZ%0u`H;4;(0@M*C z0V;w!kH`3?XTG!?rF(6?+W986t2S+_150943|1;Zh;0Iu3*jbyrbrRo72Z%DdLrtZ zAP|VC$Pj?;p-TuqL^l^2TZAG&AP^Pod({2j?y(soE5-}c6$`)t`XCUD1t2BMBQHA? zS+=h|m6G_xWnmS!E`KF{#_{owwB{%%q5)7+RHo3@o%cbbXXoVc*X-mlJ;9md;f_V@ z4lzB#++bMsB_V$6^6)JHe~SX7El1MWAR=R`Y7-1ffM+e(kG|)62Un_Y?ictLlPn_9 zx3kAo_kVcw=s|no@sME0y#(M#s`3fmrDp$3e}R5T-p+Oe;OTq7$1$YhSn5G!Dl7|` zkT%jCFsg&GBQK;Nu;XJ03jjox)enm%Bm~RSLdC@E0_B7#iUK2gY^kW$@r zTixd6eeiq>7AMhitV>l8Gw3u@cv?|X(TG**-_|&jIu<>l{ID?@HRM3vaSVq&htAoE zFO8~+kd{P>Lreo2icG?mowp1_HN3J@P`t8&MHOxt=-n#=T5W-y`1L&VDPA20R0gaJYXu?C;`rtC~|~&gy+bodG8}b;(Q1LU&JZZ zq~!EN$CCDyvthJ$YV0?UC-HSW$?b%MBFYaS7er9@5d*go0_rK3_Qdvw_+qI1KkK6S){1m9|O!A%ijm`v}i zIwNlr`2h+n-l>EAhqXmZSQ9!aUE>q#MD zf?lcW_+liE*&{C?E;j#OnlMbF3jCq&t4ItkYouHx1%muKT8hPcVeqKkGi!y;(v_szWU!_ zmo{n%zo$vhI}SkpDE?iEtf_D`oXK?+-@oCy+||CO&E1$Z-k+}y2;M>{bP+I{u(`D% z0NQm?1_|j<(42Pgji*f&I2|&!m-3P!*61*Kc8(bsgtxWan+rWO>~i0Gd7}VG?BSyF zC68$#Hw+js1Wg@bp=fqGDUV+S>;qxEOlun#e=aW}Feu8OBE=mj&s#Ly#&Y?Smfw zikOq$B-CPiEPm3LvotKXoXlj;n=}aXQCArtaVX^NxV}kqA65n9iCPvw}7ul!Qs6KnG*b1WM-DE6H8G&gzx*i zF`na@G9ddZ9xLN@L5y{ynrGQqm{6!9NQojWild|>EAEaU24K{_ld*2i676x1K6$!Q z-LW!yJwlb?Q4^$99}@esiNTs6xmjv>_V-Zp&|k_!YiwvZZa|RtHcKvqlGf0SVxbf| zik2f_IgI))$=L98{sXx1?(m93tE*QfIQ1Hfr^0GOTtZ%w)ZIN!?%t5x=if&?*D{S~ zM*DH{8H4V>RZ6$N>hL}zFM{T2e25){Wn6f)aHp^tAYh9hmJhZdg@PzV>>r$udOYjw z#Q79M^rQyrf*ufLRz&jOx2FV5TW&05sn$v;i-ozel21O39#3F=r_p?$5y!CYsw~4% zhQQ@S-W=wWiN*lG;4JL=wQxL}z5H;olyqxQ7pFmyyNZRu$Hy@Aq11czofC|$m|fS@ z7TO;Gh(tmF9G?CoFIPbKu)48ImVJ5^bkkl2j!}dN0z;LqxDsXjx{cYOuGSr%vq&mE zeYKmis>|%3|>vs#!&sLsb8)igz~HUJ|#c5lDp+$0}(aPM~wyKWVKTq zzgc9=j5$Qr-WLP}q!=zpqAek)omJ~1`+LITNg;760p`iXBPY$7(b91v&HFlxE!D}# zy;E_95W{Gc;=#MOy4{Sq z<|ww~BP&0cv?9#Cp#XRuB$Xi~ikbNbMa^ZDhImJ5J&Gkt_UK7tf?4~Ajv9HJ~;dMj+q4$k(wyq63{zXhWGQ+BQL+6Gm2_5 zF4vRzezv2OFo#hoIcGxk9C0#lM39OQixxnVB%eDJ8p)efsUs_vX39$0SwRLcAjT+? zBtl3;4m&j19gg}ndVF^C=KEUw5eV0{TE2Q-K{F7kESe)PO-doXX>N%SfeB0lHm0<~ zrkJsahLaM2q|75ArIjNuB`mT`Voep2jMAhCKz^rrd|xZ&`rrm&uEIx&M5>DRFob~- z)@(m*S-2;n$oc&8P8kRhjhO;6L789!@)96Ea9GMeMEYdi_h&5a`IR(l^_h}-jzp&y z_o4+3B#n#Puv^-OI<~ZC;mg#f`UlCI_Ws!PJl4HUh^+)!sY7$rdv?az71lwAVMqsP z(oVI%XOHgbe6_V&zVmr|yNd65o4%*sz&Dt753V;L>e)x^^wO}=bKTC5C&c%3;LZNz z!HIHW?VW#R1-(D8E_9q6Xi`##E@udmNS*NJ7TyI+mdcj16O_>ZXJ~SgpUjdsj2H>T_$W;`=A}(~d(Dl(A!IH^72v=Y2DP+_cITRJ% zBQMiJW+_QAoce?gSyPuq(`+c1mvE}6Aj2{_ZY?)%cV3H*^f2-cYz*>g?ifNWl6%v? z5|t+iMjSy(G8CXH*(FIq7@)evAy^SiWiuf$$dV!mTokwzz}b~@S~iI*G_bN|Fc{lV zu3WSXRyJM2Y!hRsE<~WgZWd#WFp7<7jwy13nS*ka9Fj;>OpK*2BAFm!#1vq+DQk$F zNp_ZTX@YT-+J74(FTtF58{~O&Onv#8#HM)8*};)bk4dlec#2e27gdRAtC%jL-Oxf* z?4Dx3i@frOGjPWXSRbo0DhEdRcoN;xH4NgoGDOWTq^;SRQxfCL&9h?Koi|MyW?2kW zaSM9>Sl3f)(c&v1yv7E)@YIP>4p<(Rn03wTMJP-YA%a${cG(zcc_iLVJegz}Z%{KM zFQ#d{c*NO;6O-2Uw|XvhPH!>hC{W;8V#;mCN~|>H4g{RWn8O0#))x#g?edmR4$4Y* zLDLQu-Xkk!iWXKu%>XcjGpR-Eok2NFNOZ`~s0$@FhlfE2EbA>r>40WSCtNJUTLZ?p zVHBFSlhwvz{*1z5Z$eJeJ4g;`fr1`R>1EmB!zm*xE1)AQVb|X|&72N`L?U_?O96n4 zJ7Gw5*ycMktlTV>G&W+U+mfa%$8!sCGiz*e*ToPcA_=#Mbk;j?@kEanFQYK{1us9GJZk&}#wv~@D~zJ%8JJY2R@()HZAM%(3v(4$0RtEdSmR

b5)GAFC1+Va+epf`L_OkPAMU)Q4H z)QbW{7XaEFvUE;|uBf~R?@ZVC_jX?R0sN|rK#+tH<@Kid(e%DQK2i{n;p*z4+3Nt1 zkpLt>H5itsU;-!~h`K_EBhuf|mu5ghPT=_^#ILyvEDIY7U?aG?VwW?Ge%}oc3(SBQGO+ zuHl%M1Y-k~BK0FLV;)&ikhcWY(Na=(8xaQY#p2}x&P%kEjT>`bYwcq`XVml00h>ie5={J4nCyLfG3H1F+E^nGa2 z2~i7&=cxacoN2om0FaOaHM#EKC?^GCXo0A8rjg7RMnVxe7Up^H?^ng1+uQ0K;Ro4V zh!C4tFryG-52WQsbhS|Sv@htoI@E>F@?6k#X_m20B*qzq%qb3=9}i!Rb&xiuXf0mM zOLH2dBQKJxBEac8%4!9P6_q=d482Q6jg zg+rNUvQ`Dw_F9RSsQ94P8({8;-8V-Jjmn0A#2N{YRd+sPvJkfY;ekJsY7!A6E7Xle za-;wh%Bju)^I3XOLKPP!jUBsmowNJ;AycUkPbe3Lr{Id2tmq>6VTYM7)NNK zP#-Sy7ndQtK)69WsH&lmj1iSY2r1(zAf5o0x}Z4&G$St~2q01fRFOkVvKEoKS!Ez0 z*ckzc+=PxDNwZK_)Z#j#KmoxhKG#9?sRUUO1duYYpP2ZffrDiSa61%>qILTG=&(Bw zhx+T2$)k z5w9&*=(a-9m19MVVu-0WGGj)@np!QHv9lSrHqw@wR*j^#jjJI7FjXXh^bfF0S$Jhx zCNQO|BQGCz?n6N~lvQDwhEi5K%+!K_QFfIkX(KOWWtqFPAxa}JRu!h)L1fEiMFDXm zFUhS$yNUsVXfQB9-62U3jF3hUi~#B=0}#L-Y3Y#FKy-pJf;CFfALhT`@pU93GDs+K zEhsE#MHneSIv|yR3^Q<+V84iawgx_nU=JKZ<=)UjAtL}zAnY@TM@2#$$$URPX}kEj zoM)0B!+(BxPR%f|MlqwvBQNo$(MW~!rp5O6D}3N&n)9&Tzhvu8iNHQ&hDjsyix9xl zm@SJJGbS>KjM+MKr+RhQl~(0iDvGK=79%fAE)ii{muZRsljrr#!=DrAnEzWPPuJJk z)|e_UT~c7wtPD3b32ROyzl-6a)gzp`Ldc$%tGqqMBc^IS({0xt>auD3D`~E|yN>^^ zp1nHWUQ|_WZwn(UHK{`c_%h|MM>oMtzt!od$Kl}eJgTY{zN~$uG{9k$A}O8bSNUf> z42np9v4=K?5(VjVeylZ|eHjavp#>*LwamUutUDP#v@ge733c0X6 zu{!U@yHy&7zl-;W@5S|=R9$FW${!nXa#v?zE6D7q)-&dyl9C@}_^2SSN|`Uqr4qaG z#xlx~#7i)c$A}_iX2MzXBPAVC5j?Cnmb^0ASS+4h`OxEC3~cw|SJ?@j1FamAHB}e} zT8;#7s8C;B%2e##-K_h=YnJoJPKIeWCnM-#Vri`I^>yLWsl5BgTt8kRxy^0IOc>dL zFbfi;FB(>^9qXR`++8@GH_0Q*?oWk@ut3WKxzhP!kWV_42wYH+IYC3pJtFYV zX|kDl<;ZvG9y}8N38}W>!*Qxh69`FK(<5bWj2Lv0X)15zTP2rZbM3v`+t) zqgGV4bzbXaBc5XA_ZLLe$BUf?gTFV~b8jRzw}Hxk@hY-Sbl%GnOqV9rLrOMBC{Tw< zCo=ScpBpw+?GTW*=>$qaf!&%W8ln8uBU{zw;J148=*dn7LEvQ> zf-u=#LiZD92Xg1HOPp6;(I-pXgB5e$<9v0-JSV~?DKm9Zg$uB`p~by9oep?gP{&2F z3}m+6kb=`Vjgu~S**0|cBslq}cY(lh#gOfO6gXKdC#DlFgfgVs^3_&Ue7borCBIkt zt+e{SH}BF_4lf?MI7aHM<=zeu{6n5DYrA8@aEP-H2Po7?o2$IO%L`#?TXgdbrW>y1 z;bJ}Sw3%E#7;fDv?HSp_t8K_%HpAHakLhnRC+Eu)^jDr8U5Xbf;Bg&1xzBETi)ql6 zzPoVm6jbrDk|z(@Vje%3+$J$5^<@3;r8f9a9bO|Zk>Cf1=d&*urO?YH!}Jb|kR>BB zj6RmCGuNXgabU&x2xmo-o9jXsfs8>TD{|X1pM|$mnq!QQx^__=BBLlHOM@esfyS`C z@DD~_lO%x!$G)1WBQKgdom5cFcf@9JY|^&y9T-w!xZICIvLh=-StBcfGSQ?AF&!Ek zI*Vp1SO)7_XjZ2!HW5Q7>3I5dS*))ug&9TqXTx|SFNYRCA*;MA6jhWI?}cjW7?6Rd zUD4F*(4guhG8FWH8x|?e42su7lZO~XVuqkegs(k;Juk84q?96b4GSC)cm4uWRO z2qQ0U!i;#z+r_{@;m|ql5(i5iX2kwG(|Y;hiC#Z{4rdBcOLe`=h|hKy|KJxjaJowN-sQa6894084~QWGSf%dyZJ52J zp?5W-%V#ONb8R_}Vo@8XB`A}|qKwg!GEZ1^TECd;y2Tql@z-~5Yh*2ym`ydy_;ch( zj>gT2HZj$lfWT(lAbx1ePbS*Ln9RsdI?gXD&X?Le^lg)&+5Mo6yu5eB`*A7rv?^%C zx_vpomjdtVggcY?_I6!mS1N4_X(r}!ECmD7`ADs z5f@GgrN^9j3~{@cl6k4LspNT`j5M^YA*grq*u&?_oWeL-EQqc|dq{@&q)ldgLK7y5 zR|rkaG#E_2_W|ukgv%3y2KiWbmiHICvW5W5&Jg89uK!n&f?eGeJhvk&BP$M0=by5V zKBv02+kC6tD}MRnc@R4$0m-A$42O9iBd0@+5wb48L(J}^H=2quA~(lKhWP$zLJgJO& zx3@d5_1d01Uiyi`w+lh7s8h3YI9h(|a7UROvpDy_(xFoZtH~0IFfltpdNOS4h9-5x z7P(9+Jn|69kU}V zH`B&e^H66QA*QfYVB0~GERjr0G&~Fx4-=p>oID*s=YDqeN*J0ssN5~C;k!4pHRHSy zO5Jjo4%4%DJW6z|#>Q(?C{t`RBP-1C>3O+XKf~$Cg?gQ(7(|_mBQMKx&nHuQxiit} z$pm&<7RqDip-f@tEj!ZnxneoHrjFp3l*9CJsCVRZN_K2~i0tP^TG@OtWilEnotq;o z(i*YDEtJcR#7yekrkz}g>p9GYG_os3n2%J{^JRm8&e_PtoSZHqmFm;eGdC=qBN>RX zL&418XH4uMN+T;^6TPtn5LD36`JjQ*v4U7^K|4*%XLr0a%P`Dn|3&PB-<3OcQqv1! z0DzXkZnu5nOJeubG)V3tIPM|Y)`nvy(J{fuU}%N4XbGYe5%EhH)FPFETTTZjHgfN2 z&J^RpGWcj>Vp2&Z7S6(JyPKvXFSB~-4`?!ZcZO8);muS{w}(cV;PH3L^R}^%f*Yol zFmx#xyM;#iIGRr0U~gi$DUD+Er8!N8M6rcyG8KV4A|(+6v7UJPa>Y<#lbqbSJUw+o zkq4AQ%RMP9%7`RbFAFLtHk24LBOdha9^*}XG$R+Ihomsh6t{S3rtn0tO>9X_$R-|{ z1j(}57@$v3l2dng#ojY=XjHs+C@+e6`3~O0$$v6)h1~-YaSwS<$Je_X_fO?Ls)8cL zfGI4OVh^YZ2%7=`N4GIOMBm%3wh|*Nj%4hHBiF|zrf?sxQe;UItHgHj$;n%Uxq)KH z*RjLWgt26iNfrrCL+cQJly)@Io_Mh@k@eBQT=^mFd_ejLuAMiK;%d>0?eFMxPedLd zMP9{hYm3r6cO$I8IXB7n28YIkMt78cCr7XLKWZu~0gOD-rN|Zrm`D;NAi^vY7mkU) zw?4$pq$ItJozYA8S8BA$n*h+#Z zO4TW*%Vt9V_jZ|1F$wrxM%SDPxrcp&|mTek~C8i@ULNJm@q6yMz z>#!jAn?c;V4~Td{rT|1C~_Q+eEA5wOYw=u$jr`uPe+GVOfbxVk}t*8_dW+u0pyVk5e^L9 zpFfAEq2Ng;BQM4V9LO)u-4$$nNESPaw`w@-lP4%Zfm!B@5=e@>gfHJSK9Kl(dLv`* zs}fR`{`vCF4w*N))|$|4iX@9|{6PoWK^VlOt%jhYmil*YX4a;p%0?nG3RcRI0rdHs`)Tb5LP6tSmbo)jSG07)O*noPgH(pPH+YY>ZkgAxF{ma-Z=}OG`%Kih zo))E`PBW&u()fDaD?-^*O}tfe8e83~AvJ+DB+J)(NPbBhVnq_5UhhmR;qB=>Gq6TS zQcz%sv%j{JQ>MLUWSuPNQ`9gq2@_!0EF^_IP+Yvwx5f~}XPNBmO%I&Lz*Hk20S?kQD#f{jmWrGkp%awy7Zy=zMVgM+)8uZZEYa=V$2pe6VA@Tx` z1^^}fSX~RKZv}BoQz{`)g0?Pn^Yez1)DEAk)HP!?Ha%|V*i>}PjOIKXfOa<|7Oe!f z=R_t$el57@A29Rc9$=PR*-l)@ zXqFghemm!$572qAdXD2YkZAymL~*&ISsUU6T8uS)VEf|@4m3yp8Yt#9wRT`BL;!hni=@_qBpk%%uNO8{z}35{F?y@kbJr>_r+HT zufLHwmY;6FR0t4+84?D4bMru+FVB~k6|lpHjS1ESB>fYNY$S;wRSsk%quZ6@%?YM{ zo&HqbKsb=Lg1b%rLmcq>9?9#39;JN4;*g&ILjBhdq87`eOah)}};SAx4Qo6E1!$ZB8WC9gOB7ClEX4AZv3ipP3MylLnY{CclGQ(wQ9m zX!%~vaMhg=4g`w^AtNiP6_gyTim(8pkS|=}%~F*VVt;Odr$PfNisTaD&70aLryOGS zBP&k2x1Aar}Z*a6goq#8(ROTco3#}Ljb zPBq}PQ!v?xVFO4?6OPEle_Zf+*~9V7Davjmm~0f98Xu)EoT*CdedZOJU!mppCsXINZGvC|NSrV<||K6A@-oa(Etx|54V zjmHM_Yl(5qX#_S{4A|oXh-qNlfO4pZ%9+`a21yf%4r>L941MjBCot^^Sb8Mz!0V#& znV9bn2t7s3%=6{T+xfJ`L)8Vn6GkzWn!~&$gpm~xLIfbhk%($iBP#(HLZHw*(&CWY zQ(T*dsLo7D>Bt(6=MEgsh)Qf^y>)r8>Kw9k&onjR-kBuwVK{RH!?)7aMdl$E_R_+g zLx3%#YN;mMkQ#H#ZFLMYC2GiuDh!#`#V6b?+%p6rNybRo@r-R`_JQs&&qc=3BP)p( zB8R92krbJrCEC!~6H;N|d^82S#^@s})U=KxE1;<-6*!n1n7q4A#HNNWT!b1l^+HVB z+(eLiGHD&(q`ZB~s4_jJhQl=I~(Vi(;;EnmKO-oQsjp>HxZ|KarDY@E4;${uDov_R}nv8^lh=-L zYza(h<-?kCJTlrFJ_zb!hpwbi!%xJz+4#e8G^%!yH%aDmj&_14A*Nio5~YnhwJ8wj zRuuCi)4P5=5rG@i2P3fVg0rauJ*ROK$toOTl3+a~5x`^Gp2^fgUY_Jp+Y1SE06P6+Z zQxqUl!};)VBXoUGia(O$9h*7b#>?n)E&Hcz?D^<_Dbri|o>@`u@X6S^=I>VqR`pq; z+!uFSwB4p(u7}T0qIS90W`?t-S2k0&Zr)=~CnGPrauo~B9OGO^WaHmh@Z}C^-ofrS zr)9LAHfDNwch*Q5wkIMVc4{Ut%KAK15bJ)-CIO5EhfAJ*SaU6)l%=hf942L_W%JWH zIKcAAYTLWJwHSvZE7LixpS~N=!?2y7uF{zjF@%DJ%oHf6 zPR`nhJ=3=v;UgS2<^VhVI~& zb%wVa($eZ129H5d;(~}hTMh%X&v6MNwjNT@L!z5Bq&q1?BOt;d227_XgPumVJwwdd zsw}`^^aRqKm@*?Pj2M?79a!o>b^#+RhJe`GThyB&hF(HE-Ap+VIY1(q7&JsJC<99U0!#OdyPru@SCcyVmH zzp!ZtM1an5ItAZef>3dbVbjg#8bO_*Gnh0343MD(IaEY9#a_Izuq)HkC8p_K8;lNE z9eE=!^B(F4c|=N&+=1aW;*Z-XGojBJnb}vZ1%v~_tNXXiEw-kFT*B8i=F9->^GNia zL!pR6IyzXZ-PEG1XqO`|+KV84Ba1Rv0&&LLdZ89}Ae%hp0E%ox7|DfYzNS-tMdk8d zU!SLS`DK;n7_CD@z@w_&V6U>Y@451W&@f@hg^&a#TjnxP=OQbO!vRHt*n8f89hG_F zH#&Xe*YLdXG>bngIG8iIQ;rGR9rfN&^{-7cIFe3PK{;2s07?PY9>wJ`GtkJkm5xEq zy5cEe`Kh3~+rahJ-_9fe9n~$i_oL-)UwL_zGa-uAzW?bjVD=-oP{8*388Qx(wQVXx zSwscA+TEsN42%;@*=*2_3s@{7EES1u7@iCU~mtp3vmh=*{yosN711ASAJIlks}(bs5eHi5GqZ;h^lBWA%Rx{g|1*0mn9sXB{> zCyKYA(Wz*w1pxvM9B4z`js;_IF%eTM%ma~qcljLCxSfntv>%v!0TKHZpI^`0BOu76gCGW;Jv@f< z1qIn{-1uZE_)sE15C}n2L-F(utD6t5N4$aI!rBNHUDOo*5>1fVQ|LSxh$dO(=DmE&z~RhuSGVCxxx2<0UbUK{g0JqoR+tntt7KlS-20?6^OVnMoTa%nS9VbjA&hJ_9 zGiH_>>}E&-mX0IjY&EQad73Nynrg$txgO||kHW}VM?txYEXnkrR_U_t4zbfrvQp*1 zhOnO_<$FEIT-wJ0T}PZO%aKBjq3y6DKWL#9JonS9n%)rT)u|&ZiW`HJ?jtLTX^4Xe zBQIjAh(H|~Lq9AQ!|W^3)i*oivQ)VJB2~8^}xkBQFr(H9oS?I=lI*zR8dh2#yuuXU1l9b{yL{j`=)YRHV#=(8#Psl$K1=g?dY)USmp1ZIO{QVj69zi)(eW zF%PzdBT)DwFXTYduth#!qb+#)^?FQrr%MOUbvPbi=p?P{yMRB5I6?#@(km>j z>8n=-DV6?Dbx{QPK$l1|5(L_H{BC!#Z-qw!+=phfo6~f9BUOP|V^~<) z8WDe#pt=vTgw_keB6xyB&MN^HlVB`|6ww9J1;nvXk&z@Mh{YsglEQ+4kyj%t92P6B zUPW)ns+nzF>mJ_wb5Tb+jYcIQL|b3cv}~k9XKgpR3`|;M`Y~C zF<-PccQQ-E04+J$oZVqZAQDJ@0tx5`tM`xm;H@1)4w3nZAuaRwW~SWfglcM1jbj=l zks*l*%Z-edm{GK7iusl2mqtLe%M@AN%4UseYc!R6HNKBc?((1%grPz>Fr?NaFYw45 z^AzjdKF=dBIyv(%cW}B-?Lh#NKv@6;%A|-a6j?ScLoG^dTBB4Dk^n>}fxYzY_0!?R zsVQ^I;gARC6i(3mwkqFEWcLxEh(j1-6n%EyQSwQo&9|&|`Lrb)jgfLSTVLg=Ymk;;Fj?!vxnQE$s`zx#HA3HPi{?3?nNE z#(6k^3Cw5<|cz%XP;qY*(tjJE-% z091l3r+8r|H6^wcw!uQMSvJDLTO%)^$0v!lS*DUA0i#(WqN2bPZee)P6de`Zh1yG& z7j0M!5-5nUVFD=#iHM~!N{L8cHKZg4$R=uzgPBoa@GMjZlBNUhfl1C5i8FW`E!o$MQ$)fc-?4HN zv>QYvJOERIcFhs<#L!e>wuF+o-T38fS-TNYdo`Bc?3p?pa)ni$okG8rAqxcb`23t4 z{;m6Ge?n1CHrJ5%aw=4(6nCP+=qLV*GBlmN3ODc;p zs6>b~1REnOT%DSt9|$E&^5#YM{J&hB;&X$K8Kx3LvuETJlV$NKQSj}m;(+RPZZ04A&I@%b`XmrFCamn+mq-r zay(7cBS&v8zBv4_(ZA|vwtnt{uGU!5+VB&lF;!2wA~8^gX4-btYus#WNNv&8V+;l( zFS6qRrudQo7|3F56tQi4pzhbPTRoC6ZqABIRUUnx`2Y9I=l{R|@BcX6{=fYE{{Qv= z@&DGp^>}+f`TzI*-rx3r<^8|i{@s7e?EmZff8G9n_WUjUpX}%Vcjy26*Zp7J`hVa3 z-_8Bs-JkpX-^KF%p-BB?U(EfjClB0wMKLl=KMzU!EmdWx-1;#P{A|*ig1!i3e6)%5 zkx;`AxIF4o?_=;@^>5Ey5Q^8wZ%?S-lYbz|G6<@IsIHUx$?8C|eQ0z~_MyJh3lmGt z&5+g~n->r0c4@l76M6f#Y1D=%^9ebSFGs!~W`R;q!%Bz(zMP)FN>P5sk2EAS&rVxb zfrYIjCOMMZZEcB2lwKkskz8-<{`C3pu?Int0UmxmD2Mk&ZtP5DHhXd`Za-~$Eqlw{ zmi!OG=JPE`dU<$3Y4 z9AvNixhS4qFIy`XN?EK3@<6gu6r0pT3Aus=|0KjM(e7D4CP?u6LdM$LDGN$;HrPAe zBP-W)Qs%xG+T6XaaLcsfL+GZzPDAD22dPuJjKU%rJHrmeOOp99K6XVOb0TRF^E&OD zycRNOZi*&B^th=~DNua3G0{0ju3IB3Rgo!@bv+UO$}piksy$P3Vsqsrm5xh6&p;`= zU9_f1B(m6<4v|7Xagyz%nXa8ftSorvzI4SE!AVR@ib#@J>ak#vUZbBIUds`6@k!Y> zBQIbWBuumr4`l)8y#R|+LIV-NlhP`M!5t1q8ZHD(glQ9(m%savIUC{g{RK%A72oHZ zIcADc>JbC`fW+%Erz4^G-nVP=qfS}VWfbt#rfnlDBT=H0YG%^-qJ;>7!XP|++6enO zWdXloNI&9=7-2$6r>g=%xFh00#ga)vghnIqpIsJl?gnO`nVmOcbl>DIjt=l}M3bH) zFC#0^|IL4-$-}R|yq{oI`bZJF0yI370jnTP8uj+Nd*z6HaU95LwlsSXVzRh1h1AGr- zIBm$`AS=o%2&92*N`f*79neAHgUU3;kPal4ltxG(;`HAGX9Y%z1O8+;4iCX2FGdVi zYB_D8ND)(T5xf=VBZ9;N40%Qgi2*JXBP%|O?ISO#!3iA~X8`EE!_%VJ3>F3LSbxAu zeq-kUANAI}&OknYTf9pvHYXr+e1}S)f2JtKhzuZy4=t4>^$@6142UTKX&R!%*K6l% z`ZiK-zQtAaFK)nBw1kj}79dC{6hsc+S8?f{uctxF7C*YF>N2d2c^&UF9`Uk`Aj01ce}z>EId0C7uTh4VOZ?op(wNAK zSu>nstq;Q6Z}__Jo9m|o&FISH5^8e%Fz ' + desktop) + bld.install_files (appdir, folder + '/' + desktop) + except: + Utils.pprint ('BLUE', 'File ' + desktop + ' not generated') + finally: + pre.close () + + if bld.env['RSVG_CONVERT']: + Utils.check_dir (blddir + '/data') + command = bld.env['RSVG_CONVERT'] + \ + ' -o ' + blddir + '/data/logo-shade.png ' + \ + srcdir + '/data/logo-shade.svg' + if not Utils.exec_command (command): + bld.install_files ('${DATADIR}/' + APPNAME, blddir + '/data/logo-shade.png') + else: + Utils.pprint ('BLUE', "logo-shade could not be rasterized.") + + if Options.commands['check']: + bld.add_subdirs ('tests') + +def shutdown (): + if Options.commands['install'] or Options.commands['uninstall']: + dir = Build.bld.get_install_path ('${DATADIR}/icons/hicolor') + icon_cache_updated = False + if not Options.options.destdir: + # update the pixmap cache directory + try: + command = 'gtk-update-icon-cache -q -f -t %s' % dir + if not Utils.exec_command (command): + Utils.pprint ('YELLOW', "Updated Gtk icon cache.") + icon_cache_updated = True + except: + Utils.pprint ('RED', "Failed to update icon cache.") + if not icon_cache_updated: + Utils.pprint ('YELLOW', "Icon cache not updated. " + "After install, run this:") + Utils.pprint ('YELLOW', "gtk-update-icon-cache -q -f -t %s" % dir) + + elif Options.commands['check']: + test = UnitTest.unit_test () + test.change_to_testfile_dir = True + test.want_to_see_test_output = True + test.want_to_see_test_error = True + test.run () + test.print_results () + + elif Options.options.update_po: + os.chdir('./po') + try: + try: + size_old = os.stat (APPNAME + '.pot').st_size + except: + size_old = 0 + subprocess.call (['intltool-update', '-p', '-g', APPNAME]) + size_new = os.stat (APPNAME + '.pot').st_size + if size_new <> size_old: + Utils.pprint ('YELLOW', "Updated po template.") + try: + command = 'intltool-update -r -g %s' % APPNAME + Utils.exec_command (command) + Utils.pprint ('YELLOW', "Updated translations.") + except: + Utils.pprint ('RED', "Failed to update translations.") + except: + Utils.pprint ('RED', "Failed to generate po template.") + Utils.pprint ('RED', "Make sure intltool is installed.") + os.chdir ('..') + elif Options.options.run: + folder = os.path.dirname (Build.bld.env['waf_config_files'][0]) + try: + ext = 'MIDORI_EXTENSION_PATH=' + folder + os.sep + 'extensions' + nls = 'NLSPATH=' + folder + os.sep + 'po' + lang = os.environ['LANG'] + try: + for lang in os.listdir (folder + os.sep + 'po'): + if lang[3:] == 'mo': + lang = lang[:-3] + else: + continue + Utils.check_dir (folder + os.sep + 'po' + os.sep + lang) + Utils.check_dir (folder + os.sep + 'po' + os.sep + lang + \ + os.sep + 'LC_MESSAGES') + os.symlink (folder + os.sep + 'po' + os.sep + lang + '.mo', + folder + os.sep + 'po' + os.sep + lang + os.sep + \ + 'LC_MESSAGES' + os.sep + APPNAME + '.mo') + except: + pass + command = folder + os.sep + APPNAME + os.sep + APPNAME + print ext + ' ' + nls + ' ' + command + Utils.exec_command (ext + ' ' + nls + ' ' + command) + except: + Utils.pprint ('RED', "Failed to run application.")