pax_global_header00006660000000000000000000000064147551366100014522gustar00rootroot0000000000000052 comment=13e5c3eb6186c62c60ce449ed01a49c89b3adaa0 libfm-1.4.0/000077500000000000000000000000001475513661000126155ustar00rootroot00000000000000libfm-1.4.0/.gitignore000066400000000000000000000011401475513661000146010ustar00rootroot00000000000000Makefile.in* Makefile .[A-Za-z]* *~ *.o *.lo *.la config.* configure depcomp *.pc aclocal.m4 m4/*.m4 autom4te.cache stamp-* libtool ltmain.sh missing install-sh compile *.stamp gtk-doc.make *.mo *.gmo POTFILES LINGUAS fm*-marshal.[ch] *.ui src/actions/*.[ch] *.1 *.desktop src/fm-version.h src/libfm-demo src/libfm-pref-apps src/lxshortcut src/tests/file-search-cli-demo src/tests/fm-path src/vapi/fm-actions.vapi docs/reference/libfm/*/* docs/reference/libfm/libfm-decl* docs/reference/libfm/libfm-overrides.txt docs/reference/libfm/libfm-un* docs/reference/libfm/libfm.* docs/reference/libfm/version.xml libfm-1.4.0/.hgignore000066400000000000000000000016571475513661000144310ustar00rootroot00000000000000syntax: glob *Makefile *.in *.m4 autom4te.cache/* *.desktop *.ui *.pc *.gmo *.Plo *.a *.so *.la *.o *.lo *.lai *.soT *.Po *.dirstamp *.so.* *.exp *.ver ar-lib compile config.guess config.h config.log config.status config.sub configure data/libfm-pref-apps.1 data/lxshortcut.1 depcomp docs/reference/libfm/version.xml gtk-doc.make install-sh libtool ltmain.sh missing po/.intltool-merge-cache po/LINGUAS po/POTFILES po/stamp-it src/.libs/libfm-pref-apps src/.libs/lxshortcut src/actions/action.c src/actions/condition.c src/actions/fm-actions.h src/actions/libfmactions_la_vala.stamp src/actions/parameters.c src/actions/profile.c src/actions/utils.c src/base/fm-marshal.c src/base/fm-marshal.h src/fm-version.h src/gtk/fm-gtk-marshal.c src/gtk/fm-gtk-marshal.h src/libfm-pref-apps src/lxshortcut src/tests/.libs/file-search-cli-demo src/tests/.libs/fm-path src/tests/file-search-cli-demo src/tests/fm-path src/vapi/fm-actions.vapi stamp-h1 *~ libfm-1.4.0/AUTHORS000066400000000000000000000032251475513661000136670ustar00rootroot00000000000000洪任諭 (Hong Jen Yee, aka PCMan) Jürgen Hötzel Andriy Grytsenko (LStranger) External source code taken from other projects: * ExoIconView, ExoTreeView, along with the source code in src/exo: os-cillation e.K, Anders Carlsson, Jannis Pohlmann , Nick Schermer and Benedikt Meurer * Udisks support contains several lines of source code from gnome-disk-utility(gdu-volume.c): Copyright (C) 2007 David Zeuthen, licensed under GNU LGPL Big thanks to all other contributors: Martin Bagge Shae Smittle Vadim Ushakov Andrea Florio Christoph Wickert galtgendo Eugene Tretyak Mateusz Loskot Samuel Stirtzel Martin Kortkamp Abel Fírvida Donéstevez pavel Richard Grenville Mamoru TASAKA Jekyll Wu David Schalig Jonathan Marsden Evangelos Foutras Daniele Forsi Mario J. Rugiero Tsu Jan Nathan Osman Nikita Sirgienko Mahmoud Al-Qudsi Simon Long wb9688 Ingo Brückl Also big thanks to our great translation team. libfm-1.4.0/COPYING000066400000000000000000000355641475513661000136650ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS libfm-1.4.0/ChangeLog000066400000000000000000000000001475513661000143550ustar00rootroot00000000000000libfm-1.4.0/Makefile.am000066400000000000000000000016551475513661000146600ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl NULL= DIST_SUBDIRS = src po data # a little trick against gtk-doc is here SUBDIRS_DOCS = docs EXTRA_DIST_DOCS = \ gtk-doc.make \ docs/Makefile.am \ docs/Makefile.in \ docs/reference/Makefile.am \ docs/reference/Makefile.in \ docs/reference/libfm/Makefile.am \ docs/reference/libfm/Makefile.in \ docs/reference/libfm/libfm-docs.xml \ docs/reference/libfm/libfm-sections.txt \ docs/reference/libfm/version.xml.in pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libfm-extra.pc if EXTRALIB_ONLY SUBDIRS = src else SUBDIRS = $(DIST_SUBDIRS) EXTRA_DIST += \ libfm.pc.in \ libfm-extra.pc.in \ libfm-gtk.pc.in \ libfm-gtk3.pc.in \ po/libfm.pot \ $(NULL) if ENABLE_GTK_DOC DIST_SUBDIRS += $(SUBDIRS_DOCS) SUBDIRS += $(SUBDIRS_DOCS) else EXTRA_DIST += $(EXTRA_DIST_DOCS) endif pkgconfig_DATA += \ libfm.pc \ @LIBFM_GTK_PC@ \ $(NULL) endif DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc libfm-1.4.0/Makefile.decl000066400000000000000000000067511475513661000151740ustar00rootroot00000000000000# GLIB - Library of useful C routines #GTESTER = gtester # for non-GLIB packages GTESTER = gtester # for the GLIB package GTESTER_REPORT = gtester-report # for the GLIB package # initialize variables for unconditional += appending EXTRA_DIST = TEST_PROGS = ### testing rules # test: run all tests in cwd and subdirs test: test-nonrecursive # if OS_UNIX @ for subdir in $(SUBDIRS) . ; do \ test "$$subdir" = "." -o "$$subdir" = "po" || \ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ done # endif # test-nonrecursive: run tests only in cwd test-nonrecursive: ${TEST_PROGS} # if OS_UNIX @test -z "${TEST_PROGS}" || MALLOC_CHECK_=2 MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) ${GTESTER} --verbose ${TEST_PROGS} # endif # test-report: run tests in subdirs and generate report # perf-report: run tests in subdirs with -m perf and generate report # full-report: like test-report: with -m perf and -m slow test-report perf-report full-report: ${TEST_PROGS} @test -z "${TEST_PROGS}" || { \ case $@ in \ test-report) test_options="-k";; \ perf-report) test_options="-k -m=perf";; \ full-report) test_options="-k -m=perf -m=slow";; \ esac ; \ if test -z "$$GTESTER_LOGDIR" ; then \ ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ elif test -n "${TEST_PROGS}" ; then \ ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ fi ; \ } @ ignore_logdir=true ; \ if test -z "$$GTESTER_LOGDIR" ; then \ GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ ignore_logdir=false ; \ fi ; \ for subdir in $(SUBDIRS) . ; do \ test "$$subdir" = "." -o "$$subdir" = "po" || \ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ done ; \ $$ignore_logdir || { \ echo '' > $@.xml ; \ echo '' >> $@.xml ; \ echo '' >> $@.xml ; \ echo ' $(PACKAGE)' >> $@.xml ; \ echo ' $(VERSION)' >> $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.xml ; \ rm -rf "$$GTESTER_LOGDIR"/ ; \ ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ } .PHONY: test test-report perf-report full-report test-nonrecursive .PHONY: lcov genlcov lcov-clean # use recursive makes in order to ignore errors during check lcov: -$(MAKE) $(AM_MAKEFLAGS) -k check $(MAKE) $(AM_MAKEFLAGS) genlcov # we have to massage the lcov.info file slightly to hide the effect of libtool # placing the objects files in the .libs/ directory separate from the *.c # we also have to delete tests/.libs/libmoduletestplugin_*.gcda genlcov: rm -f $(top_builddir)/tests/.libs/libmoduletestplugin_*.gcda $(LTP) --directory $(top_builddir) --capture --output-file glib-lcov.info --test-name GLIB_PERF --no-checksum --compat-libtool LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory glib-lcov --title "GLib Code Coverage" --legend --show-details glib-lcov.info lcov-clean: -$(LTP) --directory $(top_builddir) -z -rm -rf glib-lcov.info glib-lcov -find -name '*.gcda' -print | xargs rm # run tests in cwd as part of make check check-local: test-nonrecursive libfm-1.4.0/NEWS000066400000000000000000001066671475513661000133340ustar00rootroot00000000000000Changes in 1.4.0 since 1.3.2: * Updated translations. * Fixed a vulnerability related to trusted locations. * GCC 14 compilation support. * Updated the list of mime types handled by xarchiver. * Removed mime type definitions provided by shared-mime-info. * Terminals in terminals.list are allowed to have no open_arg entry. * Added germinal, kitty, mintty, and alacritty to terminals.list. * Added a setting for the ISO 8601 date format. * Fixed not setting $DISPLAY on Wayland. * Added a setting to open files with a single middle-click. * Fixed various drag and drop bugs with XDirectSave. * Added a missing filter name. * Enabled smooth scrolling. * Fixed background color with GTK3. * Increased the width of the file properties dialog. * Added the MIME type to the file properties dialog. * Source cache is now cleared after data drop. * Corrected check for the stamp file to rebuild the vala code. Changes on 1.3.2 since 1.3.1: * Fixed all/allfiles parse conditions in FmAction, it was inverted. * Fixed 'SelectionCount' condition parsing in FmAction if '=' was used. * Fix memory access error if home path == desktop path. * Added treating /usr/local/share/ as trusted for *.desktop files. * Fixed value for amount of data transferred in progress dialog. * Fixed preferred height in fm-cell-renderer-text. * Fixed search_window immediately disappearing on Wayland. * Changed thumbnails placement according to the XDG Base Directory Specification. * Changed xarchiver command invocation to create archive. It was incompatibly changed by the author in 2017. * Don't set $DISPLAY for spawned process, let it be inherited from parent. * Fixed memory leak on sn_id in fm-action.c. Changes on 1.3.1 since 1.3.0.2: * Fixed crash on reload while directory changes (folder might be not ready yet). * Changed size of large thumbnails to 512 since 256*256 appears to be small on hi-res displays. * Added application/gzip to archivers.list file next to application/x-gzip. * Added image/x-compressed-xcf to archivers.list file for xarchiver. Changes on 1.3.0.2 since 1.3.0: * Fixed launching menu entries shortcuts on desktop which was broken by making them all executable in 1.3.0 - those should be launchable still. * Fixed installing modules into non-standard path: libtool couldn't relink them properly. Changes on 1.3.0 since 1.2.5: * Added emblem support by reading the "metadata::emblems" attribute provided by GFileInfo. The metadata is provided by gio/gvfs and are currently stored in $XDG_DATA_HOME/gvfs-metadata. * Fixed typo: occured -> occurred. * Made desktop entries treaten as executables. Now clicking on a native desktop file opens a confirmation dialog instead of executing it. Trashed desktop files are only opened as text files and desktop files under system menu (i.e. menu://applications/) are executed without prompt as before. * Fixed build error with vala 0.36.1. * Fixed crash on launching nonexistent link targets. * Added tooltips for attributes of copying files. * Fixed thumbnails generation for files in the thumbnails cache directory which actually should never be done. * Fixed crash on pasting large string when completion matches. * Prevented creation corrupted image thumbnails with gdk-pixbuf2 >= 2.36.1. * Fixed crash in fm_config_load_from_file(). * Dropped displaying "extension" for a directory. * Fixed crash on pasting a file into the search folder, show an error message when the copy destination doesn't exist instead. * Added new API for FmAction new object type, to replace old VALA-generated code. New API is more convenient, C instead of VALA, and should support all DES-API specification features, not just limited set. * Migrated module 'gtk-menu-actions' to new DES-EMA actions API. * Added display of data transferred to progress dialog. * Fixed wrong names for files, copied from Google Drive and similar places. Changes on 1.2.5 since 1.2.4: * Fixed 'Launch in Terminal' issue when custom args were ignored. * Fixed crash with non-UTF regex search pattern. * Added 'termite' into the terminals database. * Fixed possible crash on FmPlacesView. * Fixed crash on non-existent directory listing job. * Added conversion of all URIs schemes to file:/// by mapping them to FUSE-mounted local paths if that is possible. This is required for non-gio applications to open files mounted by gvfs. * Added new MIME type for rar files to the archivers.list file. * Fixed crash in _fm_template_update(). * Fixed incorrect initialization of FmPlacesViewClass, it should not call fm_get_home_dir() but initialized with NULL, that will do the same at runtime. * Fixed FTBFS when libmenu-cache was installed to non-standard location. * Added check for edit name "/" for remote root directory so display name should be used in such cases as more sensible one. * Fixed wrong width requested by FmCellRendererText (1.2.4 regression). * Updated list of MIME types handled by xarchiver. * Don't show error message when attempting to rename file into the same. * Fixed crash after file info job finished on a folder that already left. * Changed limitations on libfm-pref-apps.desktop to show only in LXDE. * Fixed incomplete file copy job pausing in some cases. * Fixed missing 'Empty Trash Can' option in desktop's trash context menu. Changes on 1.2.4 since 1.2.3: * Fixed crash in templates on file that was deleted instantly after creation. * Fixed handling %c in desktop entry Exec key: launch may fail if the application name contains spaces so it needs quoting. * Fixed missing folder info update on folder attributes change. * Use G_SPAWN_DO_NOT_REAP_CHILD on application launch, that should fix a problem with pkexec. * Corrected missing newline at end of generated shortcut desktop entry. * Improved file type detection, it failed in some cases such as DOCX. * Returned back the workaround on thumbnailers which don't save any of Thumb::MTime or Thumb::URI in the thumbnail. * Fixed wrong treating files like ".purple" as having extension "purple". * Fixed invalid desktop entry save if 'Cancel' was pressed in the file properties dialog window. * Fixed issues on dropping folders into Places for bookmarking them. * Fixed crash in expand_exec_macros() on missing Exec line. * Rewritten broken rubberband rendering in icon view for GTK3. * Eliminated usage of GVolumeMonitor if no FmFolder object was created. * Fixed renaming of desktop entries on copy operation error: it was the file name which was set in renaming dialog but it was compared with display name instead when decided whether "Rename" button should be active or not. * Fixed dropping files onto applications shortcuts on the desktop: those should be not "inode/x-shortcut" but "application/x-desktop" instead and therefore handled as any other applications, i.e. allow drop. * Added 'urxvtc' into the terminals database. * Fixed adding user-defined MIME associations into mimeapps.list config. * Few UI adaptations to work with GTK+ 3.10 or newer. * Fixed creating shortcuts on paths with basename started with '?'. * Fixed pointer-related issues with GTK+ 3.10 or newer. * Added 'terminology' into the terminals database. * Fixed stuck tooltip on entering empty folder. * Fixed crash on cancelling FmDirListJob while retrieving is in progress. * Fixed incomplete cleanup on folder reloading. * Corrected autoscrolling to position in view to not include extra space (so not show all the column/row at once but only fully show exactly the item). This may fix a problem with double-click at the end of the file name which is already visible so no scrolling is needed, but if another file in the column/row has longer name then it could bring a scrolling of the column/row, and second click lands out of item area. * Fixed timer shown in progress dialog, it should show 01:00, not 00:60. * Fixed stuck tooltip after right-click on file in view, seen rarely. * Disabled following symlinked directories on recursive search, that may give undesired results duplicating files and in some rare cases even may lead to endless recursion and endless number of files found. * Fixed few small issues with icon view interactive search: - search should be not activated by space key; - cursor was missing in the entry. * Fixed the background of the name of selected file with GTK+ 3.0. * Fixed not-ignored invalid Path= line on launch a desktop entry. * Fixed testing URIs like http://some.host.com for MIME type. * Dropped using shortcuts to URIs like http://host/ as directories, no directory should be in principle used in shortcuts. * Fixed possible data loss on cross-partition data movement. * Fixed incorrect data in the search dialog date selection window. Changes on 1.2.3 since 1.2.2: * Changed licence for libfm-extra and libfm components from GPL-2 to LGPL-2.1. * Fixed crash on dropping URL queries into some folder. * Fixed filename on dropping URI queries into folder: URI query like http://some.site/path/query.php?new=yes&mine=0 should be never saved with file name path/query.php?new=yes&mine=0 but as query.php instead like all the web browsers do. * Disabled debug messages in XML parser, it spammed a lot. * Fixed content type detection which was broken in last release. * Fixed incorrect call to g_environ_setenv() in the terminal call. * Replaced deprecated atk_component_get_position() calls. * Fixed invalid callback get_image_position() on ATK icon of ExoIconView, it could loop and therefore hang the application. * Disabled deprecated atk_focus_tracker_notify() with new libatk. * Fixed installation of headers with parallel install, it could create invalid symlink /usr/share/libfm/libfm in some conditions. * Corrected handling of application launch failure - launch content have to be informed about failure if startup notify id was retrieved from it before. * Fixed usage of POSIX.1-2001 declaration `environ' with GLib < 2.28. * Fixed "out-of-tree" build (e.g. make distcheck). * Corrected menu cache to sync in fm_app_chooser_dlg_dup_selected_app(), otherwise it would not work without menu preloaded. * Fixed launch of applications with %f or %u argument - it should launch not just first file but all of them with the same command. * Fixed unneeded fm-folder-config save even if no changes were made. * Fixed not updated file in FmFolder if file was not changed within last 2 seconds. In case of fast download it was not updated in time. This may cause a little performance issue though due to thumbnails update. * Fixed crash if g_file_get_basename() returns NULL. * Fixed issue with desktop entry file selected in the Application chooser dialog, it tried to execute the desktop entry directly. Now it setups dialog fields from that desktop entry instead. * Fixed problem with unwanted application substitution in the Application chooser dialog: if user selected no name then no replacements should be attempted. * Fixed default app detection in Application chooser combo box. Changes on 1.2.2 since 1.2.1: * Fixed display name of created shortcut after dropping from another application. * Fixed the screen for context in fm_launch_command_simple(). * Added KDE archiver "Ark" into archivers list. * Fixed parsing order of directories in XDG_DATA_DIRS and XDG_CONFIG_DIRS. * Added a possibility for application that was started (by PCManFM or any other application that uses LibFM) to never die after our application (i.e. its parent) was closed. * Fixed possible memory leak in fm_config_load_from_file(). * Corrected g_content_type_guess() call with file sample. This may help with correct file type detection. * When calculate total file sizes in directory, filesize of directory now is skipped. * Fixed problem with memory consumption in case image has big dimension but not so big filesize - in that case loading may consume all the available memory to create bitmap. The file dimensions should also be checked against thumbnail_max configuration variable. * Fixed problem with starting custom command from application selection dialog. This stopped to work with new GLib versions. Changes on 1.2.1 since 1.2.0: * Fixed incorrect presence of LXShortcut in menus. * Fixed context menu on right-click on column header, it was not always shown, especially with GTK3. * Fixed incorrect mime-type of mount points under computer:///. * Few fixes in internal thumbnail generator. * Changed info message on usage of x-terminal-emulator as terminal. * Added sakura, qterminal and lilyterm into terminals database. * Don't create ~/Templates if it does not exist on application start. * Fixed installing extra files with different values for --with-gtk. * Fixed file renaming if it's name is illegal on destination filesystem. * An error window after user pressed 'Cancel' on app selection should be not shown anymore. * Fixed menu positioning if it's placed near monitor edge and also on non-first monitor, also ensured menu UI update before calculating its position. * Fixed cancellation of loading row after FmDirTreeView chdir. * The "link" mark on icons of small size (< 20 px) now scaled properly. * Fixed positioning of search box in ExoIconView widget. * Fixed fm_terminal_launch(), some terminals need PWD environment set. * Fixed invalid rubberbanding after doubleclick on ExoIconView items. * Corrected drag cursor, it should correctly show dragged item icon, not generic drag cursor. * Fixed crash in fm_folder_view_scroll_to_path() if path is not available. * Fixed unitialized variable usage in folder view context menu positioning code. * Prevented path entry from containing "(invalid encoding)" string since it will prevent that path from being used. * Fixed path completion listing for display names in paths. * One-time custom application isn't added anymore into list of last used. * Added a workaround on duplicated loop devices in Places sidebar. * If quick_exec option is set to true, launching will always start the application, not try a terminal for it. * Changed ExoIconView rubberbanding the same way as it's done in GTK+. * Fixed invalid renaming files on moving them around virtual FS. * Fixed crash in vfs-menu module with libmenu-cache 0.3.x. Changes on 1.2.0 since 1.1.0: * ABI bumped to 4. * Added 'auto_selection_delay' option into config file, defaulted to 600, which defines interval in milliseconds before folder item is selected in single-click mode. Setting to 0 disables autoselection. * Added 'drop_default_action' option into config file, which defines how to act when some file(s) were dropped onto destination widget and no modificator key was pressed. Default is 0 (Auto). * Added 'confirm_trash' option into config file, defaulted to true, which defines whether moving files to trash can should be confirmed by the user. Previously this confirmation was defined by the 'confirm_del' option but now those two are separated. * Added 'show_full_names' option into config file, defaulted to false, which defines whether long names in icon view should be shown as it is or truncated to reasonable height. * The Places View made customizable. New section '[places]' added into config file with an option for each standard item (Home, Desktop, Trash, and Applications). * Added new Places View items: File system, Computer, and Network. All new items are disabled by default. * The option 'places_unmounted' in config file defines whether volumes from /etc/fstab that aren't mounted should be shown in Places View sidebar or not. This option should be not present in the Preferences dialog the same as 'advanced_mode' one. Defaulted to true therefore default behavior is the same as before. * Context Menu on folder now available by Ctrl+Menu keypress while the selection context menu is available by Menu (or Shift+F10) keypress. * Implemented reordering bookmarks in Places View via context menu. * Greatly improved accessibility on every widget. * Added an option 'Add to Bookmarks' into file context menu. Available only if exactly one file is selected and that file is a directory. * Implemented dropping files onto Directory Tree View (sidebar) items. * Added terminal list file. There is no need to add '-e %s' or similar to 'terminal' config file statement, it will be ignored from now on but predefined command line options from terminal list file will be used instead. * Added possibility to keep terminal window open after command execution. It depends on chosen terminal though: some terminals allow this (such as xterm, konsole, urxvt) but some doesn't (lxterminal). * Added optional program name for custom application. If no program name is entered then application's association with mime type will be not remembered and created application desktop entry file will be removed from user's applications directory. Otherwise entered name will be shown in list of applications for that mime type instead of file name (that was old behavior). * New class FmTemplate for full templates support. Templates support also added into folder context menu replacing old hardcoded menu for the Empty Text File and Shortcut. To be more lightweight it is created once per folder view and isn't updated if user added or removed some template while the view window is still opened. If this will cause any inconveniences this behavior may be changed but that will make the folder context menu less lightweight to appear. * Added 'only_user_templates' option into config file, defaulted to false, which defines whether only user defined templates should be shown in the folder context menu or system defined should be shown too. * Added 'template_run_app' option into config file, defaulted to false, which defines whether default application for appropriate MIME type should be ran after successful creation of file from template. There is also button in the dialog to change this default per creation. * Added 'template_type_once' option into config file, defaulted to false, which defines two modes for templates appearance. If this option is set to false then only those duplicates will be ignored which have the same file name, and label in popup list will be set to template file name without last suffix. If this option is set to true then only one template of each MIME type will be shown, it will have label from MIME type description. In both cases if any search directory has desktop entry matching this template (or template itself is defined by the desktop entry file) then value of 'Name' from it will override that autogenerated label. * Added a possibility to have tooltips in popups (GTK itself has no such possibility). * Added menu item "Empty File" back into folder context menu. * The 'no_usb_trash' option now has default to 1 (true). * Added support to remember columns width for FmFolverView. The columns widths are changeable only in Detailed List View though. Any change in columns layout will emit a "columns-changed" signal so application may connect handler to it and save columns layout into config file. * Implemented columns extension APIs which allows application to add own custom columns into any FmFolderModel - it registers handler for such column and any view which uses the model can use it after that. * Thumbnails loader code moved from libfm-gtk into libfm. Application can use custom image callbacks therefore external thumbnailers can be called independent from application-specific image representation, thumbnail generator will create thumbnail file and that thumbnail will be loaded outside of libfm. * Setting 'thumbnail_max' to 0 will mean unlimited size from now on. * Added file properties dialog extension API. Application can add own handler to modify file properties dialog for certain MIME type files. * Implemented file properties dialog extension for desktop entry file type - opening file properties dialog for single desktop entry will be extended by third tab ('Desktop Entry') with few desktop entry properties such as command to execute. Icon also becomes clickable (and focusable as well, can be activated by Space key when focused), activation will present icon choose dialog. The implementation was partially taken from LXShortcut utility. Icon change dialog is also available for any single file which allows icon change. * Disallowed default desktop path (by fm_path_get_desktop()) to be equal to home directory since it may be too dangerous. If it is set to home directory then it will be shifted to ~/Desktop. * Added 'shadow_hidden' option into config file, defaulted to false, which allows icons of hidden files to be shadowed in view. * Added GFileMonitor implementation for menu:// VFS. * The 'Permissions' tab in the file properties dialog will be hidden if permissions (owner/group and access flags) aren't available to get for the selected file(s). * Added file operations for menu:// VFS, therefore any application which uses libfm can do desktop menu editing. Supported operations are now: - create new application in any menu folder; - change some application properties (contents of desktop entry); - delete some application from menu; - move the application from some menu folder to another one; - create new folder in the menu (it is hidden initially); - delete some folder from the menu. Folder creation and deletion operations are disabled if used with libmenu-cache older than 0.5.0 because you cannot see hidden folders with older libmenu-cache and therefore you cannot see newly created folder too (empty folders are hidden from menu in accordance with XDG menu specification). * New class FmXmlFile which is simple container which allows to load and parse XML text, do desired changes, and finally compose changed data into XML text back. It has very few simplifications: - only UTF-8 encoding is supported; - no user-defined entities (those should be converted externally); - processing instructions, comments and the doctype declaration are parsed but are not interpreted in any way. * Added one more library: libfm-extra. It contains only FmXmlFile for now. The purpose for separated library is that it can be used where libfm cannot be - for example in menu-cache utilities. This library can be compiled separatedly from other libraries, use the configure script option --with-extra-only for that. * Implemented support for hidden menu applications and folders. Those are visible in folder view only when 'Show hidden' is on. This will work only with libmenu-cache 0.5.0 or newer. * Default behavior of drag and drop files on desktop is changed: if file dropped to desktop is some remote URI (a web link for example) then shortcut will be created; if file is a file under home directory (so it is most likely some special directory and should be never moved) then a symlink will be created; otherwise the file will be copied or moved as usual. This "smart link" behavior is applied only if option 'drop_default_action' is set to 'auto'. * Added 'smart_desktop_autodrop' option into config file to enable or not abovementioned "smart link" behavior. Its default is true to protect inexperienced users, the old behavior can be returned by setting this option to false. * Implemented creating shortcuts (desktop entries with Type=Link) so it is possible now to drop a link from browser to desktop, for example, and that link will be opened with default browser when you click on it. And you can edit display name and icon of created shortcut to your preference. * Added basic support for detecting target type of shortcuts. If type of target content cannot be determined then content type of shortcut will be set to "inode/x-shortcut". * Added APIs to test possibility and change display name, icon, "hidden" attribute of file, and target of shortcut. * File name is shown if file properties dialog window along with display name if it is different from displayable one. * If access or modification time aren't available for the file then they will be not shown instead of stupid "01 Jan 1970" date. * File can be renamed in the file properties dialog now. The entry will be disabled if target file system doesn't support file renaming. * The "link" icon mark in left upper corner of icon is shown on shortcuts the same way as it is shown for symlinks. It is reasonable since any shortcut is the same thing - link to another resource. * New interface for loadable modules (plugins). Modules can be made by third party as well. Modules will be loaded on first demand and never reloaded so if you add or remove some module then you have to restart your application. * Added 'modules_blacklist' option into config file to disallow certain modules to load. The wildcard char '*' is allowed and matches any number of characters. To match '*' itself it should be escaped with two backslashes (\\), due to key file format. The option is a string list, each string may be just a type to blacklist, or type mask and name mask, divided by a colon (:). * Added 'modules_whitelist' option into config file as a exceptions list from the 'modules_blacklist' option. Format is the same. * Created interfaces for loadable modules: - vfs (virtual file system) - gtk_file_prop (GTK file properties dialog extension) - gtk_folder_col (FmFolderModel custom column) - gtk_menu_scheme (GTK context menu extension for URI scheme) - gtk_menu_mime (GTK context menu extension for file MIME type) * Moved all VFS into loadable modules. * Moved desktop entry file properties extension into loadable module. * Rewritten context menu creation with loadable modules. Loadable modules have key either URI scheme, or MIME type. * Customized Trash Can context menus with separate module. * Added test if the directory is read-only and update context menus appropriately. * FmPathEntry shows real display name now instead of forged UTF-8 one. It is more logical if we enter directory "Multimedia" and end up in the "Multimedia" rather then in "AudioVideo". It works for entry path and for path completion as well (naturally, it was impossible before). * The fm_path_display_name() API now returns real display name in most of cases instead of forged UTF-8 one. * Added 'defer_content_test' options into config file which defined if deferred content type test should be applied. Deferred content type test means the MIME type and icons of FmFolder items will be based only on file name for native files but their actual content will be tested later, after signal "finish-loading" was already emitted. If verified content type differs from early estimation then the signal "files-changed" will be emitted later. If option 'defer_content_test' is unset then old behavior (emit "finish-loading" only after all the info is retrieved) will happen. * The option 'drop_default_action' is saved in more portable way - not the number but text. Therefore if that list will be ever changed then it will be still accepted by libfm right way. * Added support for 'hidden' file attribute into file context menu and file properties dialog. * Added options 'SortIgnoreCase' and 'MingleDirs' into folder context menu. * The FmIcon class is implemented using GIcon instead, greatly reducing number of APIs used for cached icons support. * Implemented extensions for context menu on Sidebar items, similar to those that are done for FmFileMenu or FmFolderMenu. Application must remember file on which menu was activated and use it in own callback if it was activated. * Disabled attempt to drop files into folders on read-only file system. * The item "Delete" in context menu now changes appearance between Trash and Remove in dependency if Shift key is pressed. * Implemented little popup menu if option 'drop_default_action' is set to 'ask' - it shows 'Copy', 'Move', 'Link', and 'Cancel' choices when some files are dropped onto widget controllable by libfm drag&drop. * Added support for + drop: it will show the abovementioned menu with choices. * Allowed dropping file into the same directory if 'drop_default_action' is set to 'ask' - it shows 'Link' and 'Cancel' choices therefore it is possible to create symbolic link onto the file by drag&drop. * If last access right change time is available for file then it will be shown in the file properties dialog. * Broken symlinks are shown with appropriate icon "dialog-warning". * Added API to suspend execution of running FmJob. This API applied to progress dialog therefore it will be possible to pause and resume any file operations jobs in middle. This may be useful in some cases. * Added 'list_view_size_units' option into config file, unset by default, if set then defines which units will be used in the Size column in Detailed List View mode, similar to those used in 'du' Unix utility: 'h' for ISO units, 'H' for SI units, 'k' for KiB, 'm' for MiB, 'g' for GiB, 'K' for kB, 'M' for MB, 'G' for GB. If not set then default mode (by 'si_unit' config option) will be used. * Added 'quick_exec' option into config file, false by default. If set to true then libfm-gtk will not ask for options on launching executable file but will do default action: run in terminal for any executable script or run directly for other executable files. * Implemented hiding items in Places View (Applications, Trash Can, etc.) if appropriate support is missing (no GVFS support or no module). * Implemented advanced version of lxshortcut application as one more tool based on libfm-gtk. * Sealed all the private data in objects. Applications should exclude use of sealed data and use accessor functions instead. For old code the workaround may be used - define FM_DISABLE_SEAL in compiler options. * Added 'format_cmd' option into config file. If set then "Format volume" option will appear on local non-mounted volumes which allows user to reformat USB stick for example. The example of setting for the option is "/usr/lib/gnome-disk-utility/gdu-format-tool -d", that will call well known component of Gnome Disk Utility. * Implemented internal workaround for GIO inotify delay - operations with files are reflected in view instantly now, without delay of 1 second. * Added new class FmMenuToolItem - simplified GtkMenuToolButton with only menu button arrow without button that it is bound to. * Applied common human interface guidelines to capitalization of strings. Changed some names that might be ambiguous: 'Computer' to 'Devices'. * Added new object FmFolderConfig for abstract access for folder-specific configuration values as key/value pairs (similarly to GKeyFile). * Added support for adding an optional icon in FmTabLabel before the text in the label. * New API fm_side_pane_set_show_hidden() for change visibility of hidden file in side pane (if the mode supports that). * Implemented support for hidden files in FmDirTreeModel. * Implemented more flex access to FmSidePane modes to allow extensions in the future. * Added option 'Copy Path(s)' into selection context menu to allow user copy text representation of path(s) as simple text list delimited by newline into the clipboard. * Changed search:// paths delimiter to be ',' instead of ':'. * Corrected strings in the application chooser dialog. * Config file isn't enforced to be rewritten anymore when fm_finalize() is called. The application should control that process instead. This will speed up application termination because when config is changed then the application will save config. Doing it on exit is a plain waste of resources: we rewrite what is already written but spend both CPU and disk I/O on it. * Press in FmPathEntry in case if completion ended in single match will append a slash to the completed directory name. * New API fm_side_pane_set_home_dir() for change the directory path which will be used on activating 'Home' item in side pane. * New API fm_folder_view_scroll_to_path() to scroll folder view to some path and optionally focus it. * If files that file properties dialog is open for contain a directory then file properties dialog will show file counting progress with total number of files involved. * Added new built-in column in FmFolderModel - Extension (last suffix of the displayable name) as alternative to file type for some old-style users. * Search dialog options are remembered now between searches. Search path and 'Properties' tab are not saved though. * Added fallback icons for folder and file in case if no usable theme was set in user GTK environment. * A whole lot of bugfixes. Changes on 1.1.0 since 1.0.1: * Added 'no_usb_trash' option into config file, defaulted to 0, which defines whether skip trashing files on removable media or not. If defined to skip then files will go into "trash-unsupported" and user will be asked by fm_file_ops_job_run_with_progress() to remove them instead. * Added 'no_child_non_expandable' option into config file, defaulted to 0, which adds feature to hide expanders on non-expandable rows so no extra 'No Sub Folder' rows are shown. No automation on that is done still since it may be expensive sometimes. * Corrected underscores (mnemonics) on every menu and dialog. * Fixed GTK+ 3.0 compatibility problems. Libfm can be compiled with Gtk 2.18 ... 3.x and Glib 2.22+ currently (if glib < 2.26 or vala < 0.13 still requires run configure --disable-actions). Added new switch to configure script --with-gtk=N where N is GTK+ generation to be used, may be either 2 or 3. Default is 2. * Enabled option to Unmount removable media without ejecting it. * Migrated menu:// support into built-in VFS. There will be support for menu editing functions later. * Added search engine. Supports search:// URIs and has the UI represented by API fm_launch_search_simple(). * Full name in Icon View mode now shown in tooltip while long names are placed under icons in truncated form. * Added ability to change columns of view. Works only for Detailed List View in FmStandardView widget for now. Implementation for other modes and widgets will come later on demand. * Added a FmSortMode enumerator (similar to GtkSortType) with few modes specific fo file manager (ascending/descending is one of new modes). * Sorting set/get functions moved from FmFolderView into FmFolderModel. Sorting isn't remembered by implementations of FmFolderView anymore so application should set sorting explicitly after creation of new FmFolderModel instance. Previously FmFolderView remembered it and no explicit setting was required. * A lot of lesser bugfixes. Changes on 1.0.1 since 1.0.0: * Fixed slowness on loading and changing of very large folders. * FmFolderView is converted into generic interface. Former FmFolderView is renamed into FmStandardView so APIs specific to it have changed their names and arguments. Old APIs left for compatibility reasons. New FmFolderView interface now contains methods to handle popups, keyboard and mouse gestures, including Cut/Copy/Paste operations. * Fixed compatibility with systems that are a bit old so have neither decent Vala compiler nor GLib 2.26. * Few lesser bugfixes. libfm-1.4.0/README000066400000000000000000000026661475513661000135070ustar00rootroot00000000000000Notes for compilation: 1. This library requires: - Libtool. - Intltool 0.40.0 or newer. - GLib 2.22.0 or newer. - GTK+ 2.18.0 or newer. - Libmenu-cache 0.3.2 or newer. 2. Optional dependencies: - Gtk-doc-tools 1.14 or newer. - Dbus-Glib-1. - Libexif. Notes for runtime environment: 1. The file alteration monitor is done via GFileMonitor built into glib. It relies on inotify on Linux, kqueue on FreeBSD, and FAM or gamin on others. On Linux, no additional dependency is needed. However, for systems like NetBSD, you may need a working FAM daemon. 2. To get remote filesystem support, trash:///, and computer:/// support, libfm needs gvfs. Please install gvfs and its related backends if you need these features. 3. Volume management is done with glib, which relies on gvfs. If you don't want to use gvfs, try the --enable-udisks configure option. Libfm has a built-in volume management implementation done with udisks. However, it's still experimental and may be unstable. Use gvfs whenever possible. 4. If you're using Linux, mounting volumes without root privileges is supported by gvfs and udisks, given you have correct policy-kit configurations. If you have problems mounting/unmounting devices, check your policykit configurations. Either your permission settings are wrong, or there is no policykit agent running. There must be something wrong and it's not a bug of libfm/pcmanfm. libfm-1.4.0/TODO000066400000000000000000000177501475513661000133170ustar00rootroot00000000000000[High Priority] * File operations: move, copy, trashing, ... Improve error handling. should provide multiple destination files for recovering trashed files. Check available disk size prior to moving/copying. Do mounting on demand. Calculate speed and show remaining time. * Fix idle handlers with proper g_source_is_destroyed(). * File monitor: Queue files which are already processed in file operations, and send change notifications in timeout handlers to improve performance. * Dnd Dnd destination, drop site handling. => Almost done For drag source, use file:///~/.gvfs/ rather than its original URL scheme to be compatible with other programs => need more survey => g_file_new_for_uri, and then g_file_get_path can return gvfs fuse path. Refuse drop if the user doesn't has access to destination dir. Fix incorrect drop target item of icon view mode. => done Fix incorrect design of 'query-info' signal. Implement XDS support => done, but in a quite dirty way. * Thumbnails, may be cached with hash table to speed up loading. Need to support external thumbnailers. Thunar can directly load embedded thumbnail in jpeg files, we need that, too. Size of cell renderers and ExoIconView item size must be adjusted for Thumbnail View. * Mount volumes and mount points when needed This already works with remote URLs. Need to be done for removable devices. => partially done Now mounting works when the user click on a volume in side pane. Not available yet in computer:/// * path resolution and canonicalization: convert ../ and ./ gracefully Partially done. fm_path_new_relative and fm_path_new_child handles . and .. Need to show canonicalized paths in location bar. * FmFileMenu should provide special menu items for special paths For example: Provide totally different menus for items in computer:/// Provide "Uninstall" for items in applications:/// (requires integration with package-kit) * File searching utility => Subclass FmFolder and provide FmSearchFiles The search result can be given to a GtkTreeModel for display. * Add filter to FmFolderModel, so we can only show specific files. The API can be compatible with GtkFileFilter used by GtkFileChooser. The hidden parts can be stored in model->hidden GSequence. * Select destination files when copy or move is finished. Can use g_object_set_data to associate a FmFolderView with FmJob. * Support symlink creation. * Add reserved data members to structs to padding for future expansion. * Use a forked version of xdg_mime included in glib/gio to do faster mime-type detection. * Bug: clicking on detailed view's column to change sorting didn't update the sort sub menu in main menu. * Implement our own empty trash API since delete a file in trash:/// with g_file_delete really sucks. * Implement our own trash can since the one provided by gvfs really sucks! * Maybe we can add a gtk+ module and register our own implementation of GtkFileChooserWidget. * Handle self-mangled symlinks. * Make fm_launch_paths more user-friendly so pcmanfm can use it to handle files_to_open. * Refactor FmFolderView and make a separate class named FmListView, which encapsulate a generic composite widget combining ExoIconView and GtkTreeView. Then, derive FmFolderView from it. [Medium Priority] * API renaming: when a returned value was allocated or ref_count is increased, the API should use _dup_ rather than _get_. currently there are inconsistent naming convention among different modules. _get_for_, new_from_, _get_from_, and simply _get_ are used in different places where APIs have similar behaviors. * API redesign: maybe abstract classes like FmBasicView or FmBasicWin were needed. in this way, both desktop window and folder views can have the same behavior through the same interface. example: FmBasicView { sort(); show_hidden(); get_popup_menu_ui(); get_selected_files(); select_all(); } * Better clipboard handling => almost done Can we be more compatible with GNOME and XFCE? Already compatible with KDE/Dolphin Partially compatible with gnome and xfce. Clipboard operation done by libfm doesn't seem to be noticed by nautilus. Cause? maybe related to clipboard monitoring? * Custom actions for specific file types. integration with archivers is a must have, but how? Maybe we can use the implementation proposed by KDE. (Compress / Extract are now supported in another way.) * GtkFileChooser style path button bar. (can take the one in gtk) * Bring some fallback icons (application-x-generic and folder) along with the package of libfm to work without icon themes. * Warn the user for insufficient disk space before file operations. GFileInfo:G_FILE_ATTRIBUTE_FILESYSTEM_FREE before calculating total size, and store this value in FmFileOpsJob. During calculation, if total size already exceeds free space available, prompt the user, and also provide an option to skip this. * Support "Send To..." => Need to see how thunar does this. * Auto-mounting => partially done * Support mount specific filesystem encoding in the future. Now we only handle UTF-8 for simplicity. Those settings can be stored in FmConfig? * Inter-process config change notifications: fm_config_notify should cache all notfications. Then, pack all changed values in a buffer and pass it to a notifier function set with fm_config_set_notify_hook. fm-gtk can use this hook to send the changed values via X11 root window properties or dbus. * Implement our own gio extension points to override some bad stuff in gio/gvfs. Pass highest priority value to g_io_extension_point_implement() if we're under LXDE might be a good idea. * Add "Create New" to popup menu of folder. => partially done, quite dirty. ==> need refactor * Show available disk space in status bar => done, but in a slightly dirty way. ==> need refactor * While create user-custom desktop files, search for existing ones, and only add new mime-types to existing user-custom desktop files to prevent creating too many duplicated desktop files for the same app. [Low Priority] * Constraint memory usage of FmIcon cache. Periodically removed rarely used items might be needed. * Add FmGesture to support mouse gesture. (low priority) Maybe this should in another lib to be used in other programs, too. * Hide computer:///, network:///, and disable trash:/// if gvfs is not available. * Implement fm_list_concat_glist to add a GList* to FmList or to convert a GList to FmList by fm_list_new followed by fm_list_concat_glist() * Expose a set of dbus interfaces/services so other applications can call libfm to do file operations without being linked with it. Or, this should be implemented in the level of file managers, like in pcmanfm? If this is going to be supported, write a freedesktop.org spec for it. * Display tooltips for folder items * Documentation, can be done with gtk-doc [Very Low Priority] * Fork gvfs to make it gnome-free. * Add gio extension modules to override the ones provided by gvfs. * Provide a wizard to clean temporary files from the filesystem to get more usable disk space. => a disk cleaner is needed. This can be showed to the user when there is not available disk space. * Periodically remove thumbnail caches Maybe it's a better idea to handle this in disk cleaner wizard. * Enable showing .. in list view mode. * Add a right pane to list all opened folders instead of using tabs. Quite useful for wide screen and can save taskbar space. Very convinient when you need to work with files in many different folders * Support saving currently opened folders as a session, and the saved session file can be loaded later by double click on it. This is especially useful for developers and can be used for project management libfm-1.4.0/acinclude.m4000066400000000000000000000021551475513661000150110ustar00rootroot00000000000000dnl This library is free software; you can redistribute it and/or dnl modify it under the terms of the GNU Lesser General Public dnl License as published by the Free Software Foundation; either dnl version 2.1 of the License, or (at your option) any later version. dnl dnl This library is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl Lesser General Public License for more details. dnl dnl You should have received a copy of the GNU Lesser General Public dnl License along with this library; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA dnl AC_CHECK_LDFLAG(CACHEVAR, FLAGS, APPENDVAR) AC_DEFUN([AC_CHECK_LDFLAG], [AC_CACHE_CHECK([whether the target compiler accepts $2], $1, [$1=no echo 'int main(){return 0;}' > conftest.c if test -z "`${CC} $2 -o conftest conftest.c 2>&1`"; then $1=yes else $1=no fi rm -f conftest* ]) if test x${$1} = xyes; then $3="$2 ${$3}"; fi ]) libfm-1.4.0/autogen.sh000077500000000000000000000023271475513661000146220ustar00rootroot00000000000000#! /bin/sh AC_VERSION= test -n "$SRC_DIR" || SRC_DIR=$(dirname "$0") test -n "$SRC_DIR" || SRC_DIR=. OLD_DIR=$(pwd) cd "$SRC_DIR" AUTOMAKE=${AUTOMAKE:-automake} AM_INSTALLED_VERSION=$($AUTOMAKE --version | sed -e '2,$ d' -e 's/.* \([0-9]*\.[0-9]*\).*/\1/') # FIXME: we need a better way for version check later. case "$AM_INSTALLED_VERSION" in 1.1[1-9]) ;; *) echo echo "You must have automake >= 1.11 installed." echo "Install the appropriate package for your distribution," echo "or get the source tarball at http://ftp.gnu.org/gnu/automake/" exit 1 ;; esac if [ "x${ACLOCAL_DIR}" != "x" ]; then ACLOCAL_ARG=-I ${ACLOCAL_DIR} fi GTKDOCIZE=`which gtkdocize` if test "x${GTKDOCIZE}" = x; then echo "You need gtk-doc to build this package." echo "http://www.gtk.org/gtk-doc/" exit 1 fi test -d m4 || mkdir m4 set -ex gtkdocize --copy ${ACLOCAL:-aclocal$AM_VERSION} ${ACLOCAL_ARG} ${AUTOHEADER:-autoheader$AC_VERSION} --force AUTOMAKE=$AUTOMAKE libtoolize -c --automake --force AUTOMAKE=$AUTOMAKE intltoolize -c --automake --force $AUTOMAKE --add-missing --copy --include-deps ${AUTOCONF:-autoconf$AC_VERSION} rm -rf autom4te.cache if test -n "$DOCONFIGURE"; then ./configure $@ fi cd "$OLD_DIR" libfm-1.4.0/checks/000077500000000000000000000000001475513661000140555ustar00rootroot00000000000000libfm-1.4.0/checks/README000066400000000000000000000005401475513661000147340ustar00rootroot00000000000000This directory contains files or tools used to check the source code. The files inside this directory should not be included in any distributed tarballs. Files skip_files and skip_symbols are used with min-lib-ver.py in lxde/devtools. It's a tool used to check minimal required gtk+ version. Usage: min-lib-ver.py -F skip_files -S skip_symbols ../src libfm-1.4.0/checks/skip_files000066400000000000000000000002041475513661000161240ustar00rootroot00000000000000base/fm-marshal.c base/fm-marshal.h gtk/fm-gtk-marshal.c gtk/fm-gtk-marshal.h gtk-compat.h gtk-compat.c glib-compat.h glib-compat.c libfm-1.4.0/checks/skip_symbols000066400000000000000000000000431475513661000165130ustar00rootroot00000000000000gdk_display_get_app_launch_context libfm-1.4.0/configure.ac000066400000000000000000000256521475513661000151150ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) AC_INIT([libfm], [1.4.0], [http://pcmanfm.sourceforge.net/]) AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects no-dist-gzip dist-xz -Wno-portability]) AC_CONFIG_MACRO_DIR(m4) AC_CONFIG_HEADERS([config.h]) dnl Support silent build rules. Disable by either passing --disable-silent-rules dnl to configure or passing V=1 to make AM_SILENT_RULES([yes]) dnl version of API generation FMLIBVER="1.0" # automake 1.12 requires AM_PROG_AR. m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) # Checks for programs. AC_PROG_CC AM_PROG_CC_C_O AM_PROG_LIBTOOL # Test if we address libfm-extra compilation only AC_ARG_WITH(extra-only, [AC_HELP_STRING([--with-extra-only], [disable all components but libfm-extra library])], [extra_only="${withval}"], [extra_only=no] ) AM_CONDITIONAL(EXTRALIB_ONLY, [test x$extra_only = xyes]) # Vala AC_ARG_ENABLE(old-actions, [AC_HELP_STRING([--disable-old-actions], [disable old custom actions code if you have no decent Vala compiler])], [enable_actions="${enableval}"], [enable_actions=yes] ) AM_COND_IF(EXTRALIB_ONLY, [enable_actions=no]) if test x"$enable_actions" = xyes; then dnl no vala compiler required when sources are from dist tarball if test -f $srcdir/src/actions/libfmactions_la_vala.stamp; then AM_PROG_VALAC else AM_PROG_VALAC([0.13]) if test x"$VALAC" = xvalac; then AC_ERROR([No Vala compiler found but it is required.]) fi fi ACTIONS_SUBDIR='actions' AC_DEFINE(HAVE_OLD_ACTIONS, 1, [Define to 1 to enable old custom actions code]) else ACTIONS_SUBDIR= fi AC_SUBST(ACTIONS_SUBDIR) AM_CONDITIONAL(HAVE_OLD_ACTIONS, [test x$ACTIONS_SUBDIR = xactions]) # Checks for libraries. # Checks for header files. AC_HEADER_STDC # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. dnl AC_FUNC_MMAP AC_SEARCH_LIBS([pow], [m]) AC_SEARCH_LIBS(dlopen, dl) # Large file support AC_ARG_ENABLE([largefile], AS_HELP_STRING([--enable-largefile], [enable Large file support (default: yes)]), largefile=$enableval, largefile="yes") if test x"$largefile" = x"yes"; then CPPFLAGS="$CPPFLAGS -D_LARGEFILE_SOURCE -D_REENTRANT -D_FILE_OFFSET_BITS=64" AC_DEFINE(_LARGEFILE64_SOURCE, 1, [Whether to enable large file support]) AC_DEFINE(_FILE_OFFSET_BITS, 64, [File offset bits]) fi # intltool IT_PROG_INTLTOOL([0.40.0]) dnl libgtk version AC_ARG_WITH(gtk, [AC_HELP_STRING([--with-gtk=VER], [choose Gtk+ version for libfm-gtk build (default=2)]) AC_HELP_STRING([--without-gtk], [disable libfm-gtk build])], [ac_with_gtk="${withval}"], [ac_with_gtk=2] ) AM_COND_IF(EXTRALIB_ONLY, [ac_with_gtk=no]) # modules required if test x"$enable_actions" = xyes; then gio_modules="gio-unix-2.0 >= 2.26.0 glib-2.0 >= 2.26.0" else gio_modules="glib-2.0 >= 2.22.0 gio-unix-2.0" fi gio_modules="$gio_modules gthread-2.0 gobject-2.0" PKG_CHECK_MODULES(GIO, [$gio_modules]) AC_SUBST(GIO_CFLAGS) AC_SUBST(GIO_LIBS) if test x"$ac_with_gtk" != xno; then case "$ac_with_gtk" in 3|3.*) pkg_modules="$gio_modules gtk+-3.0 pango >= 1.16.0 cairo >= 1.8.0" LIBFM_GTK_LTLIBRARIES=libfm-gtk3.la LIBFM_GTK_PC=libfm-gtk3.pc ac_with_gtk="3.0" ;; *) pkg_modules="$gio_modules gtk+-2.0 >= 2.18.0 pango >= 1.16.0 cairo >= 1.8.0" LIBFM_GTK_LTLIBRARIES=libfm-gtk.la LIBFM_GTK_PC=libfm-gtk.pc ac_with_gtk="2.0" ;; esac PKG_CHECK_MODULES(GTK, [$pkg_modules]) LIBFM_PREF_APPS="libfm-pref-apps lxshortcut" else dnl automake uses GTK_CFLAGS for glib-compat.c compilation GTK_CFLAGS="${GIO_CFLAGS}" GTK_LIBS= LIBFM_GTK_LTLIBRARIES= LIBFM_GTK_PC= ac_with_gtk="none" LIBFM_PREF_APPS= fi if test "$ac_with_gtk" = "3.0"; then CFLAGS="$CFLAGS -Wno-deprecated-declarations" fi AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) AC_SUBST(LIBFM_GTK_LTLIBRARIES) AC_SUBST(LIBFM_PREF_APPS) AC_SUBST(LIBFM_GTK_PC) AM_CONDITIONAL([ENABLE_GTK], [test x$ac_with_gtk != xnone]) dnl pango_modules="pango >= 1.16.0" dnl PKG_CHECK_MODULES(PANGO, [$pango_modules]) dnl AC_SUBST(PANGO_CFLAGS) dnl AC_SUBST(PANGO_LIBS) dnl gmodule may be used for libfm-chooser-hack.la #gmodule_modules="gmodule-2.0" #PKG_CHECK_MODULES(GMODULE, [$gmodule_modules]) #AC_SUBST(GMODULE_CFLAGS) #AC_SUBST(GMODULE_LIBS) AM_COND_IF(EXTRALIB_ONLY, [MENU_CACHE_CFLAGS= MENU_CACHE_LIBS=], [menu_modules="libmenu-cache >= 0.3.2" PKG_CHECK_MODULES(MENU_CACHE, [$menu_modules])]) AC_SUBST(MENU_CACHE_CFLAGS) AC_SUBST(MENU_CACHE_LIBS) dnl check for menu-cache versions 0.4.x since no macro MENU_CACHE_CHECK_VERSION dnl is available in those versions LIBS_save="${LIBS}" LIBS="${LIBS} ${MENU_CACHE_LIBS}" AC_CHECK_FUNCS(menu_cache_dir_list_children) LIBS="${LIBS_save}" # special checks for glib/gio 2.27 since it contains backward imcompatible changes. # glib 2.26 uses G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME extension point while # glib 2.27 uses x-scheme-handler/* mime-type to register handlers. PKG_CHECK_MODULES(GLIB2_27, [glib-2.0 >= 2.27.0], [have_scheme_handler="yes"], [have_scheme_handler="no"]) AM_CONDITIONAL(HAVE_SCHEME_HANDLER, test "x$have_scheme_handler" = "xyes") if test "x$have_scheme_handler" = "xyes"; then AC_DEFINE_UNQUOTED(HAVE_SCHEME_HANDLER, [1], [Have x-scheme/uri handler support]) fi #optional features AC_ARG_ENABLE(udisks, [AC_HELP_STRING([--enable-udisks], [build libfm with udisks support (Linux only) @<:@default=yes@:>@])], [enable_udisks="${enableval}"], [enable_udisks=no] ) AM_COND_IF(EXTRALIB_ONLY, [enable_udisks=no]) AM_CONDITIONAL(ENABLE_UDISKS, test x"$enable_udisks" = x"yes") if test x"$enable_udisks" = x"yes"; then # turn on udisks support AC_DEFINE_UNQUOTED(USE_UDISKS, [1], [Enable UDisks support]) # test for availability of dbus dbus_modules="dbus-glib-1" PKG_CHECK_MODULES(DBUS, [$dbus_modules]) AC_SUBST(DBUS_CFLAGS) AC_SUBST(DBUS_LIBS) fi AC_ARG_ENABLE([exif], AS_HELP_STRING([--disable-exif], [disable libexif which is used for faster thumbnail loading.]), [enable_exif="${enableval}"], [enable_exif=auto] ) AM_COND_IF(EXTRALIB_ONLY, [enable_exif=no]) AM_CONDITIONAL(ENABLE_EXIF, test x"$enable_exif" != x"no") AS_IF([test x"$enable_exif" != x"no"], [ # test for availability of libexif exif_modules="libexif" PKG_CHECK_MODULES(EXIF, [$exif_modules], [# turn on libexif support enable_exif=yes AC_DEFINE_UNQUOTED(USE_EXIF, [1], [Enable libexif]) AC_SUBST(EXIF_CFLAGS) AC_SUBST(EXIF_LIBS)], [AS_IF([test x"$enable_exif" = x"auto"], [enable_exif=no], [ AC_ERROR([Package requirements (libexif) were not met: $EXIF_PKG_ERRORS ])])])]) #check for gtk-doc GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) AC_ARG_ENABLE(demo, [AC_HELP_STRING([--enable-demo], [build libfm-demo file manager @<:@default=no@:>@])], [enable_demo="${enableval}"], [enable_demo=no] ) AM_COND_IF(EXTRALIB_ONLY, [enable_demo=no]) AM_CONDITIONAL(ENABLE_DEMO, test x"$enable_demo" = x"yes") # GIO extension module giomodulesdir=$libdir/gio/modules AC_SUBST(giomodulesdir) GETTEXT_PACKAGE=libfm AC_SUBST(GETTEXT_PACKAGE) # Generate po/LINGUAS on the fly rather than relying on translators # to maintain it manually. This also overcome the problem that Transifex # cannot add a language to po/LINGUAS if a new po file is submitted. rm -f $srcdir/po/LINGUAS for po_file in `ls $srcdir/po/*.po | sort`; do lang=`echo "$po_file" | sed "s|.*/po/\(.*\)\.po|\1|g"` echo $lang >> $srcdir/po/LINGUAS done AM_GLIB_GNU_GETTEXT AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.]) AC_SUBST(FMLIBVER) if test `eval "echo $includedir"` = /usr/include then FMINCLUDEADD='' else FMINCLUDEADD='-I${includedir}' fi AC_SUBST(FMINCLUDEADD) AC_ARG_ENABLE(debug, [AC_HELP_STRING([--enable-debug], [build libfm with debug support @<:@default=no@:>@])], [enable_debug="${enableval}"], [enable_debug=no] ) if test "$enable_debug" = "yes"; then # turn on debug and disable optimization CPPFLAGS="$CPPFLAGS -DG_ENABLE_DEBUG -O0 -g" case "$CC" in gcc*) CPPFLAGS="$CPPFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers" ;; *) ;; esac dnl Be more strict on portability CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=700" else # turn off glib debug checks CPPFLAGS="$CPPFLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS" fi dnl Check linker flags for modules AC_CHECK_LDFLAG(ac_cv_ld_z_defs, [-Wl,-z,defs], LDFLAGS) dnl Check if OS respects POSIX.1-2001 `environ' declaration AC_CHECK_DECLS([environ], [], [], [[#include ]]) dnl Fix invalid sysconfdir when --prefix=/usr if test `eval "echo $sysconfdir"` = /usr/etc then sysconfdir=/etc fi dnl Make version subfields for FM_CHECK_VERSION macro ac_version_subst_str=`echo $VERSION | awk -F '.' '/.*/ { printf "FM_VERSION_MAJOR=%d FM_VERSION_MINOR=%d FM_VERSION_MICRO=%d", $1, $2, $3 }'` eval ${ac_version_subst_str} AC_SUBST(FM_VERSION_MAJOR) AC_SUBST(FM_VERSION_MINOR) AC_SUBST(FM_VERSION_MICRO) AC_CONFIG_FILES([ Makefile src/Makefile src/actions/Makefile src/tests/Makefile src/modules/Makefile src/fm-version.h data/Makefile data/libfm-pref-apps.1 data/lxshortcut.1 data/ui/Makefile po/Makefile.in docs/Makefile docs/reference/Makefile docs/reference/libfm/Makefile docs/reference/libfm/version.xml libfm.pc libfm-gtk.pc libfm-gtk3.pc libfm-extra.pc ]) AC_OUTPUT echo echo "Libfm $VERSION Configuration Summary:" echo echo "prefix: $prefix" echo "sysconfdir: $sysconfdir" echo "Enable compiler flags and other support for debugging: $enable_debug" echo "Build udisks support (Linux only, experimental): $enable_udisks" echo "Build with libexif for faster thumbnail loading: $enable_exif" echo "Build demo program src/demo/libfm-demo: $enable_demo" echo "Build old custom actions API (requires Vala): $enable_actions" echo "Large file support: $largefile" if test x"$have_scheme_handler" = x"no"; then echo "GIO module for preferred apps (for glib < 2.28 only): $giomodulesdir" else echo "GIO module for preferred apps (for glib < 2.28 only): not required" fi echo "Build libfm-gtk for Gtk+ version: $ac_with_gtk" echo "Build API doc with gtk-doc (recommended for make dist): $enable_gtk_doc" echo echo if test x"$sysconfdir" != x'/etc'; then echo echo echo 'Warning: sysconfdir is not /etc.' echo 'Please consider passing --sysconfdir=/etc to configure.'; echo 'Otherwise default config files will be installed to wrong place.' echo echo fi libfm-1.4.0/data/000077500000000000000000000000001475513661000135265ustar00rootroot00000000000000libfm-1.4.0/data/Makefile.am000066400000000000000000000017001475513661000155600ustar00rootroot00000000000000NULL= SUBDIRS=ui man_files = libfm-pref-apps.1 lxshortcut.1 if ENABLE_GTK man_MANS = $(man_files) endif mimedir = $(datadir)/mime/packages mime_DATA = libfm.xml libfmconfdir = $(sysconfdir)/xdg/libfm libfmconf_DATA = \ libfm.conf \ $(NULL) desktop_in_files= \ libfm-pref-apps.desktop.in \ lxshortcut.desktop.in \ $(NULL) desktop_files = $(desktop_in_files:.desktop.in=.desktop) if ENABLE_GTK desktopdir=$(datadir)/applications desktop_DATA = $(desktop_files) endif @INTLTOOL_DESKTOP_RULE@ libfmdatafilesdir = $(datadir)/libfm libfmdatafiles_DATA = \ archivers.list \ terminals.list \ $(NULL) libfmimages_files = \ images/unknown.png \ images/folder.png \ $(NULL) if ENABLE_GTK libfmimagesdir = $(datadir)/libfm/images libfmimages_DATA = $(libfmimages_files) endif EXTRA_DIST = \ $(libfmconf_DATA) \ $(man_files) \ $(mime_DATA) \ $(libfmdatafiles_DATA) \ $(desktop_in_files) \ $(desktop_files) \ $(libfmimages_files) \ $(NULL) test: libfm-1.4.0/data/archivers.list000066400000000000000000000131051475513661000164110ustar00rootroot00000000000000[file-roller] create=file-roller --add %U extract=file-roller --extract %U extract_to=file-roller --extract-to %d %U mime_types=application/x-7z-compressed;application/x-7z-compressed-tar;application/x-ace;application/x-alz;application/x-ar;application/x-arj;application/x-bzip;application/x-bzip-compressed-tar;application/x-bzip1;application/x-bzip1-compressed-tar;application/x-cabinet;application/x-cbr;application/x-cbz;application/x-cd-image;application/x-compress;application/x-compressed-tar;application/x-cpio;application/x-deb;application/x-ear;application/x-ms-dos-executable;application/x-gtar;application/gzip;application/x-gzip;application/x-gzpostscript;application/x-java-archive;application/x-lha;application/x-lhz;application/x-lzip;application/x-lzip-compressed-tar;application/x-lzma;application/x-lzma-compressed-tar;application/x-lzop;application/x-lzop-compressed-tar;application/x-rar;application/x-rar-compressed;application/vnd.rar;application/x-rpm;application/x-rzip;application/x-tar;application/x-tarz;application/x-stuffit;application/x-war;application/x-xz;application/x-xz-compressed-tar;application/x-zip;application/x-zip-compressed;application/x-zoo;application/zip;multipart/x-zip; supports_uris=true [xarchiver] create=xarchiver --compress %F extract=xarchiver --extract %F extract_to=xarchiver --extract-to %d %F mime_types=application/epub+zip;application/gzip;application/java-archive;application/vnd.android.package-archive;application/vnd.appimage;application/vnd.comicbook-rar;application/vnd.comicbook+zip;application/vnd.debian.binary-package;application/vnd.ms-cab-compressed;application/vnd.ms-htmlhelp;application/vnd.oasis.opendocument.text;application/vnd.openofficeorg.extension;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.rar;application/vnd.snap;application/vnd.squashfs;application/x-7z-compressed;application/x-archive;application/x-arj;application/x-bzip;application/x-bzip-compressed-tar;application/x-bzip1;application/x-bzip1-compressed-tar;application/x-bzip2;application/x-bzip2-compressed-tar;application/x-bzip3;application/x-bzip3-compressed-tar;application/x-cb7;application/x-cbt;application/x-cd-image;application/x-compress;application/x-compressed-tar;application/x-cpio;application/x-cpio-compressed;application/x-java-archive;application/x-lha;application/x-lrzip;application/x-lrzip-compressed-tar;application/x-lz4;application/x-lz4-compressed-tar;application/x-lzip;application/x-lzip-compressed-tar;application/x-lzma;application/x-lzma-compressed-tar;application/x-lzop;application/x-rar;application/x-rpm;application/x-rzip;application/x-rzip-compressed-tar;application/x-source-rpm;application/x-tar;application/x-tarz;application/x-tzo;application/x-xpinstall;application/x-xz;application/x-xz-compressed-tar;application/x-zip-compressed-fb2;application/x-zpaq;application/x-zstd-compressed-tar;application/zip;application/zstd; [squeeze] create=squeeze --new %F extract=squeeze --extract %F extract_to=squeeze --extract-to %d %F mime_types=application/x-bzip-compressed-tar;application/x-bzip2-compressed-tar;application/x-compressed-tar;application/x-tar;application/x-tarz;application/x-tzo;application/x-zip;application/x-zip-compressed;application/zip;application/x-rar;application/vnd.rar;application/gzip;application/x-gzip;application/x-bzip;application/x-lzop;application/x-compress; [engrampa] create=engrampa --add %U extract=engrampa --extract %U extract_to=engrampa --extract-to %d %U mime_types=application/x-7z-compressed;application/x-7z-compressed-tar;application/x-ace;application/x-alz;application/x-ar;application/x-arj;application/x-bzip;application/x-bzip-compressed-tar;application/x-bzip1;application/x-bzip1-compressed-tar;application/x-cabinet;application/x-cbr;application/x-cbz;application/x-cd-image;application/x-compress;application/x-compressed-tar;application/x-cpio;application/x-deb;application/x-ear;application/x-ms-dos-executable;application/x-gtar;application/gzip;application/x-gzip;application/x-gzpostscript;application/x-java-archive;application/x-lha;application/x-lhz;application/x-lzip;application/x-lzip-compressed-tar;application/x-lzma;application/x-lzma-compressed-tar;application/x-lzop;application/x-lzop-compressed-tar;application/x-rar;application/x-rar-compressed;application/vnd.rar;application/x-rpm;application/x-rzip;application/x-tar;application/x-tarz;application/x-stuffit;application/x-war;application/x-xz;application/x-xz-compressed-tar;application/x-zip;application/x-zip-compressed;application/x-zoo;application/zip;multipart/x-zip; supports_uris=true # The KDE archiver Ark # Here we use %F instead of %U since KDE programs do not know the URI provided by gvfs. # GIO will pass FUSE-based file paths to the KDE programs, which should still work. [ark] create=ark --add --dialog %F extract=ark --batch --dialog %F extract_to=ark --batch --destination %d %F mime_types=application/x-tar;application/x-compressed-tar;application/x-bzip-compressed-tar;application/x-tarz;application/x-xz-compressed-tar;application/x-lzma-compressed-tar;application/x-deb;application/x-cd-image;application/x-bcpio;application/x-cpio;application/x-cpio-compressed;application/x-sv4cpio;application/x-sv4crc;application/x-rpm;application/x-source-rpm;application/vnd.ms-cab-compressed;application/x-servicepack;application/x-rar;application/vnd.rar;application/x-7z-compressed;application/x-java-archive;application/zip;application/x-compress;application/gzip;application/x-gzip;application/x-bzip;application/x-bzip2;application/x-lzma;application/x-xz;application/lha;application/x-lha;application/maclha; supports_uris=true libfm-1.4.0/data/images/000077500000000000000000000000001475513661000147735ustar00rootroot00000000000000libfm-1.4.0/data/images/folder.png000066400000000000000000000061371475513661000167630ustar00rootroot00000000000000PNG  IHDR00WbKGDC pHYs   IDAThYI\W=~ ].m݆8B1ab\H" b+ !!Ɏ 8 HH =VW޽,{v[q7~뫪={kɱ}{cogV6\di:ўv_X>zGxϲu#n{nozuG:q$pvrSuM>MEJFi '1Xl#t(^~sIHƛwfV s N3ny/(HBRhMHIՎyRBk /}=3ׇApdg{a399GR HWU@4FXO9"ZB,s"3o}?ճ׾#Goi♸CS~sœ9$]0Yc?0hu{F ^D h P"u݈y 88!E\~>/,ci;! <bF&t DxZj<&pû7[0H1RlA2XȆ+HFCFXZ#Q|\gIxT0lRG6*Ži`r   3I"UHfr͖f;*YK`5LϕR~ò0XH!'X^Z֜H@Q1J dYK|yW1&{Xʺq"nt,:e։^0$@RֆF0Z_E0B}$͐Rt{mH8UUh"""L@7!t 5r6HH,Dbm XL`#u*&-$ glTtQ u^Ny'#Jp 'ojlF!XTyy&-nR0cT=5⃠\5@4ĒP4[R)Dp>8/2)k׹K""EaYH%,]= Ea+ۀufRDPP(ɵfv҅E :)3cbnZRl "چlf:\xVl $!A ĪdN$"\뜅Ac\jz XtnmmZsVf *;*Dgdl@1 3eV3RLMgCW2ʥ-e'v[!n[h֙fe Xs ʑX[M(fq 1C!Ha[6jo&"UA>p^HhHcsnP6xf(msZ#j#R*@YH[{8I@j6*K2AA8-׸™+jyL f,@,\s@%,,x"R\e6["\ɾ P,=O!nh5#S$I W x|\oY_0 `J)A("f+/fh#v^! R2TRj ! '{Qyq7{U x6i(" 2#eu19Jb/^hw3}{fߤ/]pv@̦D{ ))g3۔+E<@ ) uX&uGvϟ^hr ,t,m@ RZٸ k^<Kj <$k޺KgΝaYį Lޣ?78=* 3)n^^_6T!2Hacao*O+sO<ş[DK Bhǡ̾?q{f2lac-G. ϯ;GѢ1C)AQ|s~z:h_WS{d?%X¾f։Vo>|x +>6?&f`ƋW2s?o鿫/}G}RhÏφiy>jFC3JM= @֌%aafot<4U89/.&w<護17ѝИwPl5~LNAcǩ<}ȱOE39_enl~Ծ}Aو"zTXtSoftwarex+//.NN,H/J6XS\IENDB`libfm-1.4.0/data/images/unknown.png000066400000000000000000000032071475513661000172020ustar00rootroot00000000000000PNG  IHDR00WbKGDC pHYs oyIDAThZKoW;/'$&RJ<]#ZҊu"anmD"JP%MꊲRTM,D@Pc׫J%>84O |߇ ) ;3g|^"BJWTV>bcB`iiܹs߿… F 0CqP)8\ER²,||'_<|ŎTxV31&* jA FԩS/__v`}}Ea6Ţvٕwy5d2cttBjB|/^\r8qbG~=HPGJRJDJ-+"B&s0L8=ի,,,OՄ!Lj0b0iseD\n25Ds@( PY<45rRwM⤷mNrug%wC_{^UU;;B}e.0(:cYBD`AQ퉢_T5(JRlmǎ$)>Vwh4af:'qHl6 c%@(l65#iI4Fa)ثՁ)Bim;#,j=D Phzd+1QPsOAt]. .PP This manual page was written by Sergey Slipchenko , for the Debian project (and may be used by others). Updated by Andriy Grytsenko .libfm-1.4.0/data/libfm-pref-apps.desktop.in000066400000000000000000000004241475513661000205120ustar00rootroot00000000000000[Desktop Entry] Type=Application _Name=Preferred Applications _Comment=Select applications called on click on Web link or e-mail address Icon=preferences-desktop Exec=libfm-pref-apps StartupNotify=true Categories=GTK;Settings;DesktopSettings;X-LXDE-Settings; OnlyShowIn=LXDE; libfm-1.4.0/data/libfm.conf000066400000000000000000000002671475513661000154730ustar00rootroot00000000000000[config] single_click=0 use_trash=1 confirm_del=1 thumbnail_local=1 thumbnail_max=2048 [ui] big_icon_size=48 small_icon_size=24 thumbnail_size=128 pane_icon_size=24 show_thumbnail=1 libfm-1.4.0/data/libfm.xml000066400000000000000000000007151475513661000153440ustar00rootroot00000000000000 libfm-1.4.0/data/lxshortcut.1.in000066400000000000000000000022241475513661000164340ustar00rootroot00000000000000.\" -*-nroff-*- .TH LXSHORTCUT 1 "August 2013" "@PACKAGE@ @VERSION@" "lxshortcut manual" .SH NAME lxshortcut \- desktop entry file editor .SH SYNOPSIS .B lxshortcut [ \-i .I input-file ] [ \-o .I output-file ] .SH DESCRIPTION lxshortcut is a simple application that uses LibFM file properties dialog window to change properties of a desktop entry - icon, display name, path and arguments of execution, etc. .SH OPTIONS At least one option should be specified and if \fIoutput-file\fP isn't specified then \fIinput-file\fP will be used to make a result - either full path or path in XDG specified user data directory for menu entries. .TP 20 .BI \-i " input-file" "\fR,\fP \-\^\-input=" input-file use \fIinput-file\fP as source for editing, it may be some XDG menu entry if no full path is specified or custom path to some file .TP .BI \-o " output-file" "\fR,\fP \-\^\-output=" output-file write result into \fIoutput-file\fP .SH SEE ALSO XDG Desktop Entry Specification .SH AUTHOR lxshortcut was written by Hong Jen Yee and modified by Andriy Grytsenko . .PP This manual page was written by Andriy Grytsenko .libfm-1.4.0/data/lxshortcut.desktop.in000066400000000000000000000004031475513661000177420ustar00rootroot00000000000000[Desktop Entry] Type=Application Icon=applications-other _Name=Shortcut Editor _Comment=Create new or change existing desktop entry Categories=GTK;Utility; Exec=lxshortcut -i %f StartupNotify=true Terminal=false MimeType=application/x-desktop; NoDisplay=true libfm-1.4.0/data/terminals.list000066400000000000000000000024151475513661000164230ustar00rootroot00000000000000[xterm] open_arg=-e noclose_arg=-hold -e desktop_id=xterm.desktop [uxterm] open_arg=-e noclose_arg=-hold -e [lxterminal] open_arg=-e desktop_id=lxterminal.desktop [konsole] open_arg=-e noclose_arg=--noclose -e desktop_id=konsole.desktop [xfce4-terminal] open_arg=-x noclose_arg=--hold -x desktop_id=xfce4-terminal.desktop [terminator] open_arg=-x desktop_id=terminator.desktop [rxvt] open_arg=-e [urxvt] open_arg=-e noclose_arg=-hold -e desktop_id=rxvt-unicode.desktop [eterm] open_arg=-e noclose_arg=--pause -e desktop_id=eterm.desktop [gnome-terminal] open_arg=-x desktop_id=gnome-terminal.desktop [wterm] open_arg=-e [roxterm] open_arg=-e desktop_id=roxterm.desktop [sakura] open_arg=-e desktop_id=sakura.desktop [qterminal] open_arg=-e desktop_id=qterminal.desktop [lilyterm] open_arg=-e noclose_arg=--hold -e desktop_id=lilyterm.desktop [urxvtc] open_arg=-e noclose_arg=-hold -e [terminology] open_arg=-e noclose_arg=--hold -e desktop_id=terminology.desktop [termite] open_arg=-e noclose_arg=--hold -e desktop_id=termite.desktop [germinal] open_arg=-e desktop_id=org.gnome.Germinal.desktop [kitty] noclose_arg=--hold desktop_id=kitty.desktop [mintty] open_arg=-e noclose_arg=--hold always -e [alacritty] open_arg=-e noclose_arg=--hold -e desktop_id=Alacritty.desktop libfm-1.4.0/data/ui/000077500000000000000000000000001475513661000141435ustar00rootroot00000000000000libfm-1.4.0/data/ui/Makefile.am000066400000000000000000000007471475513661000162070ustar00rootroot00000000000000NULL= # GtkBuilder UI definition files ui_in_files= \ file-prop.glade \ progress.glade \ ask-rename.glade \ app-chooser.glade \ preferred-apps.glade \ exec-file.glade \ filesearch.glade \ $(NULL) ui_files = $(ui_in_files:.glade=.ui) choose-icon.ui if ENABLE_GTK uidir=$(datadir)/libfm/ui ui_DATA = $(ui_files) endif EXTRA_DIST = \ $(ui_in_files) \ $(ui_files) \ $(NULL) # Purge GtkBuilder UI files .glade.ui: sed 's///' < $< | sed ':a;N;$$!ba;s/ *\n * $@ libfm-1.4.0/data/ui/app-chooser.glade000066400000000000000000000456111475513661000173700ustar00rootroot00000000000000 True False gtk-open False 5 Choose Application 400 380 dialog True False 6 True False 12 True False 2 2 True True True 0 False False False 1 False True 0 True True True True automatic automatic in True False Use selected application to open files _Installed Applications True False True False 6 6 True False 0 <b>C_ommand line to execute:</b> True True cmdline False True 0 True False 12 True False 6 True False 12 True True True False False True True True True 0 _Browse... True True True False browse_btn_img True False False 1 False True 0 _Execute in terminal emulator True True False False True True False False 1 True False 12 _Keep terminal window open after command execution True False True False False True True True True 2 True False 0 <b>These special codes can be used in the command line:</b> <b>%f</b>: Represents a single file name <b>%F</b>: Represents multiple file names <b>%u</b>: Represents a single URI of the file <b>%U</b>: Represents multiple URIs True True False True 3 True True 1 True False 0 <b>_Application name (optional, set it to keep association)</b> True True app_name True True 2 True False 12 True True True False False True True True True 3 1 True False Execute custom command line to open files C_ustom Command Line True 1 False True True 1 False False True 2 _Set selected application as default action for this file type True True False False True True False False 2 True False end gtk-cancel True True True False False True False False 0 gtk-ok True True True True False False True False False 1 False True end 3 cancelbutton okbutton libfm-1.4.0/data/ui/ask-rename.glade000066400000000000000000000342721475513661000171740ustar00rootroot00000000000000 False 10 Confirm File Replacing normal True False 6 True False end gtk-cancel True True True False True False False 0 _Skip True True True True True False True False False 1 _Rename True False True True True False True False False 2 _Overwrite True True True False True False False 3 False True end 0 True False 12 True False 0 gtk-dialog-question 6 False True 0 True False 6 True False 0 <b>There is already a file with the same name in this location.</b> Do you want to replace the existing file True False True 0 True False 12 True False gtk-missing-image 6 False True 0 True False 0 True True 1 False True 1 True False 0 with the following file? False True 2 True False 12 True False gtk-missing-image 6 False True 0 True False 0 True True 1 False True 3 True False 12 True False 0 _File name: True filename False True 0 True True True False False True True True True 1 False True 4 True True 1 True True 1 _Apply this option to all existing files True True False False True True False True 2 cancel skip rename overwrite libfm-1.4.0/data/ui/choose-icon.ui000066400000000000000000000237401475513661000167160ustar00rootroot00000000000000 10 Choose An Icon... GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 6 True GTK_BUTTONBOX_END True True gtk-cancel True GTK_RELIEF_NORMAL True True True gtk-ok True GTK_RELIEF_NORMAL True 0 False True GTK_PACK_END True 0 0.5 GTK_SHADOW_NONE True 0.5 0.5 1 1 0 0 12 0 True False 12 True True system icon theme True GTK_RELIEF_NORMAL True True False True 0 False True True True image files True GTK_RELIEF_NORMAL True False False True theme 0 False True True <b>Choose icon from:</b> False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False True True False False GTK_POS_TOP False False True True GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT True True GTK_SELECTION_SINGLE False False True True GTK_FILE_CHOOSER_ACTION_OPEN True False False False True 0 True True cancel ok libfm-1.4.0/data/ui/exec-file.glade000066400000000000000000000121521475513661000170030ustar00rootroot00000000000000 5 Execute File center normal True vertical 2 True 12 True gtk-missing-image False False 0 True 0 1 False 1 True end gtk-execute True True True True True False False 0 Execute in _Terminal True True True True True False False 1 gtk-open True True True True False False 2 gtk-cancel True True True True False False 3 False end 0 exec exec_term open cancel libfm-1.4.0/data/ui/file-prop.glade000066400000000000000000001517551475513661000170540ustar00rootroot00000000000000 False 6 File Properties center-on-parent 600 dialog center True False 12 True False end gtk-cancel True True True False False True False False 0 gtk-ok True True True True False False True False False 1 False True end 0 True True 6 True False 6 6 12 True False 4 12 3 12 6 True False True False GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK True Icon of the file in folder view gtk-missing-image 6 2 GTK_FILL 12 False 1 True 1 2 GTK_FILL True 0 True 2 3 True False 1 <b>_Name:</b> True True name 1 2 1 2 GTK_FILL True True False False True True 2 3 1 2 True False 0 <b>Location:</b> True True dir 2 2 3 GTK_FILL True True 0 True middle 2 3 2 3 True False 0 <b>Target file:</b> True True target 2 3 4 GTK_FILL True True 0 True middle 2 3 3 4 GTK_FILL True False 0 <b>File type:</b> True True type 2 4 5 GTK_FILL True True 0 True True end 2 3 4 5 GTK_FILL True False 0 <b>Open _with:</b> True True open_with 2 5 6 GTK_FILL True True Select the application used to open files of this type 2 3 5 6 GTK_FILL False 0 <b>Total count of files:</b> True True total_files 2 6 7 GTK_FILL True 0 True 2 3 6 7 True False 0 <b>Total size of files:</b> True True total_size 2 7 8 GTK_FILL True True 0 True 2 3 7 8 GTK_FILL True False 0 <b>Size on disk:</b> True True size_on_disk 2 8 9 GTK_FILL True True 0 True 2 3 8 9 GTK_FILL True False 0 <b>Last modification:</b> True True mtime 2 9 10 GTK_FILL True True 0 True 2 3 9 10 GTK_FILL True False 0 <b>Last access:</b> True True atime 2 10 11 GTK_FILL True True 0 True 2 3 10 11 False 0 <b>Last permissions change:</b> True True ctime 2 11 12 GTK_FILL True 0 True 2 3 11 12 True False _General True False True False 6 6 12 True False 6 True False 2 2 2 12 4 True False 0 <b>O_wner:</b> True True owner GTK_FILL True False 0 <b>G_roup:</b> True True group 1 2 GTK_FILL True True False False True True 1 2 GTK_FILL True True False False True True 1 2 1 2 GTK_FILL False False 0 True False 0 none True False 12 True False 6 4 2 12 4 True False 0 <b>_View content:</b> True True read_perm GTK_FILL GTK_FILL True False 0 <b>C_hange content:</b> True True write_perm 1 2 GTK_FILL GTK_FILL True False 0 <b>_Execute:</b> True True exec_perm 2 3 GTK_FILL GTK_FILL True False 0 <b>Special bits:</b> True 3 4 GTK_FILL GTK_FILL True False Who can read content of the file/directory read_access_model 0 1 2 GTK_FILL True False Who can change content of the file/directory user_access_model 0 1 2 1 2 GTK_FILL True False Who can execute the file or enter the directory user_access_model 0 1 2 2 3 GTK_FILL True False Special flags for file execution flags_set_file_model 0 1 2 3 4 GTK_FILL True False Special flags for directory access flags_set_dir_model 0 1 2 3 4 GTK_FILL True False <b>Access Control</b> True False False 1 Hidden file False False False False True False False 2 1 True False _Permissions True 1 False False 6 6 12 2 True False True 2 False True True 2 cancel ok --- None Sticky Set GID Sticky & set GID --- None Set UID Set GID Set UID & GID --- Only owner Only owner and group Anyone --- Nobody Only owner Only owner and group Anyone libfm-1.4.0/data/ui/filesearch.glade000066400000000000000000001652601475513661000172600ustar00rootroot00000000000000 2147483647 1 10 Bytes KB MB GB False 12 Choose Date dialog dlg True False 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True True False False True False False 1 False True end 0 True False 0 Choose a date from the following calendar False True 1 True True True True 2 button2 button1 False 5 Search Files 512 384 edit-find dialog True False 2 True False end gtk-cancel True True True False True False False end 0 gtk-find True True True True False False True False True end 1 False True end 0 True True True True False 6 6 True False 0 <b>File _Name Patterns:</b> True True name_entry False True 0 True False 12 12 True False 6 True True True Pattern may be either POSIX shell pattern list (with ',' as separator) or POSIX regular expression. True * True False False True True False True 0 Case insensiti_ve True True False False none True True True False True 1 _Use regular expression True True False False True True False False 2 False True 1 True False 0 <b>Plac_es to Search:</b> True True path_tree_view False True 2 True False 12 12 True False 6 True False 6 True True automatic automatic etched-in True True path_list_store False path 0 True True 0 True False 6 gtk-add True True True False True False True 0 gtk-remove True True True False True False True 1 False True 1 True True 0 _Search in sub directories True True False False True True True False True 1 Search _hidden files True True False False True True False True 2 True True 3 True False Name/_Location True False True False 6 6 True False 0 <b>File Type</b> True False True 0 True False 12 12 True False 6 True False 0 Only search for files of following types: True True 0 Te_xt files True True False False True True True True 1 _Image files True True False False True True True True 2 _Audio files True True False False True True True True 3 _Video files True True False False True True True True 4 _Documents True True False False True True True True 5 Folde_rs True False False True True True True 6 True False 12 Ot_her: True False False True True False True 0 True Any valid content type can be entered here. Wildcard '*' is allowed at end of the type. Multiple types should be separated with ';'. False False True True True True 1 True True 7 False True 1 1 True False File _Type True 1 False True False 6 6 True False 0 <b>File Contain_s:</b> True True content_entry False True 0 True False 12 12 True False 6 True True True True False False True True False True 0 Case insensiti_ve True True False False True True True False False 1 _Use regular expression True True False False True True False True 2 False True 1 2 True False C_ontent True 2 False True False 6 6 True False 0 <b>File Size</b> True False True 0 True False 12 12 True False 2 3 12 6 True False True True False False True True bigger_adjustment 1 2 2 True False True True False False True True smaller_adjustment 1 2 1 2 2 2 _Smaller than: True True False False True True 1 2 GTK_FILL _Bigger than: True True False False True True GTK_FILL True False True bigger_liststore 1 0 2 3 True False True smaller_liststore 2 0 2 3 1 2 GTK_EXPAND False True 1 True False 0 <b>Last Modified Time</b> True False True 2 True False 12 12 True False 2 2 12 6 (None) True False True True False 1 2 (None) True False True True False 1 2 1 2 _Earlier than: True True False False True True GTK_FILL GTK_FILL L_ater than: True True False False True True 1 2 GTK_FILL GTK_FILL False True 3 3 True False _Properties True 3 False True True 1 find_button cancel_button 2147483647 1 10 Bytes KB MB GB libfm-1.4.0/data/ui/preferred-apps.glade000066400000000000000000000330601475513661000200620ustar00rootroot00000000000000 5 Preferred Applications center normal True vertical 2 True True True 12 vertical 18 True vertical 6 True 0 <b>Web Browser</b> True False 0 True 12 True vertical 6 360 True 0 The preferred Web Browser will be used to open hyperlinks. True 0 True 1 False 1 False 0 True vertical 6 True 0 <b>Mail Client</b> True False 0 True 12 True vertical 6 360 True 0 The preferred Mail Client will be used to compose emails when you click on e-mail addresses. True 60 0 True 1 False 1 False 1 vertical 6 True 0 <b>Terminal Emulator</b> True False 0 True 12 True 6 True Command line: False 0 True True 1 False 1 False 2 True System Applications False vertical 1 True File Associations 1 False 1 True end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False end 0 cancel ok libfm-1.4.0/data/ui/progress.glade000066400000000000000000000365701475513661000170200ustar00rootroot00000000000000 True False 5 480 dialog north-east True False 6 True False end gtk-stop True True True False False True False False 0 False True end 0 True False 6 6 True False 12 False gtk-file 6 False True 0 False 0 True True True 1 True True 0 True False 6 5 2 12 6 True False 0 True True src GTK_FILL True True 0 end 1 2 True False 0 <b>To:</b> True True dest 1 2 GTK_FILL True True 0 middle 1 2 1 2 True False 0.10000000149 2 2 3 True True 0 Preparing... middle 2 3 4 True False 0 <b>Data transferred:</b> True True data_transferred 4 5 GTK_FILL True True 0 1 2 4 5 True False 0 <b>Time remaining:</b> True True remaining_time 5 6 GTK_FILL True True 0 1 2 5 6 True True 1 False 6 True False 0 <b>Errors occurred:</b> True True error_msg False True 0 True False 12 True True automatic automatic etched-in 120 True True False True True 1 True True 2 True True 1 cancel libfm-1.4.0/docs/000077500000000000000000000000001475513661000135455ustar00rootroot00000000000000libfm-1.4.0/docs/Makefile.am000066400000000000000000000000711475513661000155770ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl SUBDIRS = reference libfm-1.4.0/docs/reference/000077500000000000000000000000001475513661000155035ustar00rootroot00000000000000libfm-1.4.0/docs/reference/Makefile.am000066400000000000000000000000651475513661000175400ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl SUBDIRS = libfm libfm-1.4.0/docs/reference/libfm/000077500000000000000000000000001475513661000165745ustar00rootroot00000000000000libfm-1.4.0/docs/reference/libfm/Makefile.am000066400000000000000000000106571475513661000206410ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in NULL= # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=libfm # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. # e.g. DOC_SOURCE_DIR=../../../gtk DOC_SOURCE_DIR= $(top_srcdir)/src # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # http://developer.gnome.org/gtk-doc-manual/unstable/metafiles_types.html.en # using --rebuild-types to re-generate type list automatically. SCAN_OPTIONS=--rebuild-sections --rebuild-types --deprecated-guards=FM_DISABLE_DEPRECATED # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml MKDB_OPTIONS=--sgml-mode --output-format=xml --name-space=fm # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS= # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB= \ $(top_srcdir)/src/*.h \ $(top_srcdir)/src/base/*.h \ $(top_srcdir)/src/job/*.h \ $(top_srcdir)/src/gtk/*.h \ $(top_srcdir)/src/extra/*.h \ $(NULL) CFILE_GLOB=$(top_srcdir)/src/*.c \ $(top_srcdir)/src/base/*.c \ $(top_srcdir)/src/job/*.c \ $(top_srcdir)/src/gtk/*.c \ $(top_srcdir)/src/extra/*.c \ $(NULL) # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files to ignore when scanning. Use base file name, no paths # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h IGNORE_HFILES= \ fm-marshal.h \ fm-gtk-marshal.h \ main-win.h \ dbus-utils.h \ fm-udisks.h \ g-udisks-device.h \ g-udisks-drive.h \ g-udisks-mount.h \ g-udisks-volume.h \ g-udisks-volume-monitor.h \ udisks-device.h \ udisks.h \ fm-app-lookup.h \ exo-icon-view.h \ exo-marshal.h \ exo-private.h \ exo-string.h \ exo-tree-view.h \ fm-actions.h \ glib-compat.h \ gtk-compat.h \ $(NULL) # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files= # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS= \ -I$(top_srcdir) \ -I$(top_builddir) \ $(GTK_CFLAGS) GTKDOC_LIBS= \ $(top_builddir)/src/libfm.la \ $(top_builddir)/src/libfm-extra.la \ $(top_builddir)/src/$(LIBFM_GTK_LTLIBRARIES) \ $(GTK_LIBS) \ $(NULL) # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULE).types # Comment this out if you want your docs-status tested during 'make check' if ENABLE_GTK_DOC #TESTS_ENVIRONMENT = cd $(srcsrc) && #TESTS = $(GTKDOC_CHECK) endif # we don't have tests here test: -include $(top_srcdir)/git.mk libfm-1.4.0/docs/reference/libfm/libfm-docs.xml000066400000000000000000000147421475513661000213450ustar00rootroot00000000000000 ]> Libfm Reference Manual for Libfm &version; The latest version of this documentation can be found on-line at http://sf.net/projects/pcmanfm/. Libfm Overview Libfm is a library built on top of glib/gio for developing file managers. It provides some useful file management utilities and related-widgets missing in gtk+/glib. It's originally developed for use in PCManFM, but it's carefully designed to be desktop environment-independent and can be used to develop other file manager-related tools as well. Libfm Core Reference. Libfm Extra. Libfm Jobs. Libfm Gtk+ Widgets and Objects. Object Hierarchy API Index Index of deprecated symbols Index of symbols included in 1.0.0 Index of new symbols in 1.0.1 Index of new symbols in 1.1.0 Index of new symbols in 1.2.0 Index of new symbols in 1.3.0 libfm-1.4.0/docs/reference/libfm/version.xml.in000066400000000000000000000000121475513661000214010ustar00rootroot00000000000000@VERSION@ libfm-1.4.0/libfm-extra.pc.in000066400000000000000000000004631475513661000157630ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libfm-extra Description: A glib/gio-based lib used to develop file managers providing some file management utilities. Requires: glib-2.0 >= 2.22.0 Version: @VERSION@ Libs: -L${libdir} -lfm-extra Cflags: @FMINCLUDEADD@ libfm-1.4.0/libfm-gtk.pc.in000066400000000000000000000006041475513661000154220ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libfm-gtk Description: A glib/gio-based lib used to develop file managers providing some file management utilities and related-widgets missing in gtk+/glib. Requires: gtk+-2.0 >= 2.18.0 gthread-2.0 gio-unix-2.0 libfm >= @VERSION@ Version: @VERSION@ Libs: -L${libdir} -lfm-gtk Cflags: @FMINCLUDEADD@ libfm-1.4.0/libfm-gtk3.pc.in000066400000000000000000000005741475513661000155130ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libfm-gtk3 Description: A glib/gio-based lib used to develop file managers providing some file management utilities and related-widgets missing in gtk+/glib. Requires: gtk+-3.0 gthread-2.0 gio-unix-2.0 libfm >= @VERSION@ Version: @VERSION@ Libs: -L${libdir} -lfm-gtk3 Cflags: @FMINCLUDEADD@ libfm-1.4.0/libfm.pc.in000066400000000000000000000005001475513661000146320ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libfm Description: A glib/gio-based lib used to develop file managers providing some file management utilities. Requires: gthread-2.0 gio-unix-2.0 glib-2.0 >= 2.22.0 Version: @VERSION@ Libs: -L${libdir} -lfm Cflags: @FMINCLUDEADD@ libfm-1.4.0/po/000077500000000000000000000000001475513661000132335ustar00rootroot00000000000000libfm-1.4.0/po/POTFILES.in000066400000000000000000000025171475513661000150150ustar00rootroot00000000000000data/libfm-pref-apps.desktop.in data/lxshortcut.desktop.in data/ui/app-chooser.glade data/ui/ask-rename.glade [type: gettext/glade]data/ui/choose-icon.ui data/ui/exec-file.glade data/ui/file-prop.glade data/ui/filesearch.glade data/ui/preferred-apps.glade data/ui/progress.glade src/base/fm-action.c src/base/fm-file-info.c src/base/fm-file-launcher.c src/base/fm-path.c src/base/fm-mime-type.c src/base/fm-templates.c src/base/fm-terminal.c src/base/fm-thumbnailer.c src/base/fm-utils.c src/extra/fm-xml-file.c src/gtk/fm-app-chooser-combo-box.c src/gtk/fm-app-chooser-dlg.c src/gtk/fm-app-menu-view.c src/gtk/fm-dir-tree-model.c src/gtk/fm-dir-tree-view.c src/gtk/fm-dnd-dest.c src/gtk/fm-file-menu.c src/gtk/fm-file-properties.c src/gtk/fm-folder-model.c src/gtk/fm-folder-view.c src/gtk/fm-gtk-file-launcher.c src/gtk/fm-gtk-utils.c src/gtk/fm-path-entry.c src/gtk/fm-places-model.c src/gtk/fm-places-view.c src/gtk/fm-progress-dlg.c src/gtk/fm-side-pane.c src/gtk/fm-standard-view.c src/gtk/fm-tab-label.c src/job/fm-dir-list-job.c src/job/fm-file-ops-job.c src/job/fm-file-ops-job-delete.c src/job/fm-file-ops-job-xfer.c src/job/fm-file-ops-job-change-attr.c src/modules/vfs-menu.c src/modules/vfs-search.c src/modules/gtk-fileprop-x-desktop.c src/modules/gtk-menu-trash.c src/tools/libfm-pref-apps.c src/tools/lxshortcut.c src/udisks/g-udisks-device.c libfm-1.4.0/po/POTFILES.skip000066400000000000000000000005621475513661000153530ustar00rootroot00000000000000# The strings in demo program shouldn't be added to the lib. src/demo/main-win.c src/demo/main-win-ui.c src/gtk/exo/exo-tree-view.c src/gtk/exo/exo-icon-view.c src/gtk/exo/exo-private.c # these files are generated data/ui/app-chooser.ui data/ui/ask-rename.ui data/ui/exec-file.ui data/ui/file-prop.ui data/ui/preferred-apps.ui data/ui/progress.ui data/ui/filesearch.ui libfm-1.4.0/po/af.po000066400000000000000000001106161475513661000141660ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: af\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774893.587013\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/ar.po000066400000000000000000001550211475513661000142010ustar00rootroot00000000000000# Arabic translation for the LibFM. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Ahmad , 2010. # Mohamed Mohsen , 2013. # Safa Alfulaij , 2014. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-06-14 16:43+0000\n" "Last-Translator: صفا الفليج \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1434300218.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "التّطبيقات المحبّذة" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "حدّد التّطبيقات المستدعاة عند النّقر على وصلة وِبّ أو عنوان بريد إلكترونيّ." #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "محرّر الاختصارات" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "أنشئ مدخلة سطح مكتب جديدة أو حرّر واحدة موجودة" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "اختر تطبيقًا" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "استخدم التّطبيق المحدّد لفتح الملفّات" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "التّط_بيقات المثبّتة" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "الأمر الّذي سيُ_نفّذ:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "ت_صفّح..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "نفّ_ذ في محاكي الطّرفيّة" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "أب_قِ نافذة الطّرفيّة مفتوحة بعد تنفيذ الأمر" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "يمكن استخدام هذه الرّموز الخاصّة في سطر الأوامر:\n" " %f: يمثّل اسم ملفّ مفرد\n" " %F: يمثّل أسماء ملفّات متعدّدة \n" " %u: يمثّل URI مفرد للمّلف\n" " %U: يمثّل معرّفات URI متعدّدة" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "اسم الت_طبيق (اختياريّ، عيّنه لإبقاء الارتباط)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "نفّذ سطر أوامر مخصّص لفتح الملفّات" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "سطر أوامر مخ_صّص" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_عيّن التّطبيق المحدّد كإجراء افتراضيّ لنوع الملفّات هذا" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "أكّد استبدال الملفّات" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "ت_خطّ" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "أ_عد التّسمية" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "ا_كتب فوقه" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "هناك ملفّ بنفس الاسم بالفعل في هذا المكان.\n" "\n" "أتريد استبدال الملفّ الموجود" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "بالملفّ الآتي؟" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "اس_م الملفّ:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "ط_بّق هذا الخيار على كلّ الملفّات الموجودة" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "اختر أيقونة..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "سمة أيقونات النّظام" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "ملفّات الصّور" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "اختر الأيقونة من:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "نفّذ الملفّ" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "نفّذ في ال_طّرفيّة" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "خصائص الملفّ" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "أيقونة الملفّ في منظور المجلّدات" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "الا_سم:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "المكان:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "الملفّ الهدف:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "نوع الملفّ:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "افتح _بِـ:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "اختر التّطبيق المستخدم لفتح نوع الملفّات هذا " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "عدد كلّ الملفّات:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "حجم كلّ الملفّات:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "الحجم في القرص:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "آخر تعديل:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "آخر نفاذ:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "آخر تغيير للصّلاحيّات:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_عامّ" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "المال_ك:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "المجمو_عة:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "عرض المحتو_ى:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "تعديل الم_حتوى:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "التّن_فيذ:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "بِتّات خاصّة:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "من يمكنه قراءة محتويات الملفّ/الدّليل" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "من يمكنه تغيير محتويات الملفّ/الدّليل" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "من يمكنه تنفيذ الملفّ أو الدّخول إلى الدّليل" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "رايات خاصّة لتنفيذ الملفّ" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "رايات خاصّة للنّفاذ إلى الدّليل" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "التّحكّم بالنّفاذ" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "ملفّ مخفيّ" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "ال_صّلاحيّات" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "بلا" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "لاصق" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "عيّن GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "لاصق وعيّن GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "عيّن UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "عيّن UID و GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "المالك فقط" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "المالك والمجموعة فقط" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "أيّ شخص" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "لا أحد" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "بايت" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "ك.بايت" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "م.بايت" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "غ.بايت" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "اختر تاريخًا" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "اختر تاريخًا من التّقويم الآتي" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "ابحث عن ملفّات" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "أنماط ا_سم الملفّ:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "يمكن أن يكون النّمط قائمة أنماط صدفة POSIX (مع ',' كفاصل) أو تعبير POSIX نمطيّ." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_غير حسّاس للحالة" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "ا_ستخدم التّعابير النّمطيّة" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "أما_كن البحث:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "اب_حث في المجلّدات الفرعيّة" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "ابحث في الملفّات الم_خفيّة" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "الاسم/الم_كان" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "نوع الملفّ" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "ابحث فقط عن الملفّات بالأنواع الآتية:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "ملفّات ن_صّيّة" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "ملفّات صو_ر" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "ملفّات صو_تيّة" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "ملفّات مر_ئيّة" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "مستن_دات" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "م_جلّدات" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "أ_خرى:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "أي نوع محتوى صالح يمكن إدخاله هنا. أحرف البدل '*' مسموحة في نهاية النّوع. يجب " "فصل الأنواع المتعدّدة بِـ ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "ن_وع الملفّ" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "المل_فّ يحوي:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "المحتو_ى" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "حجم الملفّ" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "أص_غر من:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "أكب_ر من:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "آخر وقت عُدّل فيه" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(بلا)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "أقد_م من:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "أحد_ث من:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_خصائص" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "متصفّح الوِبّ" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "سيُستخدم متصفّح الوِبّ المحبّذ لفتح الوصلات الفائقة." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "عميل البريد" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "سيُستخدم عميل البريد المحبّذ لإرسال الرّسائل الإلكترونيّة عند النّقر على عناوين " "البُرُد الإلكترونيّة." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "محاكي الطّرفيّة" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "سطر الأوامر:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "تطبيقات النّظام" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "ارتباطات الملفّات" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "إلى:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "يحضّر..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "الملفّ الهدف:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "الوقت المتبقّي:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "الأخطاء الّتي حدثت:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "ملفّ فارغ" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "الوجهة غير صالحة" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "العمليّة غير مدعومة" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "ملفّ مدخلة سطح المكتب غير صالح: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "تعذّر تحديد نوع محتوى الملفّ '%s' لإطلاقه" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "لا تطبيق افتراضيّ معيّن لإطلاق معرّفات URI ‏‎%s‎‎:‎‎/‎/‎" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "تعذّر تعيين دليل العمل إلى '%s': ‏%s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "لا تطبيق افتراضي معيّن لنوع MIME ‏%s هذا" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "الأجهزة" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "الشّبكة" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "سلّة المهملات" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "اختصار إلى معرّف URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: معطى غير صالح" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "لم يعيّن محاكي طرفيّة في ضبط libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "وصف غير صالح لتطبيق \"منشئ المصغّرات\"" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "ك.بايت" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ت.بايت" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "لا بايتات" msgstr[1] "بايت واحد" msgstr[2] "بايتان" msgstr[3] "%u بايتات" msgstr[4] "%u بايتًا" msgstr[5] "%u بايت" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "ك.بايت" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "م.بايت" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "غ.بايت" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ت.بايت" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "مسار URI الفرعيّ '%s' يحوي محارف خلوص غير صالحة" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "مقبض متكرّر للوسم <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "فشل في تحليل '‎%-.*s'، حيث كان يجب أن يكون أرقامًا داخل مرجع محرف (‎ê‎ " "كمثال). قد يكون الرّقم طويلًا جدًّا" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "مرجع المحرف لم ينته بفاصلة منقوطة؛ الأرجح أنّك استخدمت علامة \"و\" الإنجليزيّة " "دون أن تنوي بدء كيان - اخلص من العلامة بِـ ‎&‎" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "مرجع المحرف '‎%-.*s' لا يرمّز محرفًا مسموح به" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "رُئي كيان فارغ '‎&;‎'، الكيانات الصالحة هي: ‎&‎‏ ‎"‎‏ ‎<‎‏ ‎>‎‏ ‎'‎" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "اسم الكيان '‎%-.*s' مجهول" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "لم ينتهِ الكيان بفاصلة منقوطة، أغلب الظّن أنّك استخدمت محرف \"و\" الإنجليزيّ دون " "أن تنوي بدء كيان. اهرب من محرف \"و\" الإنجليزي عبر &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "المسافة غير مسموحة في وسم الإغلاق" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "العنصر '%s' أُغلق لكن لا عنصر فُتح" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "العنصر '%s' كان مغلقًا، لكن العنصر المفتوح حاليًّا هو '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "محرف '%c' غير صالح في بداية قيمة الخاصّيّة" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "محرف '%c' غير صالح في نهاية قيمة الخاصّيّة، توقّع '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "انتهى المستند بشكل غير متوقّع" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "المستند كان فارغًا أو كان يحوي مسافات بيضاء فقط" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: خطأ في بيانات XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "خصّص" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "الملفّات التّنفيذيّة" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "اختر تطبيقًا لفتح ملفّات \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "التّطبيقات المثبّتة" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<لا مجلّدات فرعيّة>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "يحمّل..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "يظهر شجرة الأدّلة في الشّريط الجانبيّ" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "أل_غِ" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "ا_نسخ هنا" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "ا_نقل هنا" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "أو_صِل هنا" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "فشل XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "ا_فتح" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "افتح _بِـ:" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "افتح _بِـ" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "انسخ الم_سار(ات)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "أ_خفِ" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "أظه_ر" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "أ_ضف إلى العلامات" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "أ_عد التّسمية..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "اض_غط..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "است_خرج هنا" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "استخر_ج إلى..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "خصائ_ص" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "انقل إلى الم_هملات" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "في علاماتك علامة لهذا المجلّد بالفعل." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "ملفات الصّور" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "لا بايتات" msgstr[1] "بايت واحد" msgstr[2] "بايتان" msgstr[3] "بايتات" msgstr[4] "بايتًا" msgstr[5] "بايت" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "يفحص... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "فضلًا أدخل اسم مستخدم أو معرّف رقميّ صالح." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "فضلًا أدخل اسم مجموعة أو معرّف رقميّ صالح." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "أتريد تطبيق هذه التّغييرات على كلّ الملفّات والمجلّدات الفرعيّة تكراريًّا؟" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "أخفِ أو أظهر الملفّ" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "هذا الملفّ مخفيّ لأنّ اسمه يبدأ بنقطة ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "الملفّات في هذا النّظام مخفيّة لأنّ أسماؤها تبدأ بنقطة ('.'). اضغط لقلب " "عرض الملفّات المخفيّة." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "يفحص..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "النّفا_ذ للمحتوى:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "ملفّات بأنوع مختلفة" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "الملفّ:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "عدّة ملفّات" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "الاسم" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "الوصف" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "الحجم" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "الصلاحيات" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "المالك" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "عُدّل في" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "المكان" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "الامتداد" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "أنشئ _جديد..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "مجلّد" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "ملفّ فارغ" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "ا_عكس التّحديد" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "افرز الم_لّفات" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "أ_عد تسمية المجلّد..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "_خصائص المجلّد" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "أظهر المخف_يّ" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "اخل_ط الملفّات والمجلّدات" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "ت_جاهل حالة الاسم" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "بالاس_م" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "بوقت التّ_عديل" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "بالح_جم" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "ب_نوع الملفّ" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "أدخل اسمًا للمجلّد المُنشأ حديثًا:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "أنشئ مجلّدًا جديدًا" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "أدخل اسمًا للملفّ الفارغ:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "ينشئ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "جديد" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "أدخل اسمًا لِـ %s الجديد:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "ينشئ %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "ش_غّل التّطبيق الافتراضيّ بعد إنشاء الملفّ" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "يبدو أن الملفّ النّصّيّ '%s' سكرِبت تنفيذيّ.\n" "ما الّذي تريد فعله؟" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "الملفّ '%s' تنفيذيّ. أتريد تنفيذه؟" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "لم تُحدّد مجلّدات" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "حدّد مجلّدًا" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "خطأ" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "أكّد" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "سؤال" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "مديرو النّظام فقط لهم صلاحيّة فعل هذا." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "أتريد نقل الملفّ '%s' إلى سلّة المهملات؟" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "لن تنقل شيئًا صحيح؟" msgstr[1] "أتريد نقل الملفّ المحدّد إلى سلّة المهملات؟" msgstr[2] "أتريد نقل الملفّين المحددّين إلى سلّة المهملات؟" msgstr[3] "أتريد نقل الـ %d ملفّات المحدّدة إلى سلّة المهملات؟" msgstr[4] "أتريد نقل الـ %d ملفًّا المحدّد إلى سلّة المهملات؟" msgstr[5] "أتريد نقل الـ %d ملفّ المحدّد إلى سلّة المهملات؟" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "أتريد حذف الملفّ '%s'؟" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "لن تحذف شيئًا صحيح؟" msgstr[1] "أتريد حذف الملفّ المحدّد؟" msgstr[2] "أتريد حذف الملفّين المحدّدين؟" msgstr[3] "أتريد حذف الـ %d ملفّات المحدّدة؟" msgstr[4] "أتريد حذف الـ %d ملفًّا المحدّد؟" msgstr[5] "أتريد حذف الـ %d ملفّ المحدّد؟" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "أعد تسمية الملفّ" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "فضلًا أدخل اسمًا جديدًا:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "أمتأكّد من إفراغ سلّة المهملات؟" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "ال_صق واذهب" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "شريط مكان المجلّد" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "مجلّد المنزل" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "سطح المكتب" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "التّطبيقات" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "جذر نظام الملفّات" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_ضمّ الجزء" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "أل_غِ ضمّ الجزء" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "أ_خرج الوسيط القابل للإزالة" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_هيّئ الجزء" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "أ_عد تسمية عنصر العلامات" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "أ_زل من العلامات" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "انقل العلامة لأ_على" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "انقل العلامة لأ_سفل" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "أ_فرغ سلّة المهملات" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "يظهر قائمة بالأماكن، والأجهزة والعلامات الشّائعة في الشّريط الجانبيّ" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "أعد تسمية عنصر العلامات" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "أدخل اسمًا جديدًا:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "النّوع: %s\n" "الحجم: %s\n" "عُدّل في: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "النّوع: %s\n" "عُدّل في: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "حدثت أخطاء قبل توقّف عمليّة الملفّات." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "أُلغيت" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "عمليّة الملفّات انتهت بأخطاء." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "انتهت" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "تعذّر نقل بعض الملفّات إلى المهملات لأنّ أنظمة الملفّات التّحتيّة لا تدعم هذه " "العمليّة.\n" "أتريد حذفها بدل ذلك؟" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "ألب_ث" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "است_كمل" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "، " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "ينقل" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "ينسخ" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "يرمي" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "يحذف" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "ينشئ الوصلة" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "إلى:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "ينشئ الوصلات إلى الملفّات" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "يغيّر خاصيّات" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "يغيّر خاصيّات الملفّات" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "يستعيد" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s الملفّات" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "عمليّة الملفّات تتقدّم..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s الملفّ:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s الملفّات:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "الأما_كن" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "شجرة الأ_دلّة" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "ال_بعيد" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "الأماكن" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "شجرة الأدلّة" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "اعرض محتويات المجلّد" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "أ_خفِ %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "انقل للي_سار" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "انقل للي_مين" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "أظهر %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "ان_سَ العرض" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "منظور أي_قونات" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "منظور م_دمج" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "منظور م_صغّرات" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "منظور قائمة م_فصّلة" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "يغيّر اللسان النّشط" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "الدّليل '%s' المحدّد غير صالح" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "تعذّر النّفاذ إلى الملفّ الوجهة" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "لا يمكن إنشاء وصلة في نظام ملفّات غير أصيل" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "تعذّر استرجاع الملفّ '%s': المسار الأصلي مجهول" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "ملفّا المصدر والوجهة هما واحد." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "لا يمكن نقل مجلّد إلى مجلّده الفرعيّ" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "لا يمكن نسخ مجلّد إلى مجلّده الفرعيّ" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "الوجهة هي مجلّد فرعيّ من المصدر" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "تعذّر نسخ الملفّ '%s': غير مدعوم" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "يمكن تعيين الاسم المعروض لملفّ واحد فقط" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "يمكن تعيين الهدف لملفّ واحد فقط" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "خطأ في ملفّ XML ‏'%s' ‏(%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "ملفّ XML لا يحوي جذر التّطبيقات" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "تعذّر إنشاء تعريف XML لّـ '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "مسار القائمة '%s' موجود بالفعل" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "خطأ في خبيئة القائمة" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "دليل القائمة غير صالح" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "لا يمكن أن يكون اسم عنصر القائمة فارغًا" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "دليل القائمة '%s' غير صالح" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "عنصر القائمة غير صالح" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "عنصر القائمة '%s' لا يملك ملفّ مدخلة ملائم" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "تغيير حالة الإخفاء غير مدعوم لدليل القائمة" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "تعيين الخاصيّة '%s' غير مدعوم" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "قيمة الخاصيّة '%s' غير صالحة" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' هو دليل قائمة" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' ليس عنصر قائمة" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "ملفّ المدخلة '%s' معطوب" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "تعذّر إنشاء عنصر القائمة '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "لا يجب أن ينتهي دليل القائمة بـ \"‎.desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "عمليّة غير صالحة مع جذر القائمة" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "الوجهة غير صالحة" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: المجلّد '%s' غير موجود في خبيئة القوائم" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 #, fuzzy msgid "Search" msgstr "بحث" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "نتائج البحث" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "اختر الملفّ التّنفيذيّ" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "ال_أمر:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "الأمر ليُنفّذ عند تنشيط أيقونة التّطبيق" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "الو_صف:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "الاسم العامّ للتّطبيق" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_مجلّد العمل:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "مجلّد العمل لتنفيذ البرنامج فيه." #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "ال_تّلميحة:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "تلميحة لإظهارها على التّطبيق" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "ا_ستخدم إخطار البدء" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_مدخلة سطح المكتب" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "ا_ستعد" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "استعد الملفّات المرميّة إلى مساراتها الأصليّة" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "اسم الملفّ المصدر أو معرّف سطح المكتب" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "المصدر" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "اسم الملفّ الناتج" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "النّاتج" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "قرص CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "قرص CD-ROM فارغ" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "قرص CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "قرص CD-R فارغ" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "قرص CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "قرص CD-RW فارغ" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "قرص DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "قرص DVD-ROM فارغ" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "قرص DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "قرص DVD-RW فارغ" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "قرص DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "قرص DVD-RAM فارغ" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "قرص DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "قرص DVD+R فارغ" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "قرص DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "قرص DVD+RW فارغ" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "قرص DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "قرص DVD+R DL فارغ" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "قرص DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "قرص DVD+RW DL فارغ" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "قرص Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "قرص Blu-Ray فارغ" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "قرص Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "قرص Blu-Ray R فارغ" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "قرص Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "قرص Blu-Ray RW فارغ" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "قرص HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "قرص HD DVD فارغ" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "قرص HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "قرص HD DVD-R فارغ" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "قرص HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "قرص HD DVD-RW فارغ" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "قرص MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "قرص MO فارغ" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "قرص MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "قرص MRW فارغ" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "قرص MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "قرص MRW/W فارغ" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "ملفّات صو_تيّة" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "قرص ضوئيّ فارغ" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "قرص ضوئيّ" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "نوع الملف الذي سيفتح:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "معالحة:" #~ msgid "Progress:" #~ msgstr "تقدُّم:" #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "إنشاء وصلات" #~ msgid "_Browse" #~ msgstr "ت_صفح" #~ msgid "My Computer" #~ msgstr "الحاسوب" #~ msgid "_Only for this folder" #~ msgstr "_فقط لهذا المجلد" #~ msgid "Please select a folder" #~ msgstr "رجاءًا حدد مجلدًا" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_فقط لهذا المجلد" #, fuzzy #~ msgid "Computer" #~ msgstr "الحاسوب" #, fuzzy #~ msgid "Network Drives" #~ msgstr "الشبكة" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "تنفي_ذ في محاكي الطرفية" #~ msgid "Shortcuts" #~ msgstr "إختصارات" #~ msgid "Mount Point" #~ msgstr "نقطة الضم" #~ msgid "Create _Symlink" #~ msgstr "أنشء و_صلة" #~ msgid "Se_nd To" #~ msgstr "أرسل إ_لى" #~ msgid "Blank File" #~ msgstr "ملف فارغ" #~ msgid "Error, lxshortcut not installed" #~ msgstr "خطأ، lxshortcut غير مثبت" #~ msgid "Failed to start lxshortcut" #~ msgstr "فشل في بدأ lxshortcut" #~ msgid "_Group:" #~ msgstr "الم_جموعة:" #~ msgid "Rename" #~ msgstr "أعد التسمية" #~ msgid "Make the file executable" #~ msgstr "جعل الملف تنفيذي" #~ msgid "Operations that all other users can do" #~ msgstr "العمليات التي يمكن لكل المستخدمين القيام بها" #~ msgid "Read and Write" #~ msgstr "قراءة وكتابة" #~ msgid "Read only" #~ msgstr "قراءة فقط" #~ msgid "Write only" #~ msgstr "كتابة فقط" libfm-1.4.0/po/be.po000066400000000000000000001470141475513661000141700ustar00rootroot00000000000000# Belarusian translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-05-07 11:29+0000\n" "Last-Translator: Jerome Leclanche \n" "Language-Team: LANGUAGE \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1430998183.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Пераважныя праграмы" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "Цэтлік" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "Выберыце праграму" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Ужываць выбраную праграму для адкрыцця файлаў" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "_Устаноўленая праграма" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "Радок загада для выканання:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "_Аглядаць" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Выканаць _у эмулятары тэрмінала" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Спецыяльныя коды загаднага радка:\n" " %f: назва аднаго файла\n" " %F: назвы некалькіх файлаў\n" " %u: шлях аднаго файла\n" " %U: шляхі некалькіх файлаў" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Выканаць уласны загад для адкрыцця файлаў" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "Ула_сны загад" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "" "Устанавіць в_ылучаную праграму як прадвызначаную для гэтага тыпу файлаў" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "Пацверджанне перазапісу файлаў" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Пра_мінуць" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Перайменаваць" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Замяніць" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Файл з такой назвай ужо існуе ў выбраным месцы\n" "\n" "Замяніць наяўны файл" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "наступным файлам?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "Н_азва файла:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Ужыць да ўсіх _файлаў" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "Выберыце праграму" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "Сістэмныя праграмы" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "Файлы выя_ў" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "_Змяняць змест:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Выканаць файл" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Выканаць у эмулятары _тэрмінала" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Уласцівасці файла" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "_Уладальнік:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Месцазнаходжанне:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "Мэта:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "Тып файла:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Адкрываць:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Выберыце праграму для адкрыцця файлаў гэтага тыпу " #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "Агульны памер файлаў:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "Агульны памер файлаў:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "Памер на дыску:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "Апошняе змяненне:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "Апошні доступ:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "Апошні доступ:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Агульныя" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Уладальнік:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Гру_па:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Глядзець з_мест:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Змяняць змест:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Выконваць:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Адмысловыя біты:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Хто можа чытаць змест файла/каталога" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Хто можа змяняць змест файла/каталога" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Хто можа выконваць файл ці адкрываць каталог" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Адмысловыя сцягі для выканання файла" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Адмысловыя сцягі для доступу да каталога" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Правы доступу" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "_Відэа файлы" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "Правы _доступу" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Нічога" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "Ліпучы" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Устаноўлены GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Ліпучы & устаноўлены GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy msgid "Set UID" msgstr "Устаноўлены UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Устаноўлены UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy msgid "Only owner" msgstr "Толькі ўладальнік" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Толькі ўладальнік і група" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Хто-хоця" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ніхто" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Байтаў" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "КБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 #, fuzzy msgid "Choose Date" msgstr "Выберыце дату" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Выберыце дату ў наступным календары" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Шукаць файлы" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "Шаблон _назвы файла:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Ігнараваць _рэгістр" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Ужыць рэ_гулярны выраз" #: ../data/ui/filesearch.glade.h:12 #, fuzzy msgid "Plac_es to Search:" msgstr "Месцы пошуку" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Шукаць у падкаталогах" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Шукаць сярод схаваных файлаў" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Назва/_Шлях" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Тып файла" #: ../data/ui/filesearch.glade.h:17 #, fuzzy msgid "Only search for files of following types:" msgstr "Шукаць толькі файлы наступных тыпаў" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Т_экставыя файлы" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Файлы выя_ў" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Гукавыя _файлы" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Відэа файлы" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Дакументы" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "Каталог" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Тып файла" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "Файл утрымлівае" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Змест" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Памер файла" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Меншы за:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Большы за:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Апошняе змяненне" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Няма)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Раней за:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Пазней за:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Уласцівасці" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Веб-браўзер" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Пераважны вэб-браўзер, які будзе ужыты для адкрыцця інтэрнэт-спасылак." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "Паштовы кліент" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Пераважны паштовы кліент, які будзе ўжыты для стварэння электроннага ліста, " "калі вы націсніце на адрас e-mail." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Эмулятар тэрмінала" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Загадны радок:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Сістэмныя праграмы" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Файлавыя асацыяцыі" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "У:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Падрыхтоўка..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Мэта:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Астатні час:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "Узніклі памылкі:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Выканаць файл" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "_Інвертаваць вылучэнне" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Аперацыя не падтрымліваецца" #: ../src/base/fm-file-launcher.c:88 #, fuzzy, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Недапушчальная назва файла %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Сетка" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Сметніца" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "Цэтлік" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "Недапушчальны каталог меню" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" msgstr[1] "%u байты" msgstr[2] "%u байтаў" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "КіБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МіБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГіБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТіБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Наставіць" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "Выканаць файл" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "Ужываць выбраную праграму для адкрыцця файлаў" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Устаноўленыя праграмы" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "<Няма падкаталогаў>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Чытанне..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "Скасавана" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Памылка XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "А_дкрыць" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Адкры_ць з дапамогай..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "Адкры_ць з дапамогай..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "_Сцерці з закладак" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "_Перайменаваць" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Сціснуц_ь..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Распакаваць сюды" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Распакаваць _у..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Уласцівасці файла" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "Сметніца" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "Файлы выя_ў" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "байт" msgstr[1] "байты" msgstr[2] "байтаў" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Увядзіце дзейснае імя карыстальніка ці лічбавы ідэнтыфікатар." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Увядзіце дзейсную назву групы ці лічбавы ідэнтыфікатар." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Прымяніць змены рэкурсіўна да ўсіх файлаў і падкаталогаў?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Чытанне..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Доступ да зместу:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Файлы розных тыпаў" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "Тып файла:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Некалькі файлаў" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Назва" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Апісанне" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Памер" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Правы доступу" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Уладальнік" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Зменены" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Месцазнаходжанне" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "С_тварыць..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Каталог" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "Выканаць файл" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Інвертаваць вылучэнне" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Парадкаваць файлы" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "Перайменаванне файла" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "Уласцівасці файла" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Паказваць _схаваныя" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "_Адзіны парадак для файлаў і каталогаў" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "_Не ўлічваць рэгістр" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Па _назве" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Па _часу змянення" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Па _памеру" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Па _тыпу файла" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Увядзіце назву новага каталога:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Перайменаванне файла" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "Увядзіце назву новага файла:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "Стварыць..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Новы" #: ../src/gtk/fm-folder-view.c:876 #, fuzzy, c-format msgid "Enter a name for the new %s:" msgstr "Увядзіце назву новага файла:" #: ../src/gtk/fm-folder-view.c:879 #, fuzzy, c-format msgid "Creating %s" msgstr "Стварэнне сімвальных спасылак" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Гэты файл '%s' - выканальны скрыпт.\n" "Што вы хочаце з ім зрабіць?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Гэты файл '%s' - выканальны. Хочаце запусціць яго?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Не зададзены каталог." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Выберыце каталог" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Памылка" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Пацверджанне" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Пытанне" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Толькі сістэмны адміністратар мае дазвол на гэта." #: ../src/gtk/fm-gtk-utils.c:924 #, fuzzy, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Перамясціць вылучаныя файлы ў сметніцу?" #: ../src/gtk/fm-gtk-utils.c:929 #, fuzzy, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Перамясціць вылучаныя файлы ў сметніцу?" msgstr[1] "Перамясціць вылучаныя файлы ў сметніцу?" msgstr[2] "Перамясціць вылучаныя файлы ў сметніцу?" #: ../src/gtk/fm-gtk-utils.c:989 #, fuzzy, c-format msgid "Do you want to delete the file '%s'?" msgstr "Хочаце сцерці вылучаныя файлы?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Хочаце сцерці вылучаныя файлы?" msgstr[1] "Хочаце сцерці вылучаныя файлы?" msgstr[2] "Хочаце сцерці вылучаныя файлы?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Перайменаванне файла" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Увядзіце новую назву:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Хочаце ачысціць сметніцу?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Файлавыя асацыяцыі" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Перайменаванне файла" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Працоўная прастора" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Праграмы" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "_Тып файла" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Прымацавац_ь дыск" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Размацаваць дыск" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Вызваліць р_ухомы носнік" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "Прымацавац_ь дыск" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Перайменаваць закладку" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "_Сцерці з закладак" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "_Сцерці з закладак" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "_Сцерці з закладак" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Ачысціць сметніц_у" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Перайменаваць закладку" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Увядзіце новую назву:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Тып: %s\n" "Памер: %s\n" "Зменены: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Тып: %s\n" "Зменены: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Файлавая аперацыя скасавана, ёсць некаторыя памылкі." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Скасавана" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "Файлавая аперацыя скасавана, ёсць некаторыя памылкі." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Закончана" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Некаторыя файлы не могуць быць змешчаны ў сметніцу, таму што файлавая " "сістэма не падтрымлівае гэту аперацыю.\n" "Хочаце сцерці іх назусім?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_Узнавіць" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Перамяшчэнне файлаў" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Капіраванне файлаў" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Перанос файлаў у сметніцу" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Сціранне файлаў" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Стварэнне сімвальных спасылак" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "У:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Стварэнне сімвальных спасылак" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Змяненне атрыбутаў файла" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Змяненне атрыбутаў файла" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_Узнавіць" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "Файлы выя_ў" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "Тып файла:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "Тып файла:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Выкл" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Месцы" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Дрэва каталогаў" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Аддалены" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Месцы" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Дрэва каталогаў" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "Указаны каталог не існуе" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Узнавіць файлы са сметніцы да пачатковага стану" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Старое і новае месца супадаюць." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Немагчыма перамясціць каталог у яго падкаталог" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Немагчыма скапіраваць каталог у яго падкаталог" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Каталог прызначэння - падкаталог выточнага каталога" #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "Немагчыма скапіраваць каталог у яго падкаталог" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Памылка кэшу меню" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Недапушчальны каталог меню" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, fuzzy, c-format msgid "Invalid menu directory '%s'" msgstr "Недапушчальны каталог меню" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "Недапушчальны каталог меню" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, fuzzy, c-format msgid "Setting attribute '%s' not supported" msgstr "Аперацыя не падтрымліваецца" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "Недапушчальная назва файла %s" #: ../src/modules/vfs-menu.c:1995 #, fuzzy, c-format msgid "The '%s' is a menu directory" msgstr "Недапушчальны каталог меню" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, fuzzy, c-format msgid "The '%s' isn't a menu item" msgstr "Недапушчальны каталог меню" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, fuzzy, c-format msgid "Cannot create menu item '%s'" msgstr "Недапушчальная назва файла %s" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Пошук" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Шукаць файлы" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Выканаць файл" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "У:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "Месцазнаходжанне:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "_Уладальнік:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "У:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "Выберыце праграму" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Працоўная прастора" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Узнавіць" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Узнавіць файлы са сметніцы да пачатковага стану" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Дыск CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Пусты дыск CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Дыск CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Пусты дыск CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Дыск CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Пусты дыск CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Дыск DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Пусты дыск DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Дыск DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Пусты дыск DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Дыск DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Пусты дыск DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Дыск DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Пусты дыск DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Дыск DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Пусты дыск DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Дыск DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Пусты дыск DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Дыск DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Пусты дыск DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Дыск Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Пусты дыск Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Дыск Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Пусты дыск Blu-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Дыск Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Пусты дыск Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Дыск HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Пусты дыск HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Дыск HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Пусты дыск HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Дыск HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Пусты дыск HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Дыск MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Пусты дыск MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Дыск MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Пусты дыск MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Дыск MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Пусты дыск MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Гукавыя _файлы" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Пусты аптычны дыск" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Аптычны дыск" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Тып файла для адкрыцця:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Выконваецца:" #~ msgid "Progress:" #~ msgstr "Выканана:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Файлавая аперацыя скончана, але ёсць некаторыя памылкі." #~ msgid "_Browse" #~ msgstr "_Аглядаць" #~ msgid "My Computer" #~ msgstr "Камп'ютар" #~ msgid "_Only for this folder" #~ msgstr "_Толькі ў гэтым каталогу" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Пазначце, каб запомніць парадкаванне як настаўленне каталога, а не " #~ "агульнае" #~ msgid "Please select a folder" #~ msgstr "Калі ласка, выберыце каталог" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_Толькі ў гэтым каталогу" #, fuzzy #~ msgid "Computer" #~ msgstr "Камп'ютар" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Сетка" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Выканаць _у эмулятары тэрмінала" #~ msgid "Shortcuts" #~ msgstr "Цэтлікі" #~ msgid "Mount Point" #~ msgstr "Пункт мацавання" #~ msgid "Create _Symlink" #~ msgstr "Ствар_ыць сімвальную спасылку" #~ msgid "Se_nd To" #~ msgstr "Адп_равіць" #~ msgid "Blank File" #~ msgstr "Пусты файл" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Памылка, lxshortcut не ўстаноўлены" #~ msgid "Failed to start lxshortcut" #~ msgstr "Не ўдалося запусціць lxshortcut" #~ msgid "_Group:" #~ msgstr "_Група:" #~ msgid "Rename" #~ msgstr "Перайменаваць" #~ msgid "Make the file executable" #~ msgstr "Выканальны файл" #~ msgid "Operations that all other users can do" #~ msgstr "Аперацыі, дазволеныя ўсім астатнім карыстальнікам" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Аперацыі, якія можа выконваць уладальнік файла" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Аперацыі, дазволеныя карыстальнікам - удзельнікам той жа групы, што і " #~ "ўладальнік файла" #~ msgid "Read and Write" #~ msgstr "Чытанне і запіс" #~ msgid "Read only" #~ msgstr "Толькі чытанне" #~ msgid "Write only" #~ msgstr "Толькі запіс" libfm-1.4.0/po/bg.po000066400000000000000000001674011475513661000141740ustar00rootroot00000000000000# Bulgarian translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , 2010. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-05-07 11:30+0000\n" "Last-Translator: Jerome Leclanche \n" "Language-Team: LANGUAGE \n" "Language: bg\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-Generator: Pootle 2.7\n" "X-Poedit-Bookmarks: -1,59,-1,-1,-1,-1,-1,-1,-1,-1\n" "X-POOTLE-MTIME: 1430998226.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Предпочитани програми" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Изберете приложенията, които да се извикват при клик на Уеб връзка или имейл " "адрес." #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Редактор на преки пътища" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Създаване на нов или промяна на съществуващия запис на работния плот" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Изберете приложение" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Използвайте избраното приложение за отваряне на файлове" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Инсталирани приложения" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Команда за изпълнение:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Разглеждане..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Изпълни в терминала" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Задръж прозореца на конзолата отворен след изпълнението на командата" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Специални кодове могат да бъдат използвани в командния ред:\n" " %f: Представлява име на файл\n" " %F: Представлява няколко имена на фалове\n" " %u: Представлява един адрес до файл\n" " %U: Представлява няколко адреса" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Име на приложение (по избор, задайте за да се подсещате)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Изпълни потребителска команда за отваряне на файлове" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "П_отребителска команда" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Задай маркираното приложение по подразбиране за този вид файл" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Потвърдете заменянето на файла" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Прескачане" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Преименуване" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Презапис" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Има файл със същото име.\n" "\n" "Желаете ли да замените съществуващия файл?" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "с този файл?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Име на _файл:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Приложи тази опция до всички съществуващи файлове" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Избор на икона..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "тема със системни икони" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "изображения" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Избор на икона от:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Изпълняване на Файл" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Изпълняване в _Терминал" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Свойства" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Икона на файла при прегледа в папка" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Име:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Място:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Обект:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Вид файл:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Отвори _с:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Изберете приложение за отваряне на файлове от същия тип" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Общ брой файлове:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Общ размер на файловете:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Място на диска:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Последна промяна:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Последен достъп:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Последна промяна на правата:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Общи" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "С_обственик:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Група:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "П_реглед на съдържание:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Промяна на съдържание:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Изпълни:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Специални условия:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Който може да чете съдържанието на файловете/директориите" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Който може да променя съдържанието на файловете/директориите" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Който може да изпълнява файлове и да отваря директории" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Специални правила за изпълнение" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Специални правила за достъп до директория" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Контрол за достъп" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Скрит файл" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Достъпност" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Няма" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Прилепване" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Задаване на Номер на групата" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Прилепване и задаване на Номер на групата" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Задаване на Номер на потребителя" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Задаване на Номер на потребителя и групата" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Само собственика" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Само собственика и групата му" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Всеки един" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Никой" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Байтове" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "кБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Изберете дата" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Изберете дата от следния календар" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Търсене на файлове" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "_Образци за име на файл:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Шаблонът може да бъде POSIX списък с обвивка (с разделител ',') или POSIX " "регулярен израз." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Зачитане на главни и малки _букви" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Ако _съвпада с цяла дума" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Места за търсене" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Търси в поддиректориите" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Търси _скритите файлове" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Име/_Място" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Вид файл:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Търси само за файлове от типа:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Те_кстови файлове" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Изображения" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Звукови файлове" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Видео файлове" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Документи" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Па_пки" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Дру_го:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Тук може да бъде въведено всеки тип валидно съдържание. Позволени са " "заместващи знаци „*“ в края на вида файл. Множество видове, трябва да са " "разделени с „;“." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Вид фай_л" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Съ_държание на файла:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Съдържание" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Размер на файла" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "По-_малък от:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "По-_голям от:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Последна промяна:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Няма)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "По-_скоро от:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "По-_късно от:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Предпо_читания" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Браузър" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Предпочитаният Браузър ще се използва за отваряне на скрити връзки." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Пощенски клиент" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Предпочитаният Пощенски клиент ще се използва за обработка и изпращане на " "съобщения, когато кликате върху имейл адреси." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Терминал" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Команда:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Системни програми" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Файлови връзки" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "До:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Подготвяне..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Обект:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Оставащо време:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Настъпиха следните грешки:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Празен файл" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Неправилен адрес" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Операцията не се поддържа" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Невалиден файл за работен плот: „%s“" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Не може да се определи вида на файла „%s“, за да бъде стартиран" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Няма зададена стандартна програма за отваряне на връзки от типа %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Директорията „%s“ не може да бъде зададена: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Няма зададено стандартно приложение за файл от типа %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Устройства" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Мрежа" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Кош" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "пряка връзка до адрес" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: неправилна стойност" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Няма зададена конзола в настройките на libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Неправилно пояснение в приложението за миниатюри" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "кБ" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" msgstr[1] "%u байта" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "киБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МиБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГиБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТиБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Пътят „%s“ в адреса съдържа неправилни условни знаци" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Повтарящ се ключов израз за етикет <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Грешка при анализ на „%-.*s“, което трябва да е число в указател (напр. " "„ê“) - вероятно числото е твърде голямо." #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Указателят на знак не завършва с „;“. Най-вероятно сте използвали „&“, без " "да сте го въвели като отделна единица. Представете го като „&“" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Указателят „%-.*s“ не представлява разрешен знак за кодиране" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Намерена е празна заместваща последователност: „&;“. Валидни " "последователности са: „&“, „"“, „<“, „>“, „'“" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Името на заместващата последователност „%-.*s“ е неизвестно" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Заместващата последователност не завършва с „;“. Най-вероятно сте използвали " "„&“, без той да е начало на заместваща последователност. Представете го като " "„&“" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Интервалът не е позволен в етикет за затваряне" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Елементът „%s“ беше затворен и не бе отворен друг" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Елементът „%s“ е затворен, но в момента е отворен „%s“" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Неправилен знак „%c“ в началото на стойността на атрибута" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Неправилен знак „%c“ в края на стойността на атрибута, очакваният знак е „%c“" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Документът се затвори неочаквано" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Документът беше празен или съдържаше само интервали" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: Грешка в XML данните" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Промени" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Изпълними файлове" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Изберете приложение за отварянето на „%s“ файлове" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Инсталирани програми" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Няма поддиректории>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Зареждане..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Показва дърво от директории в страничния панел" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Отказ" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Копирай тук" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Премести тук" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Създай връзка тук" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave пропадна." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "Отвор_и" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Отвори _с..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Отвор_и с..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Копирай п_ътя" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Скриване" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Разкриване" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Добави в Отметки" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Преименувай..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Компресира_й..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Разар_хивирай тук" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Ра_зархивирай в..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Свой_ства" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "П_ремести в Коша" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Вече имате направена отметка за тази папка." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Изображения" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "байт" msgstr[1] "байтове" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "сканиране... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Моля, въведете съществуващо потребителско име или цифров индикатор." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Моля, въведете съществуващо име на група или цифров индикатор." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Искате ли да приложите тези промени на всички файлове и поддиректории?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Скриване или разкриване на файла" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Този файл е скрит, защото името му започва с точка („.“)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Файловете в системата са скрити, ако имената им започват с „.“. Натиснете " " за превключване режима за показване на скрити файлове." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "сканиране..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Достъп_ни:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Различни видове файлове" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Вид файл:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Множество файлове" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Име" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Описание" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Размер" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Права" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Собственик" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Променен" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Място" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Разширение" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Съз_даване на..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Папка" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Празен файл" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Обръщане на избраното" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Пренаре_ждане на файлове" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "П_реименуване на папка" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "С_войства на папката" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Показване на с_критите" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Смесване на _файлове и папки" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Пр_енебрегване на главни и малки букви" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "По _име" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "По последна _промяна" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "По _размер" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "По _вид на файла" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Въведете име на новосъздадената папка:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Създаване на нова папка" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Въведете име на новосъздадения файл:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Създаване ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Нов(а)" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Въведете име на %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Създаване на %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Стартиране на стандартното приложение за файла след създаването му" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Изглежда този файл „%s“ е изпълним скрипт.\n" "Какво желаете да направите?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Този файл: „%s“ е изпълним. Желаете ли да го стартирате?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Няма избрани папки." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Изберете папка" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Грешка" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Потвърди" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Въпрос" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Само администратора има привилегии да направи това." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Искате ли да преместите файла „%s“ в коша?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Искате ли да преместите избрания файл %d в коша?" msgstr[1] "Искате ли да преместите избраните файлове %d в коша?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Искате ли да изтриете файла „%s“?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Искате ли да изтриете избраният файл %d?" msgstr[1] "Искате ли да изтриете избраните файлове %d?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Преименувай файла" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Моля, въведете ново име:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Наистина ли искате да изпразните коша?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "П_оставяне и продължаване" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Лента с разположение" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Домашна папка" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Работен плот" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Приложения" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Коренова папка на файловата система" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Монтиране на д_ял" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Д_емонтиране на дял" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Изва_ди носителя" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Монтиране на дял" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "П_реименувай отметката" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Према_хни от Отметки" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Преместване на отметката _нагоре" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Преместване на отметката _надолу" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Изпра_зни Коша" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Показва списък от най-често посещавани места, устройства и отметки в " "страничния панел" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Преименувай Отметката" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Въведете ново име:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Вид: %s\n" "Размер: %s\n" "Променен: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Вид: %s\n" "Променен: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Възникнаха грешки преди спирането на файловата операция." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Отказано" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Файловата операция приключи с грешки." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Приключено" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Някои файлове не могат да бъдат изхвърлени в коша, защото основните файлови " "системи не поддържат тази операция.\n" "Желаете ли да ги изтриете въпреки това?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Пауза" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Продължаване" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Преместване" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Копиране" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Изхвърляне в коша" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Изтриване" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Създаване на символна връзка" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "В(ъв):" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Създаване на връзки до файлове" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Промени атрибутите на" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Промени атрибутите на файловете" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "_Възстановяване" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s файлове" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Файловата операция се изпълнява..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s файлове:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s файлове:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "Изкл_ючи" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "Мес_та" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Дърво от ди_ректории" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "От_далечен" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Места" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Дърво от директории" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Изглед на съдържанието в папката" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Скрий %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Премести наляво" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "П_ремести надясно" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Показване на %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Забрави ширината" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Изглед като _икони" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Стегнат изглед" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Изглед като _миниатюри" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Подробен из_глед" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Променя активният подпрозорец" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Посочената директория „%s“ не съществува" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Не може да се домогне до мястото на файла" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" "Не може да се създаде връзка върху файлова система, която не е стандартна" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Не може да се възстанови файлът „%s“ от коша: оригиналният път не е известен" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Мястото и източника са същите." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Папка не може да бъде премествана в нейна дъщерна." #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Папка не може да бъде копирана в нейна дъщерна." #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Мястото е подпапка на източника." #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Файлът „%s“ не може да бъде копиран: не се поддържа" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" "Задаването на име, което да се показва, може да бъде направено само за един " "файл" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Задаването на цел може да бъде направено само за един файл" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Грешка в XML файла „%s (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML-файлът не съдържа корена на приложенията" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Не може да се създаде XML определение за „%s“" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Пътят „%s“ в менюто вече съществува" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Грешка при генериране на менюто" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Неправилна директория в менюто" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Името на елемент в менюто не може да бъде празно" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Неправилна директория „%s“ в менюто" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Неправилен елемент в менюто" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Елементът „%s“ в менюто не съдържа подходящ запис във файл" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" "Промяна на състоянието за скриване не се поддържа за директория в менюто" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Задаването на атрибут „%s“ не се поддържа" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Неправилна стойност за атрибута „%s“" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "„%s“ е директория в менюто" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "„%s“ не е елемент в менюто" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Записаният файл „%s“ е увреден" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "„%s“ не може да бъде създаден като елемент в менюто" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Името на директория за менюто не трябва да завършва на „.desktop“" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Неправилна операция с корена на менюто" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Неправилен адрес" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: папката „%s“ не е намерена в запаса" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Търсене" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Резултати от търсенето" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Изберете изпълним файл" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Команда:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Команда за изпълнение, когато иконата на приложението е активирана" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Описание:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Стандартно име на програмата" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Действаща директория:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Действаща директория, в която да бъде стартирана програмата" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Подсказка:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Подсказка за показване на приложението" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Известява_не при стартиране" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Запис на _Работния плот" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Възстановяване" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Възстанови изхвърлените файлове" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "име на източника или номер на работния плот" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ИЗТОЧНИК" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "име на резултатния файл" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "РЕЗУЛТАТ" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Диск: CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Празен диск: CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Диск: CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Празен диск: CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Диск: CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Празен диск: CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Диск: DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Празен диск: DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Диск: DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Празен диск: DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Диск: DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Празен диск: DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Диск: DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Празен диск: DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Диск: DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Празен диск: DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Двуслоен диск: DVD+R" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Празен Двуслоен диск: DVD+R" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Двуслоен диск: DVD+RW" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Празен Двуслоен диск: DVD+RW" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Диск: Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Празен диск: Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Записваем диск: Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Празен Записваем диск: Blu-Ray" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Презаписваем диск: Blu-Ray" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Празен Презаписваем диск: Blu-Ray" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Диск: HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Празен диск: HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Записваем диск: HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Празен Записваем диск: HD DVD" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Презаписваем диск: HD DVD" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Празен Презаписваем диск: HD DVD" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Магнитооптичен диск" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Празен Магнитооптичен диск" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Записваем Магнитооптичен диск" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Празен, Записваем Магнитооптичен диск" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Презаписваем Магнитооптичен диск" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Празен, Презаписваем Магнитооптичен диск" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Звукови файлове" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Празен Оптичен диск" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Оптичен диск" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Вид на файла за отваряне:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Обработка:" #~ msgid "Progress:" #~ msgstr "Прогрес:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Операцията е изпълнена, но възникнаха грешки." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Създаване на символни връзки" #~ msgid "_Browse" #~ msgstr "_Намери" #~ msgid "My Computer" #~ msgstr "Моят компютър" #~ msgid "_Move" #~ msgstr "Пре_местване" #~ msgid "_Trash" #~ msgstr "_Кош" #~ msgid "_Only for this folder" #~ msgstr "_Само за тази папка" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Изберете, за да се запомни пренареждането за всяка папка индивидуално" #~ msgid "Please select a folder" #~ msgstr "Моля, изберете папка" #~ msgid "Entry for folder path" #~ msgstr "Запис за пътя до папката" #~ msgid "Computer" #~ msgstr "Компютър" #~ msgid "Network Drives" #~ msgstr "Мрежови устройства" #~ msgid "_Run in terminal emulator" #~ msgstr "_Изпълни в терминала" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Поддържай конзолата отворена след стартиране" #~ msgid "Shortcuts" #~ msgstr "Преки пътища" #~ msgid "Mount Point" #~ msgstr "Място на монтиране" #~ msgid "Create _Symlink" #~ msgstr "Съ_здаване на символна връзка" #~ msgid "Se_nd To" #~ msgstr "Из_прати до" #~ msgid "Blank File" #~ msgstr "Празен файл" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Грешка, пакетът lxshortcut не е инсталиран" #~ msgid "Failed to start lxshortcut" #~ msgstr "Неуспех при стартирането на lxshortcut" #~ msgid "_Group:" #~ msgstr "_Група:" #~ msgid "Rename" #~ msgstr "Преименувай" #~ msgid "Make the file executable" #~ msgstr "Направи файла изпълняем" #~ msgid "Operations that all other users can do" #~ msgstr "" #~ "Операции, които другите потребители,\n" #~ "могат да изпълняват" #~ msgid "Operations that the owner of the file can do" #~ msgstr "" #~ "Операции, които собственика на файла,\n" #~ "може да изпълнява" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Операции с файла, които могат да изпълняват потребителите\n" #~ "от групата на собственика" #~ msgid "Read and Write" #~ msgstr "Четене и Записване" #~ msgid "Read only" #~ msgstr "Само четене" #~ msgid "Write only" #~ msgstr "Само записване" libfm-1.4.0/po/bn.po000066400000000000000000001477451475513661000142140ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: bn\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774895.036117\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "পছন্দনীয় অ্যাপ্লিকেশন" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "শর্টকাট" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "একটি অ্যাপ্লিকেশন বাছাই করুন" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "ফাইল খোলার জন্য নির্বাচিত অ্যাপ্লিকেশন ব্যবহার করুন" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "ইন্সটলকৃত অ্যাপ্লিকেশন" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "যে কমান্ড লাইনটি কার্যকর করতে হবে:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "ব্রাউজ (_B)" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 #, fuzzy msgid "_Execute in terminal emulator" msgstr "টার্মিনাল ইমিউলেটরকে কার্যকর করুন" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "কমান্ড লাইনে এই বিশেষ কোডগুলো ব্যবহার করা যায়:\n" " %f: একটি ফাইলের নাম বোঝায়\n" " %F: একাধিক ফাইলের নাম বোঝায়\n" " %u: ফাইলের একটি URI বোঝায় \n" " %U: একাধিক URI বোঝায়" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "ফাইল খোলার জন্য পছন্দসই কমান্ড লাইন কার্যকর করুন" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "স্বনির্ধারিত কমান্ড লাইন" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "এই ফাইলের জন্য নির্বাচিত অ্যাপ্লিকেশনকে ডিফল্ট অ্যাকশন হিসাবে নির্ধারণ করুন" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "ফাইল প্রতিস্থাপন করা নিশ্চিত করুন" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "এড়িয়ে যান (_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "পুনরায় নামকরণ করুন (_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "প্রতিস্থাপন (_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "এখানে একই নামে ইতোমধ্যে একটি ফাইল আছে।\n" "\n" " আপনি কি উপস্থিত ফাইলটি প্রতিস্থাপন করতে চান" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "নিম্নলিখিত ফাইলের সাথে?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "ফাইল নাম:" #: ../data/ui/ask-rename.glade.h:10 #, fuzzy msgid "_Apply this option to all existing files" msgstr "উপস্থিত সকল ফাইলে এই অপশনটি প্রয়োগ করুন" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "একটি অ্যাপ্লিকেশন বাছাই করুন" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "সিস্টেম অ্যাপ্লিকেশন" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "ফাইল ফেলে দেয়া হচ্ছে" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "লক্ষ্য:" #: ../data/ui/exec-file.glade.h:1 #, fuzzy msgid "Execute File" msgstr "অনেকগুলো ফাইল" #: ../data/ui/exec-file.glade.h:2 #, fuzzy msgid "Execute in _Terminal" msgstr "টার্মিনাল ইমিউলেটরকে কার্যকর করুন" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "ফাইলের বৈশিষ্ট্যাবলী" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "মালিক (_O):" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "অবস্থান:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "লক্ষ্য:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "ফাইল টাইপ:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "অন্য অ্যাপ্লিকেশনে খুলুন (_O):" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "এই ধরনের ফাইল খুলতে যে অ্যাপ্লিকেশন ব্যবহার করা হয় তা নির্বাচন করুন" #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "ফাইলের সম্পূর্ন আকার:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "ফাইলের সম্পূর্ন আকার:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "ডিস্কে আকার:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "শেষ পরিবর্তন:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "শেষ প্রবেশাধিকার:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "শেষ প্রবেশাধিকার:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "সাধারণ (_G)" #: ../data/ui/file-prop.glade.h:16 #, fuzzy msgid "O_wner:" msgstr "মালিক:" #: ../data/ui/file-prop.glade.h:17 #, fuzzy msgid "G_roup:" msgstr "গ্রুপ:" #: ../data/ui/file-prop.glade.h:18 #, fuzzy msgid "_View content:" msgstr "মেইল ক্লায়েন্ট" #: ../data/ui/file-prop.glade.h:19 #, fuzzy msgid "C_hange content:" msgstr "লক্ষ্য:" #: ../data/ui/file-prop.glade.h:20 #, fuzzy msgid "_Execute:" msgstr "অন্যান্য:" #: ../data/ui/file-prop.glade.h:21 #, fuzzy msgid "Special bits:" msgstr "অন্য অ্যাপ্লিকেশনে খুলুন (_O):" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "কন্ট্রোলে প্রবেশাধিকার" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "ফাইল সরানো হচ্ছে" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "অনুমোদন (_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "কোনটি না" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "কিলোবাইট" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "মেগাবাইট" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "গিগাবাইট" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 #, fuzzy msgid "Search Files" msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "ফাইল টাইপ:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 #, fuzzy msgid "File Type" msgstr "ফাইল টাইপ:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 #, fuzzy msgid "Te_xt files" msgstr "ফাইল মুছে ফেলা হচ্ছে" #: ../data/ui/filesearch.glade.h:19 #, fuzzy msgid "_Image files" msgstr "ফাইল ফেলে দেয়া হচ্ছে" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 #, fuzzy msgid "File _Type" msgstr "ফাইল টাইপ:" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "ডিস্কে আকার:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 #, fuzzy msgid "File Size" msgstr "ফাইল টাইপ:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 #, fuzzy msgid "Last Modified Time" msgstr "শেষ পরিবর্তন:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 #, fuzzy msgid "(None)" msgstr "কোনটি না" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 #, fuzzy msgid "_Properties" msgstr "ফাইলের বৈশিষ্ট্যাবলী" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "ওয়েব ব্রাউজার" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "হাইপারলিঙ্ক খুলতে পছন্দনীয় ওয়েব ব্রাউজার ব্যবহার করা হবে।" #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "মেইল ক্লায়েন্ট" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "আপনি যখন ইমেইল ঠিকানায় ক্লিক করবেন তখন ইমেইল লিখতে পছন্দনীয় মেইল ক্লায়েন্ট " "ব্যবহার করা হবে।" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "টার্মিনাল ইমিউলেটর" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "কমান্ড লাইন:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "সিস্টেম অ্যাপ্লিকেশন" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "সংশ্লিষ্ট ফাইলসমুহ" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "প্রতি:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "প্রস্তুত করা হচ্ছে..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "লক্ষ্য:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "অবশিষ্ট সময়:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "কিছু ত্রুটি ঘটেছে:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "অনেকগুলো ফাইল" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "ইন্সটলকৃত অ্যাপ্লিকেশন" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "নেটওয়ার্ক" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "আবর্জনা বাক্স" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "শর্টকাট" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "টেরাবাইট" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u বাইট" msgstr[1] "%u বাইট" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "কিবিবাইট" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "মিবিবাইট" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "গিবিবাইট" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "টিবিবাইট" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "স্বনির্ধারণ করুন" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "অনেকগুলো ফাইল" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "ফাইল খোলার জন্য নির্বাচিত অ্যাপ্লিকেশন ব্যবহার করুন" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "ইন্সটলকৃত অ্যাপ্লিকেশন" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 #, fuzzy msgid "Loading..." msgstr "প্রস্তুত করা হচ্ছে..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "বাতিলকৃত" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ব্যর্থ হয়েছে।" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 #, fuzzy msgid "Open _With..." msgstr "অন্য অ্যাপ্লিকেশনে খুলুন..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "অন্য অ্যাপ্লিকেশনে খুলুন..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "বুকমার্ক থেকে অপসারণ করুন" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "পুনরায় নামকরণ করুন (_R)" #: ../src/gtk/fm-file-menu.c:163 #, fuzzy msgid "Co_mpress..." msgstr "কমপ্রেস..." #: ../src/gtk/fm-file-menu.c:164 #, fuzzy msgid "Extract _Here" msgstr "এখানে সম্প্রসারণ করুন" #: ../src/gtk/fm-file-menu.c:165 #, fuzzy msgid "E_xtract To..." msgstr "সম্প্রসারণ করুন..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 #, fuzzy msgid "Prop_erties" msgstr "ফাইলের বৈশিষ্ট্যাবলী" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "আবর্জনা" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "ফাইল ফেলে দেয়া হচ্ছে" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 #, fuzzy msgid "byte" msgid_plural "bytes" msgstr[0] "%u বাইট" msgstr[1] "%u বাইট" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "অনুগ্রহ করে একটি ব্যবহারকারীর কার্যকর নাম অথবা সংখ্যাসূচক আইডি দিন।" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "অনুগ্রহ করে একটি কার্যকর গ্রুপের নাম অথবা সংখ্যাসূচক আইডি দিন।" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "আপনি কি সব ফাইল ও সাবফোল্ডারে এই পরিবর্তনসমুহ পুনরাবৃত্তাকারে প্রয়োগ করতে চান‌?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "প্রস্তুত করা হচ্ছে..." #: ../src/gtk/fm-file-properties.c:1089 #, fuzzy msgid "_Access content:" msgstr "কন্ট্রোলে প্রবেশাধিকার" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "বিভিন্ন ধরনের ফাইল" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "ফাইল টাইপ:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "অনেকগুলো ফাইল" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "নাম" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "বর্ণনা" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "আকার" #: ../src/gtk/fm-folder-model.c:193 #, fuzzy msgid "Permissions" msgstr "অনুমোদন (_P)" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "পরিবর্তিত" #: ../src/gtk/fm-folder-model.c:196 #, fuzzy msgid "Location" msgstr "অবস্থান:" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "অনেকগুলো ফাইল" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "ফাইলের বৈশিষ্ট্যাবলী" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "অনুগ্রহ করে একটি ফোল্ডার নির্বাচন করুন" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 #, fuzzy msgid "By _Name" msgstr "নাম" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 #, fuzzy msgid "By _Size" msgstr "আকার" #: ../src/gtk/fm-folder-view.c:222 #, fuzzy msgid "By File _Type" msgstr "ফাইল টাইপ:" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "নতুন একটি নাম দিন:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "সিমলিঙ্ক তৈরি করা হচ্ছে" #: ../src/gtk/fm-folder-view.c:866 #, fuzzy msgid "New" msgstr "নেটওয়ার্ক" #: ../src/gtk/fm-folder-view.c:876 #, fuzzy, c-format msgid "Enter a name for the new %s:" msgstr "নতুন একটি নাম দিন:" #: ../src/gtk/fm-folder-view.c:879 #, fuzzy, c-format msgid "Creating %s" msgstr "সিমলিঙ্ক তৈরি করা হচ্ছে" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "অনুগ্রহ করে একটি ফোল্ডার নির্বাচন করুন" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "ত্রুটি " #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 #, fuzzy msgid "Question" msgstr "বর্ণনা" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "কেবলমাত্র সিস্টেম প্রশাসকের এটি করার অনুমোদন আছে।" #: ../src/gtk/fm-gtk-utils.c:924 #, fuzzy, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "আপনি কি নির্বাচিত ফাইল আবর্জনা বাক্সে ফেলতে চান‌?" #: ../src/gtk/fm-gtk-utils.c:929 #, fuzzy, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "আপনি কি নির্বাচিত ফাইল আবর্জনা বাক্সে ফেলতে চান‌?" msgstr[1] "আপনি কি নির্বাচিত ফাইল আবর্জনা বাক্সে ফেলতে চান‌?" #: ../src/gtk/fm-gtk-utils.c:989 #, fuzzy, c-format msgid "Do you want to delete the file '%s'?" msgstr "আপনি কি নির্বাচিত ফাইল অপসারণ করতে চান?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "আপনি কি নির্বাচিত ফাইল অপসারণ করতে চান?" msgstr[1] "আপনি কি নির্বাচিত ফাইল অপসারণ করতে চান?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "অনুগ্রহ করে একটি নতুন নাম দিন:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "আপনি কি নিশ্চিত যে আপনি আবর্জনা বাক্স খালি করে ফেলতে চান?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "সংশ্লিষ্ট ফাইলসমুহ" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "ডেক্সটপ" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "অ্যাপ্লিকেশন" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "ফাইল টাইপ:" #: ../src/gtk/fm-places-view.c:132 #, fuzzy msgid "_Mount Volume" msgstr "ভলিউম মাউন্ট করুন" #: ../src/gtk/fm-places-view.c:133 #, fuzzy msgid "_Unmount Volume" msgstr "ভলিউম আনমাউন্ট করুন" #: ../src/gtk/fm-places-view.c:134 #, fuzzy msgid "_Eject Removable Media" msgstr "স্থানান্তরযোগ্য মিডিয়া অপসারন করুন" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "ভলিউম মাউন্ট করুন" #: ../src/gtk/fm-places-view.c:151 #, fuzzy msgid "_Rename Bookmark Item" msgstr "বুকমার্ক আইটেম নামান্তর করুন" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "বুকমার্ক থেকে অপসারণ করুন" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "বুকমার্ক থেকে অপসারণ করুন" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "বুকমার্ক থেকে অপসারণ করুন" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 #, fuzzy msgid "_Empty Trash Can" msgstr "আবর্জনা বাক্স খালি করুন" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "বুকমার্ক আইটেম নামান্তর করুন" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "নতুন একটি নাম দিন:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "টাইপ: %s\n" "আকার: %s\n" "পরিবর্তিত: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "টাইপ: %s\n" "পরিবর্তিত: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "ফাইল অপারেশনটি বাতিল হয়েছে এবং কিছু ত্রুটি রয়েছে।" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "বাতিলকৃত" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "ফাইল অপারেশনটি বাতিল হয়েছে এবং কিছু ত্রুটি রয়েছে।" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "শেষ হয়েছে" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "কিছু ফাইল আবর্জনা বাক্সে সরানোর যায় না কারণ মূল ফাইল সিস্টেম অপারেশনটি সমর্থন করে " "না।\n" "এর বদলে আপনি কি ফাইলগুলো মুছে ফেলতে চান?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "পুনরায় জমা করুন (_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "ফাইল সরানো হচ্ছে" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "ফাইল অনুলেপন করা হচ্ছে" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "ফাইল ফেলে দেয়া হচ্ছে" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "ফাইল মুছে ফেলা হচ্ছে" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "সিমলিঙ্ক তৈরি করা হচ্ছে" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "প্রতি:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "সিমলিঙ্ক তৈরি করা হচ্ছে" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "ফাইলের বৈশিষ্টাবলী পরিবর্তন করা হচ্ছে" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "ফাইলের বৈশিষ্টাবলী পরিবর্তন করা হচ্ছে" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "পুনরায় জমা করুন (_R)" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "ফাইল ফেলে দেয়া হচ্ছে" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "ফাইল টাইপ:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "ফাইল টাইপ:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "সুনির্দিষ্ট ডিরেক্টরিটি কার্যকর নেই" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "মূল পাথে পরিত্যাক্ত ফাইল পুনরায় জমা করুন" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "ফাইল পুনরায় নামকরণ করুন" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "অনেকগুলো ফাইল" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "প্রতি:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "অবস্থান:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "মালিক (_O):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "প্রতি:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "একটি অ্যাপ্লিকেশন বাছাই করুন" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "ডেক্সটপ" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "পুনরায় জমা করুন (_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "মূল পাথে পরিত্যাক্ত ফাইল পুনরায় জমা করুন" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "যে ধরনের ফাইল খুলতে হবে:" #~ msgid "Processing:" #~ msgstr "প্রক্রিয়াধীন:" #~ msgid "Progress:" #~ msgstr "অগ্রগতি:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "ফাইল অপারেশন শেষ হয়েছে, কিন্তু কিছু ত্রুটি রয়েছে।" #~ msgid "_Browse" #~ msgstr "ব্রাউজ (_B)" #~ msgid "My Computer" #~ msgstr "আমার কম্পিউটার" #~ msgid "Please select a folder" #~ msgstr "অনুগ্রহ করে একটি ফোল্ডার নির্বাচন করুন" #, fuzzy #~ msgid "Computer" #~ msgstr "আমার কম্পিউটার" #, fuzzy #~ msgid "Network Drives" #~ msgstr "নেটওয়ার্ক" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "টার্মিনাল ইমিউলেটরকে কার্যকর করুন" #~ msgid "Shortcuts" #~ msgstr "শর্টকাট" #~ msgid "Mount Point" #~ msgstr "মাউন্ট পয়েন্ট" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "সিমলিঙ্ক তৈরি করুন" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "প্রেরণ করুন" #~ msgid "_Group:" #~ msgstr "গ্রুপ (_G):" #~ msgid "Rename" #~ msgstr "পুনরায় নামকরণ" #~ msgid "Make the file executable" #~ msgstr "ফাইলটিকে কার্যকরী করুন" #~ msgid "Operations that all other users can do" #~ msgstr "অন্যান্য সকল ব্যবহারকারী যে কাজ করে থাকে" #~ msgid "Operations that the owner of the file can do" #~ msgstr "ফাইলের মালিক যে কাজ করতে পারে" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "একই গ্রুপের ব্যবহারকারী মালিক হিসাবে যে কাজ করতে পারে" #~ msgid "Read and Write" #~ msgstr "লিখুন এবং পড়ুন" #~ msgid "Read only" #~ msgstr "শুধুমাত্র পাঠযোগ্য" #~ msgid "Write only" #~ msgstr "শুধুমাত্র লিখুন" libfm-1.4.0/po/bn_IN.po000066400000000000000000001154251475513661000145700ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: bn_IN\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774895.389137\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "একটি অ্যাপ্লিকেশন বেছে নিন" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "ইনস্টল করা অ্যাপ্লিকেশন(_I)" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "কমান্ড লাইনে চালানো:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "দেখে নিন(_B)" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "টার্মিনাল এমুলেটর-এ চালিয়ে নিন(_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "বিশেষ কমান্ড লাইন(_C)" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "এই প্রকারের ফাইলের জন্য নির্বাচিত অ্যাপ্লিকেশনকে ডিফল্ট করে নিন(_S)" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "ফাইল প্রতিস্থাপন নিশ্চিত করুন" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "বাদ দিয়ে এগিয়ে চলুন(_S)kip" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "নূতন নামকরণ করুন(_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "মুছে ফেলে নূতন নামকরণ করুন(_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "নূতন নামকরণ করুন(_R)" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "একটি অ্যাপ্লিকেশন বেছে নিন" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "যে প্রকারের ফাইল খোলা হবে:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "কমান্ড লাইনে চালানো:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "নূতন নামকরণ করুন(_R)" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "ইনস্টল করা অ্যাপ্লিকেশন(_I)" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "নূতন নামকরণ করুন(_R)" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "নূতন নামকরণ করুন(_R)" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "নূতন নামকরণ করুন(_R)" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "নূতন নামকরণ করুন(_R)" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "নূতন নামকরণ করুন(_R)" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "নূতন নামকরণ করুন(_R)" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "কমান্ড লাইনে চালানো:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "নূতন নামকরণ করুন(_R)" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "যে প্রকারের ফাইল খোলা হবে:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "যে প্রকারের ফাইল খোলা হবে:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "কমান্ড লাইনে চালানো:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "একটি অ্যাপ্লিকেশন বেছে নিন" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "যে প্রকারের ফাইল খোলা হবে:" #~ msgid "_Browse" #~ msgstr "দেখে নিন(_B)" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "টার্মিনাল এমুলেটর-এ চালিয়ে নিন(_E)" libfm-1.4.0/po/ca.po000066400000000000000000001453211475513661000141640ustar00rootroot00000000000000# Catalan translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-10-01 14:36+0000\n" "Last-Translator: Davidmp \n" "Language-Team: LANGUAGE \n" "Language: ca\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1538404584.946748\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Aplicacions preferides" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Selecciona les aplicacions invocades amb un clic sobre un enllaç web o una " "adreça de correu electrònic" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor de dreceres" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Canvia l'entrada d'escriptori existent o crea'n una de nova" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Trieu una aplicació" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utilitza l'aplicació seleccionada per obrir fitxers" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Aplicacions instal·lades" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Línia d'_ordres per executar:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Navega..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Executa-ho en un emulador de terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Mantén la finestra del terminal oberta després d'executar l'ordre" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Es poden emprar aquests codis especials a l'intèrpret d'ordres:\n" " %f: representa el nom d'un sol fitxer\n" " %F: representa el nom de múltiples fitxers\n" " %u: representa un sol URI de fitxer\n" " %U: representa diversos URI de fitxer" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "Nom de l'_aplicació (opcional, establiu-ho per mantenir l'associació)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Executa la línia d'ordres personalitzada per obrir fitxers" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Línia d'ordres _personalitzada" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "E_stableix l'aplicació seleccionada com a predeterminada per a aquest tipus " "de fitxer." #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Confirmeu el reemplaçament de fitxers" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Salta" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Reanomena" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "S_obreescriu" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Ja existeix un fitxer amb aquest mateix nom en aquest lloc.\n" "\n" "Voleu reemplaçar el fitxer existent" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "pel fitxer següent?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Nom del fitxer:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Aplica aquesta opció a tots els fitxers existents" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Escolliu una icona..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "tema d'icones del sistema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "fitxers d'imatge" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Trieu la icona:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Executa el fitxer" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Executa en un _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Propietats del fitxer" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Icona del fitxer a la vista de carpetes" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nom:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Ubicació:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Fitxer de destinació:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipus de fitxer:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Obre a_mb..." #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Trieu l'aplicació que s'emprarà per obrir fitxers d'aquest tipus " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Recompte total de fitxers:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Mida total dels fitxers:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Mida en disc:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Última modificació:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Últim accés:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Últim canvi de permisos:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_General" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "P_ropietari:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Grup:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Visualitzeu-ne el contingut:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Can_vieu-ne el contingut:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Executa:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bits especials:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Qui pot llegir el contingut del fitxer / directori" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Qui pot canviar el contingut del fitxer / directori" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Qui pot executar el fitxer o accedir al directori" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Etiquetes especials per a l'execució del fitxer" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Etiquetes especials per accedir al directori" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Control d'accés" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Fitxer ocult" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permisos" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Cap" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Enganxós" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Estableix el GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Fixa i estableix el GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Estableix l'UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Estableix l'UID i el GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Només el propietari" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Només el propietari i el grup" # també podria ser tothom #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Tothom" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ningú" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Octets" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Trieu la data" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Trieu una data del calendari següent" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Cerca fitxers" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Patrons de _nom de fitxer:" # reviseu bé aquesta proposta, no ho tinc gens clar #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "El patró pot ser tant d'una llista de patrons de POSIX (amb \",\" com a " "separador) com una expressió regular de POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "No distingeix _majúscules ni minúscules" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Usa una expressió regular" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Llocs on cercar:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Cerca en subdirectoris" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Cerca fitxers _ocults" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nom / _Ubicació" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipus de fitxer" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Cerca només fitxers dels tipus següents:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Fit_xers de text" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Fitxers d'_imatge" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Fitxers d'_àudio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Fitxers de _vídeo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documents" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Ca_rpetes" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Altres:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Aquí es pot escriure qualsevol tipus de contingut vàlid. El comodí \"*\" és " "permès al final de cada tipus. Si hi ha més d'un tipus caldria separar-los " "amb \";\"." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipus de fitxer:" # No n'he tret l'aigua clara, també podria ser El fitxer conté: #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "_Contingut del fitxer:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_ontingut" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Mida del fitxer" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Mé_s petit que..." #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Més _gros que..." #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Hora de l'última modificació:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Cap)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Abans de..." #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Més tard qu_e..." #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propietats" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navegador web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "S'emprarà el navegador web preferit per obrir els hiperenllaços." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Client de correu" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "S'emprarà el client de correu preferit per redactar correus quan feu clic " "damunt d'adreces de correu electrònic." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Intèrpret d'ordres:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Aplicacions de sistema" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Associació de fitxer" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "A:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Preparant..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Dades transmeses:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Temps restant:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "S'han produït alguns errors:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Valor buit" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Selecció no vàlida" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "No s'admet l'operació" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Fitxer d'entrada a l'escriptori no vàlid: \"%s\"" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "No es pot determinar el tipus de contingut del fitxer \"%s\" per llançar-lo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "No hi ha cap aplicació predeterminada per llançar URIs %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "No es pot configurar el directori de treball per a \"%s\": %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" "No s'ha configurat cap aplicació predeterminada per als fitxers MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Dispositius" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Xarxa" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Paperera" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "drecera a URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argument no vàlid" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "No s'ha establert cap emulador de terminal a la configuració de libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Descripció no vàlida de l'aplicació de visualització prèvia d'imatges" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u octet" msgstr[1] "%u octets" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "El camí URI \"%s\" conté caràcters d'escapada no vàlids" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Gestor duplicat per a l'etiqueta <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "No s'ha pogut analitzar «%-.*s»: hi hauria d'haver hagut un dígit dins un " "caràcter de referència (per exemple: ê). Potser el dígit és massa llarg." #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "L'entitat no acaba amb un punt i coma. Segurament heu usat un caràcter & " "sense intenció d'iniciar una entitat. Substituïu el caràcter & per &." # Hi ha cap diferència entre «%-.+s» i '%-.+s' ? #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "El caràcter de referència «%-.*s» no codifica un caràcter permès" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "S'ha detectat una entitat buida: «&;». Les entitats vàlides són & " " "< > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Es desconeix el nom de l'entitat «%-.*s»" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "L'entitat no acaba amb un punt i coma. Segurament heu usat un caràcter & " "sense intenció d'iniciar una entitat. Substituïu el caràcter & per &." #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "No es permet l'espai a l'etiqueta de tancament" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "L'element «%s» s'ha tancat però no s'ha obert cap element" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "L'element «%s» estava tancat. L'element obert actualment és «%s»" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Caràcter no vàlid «%c» a l'inici del valor de l'atribut" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Caràcter no vàlid «%c» al final del valor de l'atribut, s'esperava «%c»" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Document ha acabat de manera inesperada" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "El document era buit o només contenia espais en blanc" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: error de dades XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalitza" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Fitxers executables" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Seleccioneu una aplicació per obrir fitxers «%s»" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Aplicacions instal·lades" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Carregant..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Mostra l'arbre de directoris a la barra lateral" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Canceŀla" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "C_opia-ho aquí" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Mou aquí" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Enllaça aquí" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ha fallat." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Obre" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Obre a_mb..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Obre a_mb..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copia'n el camí" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Ama_ga" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Fes _visible" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Afegeix a les adreces d'interès" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Canvia el nom..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mprimeix..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Extreu-ho a_quí" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtreu a..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propi_etats" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Mou-ho a la _paperera" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" "Les vostres adreces d'interès ja tenen una adreça d'interès per a aquesta " "carpeta." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Fitxers d'imatge" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "octet" msgstr[1] "octets" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "explorant... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Si us plau, escriviu un nom d'usuari vàlid o un identificador numèric." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Si us plau, escriviu un nom de grup vàlid o un identificador numèric." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Voleu aplicar aquests canvis de forma recursiva a tots els fitxers i " "subcarpetes?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Amaga o mostra el fitxer" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Aquest fitxer és ocult perquè el nom comença amb un punt («.»)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Els fitxers d'aquest sistema estan ocults si el nom comença amb un punt " "(«.»). Premeu per mostrar els fitxers ocults." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "explorant..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Accediu al contingut:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Fitxers de diferents tipus" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fitxer:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Fitxers múltiples" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nom" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descripció" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Mida" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permisos" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Propietari" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificat" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Ubicació" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extensió" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Crea un element _nou..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Carpeta" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Fitxer buit" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverteix la selecció" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Ordena els fitxer_s" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Canvia el nom de la ca_rpeta..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propi_etats del fitxer" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Mostra els _ocults" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Barreja _fitxers i carpetes" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignora les majúscules dels noms" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Per _nom" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Per hora de _modificació" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Per _mida" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Per _tipus de fitxer" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Escriviu un nom per a la carpeta acabada de crear:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Creació d'una carpeta nova" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Escriviu un nom per al fitxer buit:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Creant..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nou" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Escriviu un nom per al nou element %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Creant %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Executa l'aplicació predeterminada per al fitxer després de crear-lo" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Aquest fitxer de text «%s» sembla un script executable.\n" "Què voleu fer-ne?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Aquest fitxer «%s» és executable. Voleu executar-lo?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "No s'ha especificat cap carpeta." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Seleccioneu una carpeta" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Error" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmació" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pregunta" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Només els administradors/es de sistema tenen permís per fer això." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Voleu moure el fitxer «%s» a la paperera?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Voleu moure el fitxer seleccionat %d a la paperera?" msgstr[1] "Voleu moure els fitxers seleccionats %d a la paperera?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Voleu suprimir el fitxer «%s»?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Voleu suprimir el fitxer seleccionat %d?" msgstr[1] "Voleu suprimir els %d fitxers seleccionats?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Canvia el nom del fitxer" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Si us plau, escriu un nom nou:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Esteu segur que voleu buidar la paperera?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Enganxa-ho i vé_s-hi" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barra d'ubicació de fitxers" # No tinc clar quina és la millor opció, si carpeta personal o carpeta de l'usuari :( #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Carpeta personal" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Escriptori" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplicacions" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Sistema de fitxers d'arrel" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Munta el volum" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Desmunta el volum" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Extreu el suport extraïble" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formata el volum" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Canvia el _nom de l'adreça d'interès" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Eli_mina de les adreces d'interès" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Mou l'adreça d'interès am_unt" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Mou l'adreça d'interès a_vall" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Buida la paperera" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Mostra una llista de llocs comuns, dispositius i adreces d'interès a la " "barra lateral" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Canvia el nom de l'adreça d'interès" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Escriviu el nom nou:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipus: %s\n" "Mida: %s\n" "Modificat: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipus: %s\n" "Modificat: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Hi ha hagut errors abans que l'operació de fitxer s'aturés." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Cancel·lat" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "L'operació amb el fitxer s'ha completat amb errors." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "S'ha acabat" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Alguns fitxers no es poden moure a la paperera perquè els sistemes de " "fitxers subjacents no admeten aquesta operació.\n" "En comptes d'això, voleu suprimir-los?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausa" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Reprèn" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Movent" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Copiant" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Reciclant" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Suprimint" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Creant l'enllaç simbòlic" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "A:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Creant enllaços simbòlics a fitxers" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Es canvien els atributs de" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Es canvien els atributs dels fitxers" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Restaurant" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s fitxers" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Operació de fitxer en curs..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s Fitxer:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s fitxers:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "Desacti_va" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Llocs" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Arbre del _directori" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remot" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Llocs" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Arbre del directori" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Vista del contingut de la carpeta" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "Ama_ga %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Mou a l'esquerra" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Mou a la d_reta" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Mostra %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Oblida l'amplada" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Visualització d'_icones" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Visualització _compacta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Visualització de _miniatures" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Visualització de _llista detallada" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Pestanya de canvis activa" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "El directori especificat \"%s\" no és vàlid" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "No es pot accedir al fitxer de destinació" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "No es pot crear un enllaç simbòlic en un sistema de fitxers no nadiu" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "No es pot suprimir de la paperera el fitxer \"%s\": no se'n coneix el camí " "original" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "La destinació no existeix." #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "L'origen i la destinació són iguals." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "No es pot moure una carpeta a la seva subcarpeta" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "No es pot copiar una carpeta a la seva subcarpeta" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "La destinació és una subcarpeta de la font" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "No es pot copiar el fitxer %s: no s'admet" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Establir el nom que es mostra només es pot fer per a un fitxer únic" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Establir la destinació només es pot fer per a un fitxer únic" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Error \"%s\" de fitxer XML (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "El fitxer XML no conté aplicacions d'arrel" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "No es pot crear una definició XML per a \"%s\"" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "El camí de menú \"%s\" ja existeix" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Error de la memòria cau del menú" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "El directori del menú no és vàlid" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "El nom de l'element del menú no pot estar en blanc." #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Directori de menú \"%s\" no vàlid" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Element del menú no vàlid" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "L'element del menú \"%s\" no té un fitxer d'entrada adequat" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "El canvi d'estat ocult no s'admet per al directori de menú" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "No s'admet establir l'atribut \"%s\"" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Valor no vàlid per a l'atribut \"%s\"" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "\"%s\" és un directori de menú" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "\"%s\" no és un element del menú" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "El fitxer d'entrada \"%s\" està trencat" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "No s'ha pogut crear l'element del menú \"%s\"" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "El nom del directori de menú no hauria d'acabar amb \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Operació no vàlida amb l'arrel del menú" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Destinació no vàlida" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" "FmMenuVFileMonitor: la carpeta %s no s'ha trobat a la memòria cau del menú" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Cerca" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Resultats de la cerca" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Trieu el fitxer executable" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Ordre:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Ordre per executar quan la icona de l'aplicació està activada" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escripció:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "El nom genèric de l'aplicació" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Directori de _treball:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "El directori de treball per executar-hi el programa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Consell:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Consell per mostrar a l'aplicació" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Usa la notificació d'inici" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Entra_da d'escriptori" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaura" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaura fitxers de la paperera als camins originals" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nom de fitxer font o identificador d'escriptori" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "FONT" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nom del fitxer de resultat" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disc CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disc CD-ROM en blanc" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disc CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disc CD-R en blanc" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disc CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disc CD-RW en blanc" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disc DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disc DVD-ROM en blanc" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disc DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disc DVD-RW en blanc" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disc DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disc DVD-RAM en blanc" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disc DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disc DVD+R en blanc" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disc DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disc DVD+RW en blanc" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disc DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Disc DVD+R DL en blanc" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disc DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Disc DVD+RW DL en blanc" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disc Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disc Blu-Ray en blanc" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disc Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disc Blu-Ray R en blanc" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disc Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disc Blu-Ray RW en blanc" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disc HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disc HD DVD en blanc" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disc HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Disc HD DVD-R en blanc" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disc HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Disc HD DVD-RW en blanc" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disc MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disc MO en blanc" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disc MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disc MRW en blanc" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disc MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disc MRW/W en blanc" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Fitxers d'_àudio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disc Òptic en blanc" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disc òptic" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Tipus de fitxer a obrir:" #~ msgid "Processing:" #~ msgstr "S'està processant:" #~ msgid "Progress:" #~ msgstr "Progrès:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "" #~ "Ha finalitzat l'operació de fitxer, però s'han produït alguns errors." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Creant enllaços simbòlics" #~ msgid "_Browse" #~ msgstr "_Navega" #~ msgid "My Computer" #~ msgstr "El meu ordinador" #~ msgid "Please select a folder" #~ msgstr "Si us plau, Selecciona una carpeta." #, fuzzy #~ msgid "Computer" #~ msgstr "El meu ordinador" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Xarxa" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Executa-ho a un emulador de terminal" #~ msgid "Shortcuts" #~ msgstr "Dreceres" #~ msgid "Mount Point" #~ msgstr "Punt de muntatge" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Crea enllaç simbòlic" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "Envia a" #~ msgid "_Group:" #~ msgstr "_Grup:" #~ msgid "Rename" #~ msgstr "Reanomena" #~ msgid "Make the file executable" #~ msgstr "Fes aquest fitxer executable" #~ msgid "Operations that all other users can do" #~ msgstr "Operacions que poden efectuar els altres usuaris" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operacions que pot efectuar el propietari del fitxer" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operacions que poden efectuar els usuaris que són al mateix grup que el " #~ "propietari del fitxer" #~ msgid "Read and Write" #~ msgstr "Lectura i escriptura" #~ msgid "Read only" #~ msgstr "Només lectura" #~ msgid "Write only" #~ msgstr "Només escriptura" libfm-1.4.0/po/cs.po000066400000000000000000001464131475513661000142110ustar00rootroot00000000000000# Czech translation for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Radek Tříška , 2010. msgid "" msgstr "" "Project-Id-Version: Libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-06-20 17:02+0000\n" "Last-Translator: Pavel Fric \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1434819774.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Upřednostňované aplikace" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Vyberte aplikaci, která se spustí při kliknutí na webový odkaz nebo e-mail " "adresu" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor zkratek" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Vytvořit nový nebo změnit stávající vstup na ploše" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Vyberte aplikaci" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Použít vybranou aplikaci pro otevření souborů" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Nainstalované aplikace" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "P_říkaz ke spuštění:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Procházet..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Spustit v emulátoru terminálu" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Po spuštění příkazu ponechat okno terminálu otevřené" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "V příkazové řádce mohou být použity tyto speciální kódy:\n" " %f: Představuje jeden soubor\n" " %F: Představuje více souborů\n" " %u: Představuje jednu URI adresu souboru\n" " %U: Představuje více URI adres" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Jméno _aplikace" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Spustit vlastní příkaz pro otevření souborů" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "V_lastní příkazový řádek" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Nastavit vybranou aplikaci jako výchozí pro tento typ souboru" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Potvrdit nahrazení souborů" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Přeskočit" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Přejmenovat" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Přepsat" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Toto umístění obsahuje soubor se stejným názvem.\n" "\n" "Chcete nahradit stávající soubor" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "následujícím souborem?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Název souboru:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Použít tuto možnost na všechny soubory" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Zvolit ikonu..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "Systémové téma ikon" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "Soubory obrázků" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Vybrat ikonu z:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Spustit soubor" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Spustit v _terminálu" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Vlastnosti souboru" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikona souboru v zobrazení složek" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Název:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Umístění:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Cíl souboru:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Typ souboru:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Otevřít _pomocí:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Vyberte aplikaci pro otevírání souborů tohoto typu " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Celkový počet souborů:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Celková velikost souborů:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Velikost na disku:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Naposledy změněn:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Poslední přístup:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Poslední změna práv:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Obecné" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "V_lastník:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "S_kupina:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Zobrazit obsah:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Z_měnit obsah:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Spustit:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Speciální bity:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Kdo může číst obsah souboru/adresáře" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Kdo může měnit obsah souboru/adresáře" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Kdo může spouštět soubor nebo vstupovat do adresáře" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Speciální práva pro spuštění souboru" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Speciální práva pro přístup do adresáře" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Řízení přístupu" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skrytý soubor" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Práva" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Žádné" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Nastavit GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky & nastavit GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Nastavit UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Nastavit UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Pouze vlastník" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Pouze vlastník a skupina" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Kdokoliv" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nikdo" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytů" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Zvolte datum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Vybrat datum z kalendáře" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Hledat soubory" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Vzor _názvu souboru:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Systém zápisu může být jak POSIX shell seznam (s ',' jako oddělovačem) nebo " "POSIX regulární výraz." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Nezáleží na velikosti písmen" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Použít regulární výrazy" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Mís_ta k hledání" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Hledat v podadresářích" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Hledat _skryté soubory" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Jméno/_Lokace" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Typ souboru" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Hledat pouze soubory následujících typů:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xt souborů" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Obrázky" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Zvukové soubory" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenty" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Složk_y" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Ji_né:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Lze sem vložit jakýkoliv platný typ obsahu. Zástupný znak '*' je povolen na " "konci typu. Vícenásobné typy by měly být odděleny středníkem ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Typ souboru" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Soubor obsahu_je:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "O_bsah" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Velikost souboru" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Menší než:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Větší než:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Čas poslední zmeny" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nic)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Dříve než:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "P_ozději než:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Vlastnosti" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "WWW prohlížeč" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Při kliknutí na odkazy bude pro otevření použit preferovaný WWW prohlížeč." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Emailový klient" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Při kliknutí na emailové adresy bude pro psaní zprávy použit preferovaný " "emailový klient." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulátor terminálu" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Příkazový řádek:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Systémové aplikace" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Asociace souborů" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Do:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Připravuje se..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Cíl souboru:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Zbývající čas:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Došlo k chybám:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Prázdný soubor" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Neplatný cíl" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operace není podporována" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Chybné jméno položky menu '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Nemohu určit typ obsahu souboru '%s' pro jeho spuštění" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Nebyla nalezena výchozí aplikace pro spuštění URIs %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Nelze změnit pracovní složku na „%s“: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Pro MIME %s nebyla nalezena výchozí aplikace." #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Zařízení" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Síť" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Koš" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "Zkratka k URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: neplatný argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "V libfm configu nebyl nalezen žádný emulátor terminálu" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Neplatný popis náhledové aplikace" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u byty" msgstr[2] "%u bytů" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI subcesta '%s' obsahuje nesprávné změněné znaky" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Duplicitní handler pro tag <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Nelze zpracovat '%-.*s', což by mělo být číslo v odkazu na znak (například " "ê) – číslo je možná příliš velké" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Odkaz na znak nekončí středníkem; pravděpodobně jste použili znak pro " "ampersand bez úmyslu začít entitu – zapište prosím ligaturu et jako &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Odkaz na znak „%-.*s“ nekóduje povolený znak" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Nalezena prázdná entita '&;' platnými entitami jsou: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Název entity „%-.*s“ není znám" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entita nekončí středníkem; pravděpodobně jste použili znak pro ampersand bez " "úmyslu začít entitu – zapište prosím ligaturu et jako &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "V uzavíracím tagu není mezera povolena" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Prvek '%s' byl uzavřen, ale žádný prvek nebyl otevřen" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Byl uzavřen prvek „%s“, ale aktuálně je otevřen prvek „%s“" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Neplatný char '%c' na začátku hodnoty atributu" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Neplatný char '%c' na konci hodnoty atributu, očekává se '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokument neočekávaně skončil" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument je prázdný nebo obsahuje pouze mezery" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML data error" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Přizpůsobit" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Spustitelné soubory" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Použít vybranou aplikaci pro otevření souborů \"%s\" " #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Nainstalované aplikace" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Žádné podsložky>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Načítání..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Zobrazit strom adresářu v postranním panelu" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Zrušeno" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Z_kopírovat sem" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Přesunout sem" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Vytvořit zde odkaz" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave selhal." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Otevřít" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Otevřít _s..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Otevřít _s" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopírovat ce_stu/y" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "S_krýt" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Zo_brazit" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Přidat do záložek" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Přejmenovat" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Ko_mprimovat..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Rozbalit _zde" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Roz_balit do..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Vlast_nosti" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Přesunout do _Koše" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Vaše záložky již obsahují záložku pro tuto složku:" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Soubory s obrázky" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "byty" msgstr[2] "bytů" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "prohledávám… %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Prosím zadejte platné jméno nebo číselné id uživatele." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Prosím zadejte platné jméno nebo číselné id skupiny." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Chcete rekurzivně použít tyto změny pro všechny soubory a pod-složky?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Skrýt nebo zobrazit soubor" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Soubor je skrytý protože jeho název začíná tečkou ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Soubory v tomto souborovém systému jsou skryté pokud jejich název začíná " "tečkou ('.'). Stiskněte pro zapnutí zobrazení skrytých souborů." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "Zkoumám..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Přístup k obsahu:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Soubory různých typů" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Soubor:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Více souborů" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Název" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Popis" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Velikost" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Práva" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Vlastník" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Změněno" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Lokace" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Přípona" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Vytvořit _nový..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Složka" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Prázdný soubor" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Invertovat výběr" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Seřadit soubory" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Přejmenovat složku..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Vlast_nosti složky" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Zobrazit _skryté soubory" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Míchat _soubory a složky" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorovat velikost znaků" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Podle _jména" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Podle data _úpravy" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Podle _velikosti" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Podle _typu souboru" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Zadejte jméno nově vytvořené složky:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Vytváření nové složky" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Zadejte jméno pro prázdný soubor:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Vytvářím..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nový" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Zadejte název pro %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Vytvářím %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Spustit výchozí aplikaci na souboru po vytvoření" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Textový soubor '%s' vypadá jako spustitelný skript.\n" "Co s ním budete dělat?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Soubor '%s' je spustitelný. Chcete jej spustit?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nejsou specifikovány žádné adresáře." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Vyberte složku" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Chyba" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Potvrdit" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Otázka" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Toto má právo provádět pouze systémový správce." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Chcete přesunout soubor '%s' do koše?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Chcete přesunout %d vybraný soubor do koše?" msgstr[1] "Chcete přesunout %d vybrané soubory do koše?" msgstr[2] "Chcete přesunout %d vybraných souborů do koše?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Opravdu chcete odstranit soubor '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Opravdu chcete odstranit %d vybraný soubor?" msgstr[1] "Opravdu chcete odstranit %d vybrané soubory?" msgstr[2] "Opravdu chcete odstranit %d vybraných souborů?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Přejmenovat soubor" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Prosím zadejte nový název:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Skutečně chcete vyprázdnit složku koše?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Vlo_žit a jít" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Panel umístění složky" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Domovská složka" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Pracovní plocha" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplikace" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Kořen systému souborů" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Připojit svazek" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Odpojit svazek" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Vysunout vyměnitelné medium" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Naformátovat svazek" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Přejmenovat záložku" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "O_debrat ze záložek" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Posunout záložku _výš" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Posunout záložku _níž" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Vyprázdnit koš" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Zobrazit seznam běžných míst, zařízení a záložek v postranním panelu" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Přejmenovat záložku" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Vložte nový název:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Velikost: %s\n" "Změněno: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Změněno: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Před zastavením souborové operace se vyskytly se chyby." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Zrušeno" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Souborová operace byla dokončena s chybami." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Dokončeno" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Některé soubory nelze přesunout do koše, protože souborový systém tuto " "operaci nepodporuje.\n" "Chcete je trvale odstranit?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pozastavit" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Pokračovat" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Přesouvání" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopírování" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Přesouvám do koše" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Mazání" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Vytvářím odkaz" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Do:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Vytvářím odkazy na soubory" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Změna atributů" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Mění se atributy souborů" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Obnovuje se" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "Soubory %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Probíhá operace se soubory..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "Soubor %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "Soubory %s :" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Vypnuto" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Místa" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Strom adresářů" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Vzdálený" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Místa" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Strom adresářů" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Pohled na obsah složky" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Skrýt %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Posunout doleva" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Posunout _doprava" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Zobrazit %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Zapomenout šířku" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikony" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Kompaktní zobrazení" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Pohled s náhledy" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Podrobný _seznam" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Změny aktivní karty" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Zadaná složka '%s' není platná" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Nelze získat přístup k cílovému souboru" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Nelze vytvořit odkaz na ne-nativním souborovém systému" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Nelze obnovit soubor '%s' z koše: původní umístění neznámé" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Zdroj a cíl jsou shodné." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Nelze přesunout složku samu do sebe" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Nelze kopírovat složku samu do sebe" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Cílové umístění je uvnitř zdrojové složky" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Nelze kopírovat soubor '%s': není podporováno" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Nastavení zobrazení jména může být provedeno pouze na jednoho souboru" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Stanovení cíle lze dosáhnout pouze pro jeden soubor" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML soubor %s chyba (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML file doesn't contain Applications root" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Nelze vytvořit XML definici pro '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Cesta menu '%s' již existuje" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Chyba cache menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Neplatné menu adresáře" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Název položky menu nemůže být prázdná" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Neplatné menu adresáře %s" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Neplatná položka menu" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Položka menu '%s' nemá odpovídající vstupní soubor" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Změna skrytého statusu není podporována pro menu adresáře" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Nastavení atributu %s není podporováno" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Neplatná hodnota pro atribut %s" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' je menu adresáře" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' není položka menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Soubor vstupu '%s' je poškozen" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Nelze vytvořit položku menu \"%s\"" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Název menu adresáře by nemělo končit příponou \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Neplatná operace s kořenem nabídky" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Neplatný cíl" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: složka '%s' nenalezena v menu mezipaměti" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Hledat" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Výsledky hledání" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Vybrat spustitelný soubor" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Př_íkaz:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Příkaz ke spuštění, když ikona aplikace je aktivovaná" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "P_opis:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Obecný název aplikace" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Pracovní adresář:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Pracovní adresář ke spuštění programu v" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Tooltip:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Tooltip pro zobrazení na aplikaci" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Použít oznámení při spuštění" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Vstup Plochy" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Obnovit" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Obnovit soubory z koše do původních umístění" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "název zdrojového souboru nebo desktop id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ZDROJ" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "název výsledného souboru" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "VÝSLEDEK" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disk CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Prázdný disk CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disk CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Prázdný disk CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disk CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Prázdný disk CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Prázdný disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disk DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Prázdný disk DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disk DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Prázdný disk DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disk DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Prázdný disk DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disk DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Prázdný disk DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disk DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Prázdný disk DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disk DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Prázdný disk DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disk Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Prázdný disk Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disk Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Prázdný disk Blu-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disk Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Prázdný disk Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disk HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Prázdný disk HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disk HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Prázdný disk HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disk HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Prázdný disk HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disk MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Prázdný disk MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disk MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Prázdný disk MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disk MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Prázdný disk MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Zvukové soubory" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Prázdný optický disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optický disk" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Typ souboru k otevření:" #~ msgid "*" #~ msgstr "Vzory _názvu souboru:" #~ msgid "Processing:" #~ msgstr "Zpracovávám:" #~ msgid "Progress:" #~ msgstr "Průběh:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Souborová operace je dokončena, ale došlo k chybám." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Vytvoření symbolických odkazů" #~ msgid "_Browse" #~ msgstr "_Procházet" #~ msgid "My Computer" #~ msgstr "Můj počítač" #, fuzzy #~ msgid "_Move" #~ msgstr "_Posunout doleva" #, fuzzy #~ msgid "_Trash" #~ msgstr "Koš" #~ msgid "_Only for this folder" #~ msgstr "_Pouze pro tuto složku" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Zaškrtněte pro uložení nastavení řazení pro danou složku namísto " #~ "globálního nastavení" #~ msgid "Please select a folder" #~ msgstr "Prosím vyberte složku" #~ msgid "Entry for folder path" #~ msgstr "Vstup pro cestu ke složce" #, fuzzy #~ msgid "Computer" #~ msgstr "Můj počítač" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Síť" #~ msgid "_Run in terminal emulator" #~ msgstr "_Spustit v emulátoru terminálu" #~ msgid "_Keep terminal window open after run" #~ msgstr "Po spuštění _ponechat okno terminálu otevřené" #~ msgid "Shortcuts" #~ msgstr "Zkratky" #~ msgid "Mount Point" #~ msgstr "Přípojný bod" #~ msgid "Create _Symlink" #~ msgstr "Vytvořit _odkaz" #~ msgid "Se_nd To" #~ msgstr "Po_slat do" #~ msgid "Empty tag" #~ msgstr "Prázdný tag" #~ msgid "Tag should have exactly one child" #~ msgstr "Tag by měl mít právě jednoho potomka" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Tag může obsahovat pouze , , nebo " #~ "potomka" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Sloučenýsoubor který může obsahovat pouze značku nejvyšší úrovně, " #~ "dostal <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Nepodařilo se vložit štítek <%s> od sloučeného soubor" #~ msgid "Invalid tag" #~ msgstr "Špatný tag" #~ msgid "Invalid tag" #~ msgstr "Špatný tag" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Nelze najít cestu %s v definici XML" #~ msgid "Category manipulation internal error" #~ msgstr "Interní chyba kategorie manipulace" #~ msgid "Blank File" #~ msgstr "Prázdný soubor" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Chyba, lxshortcut není nainstalovaný" #~ msgid "Failed to start lxshortcut" #~ msgstr "Chyba při spuštění lxshortcut" #~ msgid "_Group:" #~ msgstr "_Skupina:" #~ msgid "Rename" #~ msgstr "Přejmenovat" #~ msgid "Make the file executable" #~ msgstr "Nastavit soubor jako spustitelný" #~ msgid "Operations that all other users can do" #~ msgstr "Operace povolené ostatním uživatelům" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operace povolené vlastníku souboru" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Operace povolené uživatelům ve stejné skupině jako vlastník souboru" #~ msgid "Read and Write" #~ msgstr "Číst a zapisovat" #~ msgid "Read only" #~ msgstr "Pouze číst" #~ msgid "Write only" #~ msgstr "Pouze zapisovat" libfm-1.4.0/po/da.po000066400000000000000000001410561475513661000141660ustar00rootroot00000000000000# Danish translation PCManFM libfm. # Copyright (C) 2010 PCmanFM & Joe Hansen. # This file is distributed under the same license as the PCManFM libfm package. # Joe Hansen (joedalton2@yahoo.dk), 2010. # msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-10-01 23:09+0000\n" "Last-Translator: scootergrisen \n" "Language-Team: Danish \n" "Language: da\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1538435340.869009\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Foretrukne programmer" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Vælg programmer som skal bruges ved klik på weblink eller e-mailadresse" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Rediger Genveje" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Opret ny eller ændre eksisterende skrivebordspost" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Vælg Program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Vælg markeret program til at åbne filer med" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Installerede Programmer" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "K_ommando der skal køres:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Gennemse..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Kør i t_erminalemulator" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Hold terminalvinduet åbent efter kommandoen er udført" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Disse specielle koder kan bruges på kommandolinjen:\n" " %f: Repræsenterer et enkelt filnavn\n" " %F: Repræsenterer flere filnavne\n" " %u: Repræsenterer en enkelt URI i filen\n" " %U: Repræsenterer flere URI'er" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Programnavn (valgfri, sæt den for at beholde tilknytning)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Kør tilpasset kommandolinje for at åbne filer" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Tilpasset kommandolinje" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Angiv valgt program som standardhandling for denne filtype" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Bekræft overskrivning af filer" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Spring over" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Om_døb" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Overskriv" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Der er allerede en fil med det samme navn på denne placering.\n" "\n" "Ønsker du at erstatte den eksisterende fil" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "med den følgende fil?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Filnavn:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Anvend dette tilvalg til alle eksisterende filer" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Vælg et ikon..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "systemets ikontema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "billedfiler" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Vælg ikon fra:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Kør fil" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Kør i _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Filegenskaber" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikonet for filen i mappevisning" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Navn:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Placering:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Målfil:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Filtype:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Åbn _med:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Vælg programmet som bruges til at åbne filer af denne type " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Samlet antal filer:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Samlet størrelse på filer:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Størrelse på disk:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Sidste ændring:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Sidste adgang:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Sidste ændring af tilladelser:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Generelt" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Ejer:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Gruppe:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Vis indhold:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Skift indhold:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Eksekver:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Specielle bit:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Hvem kan læse indholdet af filen/mappen" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Hvem kan ændre indholdet af filen/mappen" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Hvem kan eksekvere filen eller gå ind i mappen" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Specielle flag for fileksekvering" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Specielle flag for mappeadgang" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Adgangskontrol" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skjult fil" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Tilladelser" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ingen" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Klæbrig" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Sæt GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Klæbrig og sæt GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Sæt UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Sæt UID og GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Kun ejer" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Kun ejer og gruppe" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Alle" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ingen" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Byte" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Vælg dato" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Vælg en dato fra følgende kalender" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Søg efter filer" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Fil_navn-mønstre:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Mønster kan enten være POSIX-skal-mønsterliste (med \",\" som separator) " "eller POSIX-regulært udtryk." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Der skelnes _ikke mellem store og små bogstaver" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Brug regulært udtryk" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Steder hvor der skal søges:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Søg i undermapper" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Søg i _skjulte filer" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Navn/_placering" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Filtype" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Søg kun efter filer af følgende typer:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_Tekstfiler" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Billedfiler" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Lydfiler" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videofiler" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenter" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Mapper" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Andre:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Enhver gyldig indholdstype kan indtastes her. Jokertegn \"*\" er tilladt ved " "slutningen af typen. Flere typer skal spareres med \";\"." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Fil_type" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Fil _indeholder:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Indhold" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Filstørrelse:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Mindre end:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Større end:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Tidspunkt for sidste ændring" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(ingen)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Tidligere end:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Senere end:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Egenskaber" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Webbrowser" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Den foretrukne webbrowser vil blive brugt til at åbne internetadresser." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Postklient" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Den foretrukne postklient vil blive brugt til at udarbejde e-post når du " "klikker på e-post-adresser." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminalemulator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Kommandolinje:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Systemprogrammer" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Filassociationer" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Til:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Forbereder..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Data overført:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tid tilbage:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Opståede fejl:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Tom værdi" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Ugyldigt valg" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Handlingen understøttes ikke" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Ugyldig skrivebordspost-fil: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Kunne ikke beslutte indholdstype af filen '%s' for at starte den" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Intet standardprogram er sat til at starte URI'er %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Kan ikke sætte arbejdsmappe til '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Intet standardprogram er sat for MIME-typen %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Enheder" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Netværk" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Papirkurv" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "genvej til URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: ugyldigt argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Ingen terminalemulator sat i libfm-konfiguration" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Ugyldig beskrivelse af miniatureprogram" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u byte" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI-understien \"%s\" indeholder ugyldige undvigetegn" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Duplikeret håndtering for tagget <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Fejl ved fortolkning af \"%-.*s\" som skulle have været et ciffer i en " "tegnreference (ê f.eks.) - måske er cifret for stort" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Tegnreferencensluttede ikke med et semikolon; du har sandsynligvis brugt et " "og-tegn uden at det var beregnet på at starte en entitet - undgå dette ved " "at bruge & i stedet" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Tegnreferencen \"%-.*s\" koder ikke et tilladt tegn" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Tom entitet \"&;\" fundet; gyldige entiteter er: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Entitetsnavnet \"%-.*s\" er ukendt" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entiteten sluttede ikke med et semikolon; du har sandsynligvis brugt et og-" "tegn uden at det var beregnet på at starte en entitet - dette undgås ved at " "bruge & i stedet" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Mellemrum er ikke tilladt i det lukkende tag" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elementet '%s' blev lukket men intet element var åbent" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Elementet \"%s\" blev lukket, men det nuværende åbnet element er \"%s\"" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Ugyldigt tegn '%c' ved begyndelsen af attribut-værdi" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Ugyldigt tegn '%c' ved slutningen af attribut-værdi, forventede '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokumentet sluttede uventet" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokumentet var tomt eller indeholdt kun blanktegn" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: fejl ved XML-data" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Tilpas" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Kørbare filer" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Vælg at program til at åbne \"%s\" filer med" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Installerede programmer" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Indlæser..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Vis træ af mapper i sidebjælke" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Annuller" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Kopiér her" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Flyt hertil" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Henvis hertil" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave mislykkedes." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Åbn" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Åbn _med..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Åbn _med" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopiér _sti(er)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Skjul" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Vis" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Tilføj til bogmærker" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Omdøb..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Komprimer..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Pak ud _her" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Pak ud _til..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Fil_egenskaber" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Flyt til _papirkurv" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Dine bogmærker har allerede et bogmærke for denne mappe." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Aftryksfiler" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "byte" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "skanner... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Indtast venligst et gyldigt brugernavn eller numerisk id." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Indtast venligst et gyldigt gruppenavn eller numerisk id." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Ønsker du rekursivt at anvende disse ændringer på alle filer og undermapper?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Skjul eller vis filen" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Denne fil er skjult fordi dens navn begynder med et punktum (\".\")." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Filer på dette system er skjulte hvis deres navn begynder med et punktum " "('.'). Tryk på for at skifte visningen af skjulte filer." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "skanner..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Adgangsindhold:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Filer af forskellige typer" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fil:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Flere filer" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Navn" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Beskrivelse" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Størrelse" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Tilladelser" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Ejer" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Ændret" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Placering" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Udvidelse" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Opret _ny..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Mappe" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tom fil" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Omvend markering" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sortér filer" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Omdøb mappe..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Fil_egenskaber" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Vis _skjulte" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Bland _filer og mapper" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorer forskel på store/små bogstaver i navn" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Efter _navn" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Efter _ændringstidspunkt" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Efter _størrelse" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Efter Fil_type" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Indtast et navn til det nyligt oprettede mappe:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Opret ny mappe" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Indtast et navn til den tomme fil:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Opretter ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Ny" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Indtast et navn for den nye %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Opretter %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Kør standardprogram på fil efter oprettelse" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Denne tekstfil '%s' ser ud til at være et kørbart skript.\n" "Hvad ønsker du, der skal ske med den?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Denne fil '%s' er kørbar. Ønsker du at køre den?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Ingen mapper er angivet." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Vælg mappe" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Fejl" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Bekræft" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Spørgsmål" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Kun systemadministratorer har rettigheder til dette." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Ønsker du at flytte filen '%s' til papirkurven?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Ønsker du at flytte den %d valgte fil til papirkurven?" msgstr[1] "Ønsker du at flytte de %d valgte filer til papirkurven?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Ønsker du at slette filen '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Ønsker du at slette den %d valgte fil?" msgstr[1] "Ønsker du at slette de %d valgte filer?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Omdøb fil" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Indtast venligst et nyt navn:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Er du sikker på, at du vil tømme papirkurven?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "_Indsæt og gå" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Mappeplaceringslinje" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Hjemmemappe" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Skrivebord" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programmer" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Roden af filsystemet" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montér diskenhed" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Afmontér diskenhed" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Skub flytbart medie ud" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatér diskenhed" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Omdøb bogmærkepost" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Fjern fra bogmærker" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Flyt bogmærke _op" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Flyt bogmærke _ned" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Tøm papirkurven" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Viser liste af almene steder, enheder og bogmærker i sidebjælke" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Omdøb bogmærkepunkt" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Indtast et nyt navn:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Størrelse: %s\n" "Ændret: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Ændret: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Der opstod fejl inden filhandlingen blev stoppet." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Annulleret" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Filhandlingen er udført, men med fejl." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Færdig" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Nogle filer kan ikke flyttes til papirkurven da det underliggende filsystem " "ikke understøtter denne handling.\n" "Ønsker du at slette dem i steden for?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pause" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Genoptag" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Flytter" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopierer" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Smider ud" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Sletter" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Opretter henvisning" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "I:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Opretter henvisninger til filer" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Ændre attributter af" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Ændre attributter af filer" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Gendanner" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s filer" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Igangværende filhandling..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s fil:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s filer:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Fra" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Steder" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Mappetræ" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Fjern" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Steder" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Foldertræ" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Visning af mappeindhold" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Skjul %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Flyt til venstre" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Flyt til _højre" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Vis %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Glem bredde" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikonvisning" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Kompakt visning" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Miniaturevisning" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Detaljeret _listevisning" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Skifter aktivt faneblad" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Den angivne mappe '%s' er ikke gyldig" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Kan ikke tilgå destitionsfil" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Kan ikke oprette et link på non-native-filsystem" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Kan ikke gendanne filen '%s': den oprindelige sti er ukendt" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Destinationen findes ikke" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Kilde og destination er ens." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kan ikke flytte en mappe til sin egen undermappe" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kan ikke kopiere en mappe til sin egen undermappe" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Destinatiion er en undermappe af kilde" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Kan ikke kopiere filen '%s': ikke understøttet" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Indstilling af visningsnavn kan kun gøres for en enkelt fil" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Indstilling af mål kan kun gøres for en enkelt fil" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML-fil '%s' fejl (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML-filen indeholder ikke programmets rod" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Kan ikke oprette XML-definition for '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Menustien '%s' findes allerede" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Fejl ved menu-mellemlager" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ugyldig menumappe" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Navn til menupunkt må ikke være tomt" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Ugyldig menumappe '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ugyldig menupunkt" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Menupunktet '%s' har ikke passende postfil" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Skift af skjult-status understøttes ikke til menumappe" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Indstilling af attributten '%s' understøttes ikke" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ugyldig værdi for attributten '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' er en menumappe" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' er ikke et menupunkt" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Postfilen '%s' er ødelagt" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Kan ikke oprette menupunktet \"%s\"" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Navnet på menumappen må ikke slutte med \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Ugyldig handling med menurod" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ugyldig destination" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: mappen '%s' findes ikke i menu-mellemlager" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Søg" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Søgeresultater" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Vælg kørbar fil" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Kommando:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Kommando som skal køres, når programikonet aktiveres" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Beskrivelse:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Generisk navn for programmet" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Arbejdsmappe:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Arbejdsmappen som programmet skal køres i" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Værktøjstip:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Værktøjstip som vises på program" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Brug _opstartspåmindelse" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Skrivebordspost" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Gendan" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Gendan slettede filer til deres oprindelige sti" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "kildefilnavn eller skrivebords-id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "KILDE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "resultats filnavn" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Cd-rom-disk" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Tom cd-rom-disk" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Cd-r-disk" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Tom cd-r-disk" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Cd-rw-disk" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Tom cd-rw-disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Dvd-rom-disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Tom dvd-rom-disk" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Dvd-rw-disk" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Tom dvd-rw-disk" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Dvd-ram-disk" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Tom dvd-ram-disk" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Dvd+r-disk" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Tom dvd+r-disk" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Dvd+rw-disk" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Tom dvd+rw-disk" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Dvd+r dl-disk" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Tom dvd+r dl-disk" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Dvd+rw dl-disk" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Tom dvd+rw dl-disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray-disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Tom Blu-Ray-disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R-disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Tom Blu-Ray R-disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW-disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Tom Blu-Ray RW-disk" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Hd dvd-disk" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Tom hd dvd-disk" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Hd dvd-r-disk" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Tom hd dvd-r-disk" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Hd dvd-rw-disk" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Tom hd dvd-rw-disk" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Mo-disk" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Tom mo-disk" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Mrw-disk" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Tom mrw-disk" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Mrw/w-disk" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Tom mrw/w-disk" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Lydfiler" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Tom optisk disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optisk disk" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Filtype der skal åbnes:" #~ msgid "Processing:" #~ msgstr "Behandler:" #~ msgid "Progress:" #~ msgstr "Status:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Filhandlingen er færdig, men der er nogle fejl." #~ msgid "_Browse" #~ msgstr "_Gennemse" #~ msgid "My Computer" #~ msgstr "Min computer" #~ msgid "Please select a folder" #~ msgstr "Vælg venligst en mappe" #, fuzzy #~ msgid "Computer" #~ msgstr "Min computer" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Netværk" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Kør i terminalemulator" #~ msgid "Shortcuts" #~ msgstr "Genveje" #~ msgid "Mount Point" #~ msgstr "Monteringspunkt" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Opret symbolsk henvisning" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "Send til" #, fuzzy #~ msgid "Blank File" #~ msgstr "Tom mo-disk" #~ msgid "_Group:" #~ msgstr "_Grupper:" #~ msgid "Rename" #~ msgstr "Omdøb" #~ msgid "Make the file executable" #~ msgstr "Gør filen eksekverbar" #~ msgid "Operations that all other users can do" #~ msgstr "Handlinger som alle andre brugere kan udføre" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Handlinger som ejeren af filen kan udføre" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Handlinger som brugere af den samme gruppe som ejeren af filen kan udføre" #~ msgid "Read and Write" #~ msgstr "Læs og skriv" #~ msgid "Read only" #~ msgstr "Skrivebeskyttet" #~ msgid "Write only" #~ msgstr "Kun skriv" libfm-1.4.0/po/de.po000066400000000000000000001404101475513661000141630ustar00rootroot00000000000000# German translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Daniel Winzen , 2013. # Ingo Brückl, 2020-2023 msgid "" msgstr "" "Project-Id-Version: libfm 1.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2024-12-03 13:55+0100\n" "Last-Translator: Ingo Brückl \n" "Language-Team: LANGUAGE \n" "Language: de\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-POOTLE-MTIME: 1434145210.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Bevorzugte Anwendungen" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "Auswahl der Anwendungen für Weblinks und E-Mail-Adressen" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Verknüpfungseditor" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Erstellung oder Bearbeitung einer .desktop-Datei" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Anwendung auswählen" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Ausgewählte Anwendung zur Dateiöffnung verwenden" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Installierte Anwendungen" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Auszuführende _Befehlszeile:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Durchsuchen" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Im Terminal ausführen" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Terminalfenster nach der Befehlsausführung geöffnet lassen" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Folgende Parameter können in der Befehlszeile verwendet werden:\n" " %f: Name einer einzelnen Datei\n" " %F: Namen mehrerer Dateien\n" " %u: URI einer einzelnen Datei\n" " %U: URIs mehrerer Dateien" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Bezeichnung (falls die Zuordnung gespeichert werden soll):" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Benutzerdefinierten Befehl zum Öffnen verwenden" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Benutzerdefinierte Befehlszeile" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Aus_gewählte Anwendung als Vorgabe für diesen Dateityp festlegen" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Ersetzung bestätigen" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Über_springen" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Umbenennen" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "Ü_berschreiben" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Es existiert hier bereits eine Datei mit diesem Namen.\n" "\n" "Möchten Sie die vorhandene Datei" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "durch folgende Datei ersetzen?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Dateiname:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Auswahl auf alle Dateien anwenden" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Symbol auswählen" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "Systemthema-Symbole" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "Bilddateien" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Wählen Sie ein Symbol:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Datei ausführen" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Im _Terminal ausführen" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Eigenschaften" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Symbol der Datei in der Ordneransicht" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Name:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Verzeichnis:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Zieldatei:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Dateityp:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Öffnen _mit:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Anwendung zum Öffnen dieses Dateityps wählen" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Anzahl der Dateien:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Gesamtgröße der Datei(en):" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Belegung auf dem Datenträger:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Letzte Änderung:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Letzter Zugriff:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Letzte Berechtigungsänderung:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Allgemein" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Besitzer:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_ruppe:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Lesen:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Schreiben:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Ausführen:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Spezielle Berechtigungen:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Wer kann den Inhalt einer Datei oder eines Ordners lesen?" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Wer kann den Inhalt einer Datei oder eines Ordners ändern?" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Wer kann eine Datei ausführen oder einen Ordner öffnen?" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Welche speziellen Berechtigungen hat die Datei bei der Ausführung?" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Welche speziellen Berechtigungen hat der Ordner beim Zugriff?" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Zugriffsrechte" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Verborgene Datei" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Berechtigungen" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "—" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Keine" # Nicht übersetzen! Sonst Sinnfehler! #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "GID setzen" # Sticky nicht übersetzen da sonst Sinnfehler! #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky und GID setzen" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "UID setzen" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "UID und GID setzen" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Nur Besitzer" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Nur Besitzer oder Gruppe" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Jeder" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Niemand" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Datum auswählen" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Wählen Sie ein Datum aus dem Kalender aus:" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Dateien suchen" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Datei_namen-Muster:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Das Muster kann entweder eine Liste von Shell-Mustern (mit ›,‹ als " "Trennzeichen) oder ein regulärer Ausdruck sein." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Groß-/Kleinschreibung i_gnorieren" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Regulären A_usdruck verwenden" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Zu durchsuch_ende Verzeichnisse:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "In _Unterordnern suchen" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_Verborgene Dateien suchen" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Allgemein" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Dateityp" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Nur nach Dateien folgender Typen suchen:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xtdateien" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Bilddateien" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Audiodateien" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videodateien" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumente" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Ordne_r" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Andere:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Hier kann jeder gültige Inhaltstyp (MIME-Typ) eingegeben werden. Am Ende des " "Typs ist der Platzhalter ›*‹ zulässig. Verschiedene Typen werden mit ›;‹ " "getrennt." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Typ" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Datei enthäl_t:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "In_halt" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Dateigröße" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Kleiner als:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Größer als:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Letzte Änderung" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Keine)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Vor:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Nach:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Eigenschaften" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Webbrowser" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Der bevorzugte Webbrowser wird zum Öffnen von Hyperlinks verwendet." # Aus stilistischen Gründen würde ich hier auf das "E-" in E-Mail verzichten da hier sonst 2 Bindestriche sind. #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Mail-Client" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Der bevorzugte Mail-Client wird verwendet, um E-Mails zu verfassen, wenn Sie " "auf E-Mail-Adressen klicken." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminal-Emulator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Befehlszeile:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "System-Anwendungen" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Dateizuordnungen" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Nach:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Vorbereitung …" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Übertragene Daten:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Verbleibende Zeit:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Aufgetretene Fehler:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Parameter fehlt" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Ungültige Auswahl" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Aktion wird nicht unterstützt" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Ungültige .desktop-Datei: %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Der Dateityp von »%s« konnte für die Ausführung nicht ermittelt werden." #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Es ist keine Anwendung festgelegt worden, um URIs »%s://« zu öffnen." #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Arbeitsverzeichnis kann nicht auf »%s« gesetzt werden: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Es ist keine Anwendung für den MIME-Typ »%s« festgelegt worden." #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Laufwerke" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Netzwerk" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Papierkorb" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI-Verknüpfung" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: Ungültiges Argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Es wurde für libfm kein Terminal-Emulator konfiguriert." #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Befehlszeile der Vorschaubildanwendung ist ungültig" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u Byte" msgstr[1] "%u Bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Der URI-Unterpfad »%s« enthält ungültige maskierte Zeichen." #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Doppelter Handler für Tag <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Die Analyse von »%-.*s« ist fehlgeschlagen. Es hätte eine Zahl innerhalb " "einer Zeichenreferenz sein sollen (z. B. ê). Möglicherweise ist die " "Zahl aber zu groß." #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Die Zeichenreferenz endete nicht mit einem Semikolon. Wahrscheinlich wurde " "das Zeichen ›&‹ verwendet, obwohl keine Entität begonnen werden sollte. Das " "&-Zeichen umschreibt man als &." #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Die Zeichenreferenz »%-.*s« stellt kein erlaubtes Zeichen dar." #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Es wurde die leere Zeichenreferenz »&;« erkannt. Gültige Entitäten sind: " "& " < > '." #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Entitäten-Name »%-.*s« ist unbekannt" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Die Entität endete nicht mit einem Semikolon. Wahrscheinlich wurde das " "Zeichen ›&‹ verwendet, obwohl keine Entität begonnen werden sollte. Das &-" "Zeichen umschreibt man als &." #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Leerzeichen sind im schließenden Tag nicht erlaubt" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element »%s« wurde geschlossen, aber es ist kein Element geöffnet" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Element »%s« wurde geschlossen, aber aktuell ist Element »%s« geöffnet" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Ungültiges Zeichen ›%c‹ am Anfang des Attributwerts" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Ungültiges Zeichen ›%c‹ am Ende des Attributwerts, erwartet wurde ›%c‹" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokument ist unerwartet zu Ende" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument ist leer oder enthält nur Leerzeichen" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML-Datenfehler" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Auswählen …" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Ausführbare Dateien" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Anwendung wählen, um den Dateityp »%s« zu öffnen" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Installierte Anwendungen" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "wird geladen …" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Verzeichnisbaum in der Seitenleiste anzeigen" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Abbrechen" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Hierhin k_opieren" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "Hierhin _verschieben" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Hierhin ver_knüpfen" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ist fehlgeschlagen." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Öffnen" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Öffnen _mit …" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Öffnen _mit" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "_Dateipfad kopieren" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Ausblenden" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Einblenden" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Zu Favoriten hinzufügen" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Umbenennen …" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Komprimieren …" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Hier entpacken" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_Entpacken nach …" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Eigenschaften" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "In den _Papierkorb" # because of duplette -> free translation #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Ihre Favoriten haben bereits einen Eintrag für diesen Ordner." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Bilddateien" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "Byte" msgstr[1] "Bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "wird ermittelt … %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Bitte einen gültigen Benutzernamen oder numerische ID eingeben." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Bitte einen gültigen Gruppennamen oder numerische ID eingeben." # Direkte Anrede: Möchten Sie... ???? #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Möchten Sie diese Änderungen rekursiv auf alle Dateien und " "Unterverzeichnisse anwenden?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Datei aus- oder einblenden" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" "Diese Datei ist ausgeblendet, weil ihr Name mit einem Punkt (›.‹) beginnt." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Dateien sind auf diesem System ausgeblendet, wenn ihr Name mit einem Punkt " "(›.‹) beginnt. Mit lässt sich die Anzeige ausgeblendeter Dateien " "umschalten." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "wird ermittelt …" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Auf Inhalt zugreifen:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Unterschiedliche Typen" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Datei:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Mehrere Dateien" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Name" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Typ" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Größe" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Berechtigungen" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Besitzer" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Änderungsdatum" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Verzeichnis" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Endung" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "_Neu …" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Ordner" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Leere Datei" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Auswahl _umkehren" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Dateien _sortieren" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Ordne_r umbenennen …" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Ordn_ereigenschaften" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_Verborgene Dateien anzeigen" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Dateien und Ordner _mischen" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Groß-/Kleinschreibung _ignorieren" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Nach _Name" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Nach letzter Än_derung" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Nach _Größe" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Nach Datei_typ" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Geben Sie einen Namen für den neuen Ordner an:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Neuen Ordner anlegen" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Geben Sie einen Namen für die leere Datei an:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Datei erstellen" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Neu" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Geben Sie einen Namen für das neue »%s« an:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "»%s« wird erstellt" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Datei nach der E_rstellung mit der vorgegebenen Anwendung öffnen" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Die Textdatei »%s« scheint ausführbar zu sein.\n" "Was möchten Sie damit tun?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Die Datei »%s« ist ausführbar. Möchten Sie sie ausführen?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Es sind keine Ordner angegeben." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Einen Ordner wählen" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Fehler" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Bestätigen" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Frage" # oder doch Systemadministratoren? #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Nur Systemverwalter haben die Erlaubnis, dies zu tun." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Möchten Sie die Datei »%s« in den Papierkorb verschieben?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Möchten Sie die ausgewählte Datei in den Papierkorb verschieben?" msgstr[1] "" "Möchten Sie die %d ausgewählten Dateien in den Papierkorb verschieben?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Möchten Sie die Datei »%s« löschen?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Möchten Sie die ausgewählte Datei löschen?" msgstr[1] "Möchten Sie die %d ausgewählten Dateien löschen?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Datei umbenennen" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Neuen Namen eingeben:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Sind Sie sicher, dass Sie den Papierkorb leeren möchten?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "_Einfügen und weiter" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Adressleiste" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Benutzerverzeichnis" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Desktop" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Anwendungen" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Stammverzeichnis" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Dateisystem _einhängen" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Dateisystem _aushängen" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Wechseldatenträger auswerfen" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "Datenträger _formatieren" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Favoriten umbenennen" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Aus Favoriten _entfernen" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Favoriten nach _oben verschieben" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Favoriten nach _unten verschieben" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Papierkorb leeren" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Favoriten und Laufwerke in der Seitenleiste anzeigen" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Favoriten umbenennen" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Neuen Namen eingeben:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Größe: %s\n" "Geändert: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Geändert: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" "Bevor die Dateioperation beendet werden konnte, sind Fehler aufgetreten." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Abbruch" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Die Dateioperation wurde mit Fehlern abgeschlossen." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Ergebnis" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Einige Dateien können nicht in den Papierkorb verschoben werden, da die " "unterliegenden Dateisysteme diesen Vorgang nicht unterstützen.\n" "Möchten Sie die Dateien stattdessen löschen?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pause" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "Fo_rtsetzen" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Verschieben von" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopieren von" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "In den Papierkorb mit" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Löschen von" # Wenn man im Deutschen von Link spricht, meint man den Hyperlink auf Webseiten -> Verknüpfung #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Verknüpfen von" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Nach:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Erstellung von Dateiverknüpfungen" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Änderung der Attribute von" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Änderung von Dateiattributen" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Wiederherstellen von" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s Dateien" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Dateioperation wird durchgeführt …" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s Datei:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s Dateien:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Aus" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Favoriten" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Verzeichnisbaum" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remote" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Favoriten" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Verzeichnisbaum" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Ansicht von Ordnerinhalten" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "%s _nicht anzeigen" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Nach _links verschieben" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Nach _rechts verschieben" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "%s anzeigen" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "Normale _Breite" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Symbolansicht" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Listenansicht" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Vorschaubildansicht" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "_Detailansicht" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Aktiven Reiter wechseln" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Das angegebene Verzeichnis »%s« ist ungültig." #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Zugriff auf Zieldatei nicht möglich" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Verknüpfung auf fremdes Dateisystem kann nicht erstellt werden" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Wiederherstellung der Datei »%s« fehlgeschlagen: Originalpfad unbekannt" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Das Ziel existiert nicht." #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Quelle und Ziel sind identisch." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Ein Ordner kann nicht in seinen Unterordner verschoben werden." #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Ein Ordner kann nicht in seinen Unterordner kopiert werden." #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Das Ziel ist ein Unterordner der Quelle." #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Kopieren von Datei »%s« fehlgeschlagen: nicht unterstützt" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Anzeigename kann nur für eine einzelne Datei festgelegt werden" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Ziel kann nur für eine einzelne Datei festgelegt werden" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Fehler in der XML-Datei »%s« (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Stammelement »Applications« ist in der XML-Datei nicht vorhanden" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "XML-Definition für »%s« kann nicht erstellt werden" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Menüeintrag »%s« existiert bereits" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Fehler im Menü-Zwischenspeicher" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ungültiges Menüverzeichnis" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Name des Menüeintrags darf nicht leer sein" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Menüverzeichnis »%s« ist ungültig" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ungültiger Menüeintrag" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Menüeintrag »%s« hat keine zugehörige »Entry«-Datei" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" "Änderung des Status zum Verbergen wird für Menüverzeichnisse nicht " "unterstützt" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Setzen des Attributs »%s« wird nicht unterstützt" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ungültiger Wert für Attribut »%s«" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "»%s« ist ein Menüverzeichnis" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "»%s« ist kein Menüeintrag" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "»Entry«-Datei »%s« ist fehlerhaft" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Menüeintrag »%s« kann nicht erstellt werden" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Name des Menüverzeichnisses sollte nicht auf ».desktop« enden" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Ungültige Aktion mit dem Stammmenü" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ungültiges Ziel" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: Ordner »%s« im Menü-Zwischenspeicher nicht gefunden" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Suchen" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Suchergebnisse" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Ausführbare Datei wählen" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Be_fehl:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Auszuführender Befehl bei Aktivierung des Anwendungssymbols" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "B_eschreibung:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Allgemeine Bezeichnung der Anwendung" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Arbeitsverzeichnis:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Verzeichnis, in dem das Programm ausgeführt werden soll" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Minihilfe:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Minihilfe, die zu der Anwendung angezeigt werden soll" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Vis_uelle Rückmeldung über den Programmstart geben" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr ".desktop-Einträge" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "Wiede_rherstellen" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Dateien im Papierkorb an ihren ursprünglichen Orten wiederherstellen" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "Pfad zur Eingabedatei oder Desktop-ID" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "QUELLE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "Pfad zur Ausgabedatei" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Leere CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Leere CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Leere CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Leere DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Leere DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Leere DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Leere DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Leere DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Leere DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Leere DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Leere Blu-ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "BD-R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Leere BD-R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "BD-RE" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Leere BD-RE" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Leere HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Leere HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Leere HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO-Disk" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Leere MO-Disk" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW-Disk" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Leere MRW-Disk" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W-Disk" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Leere MRW/W-Disk" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "Audio-CD" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Leerer optischer Datenträger" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optischer Datenträger" libfm-1.4.0/po/el.po000066400000000000000000001622551475513661000142060ustar00rootroot00000000000000# Greek translations for libfm package. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2014-11-16 11:53+0000\n" "Last-Translator: Giorgos Siafis \n" "Language: el\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1416138791.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Προτιμώμενες εφαρμογές" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Επιλογή εφαρμογών που ενεργοποιούνται με την κλήση συνδέσμου του διαδικτύου " "ή διεύθυνσης ηλεκτρονικού ταχυδρομείου" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Επεξεργαστής Συντόμευσης" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Δημιουργία νέας ή αλλαγή υπάρχουσας εγγραφής στην επιφάνεια εργασίας" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Επιλέξτε εφαρμογή" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Χρήση επιλεγμένης εφαρμογής για το άνοιγμα των αρχείων" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Εγκατεστημένες Εφαρμογές" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Ε_ντολή προς εκτέλεση:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Αναζήτηση..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Εκτέλεση στο τερματικό" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Διατήρησε το τερματικό ανοικτό μετά την εκτέλεση εντολής" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Αυτοί οι ειδικοί κωδικοί μπορούν να χρησιμοποιηθούν στη γραμμή εντολών:\n" " %f: Αντιπροσωπεύει ένα όνομα αρχείου\n" " %F: Αντιπροσωπεύει πολλαπλά ονόματα αρχείων\n" " %u: Αντιπροσωπεύει ένα ενιαίο URI του αρχείου\n" " %U: Αντιπροσωπεύει πολλαπλά URIs" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Ονομα εφαρμογής (προαιρετικό)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Εκτέλεση προσαρμοσμένης εντολής για το άνοιγμα των αρχείων" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Π_ροσαρμοσμένη εντολή" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "_Όρισε την επιλεγμένη εφαρμογή ως προεπιλεγμένη ενέργεια για αυτού του " "είδους τα αρχεία" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Επιβεβαίωση αντικατάστασης αρχείων" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Παράληψη" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Μετονομασία" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Αντικατάσταση" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Υπάρχει ήδη ένα αρχείο με το ίδιο όνομα σε αυτό τον κατάλογο.\n" "\n" "Θέλετε να αντικαταστήσετε το υπάρχον αρχείο" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "με το ακόλουθο αρχείο;" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Ο_νομα αρχείου:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Ε_φαρμογή της επιλογής σε όλα τα υπάρχοντα αρχεία" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Επιλέξτε Ενα Εικονίδιο..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "βιβλιοθήκη εικονιδίων συστήματος" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "αρχεία εικόνων" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Επελεξε εικονίδιο από:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Εκτέλεση αρχείου" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Εκτέλεση στο _τερματικό" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Ιδιότητες αρχείου" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Εικονίδιο αρχείου σε προβολή φακέλου" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Όνομα:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Τοποθεσία:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Επιλογή αρχείου:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Τύπος αρχείου:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Άνοιγμα _με:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" "Επιλέξτε την εφαρμογή που θα χρησιμοποιείται για το άνοιγμα αρχείων αυτού " "του τύπου " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Συνολικός αριθμός των αρχείων:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Συνολικό μέγεθος των αρχείων:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Μέγεθος στο δίσκο:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Τελευταία τροποποίηση:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Τελευταία πρόσβαση:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Τελευταία αλλαγή δικαιωμάτων:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Γενικά" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Ι_διοκτήτης:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Ο_μάδα:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Π_ροβολή περιεχομένων:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Επε_ξεργασία περιεχομένων:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "Ε_κτέλεση:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Ειδικά bits:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Ποιος μπορεί να διαβάσει τα περιεχόμενα του αρχείου/καταλόγου" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Ποιος μπορεί να αλλάξει τα περιεχόμενα του αρχείου/καταλόγου" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Ποιος μπορεί να εκτελέσει το αρχείο ή να μπει στον κατάλογο" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Ειδικές σημαίες για την εκτέλεση του αρχείου" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Ειδικές σημαίες για την πρόσβαση στον κατάλογο" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Έλεγχος πρόσβασης" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Κρυφό αρχείο" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Δικαιώματα" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Κανένα" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Αμετάβλητο" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Ορισμός GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Κολλημένο & ορισμός GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Ορισμός UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Ορισμός UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Μόνο ο ιδιοκτήτης" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Μόνο ο ιδιοκτήτης και η ομάδα" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Οποιοσδήποτε" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Κανένας" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Επιλογή Ημερομηνίας" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Επιλογή ημερομηνίας απο το ημερολόγιο" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "_Αναζήτηση αρχείων" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "_Μοτίβα Ονόματος Αρχείου:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Χρήση κανονικών εκφράσεων" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Τοπο_θεσίες για Αναζήτηση:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Αναζήτηση σε υποκαταλόγους" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Αναζήτηση _κρυφών αρχείων" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Ονομα/_Location" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Τύπος αρχείου" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Αναζήτηση αρχείων των παρακάτω τύπων:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Αρχεία _κειμένου" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Αρχεία _εικόνας" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Αρχεία _ήχου" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Αρχεία _ταινίας" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Εγγραφα" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Φάκελοι" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Άλλα:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Κάθε έγκυρος τύπος αρχείου μπορεί να εισαχθεί εδώ. Χαρακτήρας μπαλαντέρ '*' " "επιτρέπεται στο τέλος κάθε τύπου αρχείου. Πολλαπλοί τύποι αρχείων πρέπει να " "διαχωρίζονται με ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Τύπος αρχείου" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Περιεχόμεν_ο αρχείου:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Περιε_χόμενο" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Μέγεθος αρχείου" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Μικρότερο από:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Με_γαλύτερο από:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Τελευταία Τροποποίηση" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Κανένα)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Νωρίτερα από:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Αργό_τερα από:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Ι_διότητες" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Περιηγητής ιστού:" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Ο προτιμώμενος περιηγητής ιστού θα χρησιμοποιηθεί για το άνοιγμα " "υπερσυνδέσεων." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Πρόγραμμα αλληλογραφίας" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Το προτιμώμενο πρόγραμμα αλληλογραφίας θα χρησιμοποιηθεί για τη συγγραφή " "ηλεκτρονικών μηνυμάτων όταν κάνετε κλικ σε κάποια διεύθυνση αλληλογραφίας." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Τερματικό" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Γραμμή εντολών:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Εφαρμογές συστήματος" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Συσχετίσεις αρχείων" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Προς:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Προετοιμασία..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Επιλογή αρχείου:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Χρόνος που απομένει:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Παρουσιάστηκαν κάποια σφάλματα:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Κενό Αρχείο" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "_Αντιστροφή επιλογής" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Η λειτουργία δεν υποστηρίζεται" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Δεν καθορίζεται ο τύπος περιεχομένου του αρχείου '%s' ώστε να εκκινηθεί" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Δεν έχει καθοριστεί εφαρμογή για την εκκίνηση URIs %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Δεν έχει οριστεί κατάλογος εργασίας για '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Δεν έχει οριστεί εφαρμογή για τον τύπο MIME του %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Συσκευές" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Δίκτυο" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Κάδος απορριμάτων" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "συντόμευση στο URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Δεν έχει οριστεί εξομοιωτής τερματικού στις ρυθμίσεις του libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Απροσδόκητο τέλος εγγράφου" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Κενό έγγραφο ή περιέχει μόνο κενά" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Προσαρμογή" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Εκτέλεση αρχείου" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Επιλέξτε μια εφαρμογή για το άνοιγμα \"%s\" των αρχείων" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Εγκατεστημένες εφαρμογές" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Χωρίς υποφακέλους>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Φόρτωση..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "Α_κυρώθηκε" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Α_ντιγραφή εδώ" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "Μ_ετακίνηση εδώ" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Σ_ύνδεση εδώ" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave απέτυχε." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Άνοιγμα" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Άνοιγμα _με..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Άνοιγμα _με" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Κ_ρυφό" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Φανερ_ό" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Εισαγωγή στους _σελιδοδείκτες" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Μετονομασία..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Σ_υμπίεση..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Αποσυμπίεση ε_δώ" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Απ_οσυμπίεση στο..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Ιδιότη_τες αρχείου" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Μετακίνηση στα Απορ_ρίματα" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Οι σελιδοδείκτες σου έχουν ήδη σελιδοδείκτη για αυτό το φάκελο." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Αρχεία εικόνας" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "σάρωση... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Παρακαλώ εισάγετε ένα έγκυρο όνομα χρήστη ή αριθμό id." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Παρακαλώ εισάγετε ένα έγκυρο όνομα ομάδας ή αριθμό id." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Να εφαρμοστούν αναδρομικά οι αλλαγές σε όλα τα αρχεία και υπό-φακέλους;" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Κρύψε ή φανέρωσε το αρχείο" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" "Αυτό το αρχείο είναι κρυφό επειδή το όνομα του αρχίζει με τελεία ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Τα αρχεία του συστήματος είναι κρυφά αν τα ονόματά τους αρχίζουν από τελεία " "('.'). Πληκτρολόγησε για να εμφανίσεις τα κρυφά αρχεία." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "σάρωση..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Πρόσ_βαση περιεχομένου:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Αρχεία διαφορετικών τύπων" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Αρχείο:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Πολλαπλά αρχεία" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Όνομα" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Περιγραφή" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Μέγεθος" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Δικαιώματα" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Μόνο ο ιδιοκτήτης" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Τροποποιήθηκε" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Τοποθεσία" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Επέκταση" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "_Δημιουργία..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Φακέλου" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Κενό Αρχείο" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Αντιστροφή επιλογής" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Ταξινόμηση αρχείων" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Με_τονομασία καταλόγου..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Ιδιότητες _Φακέλου" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_Εμφάνιση κρυφών αρχείων" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Ανάμιξη αρ_χείων και φάκελων" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Αγνόηση πε_ζών-κεφαλαίων στα ονόματα" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Κατά _όνομα" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Κατά _ημερομηνία τροποποίησης" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Κατά _μέγεθος" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Κατά _τύπο αρχείου" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Εισάγετε ένα όνομα για το νέο φάκελο:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Δημιουργία Νέου Φακέλου" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Εισάγετε όνομα για το νέο αρχείο:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Δημιουργία ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Νέο" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Εισάγετε ένα όνομα για το νέο αρχείο %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Δημιουργία %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Εκτέλεσε το αρχείο αφού δημιουργηθεί με την προεπιλεγμένη εφαρμογή" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Το αρχείο κειμένου '%s' φαίνεται να είναι ένα εκτελέσιμο script.\n" "Τι θέλετε να κάνετε;" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Αυτό το αρχείο '%s' είναι εκτελέσιμο. Θέλετε να το εκτελέσετε;" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Δεν έχουν καθοριστεί κατάλογοι." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Παρακαλώ επιλέξτε ένα φάκελο" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Σφάλμα" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Επιβεβαίωση" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Ερώτηση" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Μόνο ο διαχειριστής του συστήματος έχει δικαίωμα να το κάνει." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" "Θέλετε να μετακινήσετε τα επιλεγμένα αρχεία '%s' στον κάδο απορριμάτων;" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" "Θέλετε να μετακινήσετε τo επιλεγμένo αρχείo %d στον κάδο απορριμάτων;" msgstr[1] "" "Θέλετε να μετακινήσετε τα επιλεγμένα αρχεία %d στον κάδο απορριμάτων;" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Θέλετε να διαγράψετε τα επιλεγμένα αρχεία '%s';" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Θέλετε να διαγράψετε τo επιλεγμένo αρχείo %d;" msgstr[1] "Θέλετε να διαγράψετε τα επιλεγμένα αρχεία %d;" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Μετονομασία αρχείου" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Παρακαλώ εισάγετε ένα νέο όνομα:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Είστε σίγουροι ότι θέλετε να αδειάσει ο κάδος απορριμάτων;" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Επ_ικόλλησε και Συνέχισε" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Μπάρα τοποθεσίας φακέλου" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Προσωπικός Φάκελος" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Επιφάνεια εργασίας" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Εφαρμογές" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Ρίζα συστήματος αρχείων" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Π_ροσάρτηση τόμου" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Αποπρο_σάρτηση τόμου" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Ε_ξαγωγή αφαιρούμενου μέσου" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "Διαμόρ_φωση τόμου" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Μετονομασία αντι_κειμένου σελιδοδείκτη" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Α_φαίρεση από τους σελιδοδείκτες" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Μετακίνηση σελιδοδείκτη πάν_ω" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Μετακίνηση σελιδοδείκτη _κάτω" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Ά_δειασμα απορριμμάτων" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Εμφάνισε λίστα από κοινούς τόπους, συσκευές, και σελιδοδείκτες στην πλαϊνή " "λωρίδα" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Μετονομασία αντικειμένου σελιδοδείκτη" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Πληκτρολογήστε ένα νέο όνομα:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Τύπος: %s\n" "Μέγεθος: %s\n" "Τροποποιήθηκε: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Τύπος: %s\n" "Τροποποιήθηκε: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "" "Προέκυψαν σφάλματα πριν την διακοπή της λειτουργίας του αρχείου." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Ακυρώθηκε" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Η λειτουργία ακυρώθηκε και υπάρχουν κάποια σφάλματα." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Ολοκληρώθηκε" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Μερικά αρχεία δε μπορούν να μετακινηθούν στα απορρίμματα γιατί το σύστημα " "αρχείων δεν υποστηρίζει αυτή τη λειτουργία.\n" "Αντί αυτού, θέλετε να διαγράψετε οριστικά τα αρχεία;" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Παύση" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Επαναφορά" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Μετακίνηση αρχείων" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Αντιγραφή αρχείων" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Μετακίνηση στον κάδο απορριμάτων" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Διαγραφή αρχείων" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Δημιουργία συμβολικών συνδέσμων" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "Προς:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Δημιουργία συμβολικών συνδέσμων" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Αλλαγή χαρακτηριστικών αρχείου" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Αλλαγή χαρακτηριστικών αρχείου" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Επαναφορά" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "μετακίνηση στον κάδο απορριμάτων %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Λειτουργία αρχείου σε εξέλιξη... " #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s αρχείο:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s αρχεία:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Κλειστό" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "Τοπο_θεσίες" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Δέντρο καταλόγων" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Απομακρ_υσμένο" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Τοποθεσίες" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Δέντρο καταλόγων" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Όψη περιεχομένων φακέλου" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Κρύψε %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Μετακίνηση Αριστερά" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Μετακίνηση _Δεξιά" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Εμφάνιση %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Απόκρυψη πλάτους" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Όψη Εικόνας" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Συμπαγής Όψη" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Όψη _Μικρογραφίας" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Όψη Λεπτομερούς _Λίστας" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Αλλαγή ενεργής καρτέλας" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Ο συγκεκριμένος κατάλογος '%s' δεν είναι έγκυρος" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Αδυναμία πρόσβασης σε αρχείο προορισμού" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Αδυναμία δημιουργίας συνδέσμου σε μη υποστηριζόμενο σύστημα αρχείων " #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Αδύνατη επαναφορά των διαγραφέντων αρχείων '%s': άγνωστοι αρχικοί κατάλογοι" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Η πηγή και ο προορισμός είναι ίδια." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Δε γίνεται η μετακίνηση ενός φακέλου σε υποφάκελό του" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Δε γίνεται η αντιγραφή ενός φακέλου σε υποφάκελό του" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Ο προορισμός είναι υποφάκελος της πηγής" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Δεν γίνεται η αντιγραφή του αρχείου '%s': δεν υποστηρίζεται" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Ορισμός ονόματος εμφάνισης μπορεί να γίνει μόνο για ξεχωριστό αρχείο" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Ορισμός στόχου μπορεί να γίνει για ξεχωριστό αρχείο" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML αρχείο '%s' λάθος (%d:%d):" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML αρχείο δεν περιλαμβάνει την ρίζα των Εφαρμογών" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Αδυναμία δημιουργίας ορισμού XML για '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Η διαδρομή καταλόγου '%s' υπάρχει ήδη" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Σφάλμα μνήμης προσωρινής αποθήκευσης καταλόγου" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Άκυρος κατάλογος μενού" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Το αντικείμενο καταλόγου δεν μπορεί να είναι κενό" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Άκυρος κατάλογος μενού '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Άκυρο αντικείμενο καταλόγου" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Ο ορισμός χαρακτηριστικού '%s' δεν υποστηρίζεται" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Άκυρη τιμή χαρακτηριστικού '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Αδυναμία δημιουργίας αντικειμένου καταλόγου '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Αναζήτηση" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Αποτέλεσμα αναζήτησης" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Επιλογή εκτελέσιμου αρχείου" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ε_ντολή:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "Περι_γραφή:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Γενικό όνομα της εφαρμογής" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Κατάλογος εργασίας:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Ο κατάλογος εργασίας για την εκτέλεση του προγράμματος" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Tooltip:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Tooltip to show on application" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Επιφάνεια εργασίας" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Επαναφορά" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Επαναφορά των διαγραφέντων αρχείων στους αρχικούς τους καταλόγους" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "SOURCE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "Εξαγόμενο όνομα αρχείου" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Δίσκος CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Άδειος δίσκος CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Δίσκος CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Άδειος δίσκος CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Δίσκος CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Άδειος δίσκος CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "ΔίσκοςDVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Άδειος δίσκος DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Δίσκος DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Άδειος δίσκος DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Δίσκος DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Άδειος δίσκος DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Δίσκος DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Άδειος δίσκος DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Δίσκος DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Άδειος δίσκος DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Δίσκος DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Άδειος δίσκος DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Δίσκος DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Άδειος δίσκος DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Δίσκος Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Άδειος δίσκος Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Δίσκος Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Άδειος δίσκος Blu-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Δίσκος Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Άδειος δίσκος Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Δίσκος HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Άδειος δίσκος HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Δίσκος HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Άδειος δίσκος HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Δίσκος HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Άδειος δίσκος HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Δίσκος MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Άδειος δίσκος MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Δίσκος MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Άδειος δίσκος MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Δίσκος MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Άδειος δίσκος MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Αρχεία _ήχου" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Άδειος οπτικός δίσκος" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Οπτικός δίσκος" #~ msgid "Symlinking" #~ msgstr "Ψευδοσύνδεσμοι" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Τύπος αρχείου προς άνοιγμα:" #~ msgid "Processing:" #~ msgstr "Επεξεργασία:" #~ msgid "Progress:" #~ msgstr "Πρόοδος:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Η λειτουργία ολοκληρώθηκε, αλλά υπάρχουν κάποια σφάλματα." #~ msgid "_Browse" #~ msgstr "_Αναζήτηση" #~ msgid "My Computer" #~ msgstr "Ο υπολογιστής μου" #, fuzzy #~ msgid "_Only for this folder" #~ msgstr "Μόνο για αυτό το φάκελο" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Επιλέξτε για εφαρμογή της ρύθμισης ταξινόμησης μόνο σε αυτό το φάκελο " #~ "αντί όλων των φακέλων" #~ msgid "Please select a folder" #~ msgstr "Παρακαλώ επιλέξτε ένα φάκελο" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "Μόνο για αυτό το φάκελο" #, fuzzy #~ msgid "Computer" #~ msgstr "Ο υπολογιστής μου" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Δίκτυο" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Εκτέλεση στο τερματικό" #~ msgid "Shortcuts" #~ msgstr "Συντομεύσεις" #~ msgid "Mount Point" #~ msgstr "Σημείο προσάρτησης" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Δημιουργία συμβολικού συνδέσμου" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "Αποστολή προς" #~ msgid "Blank File" #~ msgstr "Κενού αρχείου" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Σφάλμα, το lxshortcut δεν είναι εγκατεστημένο" #~ msgid "Failed to start lxshortcut" #~ msgstr "Αποτυχία εκκίνησης του lxshortcut" #~ msgid "_Group:" #~ msgstr "_Ομάδα:" #~ msgid "Rename" #~ msgstr "Μετονομασία" #~ msgid "Make the file executable" #~ msgstr "Κάντε το αρχείο εκτελέσιμο" #~ msgid "Operations that all other users can do" #~ msgstr "Λειτουργίες που όλοι οι άλλοι χρήστες μπορούν να κάνουν" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Λειτουργίες που μπορεί να κάνει ο ιδιοκτήτης του αρχείου" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Λειτουργίες που μπορούν να κάνουν οι χρήστες που ανήκουν στην ίδια ομάδα " #~ "με τον ιδιοκτήτη του αρχείου" #~ msgid "Read and Write" #~ msgstr "Ανάγνωση και Εγγραφή" #~ msgid "Read only" #~ msgstr "Μόνο ανάγνωση" #~ msgid "Write only" #~ msgstr "Μόνο εγγραφή" libfm-1.4.0/po/en_GB.po000066400000000000000000001401271475513661000145520ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2013-09-21 09:55+0000\n" "Last-Translator: Robert Readman \n" "Language-Team: English UK en_GB \n" "Language: en_GB\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1379757310.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Preferred Applications" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Shortcut Editor" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Create new or change existing desktop entry" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "Choose an application" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Use selected application to open files" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "Installed Application" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "C_ommand line to execute:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Browse..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Execute in terminal emulator" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Keep terminal window open after command execution" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Application name (optional, set it to keep association)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Execute custom command line to open files" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "C_ustom Command Line" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "_Set selected application as default action of this type of file" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "Confirm to replace files" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Skip" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Rename" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Overwrite" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file?" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "with the following file?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "_File Name:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Apply this option to all existing files" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Choose An Icon..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "system icon theme" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "image files" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Choose icon from:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Execute File" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Execute in _Terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "File Properties" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Icon of the file in folder view" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Name:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Location:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Target file:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "File Type:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Open _with:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Select the application used to open files of this type " #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "Total Size of Files:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "Total Size of Files:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "Size on Disk:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "Last Modification:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "Last Access:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "Last Access:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_General" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "O_wner:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_roup:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_View content:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "C_hange content:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Execute:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Special bits:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Who can read content of the file/directory" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Who can change content of the file/directory" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Who can execute the file or enter the directory" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Special flags for file execution" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Special flags for directory access" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Access Control" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Hidden file" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permissions" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "None" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Set GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky & set GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy msgid "Set UID" msgstr "Set UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Set UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy msgid "Only owner" msgstr "Only owner" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Only owner and group" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Anyone" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nobody" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 #, fuzzy msgid "Choose Date" msgstr "Choose a date" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Choose a date from the following calendar" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Search Files" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "File _Name Patterns:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Case insensiti_ve" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Use regular expression" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Plac_es to Search:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Search in sub directories" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Search _hidden files" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Name/_Location" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "File Type" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Only search for files of following types:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xt files" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Image files" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Audio files" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video files" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documents" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "Folder" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "File _Type" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "File Contain_s:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_ontent" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "File Size" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Smaller than:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Bigger than:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Last Modified Time" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(None)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Earlier than:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "L_ater than:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Properties" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Web Browser" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "The preferred Web Browser will be used to open hyperlinks." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "Mail Client" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "The preferred Mail Client will be used to compose emails when you click on E-" "mail addresses." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminal Emulator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Command line:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "System Applications" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "File Associations" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "To:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Preparing..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Target file:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Time remaining:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "Some errors occurred:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Empty File" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Invalid destination" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operation not supported" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Invalid desktop entry file: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Could not determine content type of file '%s' to launch it" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "No default application is set to launch URIs %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Cannot set working directory to '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "No default application is set for MIME type %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Network" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Rubbish Bin" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "shortcut to URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: invalid argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "No terminal emulator is set in libfm config" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Invalid description of thumbnailer application" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "The URI subpath '%s' contains invalid escaped characters" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Duplicate handler for tag <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Character reference '%-.*s' does not encode a permitted character" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Empty entity '&;' seen; valid entities are: & " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Entity name '%-.*s' is not known" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Space isn't allowed in the close tag" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element '%s' was closed but no element was opened" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Element '%s' was closed but the currently open element is '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Invalid char '%c' at start of attribute value" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Invalid char '%c' at end of attribute value, expected '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Document ended unexpectedly" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Document was empty or contained only whitespace" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML data error" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Customise" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Executable files" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "Use selected application to open files" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Installed Applications" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Loading..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Shows tree of directories in sidebar" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Cancel" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave failed." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Open" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Open _With..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "Open _With..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "H_ide" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Unh_ide" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Add to Bookmarks" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "_Rename" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mpress..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Extract _Here" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtract To..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Prop_erties" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "Rubbish" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Image files" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Please enter a valid user name or numeric ID." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Please enter a valid group name or numeric ID." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Do you want to recursively apply these changes to all files and sub-folders?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Hide or unhide the file" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "This file is hidden because its name starts with a dot ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Loading..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Access content:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Files of different types" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "File:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Multiple Files" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Name" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Description" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Size" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permissions" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Owner" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modified" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Location" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Create _New..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Folder" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Empty File" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Invert Selection" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sort Files" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "Rename File" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Folder Prop_erties" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Show _Hidden" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "Mingle files and folders" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "_Ignore name case" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "By _Name" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "By _Modification Time" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "By _Size" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "By File _Type" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Enter a name for the newly created folder:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Rename File" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Enter a name for empty file:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Creating ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "New" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Enter a name for the new %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Creating %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Run default application on file after creation" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "This file '%s' is executable. Do you want to execute it?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "No folders are specified." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Select a folder" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Error" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirm" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Question" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Only system administrators have the permission to do this." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Do you want to move the file '%s' to rubbish bin?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Do you want to move the %d selected file to rubbish bin?" msgstr[1] "Do you want to move the %d selected files to rubbish bin?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Do you want to delete the file '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Do you want to delete the %d selected file?" msgstr[1] "Do you want to delete the %d selected files?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Rename File" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Please enter a new name:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Are you sure you want to empty the Rubbish Bin?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "File Associations" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Rename File" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Desktop" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Applications" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "File _Type" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Mount Volume" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Unmount Volume" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Eject Removable Media" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Format Volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Rename Bookmark Item" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "Re_move from Bookmark" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Move Bookmark _Up" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Move Bookmark _Down" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Empty Rubbish Bin" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Shows list of common places, devices, and bookmarks in sidebar" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Rename Bookmark Item" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Enter a new name:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Size: %s\n" "Modified: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Modified: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "The file operation is cancelled and there are some errors." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Cancelled" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "The file operation is cancelled and there are some errors." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Finished" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Some files cannot be moved to the rubbish bin because the underlying file " "systems don’t support this operation.\n" "Do you want to delete them instead?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pause" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Resume" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Moving files" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Copying files" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Transferring to Rubbish Bin" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Deleting files" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Changing file attributes" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_Restore" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "_Image files" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "File Type:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "File Type:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Off" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Places" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Directory Tree" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remote" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Places" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Directory Tree" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "View of folder contents" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Hide %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Show %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Icon View" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Compact View" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Thumbnail View" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Detailed _List View" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Changes active tab" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "The specified directory '%s' is not valid" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Cannot access destination file" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Cannot create a link on non-native filesystem" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Cannot undelete file '%s': original path not known" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Source and destination are the same." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Cannot move a folder into its sub-folder" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Cannot copy a folder into its sub-folder" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Destination is a sub-folder of source" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Cannot copy file '%s': not supported" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Setting display name can be done only for single file" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Setting target can be done only for single file" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML file '%s' error (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML file doesn't contain Applications root" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Cannot create XML definition for '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Menu path '%s' already exists" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Menu cache error" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Invalid menu directory" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Menu item name cannot be empty" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Invalid menu directory '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Invalid menu item" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "The menu item '%s' doesn't have appropriate entry file" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Change hidden status isn't supported for menu directory" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Setting attribute '%s' not supported" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Invalid value for attribute '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "The '%s' is a menu directory" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "The '%s' isn't a menu item" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "The '%s' entry file is broken" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Cannot create menu item '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Name of menu directory should not end with \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Invalid operation with menu root" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Invalid destination" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: folder '%s' not found in menu cache" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Search" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Search Files" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Execute File" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Co_mmand:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Command to execute when the application icon is activated" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escription:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Generic name of the application" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Working directory:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "The working directory to run the program in" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Tooltip:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Tooltip to show on application" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Use startup notification" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Desktop" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restore" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restore deleted files" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "source file name or desktop id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "SOURCE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "result file name" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM Disc" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Blank CD-ROM Disc" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R Disc" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Blank CD-R Disc" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW Disc" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Blank CD-RW Disc" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM Disc" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Blank DVD-ROM Disc" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW Disc" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Blank DVD-RW Disc" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM Disc" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Blank DVD-RAM Disc" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R Disc" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Blank DVD+R Disc" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW Disc" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Blank DVD+RW Disc" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL Disc" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Blank DVD+R DL Disc" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL Disc" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Blank DVD+RW DL Disc" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray Disc" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Blank Blu-Ray Disc" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R Disc" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Blank Blu-Ray R Disc" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW Disc" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Blank Blu-Ray RW Disc" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD Disc" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Blank HD DVD Disc" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R Disc" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Blank HD DVD-R Disc" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW Disc" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Blank HD DVD-RW Disc" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO Disc" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Blank MO Disc" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW Disc" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Blank MRW Disc" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W Disc" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Blank MRW/W Disc" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Audio files" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Blank Optical Disc" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optical Disc" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "File type to be opened:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Processing:" #~ msgid "Progress:" #~ msgstr "Progress:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "The file operation is finished, but there are some errors." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Creating symlinks" #~ msgid "_Browse" #~ msgstr "_Browse" #~ msgid "My Computer" #~ msgstr "My Computer" #~ msgid "_Only for this folder" #~ msgstr "_Only for this folder" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Remember sort as per folder setting, rather than global setting" #~ msgid "Please select a folder" #~ msgstr "Please select a folder" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_Only for this folder" #, fuzzy #~ msgid "Computer" #~ msgstr "My Computer" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Network" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "_Execute in terminal emulator" #~ msgid "Shortcuts" #~ msgstr "Shortcuts" #~ msgid "Mount Point" #~ msgstr "Mount Point" #~ msgid "Create _Symlink" #~ msgstr "Create _Symlink" #~ msgid "Se_nd To" #~ msgstr "Se_nd To" #~ msgid "Blank File" #~ msgstr "Blank File" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Error, lxshortcut not installed" #~ msgid "Failed to start lxshortcut" #~ msgstr "Failed to start lxshortcut" #~ msgid "_Group:" #~ msgstr "_Group:" #~ msgid "Rename" #~ msgstr "Rename" #~ msgid "Make the file executable" #~ msgstr "Make the file executable" #~ msgid "Operations that all other users can do" #~ msgstr "Operations that all other users can do" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operations that the owner of the file can do" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgid "Read and Write" #~ msgstr "Read and Write" #~ msgid "Read only" #~ msgstr "Read only" #~ msgid "Write only" #~ msgstr "Write only" libfm-1.4.0/po/es.po000066400000000000000000001511031475513661000142030ustar00rootroot00000000000000# Spanish (Castilian) translation for libfm package. # Copyright (C) 2012 the LXDE team # This file is distributed under the same license as the libfm package. # Hugo Florentino , 2013. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2017-05-23 05:58+0000\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Spanish (Castilian) \n" "Language: es\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1495519136.202726\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Aplicaciones preferidas" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Elija las aplicaciones a abrir al pulsar en enlaces web o direcciones de " "correo" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor de atajos" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Crear o modificar una entrada .desktop" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Elija una aplicación" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utilizar la aplicación seleccionada para abrir los archivos" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Aplicaciones _instaladas" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "O_rden de consola que ejecutar:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Examinar…" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Ejecutar en el emulador de _terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Mantener la ventana del terminal después de ejecutar la orden" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Puede usar estos códigos especiales en el intérprete de órdenes:\n" " %f: Representa el nombre de un solo archivo\n" " %F: Representa los nombres de varios archivos\n" " %u: Representa un solo URI de archivo\n" " %U: Representa varios URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "Nombre de la _aplicación (opcional, defínalo para mantener la " "asociación)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Ejecutar una línea de órdenes personalizada para abrir los archivos" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Línea de órdenes personali_zada" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "_Definir aplicación seleccionada como acción predeterminada para archivos de " "este tipo" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Confirmar el reemplazo de archivos" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Omitir" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Cambia_r nombre" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Sobrescribir" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "En esta ubicación ya existe un archivo con el mismo nombre.\n" "\n" "¿Quiere reemplazar el archivo existente" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "con el siguiente?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Nombre de archivo:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Aplicar esta opción a todos los archivos existentes" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Elija un icono…" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "tema de iconos del sistema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "archivos de imagen" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Elegir el icono desde:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Ejecutar archivo" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Ejecutar en el _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Propiedades del archivo" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Icono del archivo en la vista de carpeta" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nombre:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Ubicación:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Archivo de destino:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipo de archivo:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Abrir _con:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" "Seleccione la aplicación utilizada para abrir los archivos de este tipo " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "N.º total de archivos:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Tamaño total de los archivos:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Tamaño en el disco:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Última modificación:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Último acceso:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Última modificación de permisos:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_General" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Pr_opietario:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupo:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Ver contenido:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Ca_mbiar contenido:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Ejecutar:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bits especiales:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Quiénes pueden leer el contenido del archivo o la carpeta" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Quiénes pueden modificar el contenido del archivo o la carpeta" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Quiénes pueden ejecutar el archivo o entrar en la carpeta" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Atributos especiales para la ejecución de archivos" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Atributos especiales para el acceso a carpetas" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Control de accesso" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Archivo oculto" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permisos" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ninguna" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Persistente" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Establecer el GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Persistente y establecer GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Establecer el UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Establecer UID y GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Solo el propietario" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Solo el propietario y el grupo" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Cualquiera" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nadie" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "kB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Elija una fecha" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Elija una fecha del calendario siguiente" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Buscar archivos" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Patrones de _nombres de archivo:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "El patrón puede ser una lista de patrones de consola POSIX (con «,» como " "separador) o una expresión regular de POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "No distinguir mayúsculas _y minúsculas" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Utilizar expresiones regulares" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Lu_gares donde buscar:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Buscar en subdirectorios" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Buscar en archivos _ocultos" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nombre/_ubicación" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipo de archivo" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Buscar solo archivos de los tipos siguientes:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Archivos de te_xto" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Archivos de _imagen" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Archivos de sonido" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Archivos de _vídeo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documentos" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Ca_rpetas" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "O_tros:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Aquí puede proporcionarse cualquier tipo de contenido válido. Se permite el " "comodín «*» al final del tipo. Separe varios tipos por «;»." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipo de archivo" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "El archivo con_tiene:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_ontenido" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Tamaño de archivo:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Menor que:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Ma_yor que:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Última modificación:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ninguna)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "An_terior que:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Posterior que:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propiedades" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navegador web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "El navegador web preferido se utilizará para abrir los hiperenlaces." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Cliente de correo" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "El cliente de correo preferido se utilizará para redactar mensajes cuando " "pulse en las direcciones de correo." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Línea de órdenes:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Aplicaciones del sistema" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Asociaciones de archivos" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Hacia:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Preparando…" #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Archivo de destino:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tiempo restante:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Ocurrieron errores:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Archivo vacío" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "El destino no es válido" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operación no admitida" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Archivo de entrada de escritorio no válido: «%s»" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "No se pudo determinar el tipo de contenido del archivo «%s» para abrirlo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "No se definió la aplicación predeterminada para abrir los URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "No se puede cambiar la carpeta de trabajo a «%s»: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "No se definió la aplicación predeterminada para el tipo MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Dispositivos" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Red" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Papelera" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "atajo al URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumento no válido" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "No se definió ningún emulador de terminal en la configuración de libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "La descripción de la aplicación miniaturizadora no es válida" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "La subruta del URI «%s» contiene caracteres escapados no válidos" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Manejador de etiqueta <%s> duplicado" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "No se pudo analizar «%-.*s», que debería tener un dígito en una referencia " "de carácter (p.ej., ê), quizás el dígito es demasiado grande" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "La referencia al carácter no finalizó con punto y coma. Probablemente " "utilizó un carácter «&» sin pretender iniciar una entidad; escape este " "símbolo escribiendo &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "La referencia del carácter «%-.*s» no codifica un carácter permitido" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Se detectó una entidad «&;» vacía; las entidades válidas son: & " " "< > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "El nombre de la entidad «%-.*s» es desconocido" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "La entidad no termina con punto y coma: probablemente usó el carácter «&» " "sin pretender iniciar una entidad; para utilizarlo escriba &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "No se permiten espacios en la etiqueta de cierre" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Se cerró el elemento «%s» pero no se abrió ninguno" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Se cerró el elemento «%s» pero el elemento que está abierto ahora es «%s»" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "El carácter «%c» en el inicio del valor del atributo no es válido" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "El carácter «%c» en el final del valor del atributo no es válido, se " "esperaba «%c»" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "El documento finalizó inesperadamente" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "El documento está vacío o solo tenía espacios en blanco" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: error de datos XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalizar" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Archivos ejecutables" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Elija una aplicación para abrir archivos «%s»" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Aplicaciones instaladas" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Cargando…" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Muestra el árbol de carpetas en la barra lateral" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Cancelar" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "C_opiar aquí" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Mover aquí" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "En_lazar aquí" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ha fallado." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Abrir" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Abrir c_on…" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "A_brir con" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copiar ru_ta(s)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Ocultar" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Revelar" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Añadir a los marcadores" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Cambia_r nombre…" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mprimir…" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "E_xtraer aquí" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtraer en…" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propi_edades" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Mover a la _papelera" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Esta carpeta ya está incluida en los marcadores." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Archivos de imagen" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "explorando… %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Escriba un nombre de usuario o un id. numérico válido." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Escriba un nombre de grupo o un id. numérico válido." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "¿Quiere aplicar estos cambios recurrentemente a todos los archivos y " "subcarpetas?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Ocultar o revelar el archivo" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Este archivo está oculto porque su nombre comienza por un punto («.»)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Los archivos en este sistema están ocultos si sus nombres comienzan con un " "punto. Pulse para revelar u ocultar estos archivos." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "explorando…" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Acceder al contenido:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Archivos de tipos diferentes" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Archivo:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Archivos múltiples" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nombre" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descripción" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Tamaño" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permisos" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Propietario" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificado" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Ubicación" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extensión" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Crear _nuevo…" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Carpeta" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Archivo vacío" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Invertir selección" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Ordenar archivos" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Cambia_r nombre de carpeta…" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propi_edades de la carpeta" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Mostrar _ocultos" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Me_zclar archivos y carpetas" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorar mayús./minús. en los nombres" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Por _nombre" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Por fecha de _modificación" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Por t_amaño" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Por _tipo de archivo" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Introduzca un nombre para la carpeta recién creada:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Crear una carpeta nueva" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Escriba un nombre para el archivo vacío:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Creando…" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nuevo" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Escriba un nombre para el elemento «%s» nuevo:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Creando %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "A_brir el archivo con la aplicación predeterminada luego de crearlo" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "El archivo de texto «%s» parece ser una secuencia de órdenes ejecutable.\n" "¿Qué quiere hacer con ella?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "El archivo «%s» es ejecutable. ¿Quiere ejecutarlo?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "No se especificó ninguna carpeta." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Seleccione una carpeta" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Error" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmar" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pregunta" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Solo el administrador del sistema tiene permisos para hacer esto." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "¿Quiere mover el archivo «%s» a la papelera?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "¿Quiere mover %d archivo seleccionado a la papelera?" msgstr[1] "¿Quiere mover los %d archivos seleccionados a la papelera?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "¿Quiere eliminar el archivo «%s»?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "¿Quiere eliminar %d archivo seleccionado?" msgstr[1] "¿Quiere eliminar los %d archivos seleccionados?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Cambiar nombre de archivo" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Escriba un nombre nuevo:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "¿Está seguro de que quiere vaciar la papelera?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Pegar e _ir" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barra de ubicación de carpeta" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Carpeta personal" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Escritorio" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplicaciones" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Raíz del sistema de archivos" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montar volumen" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Desmontar vol_umen" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Expulsar medio extraíble" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatear el volumen" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Cambia_r nombre de marcador" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Quitar de los marcadores" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "_Subir el marcador" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "_Bajar el marcador" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Vaciar la papelera" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Muestra una lista de lugares comunes, dispositivos y marcadores en la barra " "lateral" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Cambiar nombre de marcador" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Escriba un nombre nuevo:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Tamaño: %s\n" "Modificado el: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Modificado el: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Se produjeron errores antes de detener la operación." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Cancelado" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Se completó la operación con errores." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Finalizado" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Algunos archivos no pueden moverse a la papelera porque el subsistema de " "archivos no permite esta operación.\n" "¿Quiere eliminarlos en su lugar?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausar" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Reanudar" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Moviendo" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Copiando" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Moviendo a la papelera" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Eliminando" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Creando enlace" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "En:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Creando enlaces a archivos" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Cambiando atributos de" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Cambiando atributos de archivos" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Restaurando" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s archivos" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Operación en curso…" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s el archivo:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s los archivos:" # Necesito más contexto con esta cadena #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Desactivar" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Lugares" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Árbol de _directorios" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remoto" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Lugares" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Árbol de directorios" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Vista del contenido de la carpeta" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Ocultar %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Mover a la izquierda" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Mo_ver a la derecha" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Mostrar %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Olvidar la anchura" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Vista de _iconos" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Vista _compacta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Vista de _miniaturas" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Vista de _lista detallada" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Cambia la pestaña activa" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "La carpeta especificada «%s» no es válida" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "No se puede acceder al archivo de destino" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "No se puede crear un enlace en un sistema de archivos no nativo" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "No se puede restaurar el archivo «%s»: no se conoce la ubicación original" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "El origen y el destino son iguales." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "No se puede mover una carpeta a su subcarpeta" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Imposible copiar una carpeta en su subcarpeta" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "El destino es una subcarpeta del origen" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "No se puede copiar el archivo «%s»: no compatible" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Solo se puede definir el nombre para mostrar en un solo archivo" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Solo se puede definir el destino en un solo archivo" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Error del archivo XML «%s» (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "El archivo XML no contiene la raíz de Aplicaciones" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "No se puede crear la definición XML para «%s»" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "La ruta del menú «%s» ya existe" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Error de cache en menú" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "El directorio de menús no es válido" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "El nombre del elemento de menú no puede estar vacío" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "El directorio de menús «%s» no es válido" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "El elemento del menú no es válido" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "El elemento del menú «%s» no tiene un archivo de entrada apropiado" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "No se permite cambiar el estado oculto del directorio de menús" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "No se admite definir el atributo «%s»" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "El valor para el atributo «%s» no es válido" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "«%s» es un directorio de menú" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "«%s» no es un elemento del menú" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "El archivo de entrada «%s» está dañado" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "No se puede crear el elemento del menú «%s»" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "El nombre del directorio de menús no debe terminar con «.desktop»" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "La operación con la raíz del menú no es válida" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "El destino no es válido" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" "FmMenuVFileMonitor: la carpeta «%s» no se encontró en la caché del menú" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Buscar" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Resultados de la búsqueda" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Elija un archivo ejecutable" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "O_rden:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Orden a ejecutar cuando se activa el icono de la aplicación" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escripción:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Nombre genérico de la aplicación" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Carpeta de _trabajo:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "La carpeta de trabajo en que ejecutar el programa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Conse_jo emergente:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Información que mostrar en la aplicación" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Usar notificación de arranque" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Entrada de _escritorio" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaurar" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaura los archivos de la papelera a su ubicación original" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nombre del archivo de origen o id. de escritorio" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ORIGEN" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nombre de archivo de resultado" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTADO" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disco CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disco CD-ROM en blanco" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disco CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disco CD-R en blanco" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disco CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disco CD-RW en blanco" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disco DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disco DVD-ROM en blanco" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disco DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disco DVD-RW en blanco" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disco DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disco DVD-RAM en blanco" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disco DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disco DVD+R en blanco" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disco DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disco DVD+RW en blanco" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disco DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Disco DVD+R DL en blanco" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disco DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Disco DVD+RW DL en blanco" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disco Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disco Blu-Ray en blanco" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disco Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disco Blu-Ray R en blanco" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW en blanco" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disco HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disco HD DVD en blanco" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disco HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Disco HD DVD-R en blanco" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disco HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Disco HD DVD-RW en blanco" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disco MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disco MO en blanco" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disco MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disco MRW en blanco" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disco MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disco MRW/W en blanco" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Archivos de sonido" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disco óptico en blanco" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disco óptico" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Persistente" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Establecer el UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Solo el propietario" #~ msgid "Symlinking" #~ msgstr "Creando enlace simbólico para" #~ msgid "*" #~ msgstr "*" #~ msgctxt "It is a directory access bit - " #~ msgid "Sticky" #~ msgstr "Persistente" #~ msgctxt "this is a file access mode bit, also known as " #~ msgid "Set UID" #~ msgstr "Establecer el UID" #~ msgid "Processing:" #~ msgstr "Procesando:" #~ msgid "Progress:" #~ msgstr "Progreso:" #~ msgid "Some errors occurred:" #~ msgstr "Ocurrieron algunos errores:" #~ msgid "Re_move from Bookmark" #~ msgstr "Quitar de los _marcadores" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "La operación de archivos se ha cancelado y hay algunos errores." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "" #~ "La operación sobre archivos ha finalizado, pero hay algunos errores." #~ msgid "Moving Files" #~ msgstr "Moviendo los archivos" #~ msgid "Copying Files" #~ msgstr "Copiando los archivos" #~ msgid "Trashing Files" #~ msgstr "Enviando los archivos a la papelera" #~ msgid "Deleting Files" #~ msgstr "Eliminando los archivos" #~ msgid "Creating Symlinks" #~ msgstr "Creando enlaces simbólicos" #~ msgid "Changing File Attributes" #~ msgstr "Cambiando los atributos de archivo" #~ msgid "_Rename Folder" #~ msgstr "_Renombrar la carpeta" #~ msgid "File type to be opened:" #~ msgstr "Tipo de archivo a abrir:" #~ msgid "_Installed Application" #~ msgstr "Aplicación _instalada" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "" #~ "_Definir aplicación seleccionada como predeterminada para abrir archivos " #~ "de este tipo" #~ msgid "_Browse" #~ msgstr "_Examinar" #~ msgid "My Computer" #~ msgstr "Mi PC" #~ msgid "_Move" #~ msgstr "_Mover" #~ msgid "_Trash" #~ msgstr "Enviar a la _papelera" #~ msgid "_Only for this folder" #~ msgstr "S_olo para esta carpeta" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Marcar para recordar el ordenado como una preferencia de carpeta en lugar " #~ "de global" #~ msgid "Please select a folder" #~ msgstr "Seleccione una carpeta" #~ msgid "Entry for folder path" #~ msgstr "Entrada para la ruta de la carpeta" #~ msgid "Computer" #~ msgstr "Equipo" #~ msgid "Network Drives" #~ msgstr "Unidades de red" #~ msgid "_Run in terminal emulator" #~ msgstr "Ejecutar en el emulador de _terminal" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Mantener la ventana del terminal abierta tras la ejecución" #~ msgid "Shortcuts" #~ msgstr "Atajos" #~ msgid "Mount Point" #~ msgstr "Punto de montaje" #~ msgid "Create _Symlink" #~ msgstr "Crear enlace _simbólico" #~ msgid "Se_nd To" #~ msgstr "E_nviar a" #~ msgid "Blank File" #~ msgstr "Archivo en blanco" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Error, lxshortcut no está instalado" #~ msgid "Failed to start lxshortcut" #~ msgstr "Fallo al iniciar lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupo:" #~ msgid "Rename" #~ msgstr "Renombrar" #~ msgid "Make the file executable" #~ msgstr "Hacer el fichero ejecutable" #~ msgid "Operations that all other users can do" #~ msgstr "Operaciones permitidas al resto de los usuarios" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operaciones permitidas al propietario del archivo" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operaciones permitidas a los usuarios del mismo grupo que el propietario " #~ "del archivo" #~ msgid "Read and Write" #~ msgstr "Lectura y escritura" #~ msgid "Read only" #~ msgstr "Sólo lectura" #~ msgid "Write only" #~ msgstr "Sólo escritura" libfm-1.4.0/po/et.po000066400000000000000000001424651475513661000142170ustar00rootroot00000000000000# Estonian translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-04-19 19:01+0000\n" "Last-Translator: Anari Jalakas \n" "Language-Team: LANGUAGE \n" "Language: et\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1524164475.960107\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Eelistatud rakendused" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Vali rakendused, mis avatakse veebilingile või meiliaadressile klõpsamisel" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Otsetee redaktor" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Loo uus või muuta olemasolevat töölaua kannet" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Vali rakendus" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Kasuta valitud rakendust failide avamiseks" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Paigaldatud rakendus" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Käivitatav käsurida:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Sirvi..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Käivita terminalis" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Terminali aken jääb pärast käsu täitmist avatuks" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Need erikoodid on kasutatavad käsureal:\n" " %f: väljendab üksikut failinime\n" " %F: väljendab mitut failinime\n" " %u: väljendab ühe faili URI-id\n" " %U: väljendab mitut URI-id" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Rakenduse nimi (valikuline)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Kohandatud käskluse abil failide avamine" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Kohandatud käsurida" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Määra see rakendus vaikimisi tegevuseks selle failitüübi puhul" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Küsi failide asendamisel kinnitust" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Jäta vahele" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Nimeta ümber" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Kirjuta üle" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Sellise nimega fail on juba olemas.\n" "\n" "Kas soovid olemasoleva faili üle kirjutada" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "järgneva failiga?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Failinimi:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Selle toimingu rakendamine kõikidele failidele" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Ikooni valimine..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "süsteemi ikooniteema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "pildifailid" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Ikooni valimine:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Käivita fail" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Käivita terminalis" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Faili omadused" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Faili ikoon kaustavaates" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nimi:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Asukoht:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Sihtfail:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Failitüüp:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Ava _rakendusega:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Vali selle failitüübi avamiseks kasutatav programm " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Failide koguarv:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Failide kogusuurus:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Suurus kettal:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Viimati muudetud:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Viimati loetud:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Viimane õiguste muutmine:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Üldine" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Omanik:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Grupp:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Sisu vaatamine:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Sisu _muutmine:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Käivitamine:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Ekstra bitid:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Kes võivad lugeda faili/kataloogi sisu" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Kes võivad muuta faili/kataloogi sisu" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Kes võivad käivitada faili/kataloogi sisu" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Faili käivitamise ekstra lipud" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Kataloogi juurdepääsu ekstra lipud" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Juurdepääsu lubamine" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Varjatud fail" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "Õi_gused" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ei midagi" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Kleepuv" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "GID määramine" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Kleepuv ja määratud GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "UID määramine" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "UID ja GID määramine" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Ainult omanik" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Ainult omanik ja grupp" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Igaüks" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Mitte keegi" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "baiti" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Kuupäeva valimine" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Vali kuupäev järgnevast kalendrist" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Failide otsimine" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "_Failinime mustrid:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Muster võib olla kas POSIX kesta mustrite loend (eraldaja on koma ',') või " "POSIXi regulaaravaldis." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Tõstutundetu" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Regulaaravaldis" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Otsingu asukohad:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Alamkataloogidest otsimine" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_Peidetud failide otsimine" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nimi/_asukoht" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Failitüüp:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Otsi ainult järgnevate failitüüpide hulgast:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Tekstifailid" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Pildifailid" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Helifailid" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videofailid" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumendid" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Kaustad" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Muu:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Siia võib sisestada ükskõik millise sisutüübi. Metamärk '*' on lubatud tüübi " "lõpus. Erinevad tüübid tuleb eraldada semikooloniga ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Faili_tüüp" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Failis _sisaldub:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Sisu" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Failisuurus" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Väiksem kui:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Suurem kui:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Viimane muutmine" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ei midagi)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Varasem kui:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Hilisem kui:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Faili _omadused" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Veebilehitseja" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Eelistatud veebilehitsejat kasutatakse veebilinkide avamisel." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "E-mail klient" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Kui klõpsate e-maili aadressil, kasutatakse eelistatud meiliklienti kirja " "koostamiseks." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminaliemulaator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Käsurida:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Süsteemsed rakendused" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Faili assotsiatsioon" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Kuhu:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Valmistumine..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Edastatud andmeid:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Järelejäänud aeg:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Tekkinud vead:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Tühi väärtus" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Vigane valik" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Toimingut ei toetata" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Vigane töölauakanne: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Faili '%s' sisutüüpi ei suudetud tuvastada, seetõttu pole võimalik seda avada" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Ükski rakendus ei ava vaikimisi %s:// URIsid" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Töökataloogiks pole võimalik määrata '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "MIME tüübi %s jaoks pole määratud vaikimisi rakendust" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Seadmed" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Võrk" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Prügikast" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI-i otsetee" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: vigane argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Libfm seadetes pole terminaliemulaatorit määratud" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Vigane pisipildi rakenduse kirjeldus" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bait" msgstr[1] "%u baiti" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI alamtee '%s' sisaldab vigaseid paomärke" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Sildil <%s> on dubleeriv käsitseja" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Viga '%-.*s' analüüsimisel. See võiks olla märgiviites olev number (näiteks " "ê) - võib-olla on number liiga suur" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Märgiviide ei lõpe semikooloniga. Enamasti kasutatakse ampersand märki ilma " "kavatsuseta olemit alustada - märgi see kui &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Märgiviide '%-.*s' ei teisendu lubatud märgiks" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Avastati tühi olem '&;' lubatud olemid on: & " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Olemi nimi '%-.*s' on tundmatu" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Olem ei lõppenud semikooloniga; kõige tõenäolisemalt ei kavatsenud sa " "ampersandi kasutades olemit alustada - märgi see kui &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Sulgevas sildis ei tohi olla tühikuid" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elementi '%s' püütakse sulgeda, kuid see pole avatud" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Element '%s' on suletud, kuid praegu avatud element on '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Atribuudi väärtuse alguses on sobimatu märk '%c'" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Atribuudi väärtuse lõpus on sobimatu märk '%c', oodati '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokument lõppes ootamatult" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument on tühi või sisaldab ainult tühjust" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML andmete viga" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Kohanda" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Käivitatavad failid" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Vali \"%s\" liiki failide avamiseks rakendus" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Paigaldatud rakendused" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Laadimine..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Kataloogipuu näitamine külgribal" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Tühista" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Kopeeri siia" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Liiguta siia" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Lingi siia" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ebaõnnestus." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Ava" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Ava _rakendusega..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Ava _rakendusega" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopeeri _asukoht" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Peida" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Tee _nähtavaks" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Lisa järjehoidjatesse" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Muuda _nime..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Paki kokku..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Paki _lahti siia" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Paki lahti _asukohta..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Omadused" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Viska _prügikasti" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Sellele kaustale juba viitab üks järjehoidja." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Pildifailid" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bait" msgstr[1] "baiti" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "Skannimine... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Palun sisesta kehtiv kasutajanimi või id number." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Palun sisesta kehtiv grupi nimetus või id number." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Kas soovid rakendada need toimingud kõigile failidele ja alamkataloogidele?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Peida või too fail nähtavale" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "See fail on varjatud, kuna selle nimi algab punktiga ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Selles süsteemis olevad failid on varjatud, kui nende nimi algab punktiga " "('.'). Vajuta , et lülitada varjatud failide kuvamine sisse või " "välja." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "Skannimine..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Sisule _juurdepääs:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Erinevat tüüpi failid" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fail:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Mitmed failid" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nimi" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Kirjeldus" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Suurus" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Õigused" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Omanik" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Muudetud" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Asukoht" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Laiendus" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Loo _Uus..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Kaust" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tühi fail" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Pööra valik" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sorteeri faile" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Kaustanime muutmine..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Kausta _omadused" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Näita _peidetud" # Mingle on otsetõlkes segusta. #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Segusta kaustad ja _failid" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Suur ja väiketähtedega nimesid ei _eristata" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "_Nime järgi" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "_Muutmisaja järgi" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "_Suuruse järgi" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "_Failitüübi järgi" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Sisesta loodava kausta nimi:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Loo uus kaust" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Sisesta loodava faili nimi:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Loomine ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Uus" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Sisesta uue %s nimi:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "\"%s\" loomine" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Pärast faili loomist avatakse see vaikimisi rakendusega" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "See tekstifail '%s' näib olevat käivitatav skript.\n" "Mida soovid sellega teha?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "See fail '%s' on käivitatav. Kas soovid selle käivitada?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Kaustu pole määratud." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Kausta valimine" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Viga" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Kinnitus" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Küsimus" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Vajab süsteemihaldaja kasutusõigusi." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Kas tahad tõsta faili '%s' prügikasti?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Kas tahad tõsta %d valitud faili prügikasti?" msgstr[1] "Kas tahad tõsta %d valitud faili prügikasti?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Kas soovid faili '%s' kustutada?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Kas soovid valitud %d faili lõplikult kustutada?" msgstr[1] "Kas soovid valitud %d faili lõplikult kustutada?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Nimeta fail ümber" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Palun sisesta uus nimi:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Kas kindlasti soovid prügikasti tühjendada?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "_Aseta ja mine" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Kausta asukohariba" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Kodukaust" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Töölaud" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Rakendused" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Failisüsteemi juurkataloog" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Andmekandja haakimine" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Andmekandja _lahtihaakimine" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Eemaldatava andmekandja _väljastamine" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Köite vormindamine" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Muuda järjehoidja nime" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Eemalda järjehoidja" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Liiguta _järjehoidja üles" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Liiguta järjehoidja _alla" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Tühjenda prügikast" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Külgribal näidatakse tavaliste asukohtade, seadmete ja järjehoidjate loendit" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Muuda järjehoidja nime" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Sisesta uus nimi:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tüüp: %s\n" "Suurus: %s\n" "Muudetud: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tüüp: %s\n" "Muudetud: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Enne failioperatsiooni lõpetamist esines vigu." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Tühistatud" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Failitoiming on tühistatud, tekkisid mõned vead." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Valmis" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Mõningaid faile ei saanud prügikasti liigutada kuna nende failisüsteem ei " "võimalda seda toimingut.\n" "Kas sa soovid need hoopis kustutada?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Paus" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Jätka" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "liigutamine" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "kopeerimine" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "viskamine prügikasti" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "kustutamine" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Lingi loomine" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Kaust:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Linkide loomine failidele" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Failiomaduste muutmine:" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Failiomaduste muutmine" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "taastamine" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "Failide %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Failioperatsioon on pooleli..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "Faili %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "Failide %s:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Väljas" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Asukohad" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Kataloogipuu" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Võrguasukohad" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Asukohad" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Kataloogipuu" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Vaata kausta sisu" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Peida %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Liiguta _vasakule" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Liiguta _paremale" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Näita %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Unusta laius" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikoonivaade" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Kompaktne vaade" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Pisipildivaade" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Detailne _loendivaade" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Aktiivse kaardi vahetamine" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Määratud kataloog '%s' ei ole korrektne" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Sihtfaili avamine ei õnnestu" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Mitte-natiivses failisüsteemis pole võimalik linki luua" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Ei saa taastada faili '%s': algne asukoht pole teada" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Sihtkohta pole olemas" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Lähte- ja sihtkoht on samad." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kataloogi ei saa liigutada tema enda alamkausta" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kataloogi ei saa kopeerida tema enda alamkausta" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Sihtkoht on lähtekataloogi alamkaust" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Ei saa kopeerida faili '%s': pole toetatud" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Kuvanime saab määrata ainult üksikule failile" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Sihtkohta saab määrata ainult üksikule failile" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML faili '%s' viga (%d:%d):" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML fail ei sisalda juurikat Applications" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "'%s' jaoks pole võimalik XML definitsiooni luua" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Menüü '%s' on juba olemas" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Menüü vahemälu viga" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Vigane menüükaust" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Menüül peab olema nimi" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Vigane menüükaust '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Vigane menüüelement" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Menüükirjel '%s' pole korrektset faili" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Menüükausta varjamine pole toetatud" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Omaduse '%s' seadmine pole toetatud" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Vigane failinimi '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' on menüü kataloog" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "\"%s\" pole menüüelement" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' kirje fail on vigane" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Menüü osa '%s' pole võimalik luua" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Menüükausta nime lõpp ei peaks olema \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Vigane operatsioon juurmenüüga" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Vigane sihtkoht" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: kausta '%s' ei leitud menüüpuhvrist" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Otsing" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Otsingu tulemused" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Käivitatava faili valimine" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Käsk:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Rakenduse ikooni aktiveerimisel käivitatav käsk" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Kirjeldus:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Rakenduse üldine nimi" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Töökaust:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Töökaust, kus programmi jooksutada" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Kohtspikker:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Rakendusel näidatav vihje" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Ka_suta töölemineku märguannet" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Töölaua kanne" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Taasta" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Liiguta fail prügikastist selle algsesse asukohta" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "lähtefaili nimi või töölaua ID" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ALLIKAS" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "tulemuseks faili nimi" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "TULEMUS" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM ketas" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Tühi CD-ROM ketas" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R ketas" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Tühi CD-R ketas" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW ketas" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Tühi CD-RW ketas" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM ketas" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Tühi DVD-ROM ketas" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW ketas" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Tühi DVD-RW ketas" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM ketas" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Tühi DVD-RAM ketas" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R ketas" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Tühi DVD+R ketas" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW ketas" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Tühi DVD+RW ketas" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL ketas" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Tühi DVD+R DL ketas" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL ketas" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Tühi DVD+RW DL ketas" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray ketas" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Tühi Blu-Ray ketas" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R ketas" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Tühi Blu-Ray R ketas" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW ketas" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Tühi Blu-Ray RW ketas" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD ketas" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Tühi HD DVD ketas" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R ketas" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Tühi HD DVD-R ketas" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW ketas" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Tühi HD DVD-RW ketas" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO ketas" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Tühi MO ketas" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW ketas" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Tühi MRW ketas" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W ketas" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Tühi MRW/W ketas" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Helifailid" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Tühi optiline ketas" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optiline ketas" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Töötlemine:" #~ msgid "Progress:" #~ msgstr "Edenemine:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Failitoiming on lõpetatud, kuid tuli ette ka vigu." #~ msgid "Creating Symlinks" #~ msgstr "Nimeviitade loomine" #~ msgid "_Rename Folder" #~ msgstr "_Muuda kausta nime" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Avatav failitüüp:" #~ msgid "_Installed Application" #~ msgstr "_Paigaldatud rakendus" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "_Määra see rakendus vaikimisi tegevuseks selle failitüübi puhul" #~ msgid "_Browse" #~ msgstr "_Sirvi" #~ msgid "My Computer" #~ msgstr "Minu arvuti" #~ msgid "_Move" #~ msgstr "_Liiguta" #~ msgid "_Trash" #~ msgstr "_Prügikast" #~ msgid "_Only for this folder" #~ msgstr "Ainult selle _kausta jaoks" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Kui see on märgistatud kasutatakse kausta seadeid globaalsete seadete " #~ "asemel" #~ msgid "Please select a folder" #~ msgstr "Palun vali kaust" #~ msgid "Entry for folder path" #~ msgstr "Kaustatee kanne" #~ msgid "Computer" #~ msgstr "Arvuti" #~ msgid "Network Drives" #~ msgstr "Võrgukettad" #~ msgid "_Run in terminal emulator" #~ msgstr "_Käivita terminalis" #~ msgid "Shortcuts" #~ msgstr "Otseteed" #~ msgid "Mount Point" #~ msgstr "Haakepunkt" #~ msgid "Create _Symlink" #~ msgstr "Loo _nimeviit" #~ msgid "Se_nd To" #~ msgstr "_Saada" #~ msgid "Blank File" #~ msgstr "Tühi fail" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Viga, \"lxshortcut\" pole paigaldatud" #~ msgid "Failed to start lxshortcut" #~ msgstr "Programmi \"lxshortcut\" käivitamine ebaõnnestus" #~ msgid "_Group:" #~ msgstr "_Grupp:" #~ msgid "Rename" #~ msgstr "Nimeta ümber" #~ msgid "Make the file executable" #~ msgstr "Muuda fail käivitatavaks" #~ msgid "Operations that all other users can do" #~ msgstr "Kõigi kasutajate sooritatavad toimingud" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Faili omaniku sooritatavad toimingud" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Faili omanikuga samas grupis olevate kasutajate toimingud" #~ msgid "Read and Write" #~ msgstr "Lugeda ja kirjutada" #~ msgid "Read only" #~ msgstr "Ainult lugeda" #~ msgid "Write only" #~ msgstr "Ainult kirjutada" libfm-1.4.0/po/eu.po000066400000000000000000001455651475513661000142240ustar00rootroot00000000000000# Basque translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2017-09-11 17:59+0000\n" "Last-Translator: Asier Iturralde Sarasola \n" "Language-Team: LANGUAGE \n" "Language: eu\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1505152746.542791\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Hobetsitako aplikazioak" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Hautatu Webeko esteka edo e-posta helbide bat klikatzean deitzen diren " "aplikazioak" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Lasterbide-editorea" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Sortu edo aldatu mahaigaineko sarrera" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Aukeratu aplikazioa" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Erabili hautatutako aplikazioa fitxategiak irekitzeko" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Instalatutako aplikazioak" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "E_xekutatu beharreko komando lerroa:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Arakatu..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Exekutatu terminal-emuladorean" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Mantendu terminalaren leihoa irekita komandoa exekutatu ondoren" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Kode berezi hauek erabili daitezke komando lerroan:\n" " %f: Fitxategi-izen bakar bat adierazten du\n" " %F: Hainbat fitxategi-izen adierazten ditu\n" " %u: Fitxategiaren URI bakar bat adierazten du\n" " %U: Hainbat URI adierazten ditu" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Aplikazioaren izena (hautazkoa, ezarri asoziazioa mantentzeko)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Exekutatu komando lerro pertsonalizatua fitxategiak irekitzeko" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Komando lerro _pertsonalizatua" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "_Ezarri hautatutako aplikazioa fitxategi-mota honen ekintza lehenetsi bezala" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Berretsi fitxategiak ordezkatzeko" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Saltatu" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Berrizendatu" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Gainidatzi" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Kokapen honetan dagoeneko badago izen hori duen fitxategi bat.\n" "\n" "Existitzen den fitxategi hori ordezkatu nahi duzu" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "ondorengo fitxategiarekin?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Fitxategi-izena:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Aplikatu aukera hau existitzen diren fitxategi guztiei" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Aukeratu ikono bat..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "sistemaren ikonoen gaia" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "irudi-fitxategiak" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Aukeratu ikonoa hemendik:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Exekutatu fitxategia" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Exekutatu _Terminalean" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Fitxategiaren propietateak" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Fitxategiaren ikonoa karpeta ikuspegian" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Izena:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Kokapena:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Helburuko fitxategia:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Fitxategi-mota:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Ireki _honekin:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" "Hautatu mota honetako fitxategiak irekitzeko erabili beharreko aplikazioa " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Fitxategi kopurua guztira:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Fitxategien guztizko tamaina:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Tamaina diskoan:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Azken aldaketa:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Azken atzipena:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Azken baimen aldaketa:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Orokorra" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Jabea:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Taldea:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Ikusi edukia:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Aldatu edukia:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Exekutatu:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bit bereziak:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Nork irakur dezakeen fitxategi/direktorioaren edukia" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Nork alda dezakeen fitxategi/direktorioaren edukia" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Nork exekuta dezakeen fitxategia edo nor sar daitekeen direktoriora" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Fitxategien exekuziorako bandera bereziak" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Direktorioen atzipenerako bandera bereziak" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Atzipen-kontrola" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Ezkutuko fitxategia" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Baimenak" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Bat ere ez" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Itsaskorra" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Ezarri GIDa" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Itsaskorra eta ezarri GIDa" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Ezarri UIDa" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Ezarri UIDa eta GIDa" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Soilik jabea" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Soilik jabea eta taldea" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Edonor" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Inor ez" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Byteak" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Aukeratu data" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Aukeratu data bat ondorengo egutegitik" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Bilatu fitxategiak" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Fitxategi-_izen ereduak:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Eredua POSIX shell eredu-zerrenda bat (',' banatzaile bezala duena) edo " "POSIX adierazpen erregular bat izan daiteke." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Maiuskula/minuskula" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Erabili adierazpen erregularra" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Bilatzeko _lekuak:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Bilatu azpi-direktorioetan" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Bilatu _ezkutuko fitxategiak" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Izena/_Kokalekua" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Fitxategi-mota" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Bilatu ondorengo fitxategi-motetako fitxategiak soilik:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_Testu-fitxategiak" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Irudi-fitxategiak" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Audio-fitxategiak" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Bideo-fitxategiak" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumentuak" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Ka_rpetak" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Besteak:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Baliozko edozein eduki mota sartu daiteke hemen. '*' komodina motaren " "amaieran erabil daiteke. Mota bat baino gehiago sartzeko ';' banatzailea " "erabili." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Fitxategi-_mota" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Fitxategiak _hau duelarik:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "E_dukia" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Fitxategi-tamaina" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Hau baino _txikiagoa:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Hau baino _handiagoa:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Azken aldaketa" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Bat ere ez)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Hau baino _lehenago:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Hau baino _beranduago:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propietateak" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Web-arakatzailea" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Hobetsitako web-arakatzailea erabiliko da hiperestekak irekitzeko." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Posta-bezeroa" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Hobetsitako posta-bezeroa erabiliko da helbide elektroniko batean klik " "egitean e-postak idazteko." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminal-emuladorea" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Komando lerroa:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Sistemaren aplikazioak" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Fitxategi elkarketak" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Hona:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Prestatzen..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Helburuko fitxategia:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Geratzen den denbora:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Erroreak gertatu dira:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Fitxategi hutsa" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Helburu baliogabea" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Onartu gabeko eragiketa" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Mahaigaineko sarrera fitxategi baliogabea: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Ezin izan da '%s' fitxategia abiarazteko bere eduki-mota zehaztu" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Ez da aplikazio lehenetsirik ezarri %s:// URIak abiarazteko." #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Ezin da laneko direktorioa '%s'(e)ra aldatu: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Ez da aplikazio lehenetsirik ezarri %s MIME motarentzat." #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Gailuak" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Sarea" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Zakarrontzia" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URIra lasterbidea" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumentu baliogabea" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Ez da terminal emuladorerik ezarri libfm-ren konfigurazioan" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Koadro txikiak sortzeko aplikazioaren deskribapen baliogabea" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "byte %u" msgstr[1] "%u byte" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "'%s' URI azpi-bideak ihes-karaktere baliogabeak ditu" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "<%s> etiketaren maneiatzaile bikoiztua" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Ezin izan da '%-.*s' analizatu, digitu bat izan behar luke karaktere-" "erreferentzia baten barruan (ê adibidez); agian digitua handiegia da" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Karaktere-erreferentzia ez da puntu eta komaz bukatzen; ziurrenik & ikurra " "erabiliko zenuen entitatea hasteko asmorik gabe. Izendatu & karakterea & " "gisa;" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" "'%-.*s' karaktere-erreferentziak ez du baimendutako karaktere bat kodetzen" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "'&;' entitatea hutsik dago; baliozko entitateak hauek dira: & " " "< > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "'%-.*s' entitate-izena ezezaguna da" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entitatea ez da puntu eta komaz bukatzen; normalean & ikurra erabiltzen da " "entitatea hasteko asmorik gabe; izendatu & karakterea & gisa;" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Ez da zuriunerik onartzen ixteko etiketan" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "'%s' elementua itxi da baina ez da elementurik ireki" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "'%s' elementua itxi egin da, baina unean '%s' elementua dago irekita" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "'%c' karaktere baliogabea atributuaren balioaren hasieran" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "'%c' karaktere baliogabea atributuaren balioaren amaieran, '%c' espero zen" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokumentua ustekabean amaitu da" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokumentua hutsik dago edo zuriuneak bakarrik ditu" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML datu-errorea" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Pertsonalizatu" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Fitxategi exekutagarriak" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Hautatu aplikazio bat \"%s\" fitxategiak irekitzeko" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Instalatutako aplikazioak" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Kargatzen..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Direktorioen zuhaitza erakusten du alboko barran" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Utzi" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "K_opiatu hemen" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Eraman hona" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Este_katu hona" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave-k huts egin du." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Ireki" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Ireki _honekin..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Ireki _honekin" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopiatu _bidea(k)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "E_zkutatu" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Bistaratu" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Gehitu laster-markei" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Aldatu izena..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Konprimatu..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Erauzi _hemen" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Erauzi h_ona..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Propietateak" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Eraman _Zakarrontzira" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Karpeta honen laster-marka badaukazu laster-marketan dagoeneko." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Irudi-fitxategiak" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "byte" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "eskaneatzen... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Mesedez sartu baliozko erabiltzaile-izen edo zenbakizko id bat." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Mesedez sartu baliozko talde-izen edo zenbakizko id bat." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Aldaketa hauek errekurtsiboki aplikatu nahi dizkiezu fitxategi eta azpi-" "karpeta guztiei?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Ezkutatu edo bistaratu fitxategia" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" "Fitxategi hau ezkutuan dago bere izena puntu batekin hasten delako ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Puntuarekin ('.') hasten diren fitxategiak ezkutuan daude sistema honetan. " "Sakatu ezkutuko fitxategiak bistaratzea txandakatzeko." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "eskaneatzen..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Atzitu edukia:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Mota desberdinetako fitxategiak" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fitxategia:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Hainbat fitxategi" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Izena" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Deskribapena" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Tamaina" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Baimenak" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Jabea" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Aldatuta" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Kokapena" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Luzapena" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Sortu _berria..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Karpeta" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Fitxategi hutsa" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Alderantzikatu hautapena" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Ordenatu fitxategiak" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Aldatu karpetaren izena..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Karpetaren _propietateak" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Erakutsi _ezkutukoak" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Elkartu _fitxategiak eta karpetak" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Ez bereizi _maiuskulak eta minuskulak" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "_Izenaren arabera" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "_Aldatze-dataren arabera" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "_Tamainaren arabera" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "_Fitxategi-motaren arabera" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Sartu izen bat karpeta sortu berriarentzat:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Karpeta berria sortzen" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Sartu izen bat fitxategi hutsarentzat:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Sortzen..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Berria" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Sartu izen bat %s berriarentzat:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s sortzen" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Exekutatu aplikazio lehenetsia fitxategian sortu ondoren" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "'%s' testu-fitxategia script exekutagarri bat dela dirudi.\n" "Zer egin nahi duzu berarekin?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "'%s' fitxategia exekutagarria da. Exekutatu nahi duzu?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Ez da karpetarik zehaztu." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Hautatu karpeta" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Errorea" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Berretsi" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Galdera" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Sistemaren administratzaileek soilik dute honetarako baimena." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "'%s' fitxategia zakarrontzira bota nahi duzu?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Hautatutako fitxategi %d zakarrontzira bota nahi duzu?" msgstr[1] "Hautatutako %d fitxategiak zakarrontzira bota nahi dituzu?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "'%s' fitxategia ezabatu nahi duzu?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Hautatutako fitxategi %d ezabatu nahi duzu?" msgstr[1] "Hautatutako %d fitxategiak ezabatu nahi dituzu?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Berrizendatu fitxategia" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Mesedez sartu izen berri bat:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Ziur zaude zakarrontzia hustu nahi duzula?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "It_satsi eta joan" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Karpetaren kokapen-barra" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Etxea karpeta" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Mahaigaina" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplikazioak" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Fitxategi-sistemaren erroa" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Muntatu bolumena" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Desmuntatu bolumena" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Egotzi gailu aldagarria" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formateatu bolumena" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Berrizendatu laster-marka elementua" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Kendu laster-marketatik" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Eraman laster-marka _gora" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Eraman laster-marka _behera" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Hustu zakarrontzia" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Ohiko lekuak, gailuak eta laster-markak erakusten ditu albo-barran" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Berrizendatu laster-marka elementua" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Sartu izen berri bat:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Mota: %s\n" "Tamaina: %s\n" "Aldatuta: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Mota: %s\n" "Aldatuta: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Erroreak gertatu dira fitxategi-eragiketa gelditu baino lehen." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Ezeztatuta" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Fitxategi-eragiketa erroreekin burutu da." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Amaituta" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Zenbait fitxategi ezin dira zakarrontzira mugitu fitxategi-sistemak ez " "duelako eragiketa hau onartzen.\n" "Zuzenean ezabatu nahi dituzu?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausarazi" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Berrekin" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Lekuz aldatzen" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopiatzen" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Zakarrontzira botatzen" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Ezabatzen" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Esteka sortzen" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Hemen:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Fitxategietara estekak sortzen" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Atributuak aldatzen" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Fitxategien atributuak aldatzen" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Leheneratzen" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s fitxategi" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Fitxategi-eragiketa egiten ari da..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "Fitxategi %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s fitxategi:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Itzalita" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Lekuak" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Direktorio-zuhaitza" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Urrunekoa" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Lekuak" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Direktorio-zuhaitza" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Karpetaren edukien ikuspegia" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "E_zkutatu %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Eraman e_zkerrera" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Eraman e_skuinera" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Erakutsi %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Ahaztu zabalera" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikono ikuspegia" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Ikuspegi _trinkoa" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Koadro txikien ikuspegia" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "_Zerrenda-ikuspegia xehatua" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Fitxa aktiboa aldatzen du" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Zehazturiko '%s' direktorioa ez da baliozkoa" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Ezin da helburuko fitxategia atzitu" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Ezin da esteka sortu fitxategi-sistema ez-natiboan" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Ezin da '%s' fitxategia zaborrontzitik leheneratu: jatorrizko bide ezezaguna" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Jatorria eta helburua berdinak dira." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Ezin da karpeta bat bere azpikarpeta batetara mugitu" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Ezin da karpeta bat bere azpikarpetara kopiatu" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Helburua jatorriaren azpikarpeta bat da" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Ezin da '%s' fitxategia kopiatu: ez da onartzen" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Bistaratze-izena fitxategi bakunetan soilik ezar daiteke" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Helburua fitxategi bakunetan soilik ezar daiteke" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML fitxategia '%s' errorea (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML fitxategiak ez dauka Aplikazioak errorik" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Ezin da '%s'(r)entzako XML definizioa sortu" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "'%s' menu-bidea dagoeneko existitzen da" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Menuaren cachearen errorea" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Menu-direktorio baliogabea" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Menuko elementuaren izena ezin da hutsik utzi" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "'%s' menu-direktorio baliogabea" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Menu-elementu baliogabea" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Menuko '%s' elementuak ez dauka sarrera fitxategi egokirik" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Menu direktorioan ezin da ezkutuko egoera aldatu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Ez da onartzen '%s' atributua ezartzea" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Balio baliogabea %s atributuarentzat" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' menu-direktorio bat da" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' ez da menuko elementu bat" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' sarrera-fitxategia hondatuta dago" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Ezin da '%s' menuko elementua sortu" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Menuko direktorioaren izenak ezin du izan \".desktop\" amaieran" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Eragiketa baliogabea menuko erroarekin" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Helburu baliogabea" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: ez da aurkitu '%s' karpeta menuaren cache-an" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Bilatu" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Bilaketaren emaitzak" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Aukeratu fitxategi exekutagarria" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ko_mandoa:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Aplikazioaren ikonoa aktibatzen denean exekutatuko den komandoa" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_eskribapena:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Aplikazioaren izen generikoa" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Laneko direktorioa:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Programa exekutatzeko laneko direktorioa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Argibidea:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Aplikazioan erakutsiko den argibidea" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Erabili abioko jakinarazpena" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Mahaigaineko sarrera" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Leheneratu" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Leheneratu fitxategiak jatorrizko lekuetara" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "iturburu-fitxategiaren izena edo mahaigainaren id-a" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ITURBURUA" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "emaitzaren fitxategi-izena" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "EMAITZA" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM diskoa" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "CD-ROM disko hutsa" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R diskoa" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "CD-R disko hutsa" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW diskoa" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "CD-RW disko hutsa" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM diskoa" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "DVD-ROM disko hutsa" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW diskoa" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "DVD-RW disko hutsa" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM diskoa" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "DVD-RAM disko hutsa" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R diskoa" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "DVD+R disko hutsa" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW diskoa" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "DVD+RW disko hutsa" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL diskoa" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "DVD+R DL disko hutsa" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL diskoa" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "DVD+RW DL disko hutsa" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray diskoa" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Blu-Ray disko hutsa" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R diskoa" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Blu-Ray R disko hutsa" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW diskoa" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Blu-Ray RW disko hutsa" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD diskoa" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "HD DVD disko hutsa" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R diskoa" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "HD DVD-R disko hutsa" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW diskoa" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "HD DVD-RW disko hutsa" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO diskoa" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "MO disko hutsa" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW diskoa" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "MRW disko hutsa" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W diskoa" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "MRW/W disko hutsa" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Audio-fitxategiak" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disko optiko hutsa" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disko optikoa" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Itsaskorra" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Ezarri UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Jabeak soilik" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Prozesatzen:" #~ msgid "Progress:" #~ msgstr "Aurrerapena:" #~ msgid "Some errors occurred:" #~ msgstr "Errore batzuk gertatu dira:" #~ msgid "Re_move from Bookmark" #~ msgstr "_Kendu laster-markatik" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "Fitxategi-eragiketa ezeztatu da eta zenbait errore daude." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Fitxategi-eragiketa amaitu da, baina zenbait errore daude." #, fuzzy #~ msgid "Moving Files" #~ msgstr "Fitxategiak mugitzen" #, fuzzy #~ msgid "Copying Files" #~ msgstr "Fitxategiak kopiatzen" #, fuzzy #~ msgid "Trashing Files" #~ msgstr "Fitxategiak zakarrontzira botatzen" #, fuzzy #~ msgid "Deleting Files" #~ msgstr "Fitxategiak ezabatzen" #~ msgid "_Rename Folder" #~ msgstr "_Berrizendatu karpeta" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Ireki beharreko fitxategi mota:" #~ msgid "_Installed Application" #~ msgstr "_Instalatutako aplikazioa" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "" #~ "_Ezarri hautatutako aplikazioa fitxategi-mota honentzako ekintza " #~ "lehenetsi bezala" #~ msgid "_Browse" #~ msgstr "_Arakatu" #~ msgid "My Computer" #~ msgstr "Nire ordenagailua" #~ msgid "_Move" #~ msgstr "_Lekuz aldatu" #~ msgid "_Trash" #~ msgstr "_Zakarrontzia" #~ msgid "_Only for this folder" #~ msgstr "_Soilik karpeta honentzat" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Hautatu karpetarentzako ordenatzeko ezarpena gogoratzeko orokorraren ordez" #~ msgid "Please select a folder" #~ msgstr "Mesedez hautatu karpeta bat" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_Soilik karpeta honentzat" #~ msgid "Computer" #~ msgstr "Ordenagailua" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Sarea" #~ msgid "_Run in terminal emulator" #~ msgstr "_Exekutatu terminal-emuladorean" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Mantendu terminalaren leihoa irekita exekutatu ondoren" #~ msgid "Shortcuts" #~ msgstr "Lasterbideak" #~ msgid "Mount Point" #~ msgstr "Muntatze-puntua" #~ msgid "Create _Symlink" #~ msgstr "_Sortu esteka sinbolikoa" #~ msgid "Se_nd To" #~ msgstr "_Bidali hona" #~ msgid "Blank File" #~ msgstr "Fitxategi hutsa" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Errorea, lxshortcut ez dago instalatuta" #~ msgid "Failed to start lxshortcut" #~ msgstr "Huts egin du lxshortcut hasieratzean" #~ msgid "Rename" #~ msgstr "Berrizendatu" libfm-1.4.0/po/fa.po000066400000000000000000001451131475513661000141660ustar00rootroot00000000000000# Persian translation for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Hamidreza , 2010. # Ali Yousefi Sabzevar , 2011-2013. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2017-10-24 12:24+0000\n" "Last-Translator: Ali Yousefi Sabzevar \n" "Language-Team: LANGUAGE \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1508847843.316089\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "نرم‌افزارهای برگزیده" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "میانبر" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "یک برنامه ی انتخاب کنید" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "از نرم‌افزارهای انتخابی برای باز کردن پرونده ها استفاده کن" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_برنامه‌های نصب شده" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "خط فرمان برای اجرا:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_مرور..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_اجرا در پایانه شبیه ساز" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "این کدهای ویژه می توانند در خط فرمان استفاده شوند: \n" "%f: نشان دهنده ی یک نام پرونده است.\n" "%F:نشان دهنده‌ی چندین نام پرونده است.\n" "%u: نشان دهنده ی یک URI به تنهایی است.\n" "%U: نشان دهنده ی چندین URI است." #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "اجرای سفارشی خط فرمان برای باز کردن پرونده ها" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "خط فرمان سفارشی" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "" "برنامه‌های انتخابی را به عنوان حالت اجرایی پیشفرض این نوع پرونده تنظیم کن" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "تایید جایگزین کردن پرونده ها" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "گذشتن" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "تغییر نام" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "رونوشت" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" " از قبل پروندهی با همین نام در این آدرس وجود داشته.\n" "\n" "ایا می خواهید با پرونده موجود جایگزین کنید ؟" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "همراه با پرونده پیش رو؟" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "نام پرونده:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "به‌کار بردن این گزینه‌ را بر روی تمام پرونده‌های موجود" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "یک برنامه ی انتخاب کنید" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "نرم‌افزارهای سیستمی" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "پرونده‌های تصویری" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "تغییر محتویات:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "اجرای پرونده" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "اجرا در ترمینال" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "مشخصات پرونده" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "مالک" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "محل:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "هدف:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "نوع پرونده:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "باز کن با:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "برنامه مورد استفاده برای باز کردن پرونده‌های از این دست را انتخاب کنید" #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "مجموع اندازه ی پروندهها:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "مجموع اندازه ی پروندهها:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "حجم روی دیسک:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "آخرین تغییردهی:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "آخرین دسترسی:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "آخرین دسترسی:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_عمومی" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "مالک:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "گروه:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "مشاهده محتویات" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "تغییر محتویات:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "اجرا:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "بیت‌های مخصوص:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "چه کسی می‌تواند محتویات پرونده/پوشه را بخواند" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "چه کسی می‌تواند محتویات پرونده/پوشه را تغییر دهد" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "چه کسی می‌تواند پرونده را اجرا کند یا وارد پوشه شود" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "پرچم‌های مخصوص برای اجرای پرونده" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "پرچم‌های مخصوص برای دسترسی به پوشه" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "کنترل دسترسی" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "پرونده‌های ویدیویی" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_مجوزها" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "هیچ" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "چسبناک" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "تنظیم GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr " چسبناک و تنظیم GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy msgid "Set UID" msgstr "تنظیم UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "تنظیم UID و GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy msgid "Only owner" msgstr "فقط مالک" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "فقط مالک و گروه کاربری" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "هر کسی" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "هیچ کس" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "بایت" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "کیلوبایت" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "مگابایت" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "گیگابایت" #: ../data/ui/filesearch.glade.h:5 #, fuzzy msgid "Choose Date" msgstr "یک زمان انتخاب کنید" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "از تقویم که در ادامه است کی تاریخ انتخاب کنید" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "جستجو در پرونده‌ها" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "الگوهای نام پرونده:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "غیر حساس به بزرگی و کوچکی حروف" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 #, fuzzy msgid "Plac_es to Search:" msgstr "مکان‌های مورد جستجو" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "جستجو در زیر پوشه‌ها" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "جستجو در پرونده‌های مخفی" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "نام/ محل" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "نوع پرونده:" #: ../data/ui/filesearch.glade.h:17 #, fuzzy msgid "Only search for files of following types:" msgstr "فقط جستجو برای پرونده‌های از این نوع" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "پرونده‌های متنی" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "پرونده‌های تصویری" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "پرونده‌های صوتی" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "پرونده‌های ویدیویی" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "مستندات" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "پوشه" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "نوع پرونده" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "محتوای پرونده" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "محتویات" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "حجم پرونده:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "کوچکتر از" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "بزرگتر از:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "آخرین تاریخ تغییردهی:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(هیچ)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "پیش از:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "پس از:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "ویژگی‌ها" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "مرورگر وب" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "مرورگر برگزیده برای باز گردن فرا لینک ها استفاده خواهد شد." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "رایانامه بر" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "وقتی روی نام رایانامه ای کلیک کنید رایانه‌بر برگزیده برای رساندن نامه استفاده " "خواهد شد." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "پایانه‌ی شبیه ساز" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "خط فرمان:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "نرم‌افزارهای سیستمی" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "روابط بین پروندهی" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "به:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "در حال آماده سازی..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "هدف:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "زمان باقی مانده:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "تعدادی خطا رخ داده است:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "اجرای پرونده" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "معکوس کردن انتخاب" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "عملیات پشتبانی نمی‌شود" #: ../src/base/fm-file-launcher.c:88 #, fuzzy, c-format msgid "Invalid desktop entry file: '%s'" msgstr "نام پرونده نامعتبر %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "شبکه" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "سطل زباله" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "میانبر" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "منوی پوشه نامعتبر" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ترا بایت" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u بایت" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "کیبی بایت" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "میبی بایت" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "گیبی بایت" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "تی‌ای بی" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "سفارشی سازی" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "اجرای پرونده" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "یک برنامه برای باز کردن پرونده‌های \"%s\" انتخاب کنید" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "برنامه‌های نصب‌شده" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "<هیچ زیر پوشه‌ای نیست>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "در حال بارگزاری..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "لغو شده" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ناموفق بود." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "باز کردن" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "باز کن با..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "باز کن با..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "حذف از نشانک " #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "تغییر نام" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "فشرده سازی..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "همینجا استخراج کن" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "استخراج در..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "ویژگی‌ها" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "زباله" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "پرونده‌های تصویری" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "بایت" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "لطفا یک نام کاربری یا مشخصه‌ی عددی وارد کنید." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "لطفا یک نام گروه یا مشخصه‌ی عددی وارد کنید." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "آیا می خواهید این تغییرات بر روی تمامی پرونده‌ها و زیر پوشه‌ها اعمال شود؟" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "در حال بارگزاری..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr " دسترسی محتویات:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "پرونده‌هایی از نوع متفاوت" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "نوع پرونده:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "چندین پرونده" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "نام" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "توضیحات" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "اندازه" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "مجوزها" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "مالک" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "تغییر" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "محل" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "ساخت ...جدید" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "پوشه" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "اجرای پرونده" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "معکوس کردن انتخاب" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "دسته‌بندی پرونده‌ها" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "تغییر نام پرونده" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "مشخصات پرونده" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "نمایش مخفی‌ها" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "در هم آمیختن پرونده‌ها و پوشه‌ها" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "نادیده گرفتن بزرگی و کوچکی حروف در نام" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "با نام" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "با تاریخ تغییر" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "با اندازه" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "با نوع پرونده" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "یک نام برای پوشه جدید ساخته شده وارد کنید:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "تغییر نام پرونده" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "یک نام برای پرونده جدید ساخته شده وارد کنید:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "ایجاد ... جدید" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "جدید" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "یک نام برای %s جدید ساخته شده وارد کنید:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "ساخت %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "این پرونده متنی '%s' به نظر یک اسکریپت اجرایی است.\n" "می خواهید با او چکار کنید؟" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "این پرونده '%s' اجرایی است. آیا می خواهید اجرایش کنید؟" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "هیچ پوشه‌ای مشخص نشده است" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "یک پوشه انتخاب کنید" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "خطا" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "تایید" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "پرسش" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "فقط مدیران سیستم اجازه ی اینکار را دارند." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "آیا می خواهید پرونده‌ '%s' را به زباله‌دان منتقل کنید؟" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "آیا می خواهید %d را به زباله‌دان منتقل کنید؟" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "آیا می خواهید پرونده‌ '%s' را حذف کنید؟" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "آیا می خواهید %d را حذف کنید؟" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "تغییر نام پرونده" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "لطفا یک نام جدید وارد کنید:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "آیا از خالی کردن زباله دان اطمینان دارید؟" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "روابط بین پروندهی" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "تغییر نام پرونده" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "میزکار" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "برنامه‌ها" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "نوع پرونده" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "اتصال بخش" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "قطع بخش" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "در آوردن رسانه‌ی قابل حمل" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "اتصال بخش" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "تغییر نام مورد نشانک" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "حذف از نشانک " #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "حذف از نشانک " #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "حذف از نشانک " #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "خالی کردن زباله دان" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "تغییر نام مورد نشانک" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "یک نام جدید وارد کنید:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ":" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "نوع: %s\n" "بزرگی: %s\n" "تغییر: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "نوع: %s\n" "تغییر: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "عملیات پرونده با خطا پایان یافت." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "لغو شده" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "عملیات پرونده با خطا پایان یافت." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "به پایان رسیده" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "بعضی از پرونده ها نمی توانند به سطل زباله منتقل شوند بخاطر اینکه اساس پرونده " "سیستم این عمل را پشتیبانی نمی کند.\n" "بجای اینکار آیا می خواهید آنها را پاک کنید؟" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_بازیابی" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "،" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "جا‌به‌جایی پروندهها" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "روبرداری از پروندهها" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "انتقال به زباله دان" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "پاک کردن پرونده" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "پیوندهای نمادین" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "به:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "پیوندهای نمادین" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "تغییر مشخصه‌های پرونده‌ها" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "تغییر مشخصه‌های پرونده‌ها" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_بازیابی" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "پرونده‌های %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr " پرونده %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "پرونده‌های %s:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "خاموش" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "مکان‌ها" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "درختواره پوشه" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "راه دور" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "مکان‌ها" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "درختواره پوشه" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "دایرکتوری '%s' مشخص شده معتبر نیست" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "بازیابی پرونده‌های زباله‌دان در مسیر اصلی" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "مبدا و مقصد یکسان است." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "نمی توان یک پوشه را به پوشه زیرین خودش منتقل کرد" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "نمی توان پوشه ای راه به پوشه ی زیرین خودش کپی کرد" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "مقصد زیر پوشه‌ای از منبع است" #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "نمی توان پوشه ای راه به پوشه ی زیرین خودش کپی کرد" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "خطای حافظه نهان منو" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "منوی پوشه نامعتبر" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, fuzzy, c-format msgid "Invalid menu directory '%s'" msgstr "منوی پوشه نامعتبر" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "منوی پوشه نامعتبر" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, fuzzy, c-format msgid "Setting attribute '%s' not supported" msgstr "عملیات پشتبانی نمی‌شود" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "نام پرونده نامعتبر %s" #: ../src/modules/vfs-menu.c:1995 #, fuzzy, c-format msgid "The '%s' is a menu directory" msgstr "منوی پوشه نامعتبر" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, fuzzy, c-format msgid "The '%s' isn't a menu item" msgstr "منوی پوشه نامعتبر" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, fuzzy, c-format msgid "Cannot create menu item '%s'" msgstr "نام پرونده نامعتبر %s" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "جستجو" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "جستجو در پرونده‌ها" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "اجرای پرونده" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "به:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "محل:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "مالک" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "به:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "یک برنامه ی انتخاب کنید" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "میزکار" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_بازیابی" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "بازیابی پرونده‌های زباله‌دان در مسیر اصلی" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "دیسک فشرده" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "دیسک خالی" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "دیسک فقط خواندنی" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "دیسک خالی فقط خواندنی" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "دیسک نوشتنی و خواندنی" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "دیسک خالی نوشتنی و خواندنی" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "دیسک فشرده DVD" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "دیسک فشرده خوان خالی" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "دیسک DVDفشرده‌ی خواندنی و نوشتنی" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "دیسک DVD فشرده‌ی خالی نوشتنی و خواندنی" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "دیسک DVDفشرده فقط خواندنی" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "دیسک DVDفشرده فقط خواندنی خام" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "دیسک DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "دیسک DVD+R خام" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "دیسک DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "دیسک خام DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "دیسک دولایه DVD+R" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "دیسک دولایه خام DVD+R" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "دیسک دو لایه DVD+RW" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "دیسک دولایه خام DVD+RW" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "دیسک Blue-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "دیسک Blue-Ray خام" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "دیسک Blue-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "دیسک خام Blue-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "دیسک خام Blue-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "دیسک خام Blue-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "دیسک HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "دیسک خام HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "دیسک HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "دیسک خام HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "دیسک HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "دیسک خام HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "دیسک MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "دیسک خام MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "دیسک MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "دیسک خام MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "دیسک MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "دیسک خام MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "پرونده‌های صوتی" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "دیسک نوری خام" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "دیسک نوری" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "نوع پرونده برای باز شدن:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "پردازش:" #~ msgid "Progress:" #~ msgstr "جریان:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "عملیات پرونده به پایان رسید ولی تعدادی خطا وجود داشته." #~ msgid "_Browse" #~ msgstr "مرور" #~ msgid "My Computer" #~ msgstr "کامپیوتر من" #~ msgid "_Only for this folder" #~ msgstr "فقط برای این پوشه" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "بررسی به خاطرآوری دسته بندی با تنظیمات پوشه به جای دسته بندی باتنظیمات کلی" #~ msgid "Please select a folder" #~ msgstr "لطفا یک پوشه انتخاب کنید" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "فقط برای این پوشه" #, fuzzy #~ msgid "Computer" #~ msgstr "کامپیوتر من" #, fuzzy #~ msgid "Network Drives" #~ msgstr "شبکه" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "اجرا در پایانه شبیه ساز" #~ msgid "Shortcuts" #~ msgstr "میانبر ها" #~ msgid "Mount Point" #~ msgstr "نقطه‌ی اتصال" #~ msgid "Create _Symlink" #~ msgstr "پیوند نمادین بساز" #~ msgid "Se_nd To" #~ msgstr "بفرست به" #~ msgid "Blank File" #~ msgstr "پرونده خام " #~ msgid "Error, lxshortcut not installed" #~ msgstr "خطا، lxshortcut نصب نشده است" #~ msgid "Failed to start lxshortcut" #~ msgstr "شکست در اجرای lxshortcut" #~ msgid "_Group:" #~ msgstr "_گروه" #~ msgid "Rename" #~ msgstr "تغییر نام" #~ msgid "Make the file executable" #~ msgstr "پرونده را اجرایی کن" #~ msgid "Operations that all other users can do" #~ msgstr "عملیاتی که دیگر کاربران هم می توانند انجام دهند" #~ msgid "Operations that the owner of the file can do" #~ msgstr "عملیاتی که دارنده پرونده می تواند انجام دهد" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "عملیاتی که کاربران یک گروه یکسان به عنوان دارنده‌ی پرونده می توانند انجام " #~ "دهند" #~ msgid "Read and Write" #~ msgstr "خواندن و نوشتن" #~ msgid "Read only" #~ msgstr "فقط خواندنی" #~ msgid "Write only" #~ msgstr "فقط نوشتنی" libfm-1.4.0/po/fi.po000066400000000000000000001501251475513661000141750ustar00rootroot00000000000000# Finnish translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: fi\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774898.336754\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Oletussovellukset" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Selecione as aplicações a invocar ao clicar numa ligação ou endereço " "eletrónico" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Pikanäppäinten muokkaus" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Luo uusi tai muuta olemassa olevaa työpöytäkäynnistintä" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Valitse sovellus" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Käytä valittua sovellusta tiedostojen avaamiseen" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Asennetut sovellukset" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Suoritettava komentorivi:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Selaa…" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Suorita päätteessä" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Jätä pääteikkuna auki komennon suorittamisen jälkeen" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Näitä erikoiskoodeja voidaan käyttää komentorivissä:\n" " %f: Tarkoittaa yhtä tiedostonimeä\n" " %F: Tarkoittaa useampaa tiedostonimeä\n" " %u: Tarkoittaa yhden tiedoston URI:a\n" " %U: Tarkoittaa useampaa URI:a" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "_Sovelluksen nimi (valinnainen, aseta assosiaation säilyttämiseksi)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Suorita oma komento tiedostojen avaamiseksi" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Oma komentorivi" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Aseta valittu sovellus _oletustoiminnoksi tälle tiedostotyypille" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Vahvista tiedoston korvaaminen" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Ohita" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Nimeä uudelleen" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Korvaa" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Samanniminen tiedosto on jo olemassa tässä sijainnissa.\n" "\n" "Haluatko korvata tiedoston" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "seuraavalla tiedostolla?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Tiedostonimi:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Käytä tätä asetusta kaikille tiedostoille" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Valitse kuvake…" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "järjestelmän kuvaketeemasta" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "kuvatiedostoista" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Valitse kuvake:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Suorita tiedosto" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Suorita _päätteessä" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Tiedoston ominaisuudet" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Tiedoston kuvake kansionäkymässä" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nimi:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Sijainti:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Kohdetiedosto:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tiedostotyyppi:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Avaa _sovelluksella:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Valitse tämän tyyppisten tiedostojen avaamiseen käytetty sovellus " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Tiedostoja yhteensä:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Tiedostojen yhteiskoko:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Koko levyllä:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Viimeksi muokattu:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Viimeksi käytetty:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Oikeuksia muutettu viimeksi:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Yleiset" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Omistaja:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Ryhmä:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Näytä sisältö:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Muuta sisältöä:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Suorita:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Erityisbitit:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Kuka voi lukea tiedoston/kansion sisällön" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Kuka voi muokata tiedoston/kansion sisältöä" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Kuka voi suorittaa tiedoston tai katsoa kansion sisältöä" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Tiedoston suorituksen erityisliput" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Kansion käyttöoikeuksien erityisliput" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Käyttöoikeudet" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Piilotiedosto" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Oikeudet" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ei mitään" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Tahmea" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Aseta GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Tahmea ja aseta GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Aseta UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Aseta UID ja GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Vain omistaja" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Vain omistaja ja ryhmä" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Kuka tahansa" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ei kukaan" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Tavua" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Valitse päiväys" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Valitse päiväys kalenterista" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Etsi tiedostoja" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Tiedostonimikuviot:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Lauseke voi olla lista POSIXin mukaisia shell -lausekkeita (joiden " "erottimena ’,’) tai POSIXin mukainen säännöllinen lauseke." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Merkkikoolla ei väliä" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Kä_ytä säännöllistä lauseketta" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Haettavat sijainnit" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Hae alihakemistoista" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Hae piilotettuja tiedostoja" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nimi/_Sijainti" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tiedostotyyppi" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Hae vain seuraavan tyyppisiä tiedostoja:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_Tekstitiedostot" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Kuvatiedostot" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Äänitiedostot" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videotiedostot" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Asiakirjat" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Kansiot" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Muu:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Tähän voi syöttää minkä tahansa pätevän sisältötyypin. Jokerimerkkiä ’*’ voi " "käyttää sisältötyypin lopussa. Eri sisältötyypit erotetaan merkillä ’;’." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tiedostotyyppi:" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Tie_dosto sisältää:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Sisältö" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Tiedoston koko" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Pienempi kuin:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Suurempi kuin:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Viimeksi muokattu" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ei mitään)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Aiemmin kuin:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Myöhemmin kuin:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "O_minaisuudet" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "WWW-selain" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Oletus-WWW-selainta käytetään hyperlinkkien avaamiseen." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Sähköpostisovellus" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Oletussähköpostisovellusta käytetään sähköpostien luomiseen kun napsautat " "sähköpostiosoitetta." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Pääte" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Komentorivi:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Järjestelmäsovellukset" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Tiedostosidokset" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Kohde:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Valmistellaan…" #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Kohdetiedosto:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Jäljellä oleva aika:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Virheitä ilmaantui:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Tyhjä tiedosto" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Virheellinen kohde" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Toiminto ei ole tuettu" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Virheellinen työpöytäkäynnistin: ”%s”" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Tiedoston ”%s” tyyppiä ei voitu määrittää sen avaamiseksi" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "URI:lle%s:// ei ole asetettu oletussovellusta" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Työhakemistoksi ei voi asettaa ”%s”: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "MIME-tyypille %s ei ole asetettu oletussovellusta" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Laitteet" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Verkko" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Roskakori" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "pikanäppäin URI:in" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumentti ei kelpaa" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Pääte-emulaattoria ei ole asetettu libfm:n asetuksissa" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Virheellinen esikatselukuvasovelluksen kuvaus" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kt" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u tavu" msgstr[1] "%u tavua" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI:n ”%s” alipolku sisältää virheellisesti suojattuja merkkejä" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Toinen samanlainen käsittelijä tagilla <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Merkkijonon ”%-.*s” piti olla luku merkkiviitteen sisällä (esim. ê), " "mutta sen jäsentäminen epäonnistui - ehkä luku on liian suuri" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Merkkiviite ei päättynyt puolipisteeseen; todennäköisesti käytit &-merkkiä " "aikomatta aloittaa entiteettiä - käytä merkintää &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Merkkiviite ”%-.*s” ei ole sallitun merkin koodaus" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Havaittu tyhjä entiteetti ”&;”; kelvolliset ovat: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Entiteetin nimi ”%-.*s” on tuntematon" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entiteetti ei päättynyt puolipisteeseen; todennäköisesti käytit &-merkkiä " "aikomatta aloittaa entiteettiä - käytä merkintää &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Välilyönti ei ole sallittu sulkevassa tagissa" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elementti ”%s” on suljettu, mutta elementtiä ei ole avattu" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Elementti ”%s” on suljettu, mutta tällä hetkellä on avoinna elementti ”%s”" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Epäkelpo merkki ”%c” attribuutin arvon alussa" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Epäkelpo merkki ”%c” attribuutin arvon lopussa, odotettiin ”%c”" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Asiakirja loppui odottamattomasti" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Asiakirja oli tyhjä tai sisälsi vain tyhjiä merkkejä" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML-tietovirhe" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Mukauta" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Suoritettavat tiedostot" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Valitse ohjelma ”%s”-tiedostojen avaamiseksi" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Asennetut sovellukset" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Ladataan…" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Näyttää kansiopuun sivupalkissa" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Peru" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Kopioi tähän" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Siirrä tähän" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Linkitä tähän" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave epäonnistui." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Avaa" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Avaa _sovelluksella…" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Avaa _sovelluksella" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopioi p_olku/polut" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Piilota" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Näytä" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Lisää kirjanmerkkeihin" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Nimeä uudelleen…" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Pakkaa…" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Pura _tänne" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "P_ura kansioon…" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Tiedoston _ominaisuudet" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Siirrä _roskakoriin" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Tämä kansio on jo kirjanmerkeissä." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Kuvatiedostot" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "tavu" msgstr[1] "tavua" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "tutkitaan… %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Anna kelvollinen käyttäjänimi tai numeerinen id." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Anna kelvollinen ryhmänimi tai numeerinen id." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Hyväksytäänkö nämä muutokset rekursiivisesti kaikkiin tiedostoihin ja " "alihakemistoihin?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Piilota tai näytä tiedosto" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Tämä tiedosto on piilotettu, koska sen nimi alkaa pisteellä (”.”)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Tämän tiedostojärjestelmän tiedostot ovat piilotettuja, jos niiden nimi " "alkaa pisteellä (”.”). Paina näyttääksesi tai piilottaaksesi ne." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "tutkitaan…" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Käytä _sisältöä:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Erityyppiset tiedostot" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Tiedosto:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Useita tiedostoja" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nimi" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Kuvaus" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Koko" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Oikeudet" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Omistaja" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Muokattu" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Sijainti" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Pääte" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Luo _uusi…" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Hakemisto" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tyhjä tiedosto" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Käännä valinta" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Järjestä tiedostot" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Nimeä kansio uudestaan…" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "_Kansion ominaisuudet" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Näytä p_iilotetut" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "_Sekoita tiedostot ja kansiot" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Älä huomioi nimen kirjainkokoa" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "_Nimi" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "_Muokkausajankohta" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "_Koko" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Ti_edostotyyppi" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Anna nimi luodulle hakemistolle:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Luodaan uusi kansio" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Anna tyhjän tiedoston nimi:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Luodaan…" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Uusi" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Anna nimi uudelle %s:lle:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Luodaan %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Suorita oletusohjelma tiedoston luonnin jälkeen" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Tämä tekstitiedosto \"%s\" vaikuttasi suoritettavalta skriptiltä.\n" "Mitä tahdot tehdä sille?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Tämä tiedosto \"%s\" on suoritettava. Tahdotko suorittaa sen?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Kansioita ei ole määritelty." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Valitse kansio" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Virhe" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Vahvista" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Kysymys" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Vain järjestelmän pääkäyttäjällä on oikeudet tehdä tämä." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Siirretäänkö tiedosto ”%s” roskakoriin?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Siirretäänkö %d valittu tiedosto roskakoriin?" msgstr[1] "Siirretäänkö %d valittua tiedostoa roskakoriin?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Poistetaanko tiedosto ”%s”?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Poistetaanko %d valittu tiedosto?" msgstr[1] "Poistetaanko %d valittua tiedostoa?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Nimeä tiedosto uudelleen" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Anna uusi nimi:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Tyhjennetäänkö roskakori?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "_Liitä ja siirry" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Kansiosijaintipalkki" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Kotikansio" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Työpöytä" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Sovellukset" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Tiedostojärjestelmän juuri" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Liitä taltio" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Irrota taltio" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Irrota poistettava laite" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Alusta taltio" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Nimeä kirjanmerkki _uudelleen" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Poista kirjanmerkeistä" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Siirrä kirjanmerkkiä _ylös" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Siirrä kirjanmerkkiä _alas" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Tyhjennä _roskakori" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Näyttää yleiset sijainnit, laitteet ja kirjanmerkit sivupalkissa" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Nimeä kirjanmerkki uudelleen" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Anna uusi nimi:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tyyppi: %s\n" "Koko: %s\n" "Muokattu: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tyyppi: %s\n" "Muokattu: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Virheitä ilmaantui ennen tiedosto-operaation pysäyttämistä." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Peruutettu" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" "Tiedosto-operaatio suoritettiin loppuun, mutta virheitä ilmaantui." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Valmis" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Joitain tiedostoja ei voida siirtää roskakoriin, koska käytettävät " "tiedostojärjestelmät eivät tue tätä toimenpidettä.\n" "Poistetaanko tiedostot?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Tauko" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Jatka" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Siirretään" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopioidaan" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Siirretään roskakoriin" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Poistetaan" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Luodaan linkki" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Kohde:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Luodaan linkkejä tiedostoihin" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Muutetaan määritteitä:" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Muutetaan tiedostojen määritteitä" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Palautetaan" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s tiedostoja" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Tiedosto-operaatio on käynnissä…" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s tiedosto:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s tiedostoja:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "P_ois päältä" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Sijainnit" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Hakemistopuu" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Verkko" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Kirjanmerkit" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Hakemistopuu" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Näkymä kansion sisällöstä" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Piilota %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Siirrä vasemmalle" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Siirrä _oikealle" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Näytä %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Unohda leveys" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Ku_vakenäkymä" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Tiivis näkymä" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Pienoiskuvanäkymä" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Yksityiskohtainen _listanäkymä" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Vaihtaa aktiivista välilehteä" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Annettu hakemisto ”%s” ei ole kelvollinen" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Kohdetiedostoon ei päästä käsiksi" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Ei voida luoda linkkiä vieraalla tiedostojärjestelmällä" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Ei voida palauttaa tiedostoa ”%s”: alkuperäinen sijainti ei ole tiedossa" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Lähde ja kohde ovat samat." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kansiota ei voi siirtää sen omaan alikansioon" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kansiota ei voi kopioida sen omaan alikansioon" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Kohde on lähteen alikansio" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Ei voida kopioida tiedostoa ”%s”: ei tuettu" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Näyttönimen voi asettaa vain yhdelle tiedostolle" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Kohteen voi asettaa vain yhdelle tiedostolle" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML-tiedoston ”%s” virhe (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML-tiedostossa ei ole Appliactions-juurta" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "XML-määritelmää kohdetta ”%s” varten ei voida luoda" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Valikkopolku ”%s” on jo olemassa" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Valikon välimuistin virhe" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Virheellinen valikkokansio" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Valikon kohteen nimi ei voi olla tyhjä" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Virheellinen valikkokansio ”%s”" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Virheellinen valikon kohde" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Valikon kohteella ”%s” ei ole kirjaustiedostoa" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Valikon kansion näkyvyysasetuksen muuttaminen ei ole tuettu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Ominaisuuden ”%s” asettaminen ei ole tuettu" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Virheellinen arvo ominaisuudelle ”%s”" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "”%s” on valikkokansio" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "”%s” ei ole valikkokohde" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Tiedosto ”%s” on rikki" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Ei voida luoda valikkokohdetta ”%s”" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Valikkokansion nimen ei pitäisi päättyä merkkijonoon ”.desktop”" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Virheellinen valikon juuren operaatio" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Virheellinen kohde" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: kansiota ”%s” ei löytynyt valikkovälimuistista" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Etsi" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Hakutulokset" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Valitse suoritettava tiedosto" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Komento:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Sovelluksen kuvaketta napsautettaessa suoritettava komento" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Kuvaus:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Sovelluksen yleinen nimi" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Työhakemisto:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Työhakemisto, jossa ohjelma suoritetaan" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "T_yökaluvihje:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Sovelluksella näytettävä työkaluvihje" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Käytä _käynnistysilmaisinta" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Työpöytäkäynnistin" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Palauta" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Palauta roskakorin tiedostot alkuperäisiin sijainteihin" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "lähdetiedoston nimi tai työpöydän tunniste" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "LÄHDE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "tulostiedoston nimi" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "TULOS" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM-levy" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Tyhjä CD-ROM-levy" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R-levy" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Tyhjä CD-R-levy" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW-levy" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Tyhjä CD-RW-levy" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM-levy" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Tyhjä DVD-ROM-levy" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW-levy" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Tyhjä DVD-RW-levy" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM-levy" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Tyhjä DVD-RAM-levy" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R-levy" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Tyhjä DVD+R-levy" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW-levy" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Tyhjä DVD+RW-levy" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL-levy" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Tyhjä DVD+R DL-levy" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL-levy" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Tyhjä DVD+RW DL-levy" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray-levy" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Tyhjä Blu-ray-levy" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R-levy" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Tyhjä Blu-Ray R-levy" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW-levy" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Tyhjä Blu-ray RW-levy" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD-levy" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Tyhjä HD DVD-levy" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R-levy" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Tyhjä HD DVD-R-levy" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW-levy" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Tyhjä HD DVD-RW-levy" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO-levy" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Tyhjä MO-levy" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW-levy" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Tyhjä MRW-levy" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W-levy" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Tyhjä MRW/W-levy" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Äänitiedostot" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Tyhjä optinen levy" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optinen levy" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Tahmea" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Aseta UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Vain omistaja" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Käsitellään:" #~ msgid "Progress:" #~ msgstr "Edistyminen:" #~ msgid "Some errors occurred:" #~ msgstr "Joitain virheitä ilmaantui:" #~ msgid "Re_move from Bookmark" #~ msgstr "_Poista kirjanmerkeistä" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "Tiedosto-operaatio on peruutettu, ja virheitä ilmaantui." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Tiedosto-operaatio on valmis, mutta virheitä ilmaantui." #~ msgid "Moving Files" #~ msgstr "Siirretään tiedostoja" #~ msgid "Copying Files" #~ msgstr "Kopioidaan tiedostoja" #~ msgid "Trashing Files" #~ msgstr "Siirretään tiedostoja roskakoriin" #~ msgid "Deleting Files" #~ msgstr "Poistetaan tiedostoja" #~ msgid "Creating Symlinks" #~ msgstr "Luodaan symbolisia linkkejä" #~ msgid "Changing File Attributes" #~ msgstr "Muutetaan tiedoston ominaisuuksia" #~ msgid "_Rename Folder" #~ msgstr "_Nimeä kansio uudestaan" #~ msgid "File type to be opened:" #~ msgstr "Avattava tiedostotyyppi:" #~ msgid "_Installed Application" #~ msgstr "_Asennettu sovellus" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "Aseta valittu sovellus _oletustoiminnoksi tälle tiedostotyypille" #~ msgid "_Browse" #~ msgstr "_Selaa" #~ msgid "My Computer" #~ msgstr "Oma tietokone" #~ msgid "_Move" #~ msgstr "_Siirrä" #~ msgid "_Trash" #~ msgstr "_Roskakori" #~ msgid "_Only for this folder" #~ msgstr "_Vain tälle hakemistolle" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Muista lajittelu joka kansiolle erikseen yhteisen lajittelun sijaan" #~ msgid "Please select a folder" #~ msgstr "Valitse kansio" #~ msgid "Entry for folder path" #~ msgstr "Tekstikenttä kansiopolkua varten" #~ msgid "Computer" #~ msgstr "Tietokone" #~ msgid "Network Drives" #~ msgstr "Verkkoasemat" #~ msgid "_Run in terminal emulator" #~ msgstr "_Suorita päätteessä" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Jätä pääteikkuna auki suorittamisen jälkeen" #~ msgid "Shortcuts" #~ msgstr "Pikanäppäimet" #~ msgid "Mount Point" #~ msgstr "Liitoskohta" #~ msgid "Create _Symlink" #~ msgstr "Luo _symbolinen linkki" #~ msgid "Se_nd To" #~ msgstr "_Lähetä" #~ msgid "empty tag" #~ msgstr "tyhjä -tagi" #~ msgid "tag should have exactly one children" #~ msgstr "-tagilla pitäisi olla tasan yksi lapsi" #~ msgid "tag may contain only , , or tag" #~ msgstr "" #~ "-tagi voi sisältää vain -, -, - tai -" #~ "tageja" #~ msgid "merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "yhdistettävässä tiedostossa voi olla vain -ylätagi, sen sijaan oli <" #~ "%s>" #~ msgid "failed to insert tag <%s> from merging file" #~ msgstr "tagin <%s> lisääminen yhdistettävästä tiedostosta epäonnistui" #~ msgid "invalid tag" #~ msgstr "epäkelpo -tagi" #~ msgid "invalid tag" #~ msgstr "epäkelpo -tagi" #~ msgid "cannot find path %s in XML definitions" #~ msgstr "XML-määrityksistä ei löydy polkua" #~ msgid "category manipulation internal error" #~ msgstr "luokittelun muokkaamisessa tapahtui sisäinen virhe" #~ msgid "Blank File" #~ msgstr "Tyhjä tiedosto" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Virhe, lxshortcut ei ole asennettu" #~ msgid "Failed to start lxshortcut" #~ msgstr "Lxshortcutin käynnistys epäonnistui" #~ msgid "_Group:" #~ msgstr "_Ryhmä:" #~ msgid "Rename" #~ msgstr "Nimeä uudelleen" #~ msgid "Make the file executable" #~ msgstr "Tee tiedostosta suoritettava" #~ msgid "Operations that all other users can do" #~ msgstr "Toimenpiteet, jotka kaikki muut käyttäjät voivat tehdä" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Toimenpiteet, jorka tiedoston omistaja voi tehdä" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Toimenpiteet, jotka samassa ryhmässä kuin omistaja olevat käyttäjät " #~ "voivat tehdä" #~ msgid "Read and Write" #~ msgstr "Luku ja kirjoitus" #~ msgid "Read only" #~ msgstr "Vain luku" #~ msgid "Write only" #~ msgstr "Vain kirjoitus" libfm-1.4.0/po/fo.po000066400000000000000000001313011475513661000141760ustar00rootroot00000000000000# Faroese translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: fo\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774898.649010\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Framumtiknar nýtsluskipanir" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "Snarvegir" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "Vel eina nýtsluskipan" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Nýt tað valdu nýtsluskipaninna at lata fílur við" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "Innløgd nýtsluskipan" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "Stýriboðslinja at inna::" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "_Kaga" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 #, fuzzy msgid "_Execute in terminal emulator" msgstr "Koyr í útstøðarhermara" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Hesa serligu kotur, kunnu nýtast á stýriboðslinjuni:\n" " %f: Merkir eitt einstakt fílunavn\n" " %F: Merkir fleiri fílunøvn\n" " %u: Merkir ein einstøk URI av fílunavninum\n" " %U: Merkir fleir URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Koyr tilgjørdu stýriboðsregluna til at lata upp fílur við" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "Tilsniða stýriboðslinja" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "" "Set tað valdu nýtsluskipaninna at verða forsett atgerð fyri hesum fíluslag" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "Vátta at skriva omaná fílur" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Leyp um" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Endurnevn" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Skriva omaná" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Har finnst longu ein fíla við sama navni, á hesum staði.\n" "\n" "Vil tú seta eina aðra fílu í staðin" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "við hesari fílu?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "Fílunavn:" #: ../data/ui/ask-rename.glade.h:10 #, fuzzy msgid "_Apply this option to all existing files" msgstr "Nýt hendan kostin til allar fílur" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "Vel eina nýtsluskipan" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "Kervis-nýtsluskipanir" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "Tveiti fílur út" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "Mál:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Inna fílu" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Inna í ú_tstøð" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Fílueginleikar" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "_Eigari:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Lega:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "Mál:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "Fíluslag:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Lat upp _við:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" "Vel nýtsluskipanina ið nýtast skal til at lata upp fílur av hesum slag " #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "Samlað stødd á fílum:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "Samlað stødd á fílum:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "Stødd á harðdiski:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "Broytt seinast:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "Seinast atgingin:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "Seinast atgingin:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Alment" #: ../data/ui/file-prop.glade.h:16 #, fuzzy msgid "O_wner:" msgstr "Eigari:" #: ../data/ui/file-prop.glade.h:17 #, fuzzy msgid "G_roup:" msgstr "Bólkur:" #: ../data/ui/file-prop.glade.h:18 #, fuzzy msgid "_View content:" msgstr "Postviðskiftarit" #: ../data/ui/file-prop.glade.h:19 #, fuzzy msgid "C_hange content:" msgstr "Mál:" #: ../data/ui/file-prop.glade.h:20 #, fuzzy msgid "_Execute:" msgstr "Onnur:" #: ../data/ui/file-prop.glade.h:21 #, fuzzy msgid "Special bits:" msgstr "Lat upp _við:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Atgongu eftirlit" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "Flyti fílur" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Loyvi" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Eingi" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 #, fuzzy msgid "Search Files" msgstr "Nýnevn fílu" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "Fíluslag:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 #, fuzzy msgid "File Type" msgstr "Fíluslag:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 #, fuzzy msgid "Te_xt files" msgstr "Striki fílur" #: ../data/ui/filesearch.glade.h:19 #, fuzzy msgid "_Image files" msgstr "Tveiti fílur út" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "Nýnevn fílu" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 #, fuzzy msgid "File _Type" msgstr "Fíluslag:" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "Stødd á harðdiski:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 #, fuzzy msgid "File Size" msgstr "Fíluslag:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 #, fuzzy msgid "Last Modified Time" msgstr "Broytt seinast:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 #, fuzzy msgid "(None)" msgstr "Eingi" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 #, fuzzy msgid "_Properties" msgstr "Fílueginleikar" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Net kagari" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Framumtikni vevkagarin verður nýttur at lata upp alnetsbústaðir við." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "Postviðskiftarit" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Tann framumtikni postviðskiftarin, verður nýttur at skriva t-post tá ið tú " "trýstur á t-post bústaðir." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Útstøðarhermari" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Stýriboðaslinja:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Kervis-nýtsluskipanir" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Fílusambindingar" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Til:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Fyrireiki..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Mál:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tíð eftir:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "Nakrar villur fyrikomu:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Inna fílu" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Innlagdar nýtsluskipanir" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Net" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Ruskspann" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "Snarvegir" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u být" msgstr[1] "%u být" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Tilsniða" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "Inna fílu" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "Nýt tað valdu nýtsluskipaninna at lata fílur við" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Innlagdar nýtsluskipanir" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 #, fuzzy msgid "Loading..." msgstr "Fyrireiki..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "Avbrotið" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave miseydnaðist." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 #, fuzzy msgid "Open _With..." msgstr "Lat upp við..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "Lat upp við..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "Tak burtur úr bókamerkjum" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "_Endurnevn" #: ../src/gtk/fm-file-menu.c:163 #, fuzzy msgid "Co_mpress..." msgstr "Stappa..." #: ../src/gtk/fm-file-menu.c:164 #, fuzzy msgid "Extract _Here" msgstr "Pakka út her" #: ../src/gtk/fm-file-menu.c:165 #, fuzzy msgid "E_xtract To..." msgstr "Pakka út til..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 #, fuzzy msgid "Prop_erties" msgstr "Fílueginleikar" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "Ruskspann" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "Tveiti fílur út" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "%u být" msgstr[1] "%u být" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Vinarliga skriva inn eitt lógligt brúkaranavn ella talsamleika." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Vinarliga skriva inn eitt lógligt bólkanavn ella talsamleika." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Vil tú endurkvæmiliga nýta hesar broytingar til allar fílur og undirskjáttur?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Fyrireiki..." #: ../src/gtk/fm-file-properties.c:1089 #, fuzzy msgid "_Access content:" msgstr "Atgongu eftirlit" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Fílur av ymsum slagi" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "Fíluslag:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Fleiri fílur" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Navn" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Frágreiðing" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Stødd" #: ../src/gtk/fm-folder-model.c:193 #, fuzzy msgid "Permissions" msgstr "_Loyvi" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Broytt" #: ../src/gtk/fm-folder-model.c:196 #, fuzzy msgid "Location" msgstr "Lega:" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "Inna fílu" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "Nýnevn fílu" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "Fílueginleikar" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "Vinarliga vel eina skjáttu" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 #, fuzzy msgid "By _Name" msgstr "Navn" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 #, fuzzy msgid "By _Size" msgstr "Stødd" #: ../src/gtk/fm-folder-view.c:222 #, fuzzy msgid "By File _Type" msgstr "Fíluslag:" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Nýnevn fílu" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "Skriva eitt nýtt navn:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "Stovni tykisligar leinkjur" #: ../src/gtk/fm-folder-view.c:866 #, fuzzy msgid "New" msgstr "Net" #: ../src/gtk/fm-folder-view.c:876 #, fuzzy, c-format msgid "Enter a name for the new %s:" msgstr "Skriva eitt nýtt navn:" #: ../src/gtk/fm-folder-view.c:879 #, fuzzy, c-format msgid "Creating %s" msgstr "Stovni tykisligar leinkjur" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Hendan fílan '%s' er inningarfør. Vil tú inna hana?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Vinarliga vel eina skjáttu" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Brek" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 #, fuzzy msgid "Question" msgstr "Frágreiðing" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Einans kervisfyrisitarir hava rættindi til at gerða hetta." #: ../src/gtk/fm-gtk-utils.c:924 #, fuzzy, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Vil tú flyta tær valdu fílurnar í ruskspannina?" #: ../src/gtk/fm-gtk-utils.c:929 #, fuzzy, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Vil tú flyta tær valdu fílurnar í ruskspannina?" msgstr[1] "Vil tú flyta tær valdu fílurnar í ruskspannina?" #: ../src/gtk/fm-gtk-utils.c:989 #, fuzzy, c-format msgid "Do you want to delete the file '%s'?" msgstr "Vil tú strika tær valdu fíurnar?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Vil tú strika tær valdu fíurnar?" msgstr[1] "Vil tú strika tær valdu fíurnar?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Nýnevn fílu" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Vinarliga skriva eitt nýtt navn:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Er tú viss/ur í at tøma ruskspannina?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Fílusambindingar" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Nýnevn fílu" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Skriviborð" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Nýtsluskipanir" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "Fíluslag:" # Enskt volume, danskt arkiv #: ../src/gtk/fm-places-view.c:132 #, fuzzy msgid "_Mount Volume" msgstr "Íset skjalasavn" #: ../src/gtk/fm-places-view.c:133 #, fuzzy msgid "_Unmount Volume" msgstr "Úrset skjalasavn" #: ../src/gtk/fm-places-view.c:134 #, fuzzy msgid "_Eject Removable Media" msgstr "Skumpa leysamiðil út" # Enskt volume, danskt arkiv #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "Íset skjalasavn" #: ../src/gtk/fm-places-view.c:151 #, fuzzy msgid "_Rename Bookmark Item" msgstr "Nýnevn bókamerkisliðin" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "Tak burtur úr bókamerkjum" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "Tak burtur úr bókamerkjum" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "Tak burtur úr bókamerkjum" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 #, fuzzy msgid "_Empty Trash Can" msgstr "Tøm ruskspannina" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Nýnevn bókamerkisliðin" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Skriva eitt nýtt navn:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Slag: %s\n" "Stødd: %s\n" "Broytt: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Slag: %s\n" "Broytt: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Fíluatgerðin er avbrotin, og har eru nøkur brek." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Avbrotið" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "Fíluatgerðin er avbrotin, og har eru nøkur brek." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Liðugt" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Summar fílur kunnu ikki flytast til ruskspannina, tí at tað undirliggjandi " "kervið ikki stuðlar hesari atgerð.\n" "Vil tú strika tær í staðin?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_Endurstovna" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Flyti fílur" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Avriti fílur" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Tveiti fílur út" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Striki fílur" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Stovni tykisligar leinkjur" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "Til:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Stovni tykisligar leinkjur" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Broyti fílueginleikar" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Broyti fílueginleikar" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_Endurstovna" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "Tveiti fílur út" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "Fíluslag:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "Fíluslag:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "Tann tilskilaða skjáttan er ikki lóglig" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Endurstovna strikaðar fílur til teirra upprunaligu leið" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Kelda og mál eru tey somu" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kann ikki flyta ein faldara í sín egna undirfaldara" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kann ikki avrita ein faldara til sín egna undirfaldara" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Máli er ein undirfaldar av kelduni" #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "Kann ikki avrita ein faldara til sín egna undirfaldara" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Nýnevn fílu" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Inna fílu" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "Til:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "Lega:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "_Eigari:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "Til:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "Vel eina nýtsluskipan" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Skriviborð" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Endurstovna" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Endurstovna strikaðar fílur til teirra upprunaligu leið" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM diskur" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Blank CD-ROM dirkur" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R diskur" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Blankur CD-R diskur" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW diskur" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Blankur CD-RW diskur" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM diskur" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Blankur DVD-ROM diskur" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Blankur DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM diskur" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Blankur DVD-RAM diskur" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R diskur" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Blankur DVD+R diskur" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW diskur" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Blankur DVD+RW diskur" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL diskur" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Blankur DVD+R DL diskur" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL diskur" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Blankur DVD+RW DL diskur" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray diskur" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Blankur Blu-Ray diskur" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R diskur" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Blankur Blu-Ray R diskur" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW diskur" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Blankur Blu-Ray diskur" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD diskur" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Blankur HD DVD diskur" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R diskur" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Blankur HD DVD-R diskur" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Blankur HD DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO diskur" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Blankur MO diskur" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRV diskur" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Blankur MRV diskur" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRV/W diskur" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Blankur MRV/W diskur" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Blankur optiskur diskur" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optiskur diskur" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Fíluslag ið skal latast upp:" #~ msgid "Processing:" #~ msgstr "Tilgangi:" #~ msgid "Progress:" #~ msgstr "Støða:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Fíluatgerðin er liðug, men har eru nakrar villur." #~ msgid "_Browse" #~ msgstr "_Kaga" #~ msgid "My Computer" #~ msgstr "Mín telda" #~ msgid "Please select a folder" #~ msgstr "Vinarliga vel eina skjáttu" #, fuzzy #~ msgid "Computer" #~ msgstr "Mín telda" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Net" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Koyr í útstøðarhermara" #~ msgid "Shortcuts" #~ msgstr "Snarvegir" #~ msgid "Mount Point" #~ msgstr "Ísetingarstað" # symlink kann eita tykislig leinkja #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Stovna symlink" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "Send til" #, fuzzy #~ msgid "Blank File" #~ msgstr "Blankur MO diskur" #~ msgid "_Group:" #~ msgstr "_Bólkar:" #~ msgid "Rename" #~ msgstr "Nýnevn" #~ msgid "Make the file executable" #~ msgstr "Gerð fíluna inningarføra" #~ msgid "Operations that all other users can do" #~ msgstr "Atgerðir ið allir brúkarir kunnu gerða" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Atgerðir ið eigarin av fíluni kann gerða" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Atgerðir ið brúkarir í sama bólki sum eigarin, kunnu gerða" #~ msgid "Read and Write" #~ msgstr "Les og skriva" #~ msgid "Read only" #~ msgstr "Einans lesa" #~ msgid "Write only" #~ msgstr "Einans skriva" libfm-1.4.0/po/fr.po000066400000000000000000001545701475513661000142160ustar00rootroot00000000000000# French translation of the libfm library # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # FIRST AUTHOR , YEAR. # Emmanuel Trillaud , 2010. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-12 15:59+0000\n" "Last-Translator: Julien Henry \n" "Language-Team: \n" "Language: fr\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439395143.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Applications préférées" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Sélectionner les applications à ouvrir par clic sur un hyperlien ou une " "adresse électronique" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Éditeur de raccourcis" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Créer une nouvelle entrée de bureau ou en modifier une" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Choisir une application" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utiliser l’application sélectionnée pour ouvrir les fichiers" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Applications _installées" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Ligne de c_ommande à exécuter :" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Parcourir..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Exécuter dans un émulateur de terminal" # Trouver une lettre pour le raccourci clavier #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" "_Garder la fenêtre de terminal ouverte après l'exécution de la commande" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Ces codes spéciaux peuvent être utilisés dans la ligne de commande :\n" " %f : indique un unique nom de fichier ;\n" " %F : indique plusieurs noms de fichier ;\n" " %u : indique l’identificateur universel (URI) d’un seul fichier ;\n" " %U : indique plusieurs identificateurs universels (URI)." #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "Nom de l'_application (de manière optionnelle, on peut la configurer pour " "garder l'association)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Lancer une ligne de commande personnalisée pour ouvrir les fichiers" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Ligne de _commande personnalisée" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "Définir l’application _sélectionnée comme celle par défaut pour ouvrir ce " "type de fichiers" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Confirmer le remplacement du fichier" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Pa_sser" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Renommer" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Remplacer" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Il y a déjà un fichier avec le même nom à cet emplacement.\n" "\n" "Voulez-vous remplacer le fichier existant ?" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "avec le fichier suivant ?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Nom du _fichier :" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Appliquer cette option à tous les fichiers existants" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Choisissez une icône..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "thème d'icônes du système" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "fichiers image" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Choisir l'icône à partir de :" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Exécuter le fichier" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Lancer dans un _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Propriétés du fichier" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Icône du fichier dans la vue du dossier" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nom :" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Emplacement :" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Fichier cible :" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Type de fichier :" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Ouvrir _avec :" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Sélectionner l’application à utiliser pour ouvrir ce type de fichiers " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Nombre total de fichiers :" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Taille totale des fichiers :" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Taille sur le disque :" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Dernière modification :" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Dernier accès :" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Dernier changement de droits d'accès :" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Général" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Proprié_taire :" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_roupe :" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Voir le contenu :" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "C_hanger le contenu :" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Exécuter :" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bits spéciaux :" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Qui peut lire le contenu du fichier/dossier" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Qui peut modifier le contenu du fichier/dossier" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Qui peut exécuter le fichier ou parcourir le dossier" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Drapeaux spéciaux pour l’exécution du fichier" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Drapeaux spéciaux pour l’accès au dossier" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Contrôle d’accès" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Fichier caché" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Droits d'accès" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Aucun" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Permanent" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Définir l'identifiant de groupe" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Permanent & définir le GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Définir l'identifiant d'utilisateur (UID)" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" "Définir l'identifiant d'utilisateur (UID) et l'identifiant de groupe (GID)" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Propriétaire seulement" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Propriétaire et groupe seulement" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Tout le monde" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Personne" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Octets" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "Ko" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "Mo" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "Go" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Sélectionner une date" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Sélectionner une date à partir du calendrier suivant" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Rechercher des fichiers" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Patrons de _noms de fichiers :" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Le modèle peut soit être une liste de modèles d'invite de commande POSIX " "(avec une virgule comme séparateur), soit être une expression régulière " "POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Ignorer la casse" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Utiliser des expressions rationnelles" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Emplac_ements où chercher :" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Chercher dans les _sous-dossiers" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Inclure les fichiers cac_hés" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nom/Emp_lacement" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Type de fichier" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Chercher uniquement des fichiers des types suivants :" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Fichiers te_xte" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Fichiers _image" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Fichiers _audio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Fichiers _vidéo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documents" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Dossie_rs" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Autre :" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Tout type de contenu valide peut être saisi ici. Le métacaractère « * » est " "autorisé à la fin du type. Pour séparer les types, il faut utiliser un point-" "virgule." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Type de fichier" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Le fichier _contient :" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_ontenu" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Taille du fichier :" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Plu_s petit que :" # Vérifier la lettre pour le raccourci clavier #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Plus _grand que :" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Date de dernière modification:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Aucun)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Plus réc_ent que :" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Plus _ancien que :" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propriétés" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navigateur Web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Le navigateur Web préféré sera utilisé pour ouvrir les liens hypertextes." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Client de messagerie électronique" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Le client de messagerie préféré sera utilisé pour écrire des courriels " "lorsque vous cliquerez sur des adresses électroniques." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Émulateur de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Ligne de commande :" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Applications système" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Associations de fichiers" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Vers :" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Préparation..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Fichier cible :" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Temps restant :" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Des erreurs sont survenues :" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Fichier vide" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Destination invalide" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Opération non prise en charge" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Fichier d'entrée de bureau invalide : '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Impossible de déterminer le type de contenu du fichier « %s » pour le lancer" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "Aucune application par défaut n'est définie pour lancer les indentificateurs " "universels (URI) %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Impossible de définir le dossier de travail comme « %s » : %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Aucune application par défaut n'est définie pour le type Mime %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Appareils" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Réseau" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Corbeille" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "Raccourci vers l'identificateur universel (URI)" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file : argument invalide" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" "Aucun émulateur de terminal n'est défini dans la configuration de libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Description invalide de l'application de création de vignettes" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "ko" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "To" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u octet" msgstr[1] "%u octets" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "Kio" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "Mio" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "Gio" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "Tio" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" "Le sous-chemin de l'identificateur universel (URI) « %s » contient des " "caractères d'échappement invalides" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Dupliquer le gestionnaire pour l'étiquette <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Échec de l'analyse de « %-.*s » qui aurait dû être un nombre dans une plage " "de référence de caractères (ê, par exemple) -- le nombre est peut-être " "trop grand" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "La référence du caractère ne se termine pas par un point-virgule ; vous avez " "vraisemblablement utilisé une esperluette sans intention d'écrire une entité " "-- échappez l'esperluette en utilisant « & »." #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "La référence de caractère « %-.*s » n'encode pas de caractère autorisé" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Entité vide « &; » rencontrée : les entités valides sont : « & », « " "" », « < », « > » et « ' »" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "L'entité nommée « %-.*s » est inconnue" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "L'entité ne se termine pas par un point-virgule ; vous avez probablement " "utilisé une esperluette sans intention d'écrire une entité -- échappez " "l'esperluette avec &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Espace non autorisée dans la balise fermante" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "L'élément « %s » a été fermé mais aucun élément n'a été ouvert" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "L'élément « %s » a été fermé mais l'élément actuellement ouvert est « %s »" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Caractère invalide « %c » au début de la valeur de l'attribut" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Caractère invalide « %c » à la fin de la valeur de l'attribut, « %c » attendu" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Le document s'est fermé de manière inattendue" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Le document était vide ou ne contenait que des espaces" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data : erreur de données XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personnaliser" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Fichiers exécutables" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Sélectionnez une application pour ouvrir les fichiers « %s »" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Applications installées" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Chargement..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Affiche l'arbre des dossiers dans la barre latérale" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "A_nnuler" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "C_opier ici" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Déplacer ici" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Lier ici" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Échec de XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Ouvrir" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Ouvrir a_vec..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Ouvrir a_vec" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copier le(s) c_hemin(s)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Cacher" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Montrer" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Ajouter aux signets" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Renommer..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mpresser..." # Vérifier la lettre pour le raccourci clavier #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Extraire _ici" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtraire vers..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propri_étés" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Mettre à la cor_beille" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Vos signets en ont déjà un pour ce dossier." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Fichiers image" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "octet" msgstr[1] "octets" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "Analyse en cours... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" "Veuillez entrer un nom d’utilisateur ou un identifiant numérique valide." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Veuillez entrer un nom de groupe ou un identifiant numérique valide." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Voulez-vous appliquer ces changements récursivement à tous les fichiers et " "sous-dossiers ?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Masquer ou afficher le fichier" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Ce fichier est caché parce que son nom commence par un point (« . »)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Les fichiers sur ce système sont cachés si leur nom commence par un point " "(« . »). Tapez pour basculer l'affichage des fichiers cachés." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "Analyse en cours..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Contrôle d’_accès :" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Fichiers de différents types" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fichier :" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Fichiers multiples" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nom" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Description" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Taille" # Pq y a-t-il une lettre définie pour un raccourci clavier alors qu'il n'y en a pas dans la chaîne source ? #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Droits d'accès" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Propriétaire" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modifié" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Emplacement" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extension" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Créer un _nouveau..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Dossier" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Fichier vide" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverser la sélection" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Trier les fichier_s" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Renommer le dossier..." # Il n'y a pas de lettre définie pour le raccourci clavier dans la chaîne actuelle #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propriétés du fichi_er" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Afficher les fichiers cac_hés" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Mélanger les _fichiers et les dossiers" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorer la casse des noms" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Par _nom" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Par date de _modification" # Vérifier la lettre pour le raccourci clavier #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Par _taille" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Par _type de fichier" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Entrer un nom pour le dossier nouvellement créé :" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Création d'un nouveau dossier" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Entrez un nom pour le fichier vide :" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Création..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nouveau" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Entrer un nom pour le nouveau %s :" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Création de %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" "Exécute_r l'application par défaut pour ouvrir le fichier après sa création" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Le fichier texte « %s » semble être un script exécutable.\n" "Que voulez-vous en faire ?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Le fichier « %s » est exécutable. Voulez-vous l’exécuter ?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Aucun dossier n'est spécifié." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Sélectionner un dossier" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Erreur" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmer" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Question" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Seuls les administrateurs système ont le droit de faire cela." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Voulez-vous mettre le fichier « %s » à la corbeille ?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Voulez-vous mettre le fichier %d sélectionné à la corbeille ?" msgstr[1] "Voulez-vous mettre les fichiers %d sélectionnés à la corbeille ?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Voulez-vous supprimer le fichier « %s » ?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Voulez-vous supprimer le fichier %d sélectionné ?" msgstr[1] "Voulez-vous supprimer les fichiers %d sélectionnés ?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Renommer le fichier" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Veuillez entrer un nouveau nom :" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Êtes-vous sûr de vouloir vider la corbeille ?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Coller et pour_suivre" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barre d'emplacement du dossier" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Dossier personnel" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Bureau" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Applications" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Racine du système de fichiers" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Monter le volume" # Vérifier la lettre pour le raccourci clavier #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Démonter le volume" # Utiliser un e accentué majuscule pour le raccourci clavier ne risque-t-il pas de poser problème ? L'utilisation du e non accentué fonctionne-t-elle ? #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Éjecter le support amovible" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formater le volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Renommer le signet" # Vérifier la lettre utilisée pour le raccourci clavier #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Ret_irer des signets" # Voir quelle lettre utiliser pour le raccourci clavier #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "_Monter le signet" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "_Descendre le signet" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Vid_er la corbeille" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Affiche la liste des emplacements, appareils et signets habituels dans la " "barre latérale" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Renommer le signet" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Entrez un nouveau nom :" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr " : " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Type : %s\n" "Taille : %s\n" "Modifié : %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Type : %s\n" "Modifié : %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "" "Des erreurs sont survenues avant que l'opération sur les fichiers ne soit " "terminée." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Annulé" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "L'opération sur les fichiers s'est terminée avec des erreurs." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Terminé" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Certains fichiers ne peuvent pas être mis à la corbeille car les systèmes de " "fichiers sous-jacents ne prennent pas en charge cette opération.\n" "Voulez-vous plutôt les supprimer ?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pause" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Reprendre" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Déplacement en cours" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Copie en cours" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Déplacement des fichiers dans la corbeille en cours" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Suppression en cours" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Création de liens en cours" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Vers :" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Création de liens vers des fichiers en cours" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Changement en cours des attributs de" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Changement des attributs des fichiers en cours" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Restaure" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s les fichiers" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "L'opération sur les fichiers est en cours..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s le fichier :" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s les fichiers :" # Voir quelle lettre utiliser pour le raccourci clavier #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "Étei_nt" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "Em_placements" # l'arborescence de fichiers, qui est l'organisation hiérarchique des fichiers sur une partition, et dans certains cas de partitions entre elles, par exemple: partitions virtuelles (« lecteurs logiques ») dans des partitions réelles. @wikipedia #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Ar_borescence" # Voir quelle lettre utiliser pour le raccourci clavier #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Distant" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Emplacements" # l'arborescence de fichiers, qui est l'organisation hiérarchique des fichiers sur une partition, et dans certains cas de partitions entre elles, par exemple: partitions virtuelles (« lecteurs logiques ») dans des partitions réelles. @wikipedia #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Arborescence" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Vue du contenu du dossier" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "Cac_her %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Déplacer à _gauche" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Déplacer à _droite" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Afficher %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Oublier la largeur" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Icônes" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Compact" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Vue en _vignettes" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "_Liste détaillée" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Change l'onglet actif" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Le dossier « %s » indiqué n'est pas valide" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Impossible d'accéder au fichier de destination" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Impossible de créer un lien dans un système de fichiers non natif" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Impossible de restaurer le fichier « %s » : emplacement original inconnu" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "La source et la destination sont identiques." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Impossible de déplacer un dossier dans son propre sous-dossier" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Impossible de copier un dossier dans son propre sous-dossier" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "La destination est un sous-dossier de la source" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Impossible de copier le fichier « %s » : non pris en charge" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Régler le nom affiché ne peut être fait que pour un seul fichier" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Régler la cible ne peut être fait que pour un seul fichier" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Erreur du fichier XML « %s » (%d:%d) : " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Le fichier XML ne contient pas la racine des applications" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Impossible de créer une définition XML pour « %s »" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Le chemin de menu « %s » existe déjà" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Erreur de cache de menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Dossier de menu invalide" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Un nom d'élément de menu ne peut pas être vide" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Menu de dossier « %s » invalide" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Élément de menu non valide" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "L'élément de menu « %s » ne possède pas de fichier d'entrée approprié" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" "Le changement de l'attribut caché n'est pas pris en charge pour le dossier " "de menu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "La définition de l'attribut « %s » n'est pas prise en charge" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Valeur incorrecte pour l'attribut « %s »" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "Le « %s » n'est pas un dossier de menu" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "Le « %s » n'est pas un élément de menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Le fichier d'entrée « %s » est cassé" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Impossible de créer l'élément de menu « %s »" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Le nom du dossier de menu ne devrait pas se terminer par « .desktop »" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Opération invalide avec la racine du menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Destination invalide" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor : dossier « %s » non trouvé dans le cache du menu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Rechercher" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Résultats de la recherche" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Choisissez un fichier exécutable" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Co_mmande :" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Commande à exécuter lorsque l'icône de l'application est active" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escription :" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Nom générique de l'application" # Vérifier la lettre pour le raccourci clavier #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Dossier de _travail :" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Le dossier de travail dans lequel exécuter le programme" # Vérifier la lettre pour le raccourci clavier #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Infobulle :" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Infobulle à afficher sur l'application" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Utiliser la notification de démarrage" # Vérifier la lettre pour le raccourci clavier #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Entrée _de bureau" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaurer" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaurer les fichiers à leurs emplacements d'origine" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "Nom de fichier source ou identifiant de bureau" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "SOURCE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "Nom de fichier de résultat" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RÉSULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "CD-ROM vierge" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "CD-R vierge" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "CD-RW vierge" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "DVD-ROM vierge" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "DVD-RW vierge" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "DVD-RAM vierge" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "DVD+R vierge" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "DVD+RW vierge" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "DVD+R DL vierge" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "DVD+RW DL vierge" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disque Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disque Blu-Ray vierge" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disque Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disque Blu-Ray R vierge" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disque Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disque Blu-Ray RW vierge" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "HD DVD vierge" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "HD DVD-R vierge" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "HD DVD-RW vierge" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disque MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disque MO vierge" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disque MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disque MRW vierge" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disque MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disque MRW/W vierge" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Fichiers _audio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disque optique vierge" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disque optique" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Type de fichier à ouvrir :" #~ msgid "*" #~ msgstr "*" # En cours: #~ msgid "Processing:" #~ msgstr "En cours :" #~ msgid "Progress:" #~ msgstr "Progression :" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Opération sur les fichiers terminée, mais il y a des erreurs." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Création de liens symboliques" # Vérifier la lettre pour le raccourci clavier #, fuzzy #~ msgid "_Browse" #~ msgstr "_Parcourir" #~ msgid "My Computer" #~ msgstr "Mon ordinateur" #~ msgid "_Only for this folder" #~ msgstr "Pour ce d_ossier seulement" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Cocher pour mémoriser le tri par dossier plutôt que le tri dans l'ensemble" #~ msgid "Please select a folder" #~ msgstr "Sélectionnez un dossier" # Pq y a-t-il un signe pour un raccourci clavier alors qu'il n'y en a pas dans la chaîne source ? #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "Pour ce d_ossier seulement" #, fuzzy #~ msgid "Computer" #~ msgstr "Mon ordinateur" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Réseau" # Vérifier la lettre pour le raccourci clavier #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Lanc_er dans un émulateur de terminal" #~ msgid "Shortcuts" #~ msgstr "Raccourcis" #~ msgid "Mount Point" #~ msgstr "Point de montage" #~ msgid "Create _Symlink" #~ msgstr "Créer un lien _symbolique" # Vérifier la lettre pour le raccourci clavier #~ msgid "Se_nd To" #~ msgstr "Envo_yer vers" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Impossible de trouver le chemin %s dans les définitions XML" #~ msgid "Category manipulation internal error" #~ msgstr "Erreur interne de manipulation de catégories" #~ msgid "Blank File" #~ msgstr "Fichier vierge" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Erreur, lxshortcut n'est pas installé" #~ msgid "Failed to start lxshortcut" #~ msgstr "Impossible de démarrer lxshortcut" #~ msgid "_Group:" #~ msgstr "_Groupe :" #~ msgid "Rename" #~ msgstr "Renommer" #~ msgid "Make the file executable" #~ msgstr "Rendre le fichier exécutable" #~ msgid "Operations that all other users can do" #~ msgstr "Opérations que tous les autres utilisateurs peuvent faire" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Opérations que le propriétaire du fichier peut faire" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Opérations que les utilisateurs du même groupe que le propriétaire " #~ "peuvent faire" #~ msgid "Read and Write" #~ msgstr "Lecture et Écriture" #~ msgid "Read only" #~ msgstr "Lecture seule" #~ msgid "Write only" #~ msgstr "Écriture seule" libfm-1.4.0/po/gl.po000066400000000000000000001527211475513661000142050ustar00rootroot00000000000000# Galician translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Miguel Anxo Bouzada , 2013. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2019-02-22 09:18+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "Language: gl\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1550827112.173006\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Aplicativos preferidos" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Seleccione os aplicativos que chamar ao premer sobre a ligazón web ou o " "enderezo de correo" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor de atallos" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Crear ou cambiar unha entrada de escritorio existente" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Escolla un aplicativo" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utilizar o aplicativo seleccionado para abrir os ficheiros" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Aplicativos _instalados" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Liña de _ordes a executar:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Examinar..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "E_xecutar nun emulador de terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Manter aberta a xanela do terminal despois da execución da orde" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Na liña de ordes poden utilizarse estes códigos especiais:\n" " %f: Representa o nome dun só ficheiro\n" " %F: Representa múltiples nomes de ficheiros\n" " %u: Representa un só URI do ficheiro\n" " %U: Representa múltiples URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "_Nome do aplicativon (opcional, estabelecelo para manter a asociación)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Executar unha liña de ordes personalizada para abrir os ficheiros" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Liña de ordes personalizada" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "E_stabelecer oaplicativo seleccionado como acción predeterminada para os " "ficheiros deste tipo" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Confirmar e substituír os ficheiros" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Omitir" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Renomear" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Sobrescribir" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Nesta localización xa existe un ficheiro co mesmo nome.\n" "\n" "Desexa substituír o ficheiro existente" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "co seguinte ficheiro?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Nome do _ficheiro:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Aplicar esta opción a todos os ficheiros existentes" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Escolla unha icona..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "Icona do tema do sistema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "Ficheiros de imaxe" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Escolla a icona de:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Executar o ficheiro" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Executar no _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Propiedades do ficheiro" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Icona do ficheiro na vista do cartafol" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nome" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Localización:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Ficheiro de destino:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipo de ficheiro:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Abrir _con:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Escolla o aplicativo utilizado para abrir os ficheiros deste tipo " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Número total de ficheiros:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Tamaño total dos ficheiros:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Tamaño no disco:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Última modificación:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Último acceso:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Cambiar os últimos permisos:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Xeral" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Propietario:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupo:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Ver o contido:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Ca_mbiar o contido:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Executar:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bits especiais:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Quen pode ver o contido do ficheiro/directorio" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Quen pode cambiar o contido do ficheiro/directorio" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Quen pode executar o ficheiro ou entrar no directorio" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Marcas especiais para a execución de ficheiros" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Marcas especiais para o acceso aos directorios" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Control de acceso" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Ficheiro agachado" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permisos" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ningunha" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Persistente" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Estabelecer o GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Persistente e Estabelecer o GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Estabelecer o UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Estabelecer o UID e o GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Só o propietario" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Só o propietario e o grupo" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Ninguén" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ninguén" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Escolla a data" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Escolla unha data deste calendario" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Buscar ficheiros" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Patróns de _nome de ficheiro:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "O patrón pode ser unha lista de patróns POSIX (cunha «,» como separador) ou " "expresións regulares POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Non diferenciar maiúsculas de minúsculas" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Utilizar expresións regulares" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Lugar_es de busca" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Buscar nos _subdirectorios" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Buscar nos _ficheiros agachados" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nome/_Localización" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipo de ficheiro:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Buscar só os ficheiros dos seguintes tipos:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Ficheiros de te_xto" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Ficheiros de _imaxe" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Ficheiros de _son" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Ficheiros de _vídeo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documentos" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Ca_rtafoles" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "O_utros:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Aquí pode introducir calquera tipo de contido correcto. Permítese o uso do " "comodín «*» na fin da clase. Os múltiples tipos deben estar separados por " "«;»." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipo de ficheiro" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "O ficheiro co_ntén:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_ontido" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Tamaño do ficheiro:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Menor que:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "M_aior que:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Data da última modificación" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ningún)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Ant_erior a:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Posterior _a:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propiedades" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navegador web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "O navegador web preferido utilizarase para abrir as ligazóns." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Cliente de correo" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "O cliente de correo preferido utilizarase para redactar as mensaxes cando " "prema nos enderezos de correo electrónico." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Liña de ordes:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Aplicativos do sistema" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Asociacións de ficheiros" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Para:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Preparando..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Datos transferidos:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tempo restante:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Producíronse algúns erros:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Valor baleiro" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Selección incorrecta" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operación non admitida" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Elemento de menú incorrecto: «%s»" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Non foi posíbel determinar o tipo de contido do ficheiro «%s» para inicialo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "Non está estabelecido o aplicativo predeterminado para iniciar as URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Non é posíbel estabelecer o directorio de traballo a «%s»: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Non está estabelecido o aplicativo predeterminado para o tipo MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Dispositivos" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Rede" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Cesto do lixo" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "Atallo ao URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumento incorrecto" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" "Non foi estabelecido o emulador de terminal na configuración de «libfm»" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Descrición incorrecta do aplicativo de miniaturas" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "A subruta do URI «%s» contén caracteres de escape incorrectos" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Manexador duplicado para a etiqueta <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Produciuse un erro ao analizar «%-.*s», que debería ser un díxito dentro " "dunha referencia de carácter (por exemplo ê) - pode que o díxito sexa " "grande de máis" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "A referencia de carácter non remataba con punto e coma, probabelmente " "utilizou un carácter «&» sen intención de comezar unha entidade, escriba o & " "como &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "A referencia de carácter «%-.*s» non codifica un carácter permitido" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Detectada unha entidade baleira «&;»; as entidades correctas son: & " "" < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Non se coñece o nome de entidade «%-.*s»" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "A entidade non remata cun punto e coma, probabelmente usou o carácter «&» " "sen a intención de comezar unha entidade, escriba o & como &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Non está permitido o espace no peche dunha etiqueta" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Pechouse o elemento «%s», mais non había ningún elemento aberto" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Pechouse o elemento «%s», mais o elemento aberto actualmente é «%s»" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Carácter incorrecto «%c» no comezo do valor do atributo" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Carácter incorrecto «%c» na fin do valor do atributo, agardábase «%c»" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "O documento remata de xeito non agardado" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "O documento estaba baleiro ou só contiña espazos en branco" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: erro de datos XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalizar" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Ficheiros executábeis" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Seleccione un aplicativo para abrir os ficheiros «%s»" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Aplicativos instalados" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Cargando..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Amosar a árbore de directorios na barra lateral" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Cancelar" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "C_opiar aquí" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Mover para aquí" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Ligar para aquí" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Produciuse un fallo en XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Abrir" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Abrir _con..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Abrir _con" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copiar a(s) _ruta(s)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "A_gochar" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "A_mosar" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Eng_adir a Marcadores" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Renomear…" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mprimir..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Extraer a_quí" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtraer a..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propi_edades" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Mover á _dereita" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Os marcadores xa teñen un marcador para este cartafol." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Ficheiros de imaxe" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "analizando... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Escriba un nome de usuario ou un ID numérico correcto." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Escriba un nome de grupo ou un ID numérico correcto." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Desexa aplicar recursivamente estes cambios a todos os ficheiros e " "subcartafoles?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Agachar ou amosar o ficheiro" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Este ficheiro está agachado por comezar o seu nome cun punto («.»)" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Os ficheiros neste sistema están agachados por comezar o seu nome cun punto " "(«.»). Prema para amosar os ficheiros agachados." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "analizando…" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Acceso ao contido:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Ficheiros de tipos diferentes" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Ficheiro:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Múltiplos ficheiros" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nome" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descrición" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Tamaño" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permisos" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Propietario" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificado" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Localización" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extensión" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Crear _novo..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Cartafol" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Ficheiro baleiro" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverter a selección" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Ordenar ficheiros" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Renomear o cartafol..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propi_edades do cartafol" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "A_mosar agachados" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Mesturar _ficheiros e cartafoles" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorar as maiúsculas no nome" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Polo _nome" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Pola data de _modificación" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Polo ta_maño" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Polo _tipo" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Escriba un nome para o nova cartafol creado:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Creando un novo cartafol" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Escriba un nome para o ficheiro baleiro:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Creando ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Novo" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Escriba un nome para o novo %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Creando %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "E_xecutar o aplicativo predeterminado do ficheiro após a súa creación" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Este ficheiro de texto «%s» semella ser un script executábel.\n" "Que desexa facer con el?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Este ficheiro «%s» é executábel. Desexa executalo?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Non especificou ningún cartafol." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Seleccione un cartafol" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Erro" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmar" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pregunta" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Só o administrador ten o permiso para facer isto." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Quere mover o ficheiro «%s» ao cesto do lixo?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Quere mover %d ficheiro seleccionado ao cesto do lixo?" msgstr[1] "Quere mover os %d ficheiros seleccionados ao cesto do lixo?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Quere eliminar o ficheiro «%s»?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Quere eliminar %d ficheiro seleccionado?" msgstr[1] "Quere eliminar os %d ficheiros seleccionados?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Renomear ficheiro" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Introduza un nome novo:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Está seguro que desexa baleirar o cesto do lixo?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Pe_gar e ir" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barra de localización do cartafol" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Cartafol persoal" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Escritorio" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplicativos" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Sistema de ficheiros raíz" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montar volume" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Desmontar volume" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Expulsar medio extraíbel" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatar volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Renomear elemento marcador" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Retirar dos _marcadores" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Mover o marcador cara _arriba" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Mover o marcador cara a_baixo" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Baleirar o cesto do lixo" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Amosa a lista de lugares comúns, dispositivos e marcadores na barra lateral" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Renomear elemento marcador" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Escriba un nome novo:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Tamaño: %s\n" "Modificado: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Modificado: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" "Producíronse algúns erros antes de que se detivera a operación do " "ficheiro." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Cancelado" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "A operación do ficheiro completouse sen erros." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Finalizado" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Algúns ficheiros non poden enviarse ao cesto do lixo porque o subsistema de " "ficheiros non permite esta operación.\n" "Desexa eliminalos no seu canto?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausa" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Retomar" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Movendo" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Copiando" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Enviando ao lixo" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Eliminando" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Creando unha ligazón" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "En:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Creando ligazóns aos ficheiros" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Cambiando os atributos de" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Cambiando os atributos dos ficheiros" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Restaurando" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s ficheiros" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Operación do ficheiro en proceso..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s ficheiro:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s ficheiros:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "A_pagar" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Lugares" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Árbore de cartafoles" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remoto" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Lugares" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Árbore de directorios" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Ver o contido do cartafol" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Agachar %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Mover á esquerda" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Mover á _dereita" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Amosar %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Esquecer o largo" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Vista de _iconas" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Vista _compacta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Vista de _miniaturas" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Vista de _lista detallada" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Cambia a lapela activa" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "O directorio especificado «%s» non é correcto" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Non é posíbel acceder ao ficheiro de destino" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Non é posíbel crear unha ligazón nun sistema de ficheiros non nativo" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Non é posíbel restaurar o ficheiro «%s»: non se coñece a ruta orixinal" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Non existe o destino" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "A orixe e o destino son o mesmo." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Nón é posíbel mover un cartafol cara o seu subcartafol" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Nón é posíbel copiar un cartafol dentro dun seu subcartafol" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "O destino é un subcartafol da orixe" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Non é posíbel copiar o ficheiro «%s»: non admitido" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "A asignación do nome a amosar pódese facer para só un único ficheiro" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "A asignación do destino pódese facer para só un único ficheiro" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Produciuse un erro no ficheiro XML «%s» (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "O ficheiro XML non conten a raíz dos aplicativos" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Non é posíbel crear a definición XML para «%s»" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "A ruta ao menú «%s» xa existe" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Produciuse un erro na caché do menú" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Directorio de menú incorrecto" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "O nome do elemento de menú non pode estar baleiro" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Directorio de menú «%s» incorrecto" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Elemento de menú incorrecto" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "O elemento de menú «%s» non ten un fecheiro de entrada axeitado" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Cambiar o estado agachado non é compatíbel co directorio do menú" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Non se permite estabelecer o atributo «%s»" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Valor incorrecto para o atributo «%s»" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "O «%s» é un directorio de menú" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "O «%s» é un elemento de menú" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "O ficheiro de entrada «%s» está estragado" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Non é posíbel crear o elemento de menú «%s»" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "O nome do directorio do menú non pode rematar con «.desktop»" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Operación incorrecta coa raíz do menú" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Destino incorrecto" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: non se atopa o cartafol «%s» na caché do menú" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Buscar" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Resultados da busca" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Escolla un ficheiro executábel" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "O_rde:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Orde que executar cando se activa a icona do aplicativo" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escrición:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Nome xenérico do aplicativo" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Directorio de _traballo:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "O directorio de traballo no que executar o programa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Xanela emerxente:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Xanela emerxente para amosar o aplicativo" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Usar notificación de inicio" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Entrada de _escritorio" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaurar" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaura os ficheiros do cesto lixo cara a súa localización orixinal" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nome do ficheiro orixe ou ID do escritorio" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ORIXE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nome do ficheiro resultante" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTANTE" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "RESULTANTE" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disco CD-ROM baleiro" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disco CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disco CD-R baleiro" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disco CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disco CD-RW baleiro" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disco DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disco DVD-ROM baleiro" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disco DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disco DVD-RW baleiro" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disco DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disco DVD-RAM baleiro" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disco DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disco DVD+R baleiro" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disco DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disco DVD+RW baleiro" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disco DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Disco DVD+R DL baleiro" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disco DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Disco DVD+RW DL baleiro" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disco Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disco Blu-Ray baleiro" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disco Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disco Blu-Ray R baleiro" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW baleiro" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disco HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disco HD DVD baleiro" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disco HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Disco HD DVD-R baleiro" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disco HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Disco HD DVD-RW baleiro" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disco MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disco MO baleiro" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disco MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disco MRW baleiro" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disco MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disco MRW/W baleiro" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Ficheiros de _son" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disco óptico baleiro" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disco óptico" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Persistente" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Estabelecer o UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Só o propietario" #~ msgid "Symlinking" #~ msgstr "Facendo a ligazón simbólica" #~ msgid "*" #~ msgstr "*" #~ msgctxt "It is a directory access bit - " #~ msgid "Sticky" #~ msgstr "Persistente" #~ msgctxt "this is a file access mode bit, also known as " #~ msgid "Set UID" #~ msgstr "Estabelecer o UID" #~ msgid "Processing:" #~ msgstr "Procesando:" #~ msgid "Progress:" #~ msgstr "Progreso:" #~ msgid "Some errors occurred:" #~ msgstr "Producíronse algúns erros:" #~ msgid "Re_move from Bookmark" #~ msgstr "_Re_irar dos marcadores" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "A operación de ficheiro foi cancelada e producíronse algúns erros." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "A operación de ficheiro rematou, mais hai algúns erros." #~ msgid "Moving Files" #~ msgstr "Movendo ficheiros" #~ msgid "Copying Files" #~ msgstr "Copiando ficheiros" #~ msgid "Trashing Files" #~ msgstr "Movendo os ficheiros ao lixo" #~ msgid "Deleting Files" #~ msgstr "Eliminando ficheiros" #~ msgid "Creating Symlinks" #~ msgstr "Creando ligazóns simbólicas" #~ msgid "Changing File Attributes" #~ msgstr "Cambiando os atributos do ficheiro" #~ msgid "_Rename Folder" #~ msgstr "_Renomear o cartafol" #~ msgid "File type to be opened:" #~ msgstr "Tipo de ficheiro que se abrirá:" #~ msgid "_Installed Application" #~ msgstr "Aplicativo _instalado" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "" #~ "E_stabelecer como predeterminado o aplicativo seleccionado para abrir os " #~ "ficheiros deste tipo" #~ msgid "_Browse" #~ msgstr "_Examinar" #~ msgid "My Computer" #~ msgstr "O meu computador" #~ msgid "_Move" #~ msgstr "_Mover" #~ msgid "_Trash" #~ msgstr "_Lixo" #~ msgid "_Only for this folder" #~ msgstr "_Só para este cartafol" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Marcar para lembrar o axuste de ordenación do cartafol no canto do global" #~ msgid "Please select a folder" #~ msgstr "Seleccione un cartafol" #~ msgid "Entry for folder path" #~ msgstr "Entrada pola ruta do cartafol" #~ msgid "Computer" #~ msgstr "Computador" #~ msgid "Network Drives" #~ msgstr "Controladores de rede" #~ msgid "_Run in terminal emulator" #~ msgstr "E_xecutar no emulador de terminal" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Manter aberta a xanela do terminal despois da execución" #~ msgid "Shortcuts" #~ msgstr "Atallos" #~ msgid "Mount Point" #~ msgstr "Punto de montaxe" #~ msgid "Create _Symlink" #~ msgstr "Crear ligazón _simbólica" #~ msgid "Se_nd To" #~ msgstr "E_nviar a" #~ msgid "Empty tag" #~ msgstr "A etiqueta está baleira" #~ msgid "Tag should have exactly one child" #~ msgstr "A etiquera debe ter exactamente un fillo" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "A etiqueta só pode conter o fillo , , ou " #~ "" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "A mistura de ficheiros só pode conter a etiqueta de nivel superior " #~ ", ten <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "" #~ "Non foi posíbel inserir a etiqueta <%s> desde a mistura de ficheiros" #~ msgid "Invalid tag" #~ msgstr "Etiqueta incorrecta" #~ msgid "Invalid tag" #~ msgstr "Etiqueta incorrecta" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Non é posíbel atopar a ruta %s nas definicións XML" #~ msgid "Category manipulation internal error" #~ msgstr "Produciuse un erro interno de manipulación de categoría" #~ msgid "Blank File" #~ msgstr "Ficheiro baleiro" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Erro, lxshortcut non está instalado" #~ msgid "Failed to start lxshortcut" #~ msgstr "Non foi posíbel iniciar lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupo:" #~ msgid "Rename" #~ msgstr "Renomear" #~ msgid "Make the file executable" #~ msgstr "Facer que o ficheiro sexa executábel" #~ msgid "Operations that all other users can do" #~ msgstr "Operacións permitidas ao resto dos usuarios" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operacións permitidas ao propietario do ficheiro" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operacións permitidas aos usuarios do mesmo grupo que o propietario do " #~ "ficheiro" #~ msgid "Read and Write" #~ msgstr "Lectura e escritura" #~ msgid "Read only" #~ msgstr "Só lectura" #~ msgid "Write only" #~ msgstr "Só escritura" libfm-1.4.0/po/he.po000066400000000000000000001515121475513661000141740ustar00rootroot00000000000000# Hebrew translations for libfm package. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-07-07 21:18+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\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-Generator: Pootle 2.8\n" "X-Poedit-SourceCharset: utf-8\n" "X-POOTLE-MTIME: 1530998293.843337\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "יישומים מועדפים" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "בחירת יישומים שיפעלו עקב לחיצה על קישור לאתר או לכתובת דוא״ל" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "עורך קיצורי הדרך" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "יצירה או שינוי של רשומת שולחן עבודה" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "בחירת יישום" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "שימוש ביישום הנבחר לפתיחת קבצים" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "יישומים מו_תקנים" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_פקודה להפעלה:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_עיון…" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "ה_פעלה בהדמיית מסוף" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "להשאיר את חלון המ_סוף פתוח לאחר הפעלת הפקודה" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "ניתן להשתמש בקודים מיוחדים אלה בשורת הפקודה:\n" " %f: לייצוג שם קובץ בודד\n" " %F: לייצוג מספר שמות קבצים\n" " %u: לייצוג כתובת אחידה לקובץ\n" " %U: לייצוג מספר כתובות אחידות" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_שם היישום (רשות, כדאי להגדיר כדי לשמור על שיוך)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "הפעלת שורת פקודה מותאמת אישית לפתיחת קבצים" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_פקודה מותאמת אישית" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "ה_גדרת היישום הנבחר כמפעיל בררת המחדל לסוג קובץ זה" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "אישור החלפת קבצים" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_דילוג" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_שינוי שם" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_שכתוב" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "ישנו כבר קובץ באותו השם במיקום זה.\n" "\n" "האם להחליף את הקובץ הקיים" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "בקבצים הבאים?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "שם ה_קובץ:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "לה_חיל אפשרות זו על כל הקבצים הקיימים" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "בחירת סמל…" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "ערכת סמלי המערכת" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "קובצי תמונה" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "בחירה בסמל מהמיקום:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "הפעלת קובץ" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "הפעלה במ_סוף" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "מאפייני הקובץ" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "סמל הקובץ בתצוגת תיקייה" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_שם:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "מיקום:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "קובץ יעד:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "סוג הקובץ:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "פתיחה _באמצעות:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "יש לבחור את היישום המשמש לפתיחת קבצים מסוג זה " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "סך כמות הקבצים:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "סך גודל הקבצים:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "גודל על הכונן:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "שינוי אחרון:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "גישה אחרונה:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "שינוי ההרשאות האחרון:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_כללי" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_בעלים:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_קבוצה:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_צפייה בתוכן" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_שינוי התוכן:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "ה_פעלה:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "סיביות מיוחדות:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "מי רשאי לקרוא את תוכן הקובץ/תיקייה" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "מי רשאי לשנות את תוכן הקובץ/תיקייה" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "מי רשאי להפעיל את הקובץ או להיכנס לתיקייה" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "דגלונים מיוחדים להפעלת קבצים" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "דגלונים מיוחדים לגישה לתיקיות" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "בקרת גישה" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "קובץ מוסתר" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "ה_רשאות" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "ללא" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "דביק" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "הגדרת GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "דביק והגדרת GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "הגדרת UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "הגדרת UID ו־GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "רק הבעלים" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "רק הבעלים וקבוצה" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "כולם" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "אף אחד" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "בתים" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "ק״ב" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "מ״ב" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ג״ב" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "נא לבחור בתאריך" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "נא לבחור תאריך מלוח השנה שלהלן" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "חיפוש קבצים" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "_תבניות שם קובץ:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "התבנית יכולה להיות רשימת תבניות מעטפת תואמת POSIX (תוך שימוש ב־',' כתו " "הפרדה) או ביטוי רגולרי תואם POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "ללא תלות ב_רישיות" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_שימוש בביטוי רגולרי" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "מקומות לחיפוש:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "חיפוש בתיקיות ש_כפופות לזאת" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "חיפוש קבצים _נסתרים" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "שם/מי_קום" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "סוג הקובץ" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "יש לחפש קבצים אך ורק מהסוגים הבאים:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "קובצי _טקסט" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "קובצי _תמונה" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "קובצי _שמע" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "קובצי וי_דאו" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "מ_סמכים" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_תיקיות" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_אחר:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "סוג _קובץ" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "הקובץ מ_כיל:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_תוכן" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "גודל הקובץ" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_קטן מ־:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_גדול מ־:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "מועד השינוי האחרון" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(אין)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_לפני:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_אחרי:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "מא_פיינים" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "דפדפן אינטרנט" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "דפדפן האינטרנט המועדף ישמש לפתיחת קישורים." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "לקוח דוא״ל" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "לקוח הדוא״ל המועדף ישמש לכתיבת הודעות דוא״ל חדשות בעת לחיצה על כתובת דוא״ל." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "הדמיית מסוף" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "שורת הפקודה:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "יישומי המערכת" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "שיוכי קבצים" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "אל:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "בהכנות..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "קובץ יעד:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "הזמן שנותר:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "אירעו שגיאות:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "ערך ריק" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "בחירה שגויה" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "הפעולה לא נתמכת" #: ../src/base/fm-file-launcher.c:88 #, fuzzy, c-format msgid "Invalid desktop entry file: '%s'" msgstr "שם הקובץ שגוי %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "לא הוגדר יישום בררת מחדל עבור סוג ה־MIME‏ %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "התקנים" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "רשת" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "פח אשפה" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "קיצור דרך" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "לא הוגדרה הדמיית מסוף בתצורה של libfm" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "תיקיית התפריט שגויה" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "ק״ב" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ט״ב" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "בית אחד" msgstr[1] "%u בתים" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "טיפול כפול בתגית <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "הניתוח של '%-.*s', שאמורה הייתה להיות ספרה בתוך הפניית תו (ê למשל), " "נכשלה - יתכן שהספרה גדולה מדי" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "ההפנייה לתו לא הסתיימה בנקודה פסיק; רוב הסיכויים שהשתמשת בתו אמפרסנד מבלי " "להתכוון להתחיל יישות - ניתן לסלק אמפרסנד בתור ‎&‎" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "ההפנייה לתו '%-.*s' אינה מקודדת תו מאושר" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "התגלה היישות הריקה '&;'; יישויות תקניות אמורות להיות: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "שם היישות '%-.*s' אינו ידוע" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "היישות אינה מסתיימת בנקודה פסיק; רוב הסיכויים שהשתמשת בתו אמפרסנד מבלי " "להתכוון להתחיל יישות - ניתן לסלק אמפרסנד בתור ‎&‎" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "אסור להשתמש ברווח בתגית הסגירה" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "הרכיב '%s' נסגר אך לא נפתח אף רכיב" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "הרכיב '%s' נסגר אך הרכיב הפתוח הנוכחי הוא '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "תו שגוי '%c' בתחילת ערך המאפיין" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "תו שגוי '%c' בתחילת ערך המאפיין, אמור היה להיות '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "המסמך הסתיים בפתאומיות" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "המסמך היה ריק או שהכיל רק רווח" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: שגיאת נתוני XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "התאמה אישית" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "קובץ הפעלה" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "נא לבחור ביישום לפתיחת קבצים מסוג \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "יישומים מותקנים" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<אין תיקיות משנה>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "בטעינה..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "הצגת עץ תיקיות בסרגל הצד" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_ביטול" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "לה_עתיק לכאן" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "להע_ביר לכאן" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "ל_קשר לכאן" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave כשלה." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_פתיחה" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "פתיחה _באמצעות..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "פתיחה _באמצעות" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "ה_סתרה" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "ה_צגה" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "הוס_פה לסימניות" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_שינוי שם..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_דחיסה..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "חילוץ ל_כאן" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_חילוץ אל..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "מ_אפיינים" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "העברה ל_אשפה" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "בין הסימניות שלך כבר קיימת סימנייה לתיקייה זו." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "קובצי תמונה" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "בית" msgstr[1] "בתים" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "בסריקה... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "נא להזין שם משתמש תקני או מזהה מספרי." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "יש להזין שם קבוצה תקני או מזהה מספרי." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "האם להחל שינוים אלה על כל הקבצים ותת־התיקיות באופן נסוג?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "הסתרה או הצגה של הקובץ" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "קובץ זה מוסתר כיוון ששמו מתחיל בנקודה ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "בסריקה..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_גישה לתוכן" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "קבצים מסוגים שונים" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "קובץ:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "מספר קבצים" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "שם" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "תיאור" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "גודל" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "הרשאות" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "הבעלים" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "מועד השינוי" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "מיקום" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "סיומת" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "יצירת _חדש..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "תיקייה" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "קובץ ריק" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "הי_פוך הבחירה" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_סידור הקבצים" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "שינוי _שם תיקייה..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "מ_אפייני התיקייה" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "הצגת מו_סתרים" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "_ערבוב בין קבצים ותיקיות" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "התעלמות מ_שינויי אותיות רישיות בשם" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "לפי שם" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "לפי מועד ה_שינוי" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "לפי _גודל" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "לפי סוג ה_קובץ" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "נא להזין שם עבור התיקייה החדשה:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "יצירת תיקייה חדשה" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "נא להזין שם עבור הקובץ הריק:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "נוצר …" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "חדש" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "נא להזין שם עבור ה־%s החדש:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s נוצר" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "הפעלת תכנית _בררת המחדל על הקובץ לאחר יצירתו" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "מסתבר כי קובץ הטקסט '%s' הוא סקריפט הפעלה.\n" "מה ברצונך לעשות אתו?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "הקובץ '%s' ניתן להפעלה. האם ברצונך לפהעיל אותו?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "לא צוינו תיקיות." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "נא לבחור בתיקייה" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "שגיאה" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "אישור" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "שאלה" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "רק למנהל המערכת ישנן ההרשאות לעשות זאת." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "האם להעביר את הקובץ '%s' לסל האשפה?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "האם להעביר את הקובץ הנבחר אל סל האשפה?" msgstr[1] "האם להעביר את %d הקבצים הנבחרים אל סל האשפה?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "האם למחוק את הקובץ '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "האם למחוק את הקובץ (%d) הנבחר?" msgstr[1] "האם למחוק את %d הקבצים הנבחרים?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "שינוי שם קובץ" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "נא להזין שם חדש:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "האם לפנות את סל האשפה?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "לה_דביק ולהמשיך" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "סרגל מיקום תיקיות" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "תיקיית הבית" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "שולחן עבודה" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "יישומים" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "שורש מערכת הקבצים" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_עיגון כרך" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_ניתוק כרך" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_שליפת מדיה נתיקה" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "_עיגון כרך" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_שינוי שם לפריט סימנייה" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "ה_סרה מהסימניות" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "העברת הסימנייה למ_עלה" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "העברת הסימנייה למ_טה" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_פינוי האשפה" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "הצגת רשימה של מקומות, התקנים וסימניות נפוצים בסרגל הצד" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "שינוי שם לפריט סימנייה" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "הזנת שם חדש:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "סוג: %s\n" "גודל: %s\n" "השתנה: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "סוג: %s\n" "השתנה: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "פעולת הקבצים הושלמה וישנן כמה שגיאות." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "בוטלה" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "פעולת הקבצים הושלמה וישנן כמה שגיאות." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "הסתיימה" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "לא ניתן להעביר כמה מן הקבצים אל האשפה כיוון שמערכות הקבצים המארחות אותם אינן " "תומכות בפעולה זו.\n" "האם למחוק אותם במקום?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "ה_שהייה" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "ה_משך" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "קבצים מועברים" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "קבצים מועתקים" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "קבצים מועברים לאשפה" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "קבצים נמחקים" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "נוצר קישור סימבולי" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "אל:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "נוצרים קישורים לקבצים" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "שינוי תכונות הקובץ" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "שינוי תכונות הקובץ" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_שחזור" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "קבצים %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "מתבצעות פעולות על הקבצים..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "קובץ %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "קבצים %s:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "ל_כבות" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_מיקומים" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_עץ התיקיות" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "מ_רוחק" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "מיקומים" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "עץ התיקיות" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "הצגת תכני התיקייה" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "ה_סתרת %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "העברה _שמאלה" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "העברה ימי_נה" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "הצגת %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "מחיקת ה_גדרות הרוחב" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "תצוגת _סמלים" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "תצוגה _קומפקטית" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "תצוגת _דוגמיות" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "תצוגת _רשימה מפורטת" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "החלפת התו הפעיל" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "התיקייה שצוינה '%s' אינה תקנית" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "לא ניתן לגשת לקובץ היעד" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "לא ניתן ליצור קישור על מערכת קבצים שאינה טבעית" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "לא ניתן לשלות את הקובץ '%s' מהאשפה: הנתיב המקורי לא ידוע" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "היעד לא קיים" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "המקור והיעד זהים." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "לא ניתן להעביר תיקייה אל אחת מתת־התיקיות שלה" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "לא ניתן להעתיק תיקייה אל אחת מתת־התיקיות שלה" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "היעד היא תת־תיקייה של המקור" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "לא ניתן להעתיק את הקובץ '%s': אין תמיכה" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "ניתן להגדיר שם תצוגה עבור קובץ יחיד בלבד" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "ניתן להגדיר יעד עבור קובץ יחיד בלבד" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "קובץ ה־XML אינו מכיל את שורש היישומים" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "לא ניתן ליצור הגדרת XML עבור '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "נתיב התפריט '%s' כבר קיים" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "שגיאת מטמון תפריט" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "תיקיית התפריט שגויה" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "שם הפריט בתפריט לא יכול להישאר ריק" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "תיקיית התפריט '%s' שגויה" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "פריט שגוי בתפריט" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "לפריט התפריט '%s' אין קובץ רשומה מתאים" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "החלפת מצב ההסתרה אינו נתמך בתיקיית תפריט" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "הגדרת התכונה '%s' לא נתמכת" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "שם הקובץ שגוי %s" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' היא תיקיית תפריט" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' אינו פריט בתפריט" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "לא ניתן ליצור את פריט התפריט '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "שם תיקיית התפריט אמור להסתיים ב־„‎.desktop“" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "פעולה שגויה בשורש התפריטים" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "יעד שגוי" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: לא ניתן למצוא את התיקייה'%s' במטמון התפריט" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "חיפוש" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "תוצאות חיפוש" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "בחירת קובץ הפעלה" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_פקודה:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "פקודה להפעלה כאשר סמל היישום מופעל" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_תיאור:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "שם כללי של היישום" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "תיקיית ה_פעילות:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "תיקיית הפעילות של התכנית" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "חלונית _עצה:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "חלונית עצה להצגה ביישום" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "שימוש בהת_רעה עם ההפעלה" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_רשומת שולחן עבודה" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_שחזור" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "שחזור קבצים שנשלחו לאשפה לתיקיותיהם המקוריות" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "תקליטור CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "תקליטור CD-ROM ריק" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "תקליטור CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "תקליטור CD-R ריק" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "תקליטור CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "תקליטור CD-RW ריק" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "תקליטור DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "תקליטור DVD-ROM ריק" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "תקליטור DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "תקליטור DVD-RW ריק" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "תקליטור DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "תקליטור DVD-RAM ריק" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "תקליטור DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "תקליטור DVD+R ריק" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "תקליטור DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "תקליטור DVD+RW ריק" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "תקליטור DVD+R דו־שכבתי" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "תקליטור DVD+R דו־שכבתי ריק" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "תקליטור DVD+RW דו־שכבתי" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "תקליטור DVD+RW דו־שכבתי ריק" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "תקליטור Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "תקליטור Blu-Ray ריק" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "תקליטור Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "תקליטור Blu-Ray R ריק" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "תקליטור Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "תקליטור Blu-Ray RW ריק" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "תקליטור HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "תקליטור HD DVD ריק" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "תקליטור HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "תקליטור HD DVD-R ריק" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "תקליטור HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "תקליטור HD DVD-RW ריק" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "תקליטור MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "תקליטור MO ריק" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "תקליטור MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "תקליטור MRW ריק" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "תקליטור MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "תקליטור MRW/W ריק" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "קובצי _שמע" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "תקליטור אופטי ריק" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "תקליטור אופטי" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "סוג הקובץ לפתיחה:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "מעבד:" #~ msgid "Progress:" #~ msgstr "תהליך:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "פעולת הקבצים הסתיימה, אך ישנן כמה שגיאות." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "נוצר קישור סימבולי" #~ msgid "_Browse" #~ msgstr "_עיון" #~ msgid "My Computer" #~ msgstr "המחשב שלי" #~ msgid "_Only for this folder" #~ msgstr "_רק עבור תיקייה זו" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "יש לסמן כדי לשמור את אופן סידור התיקייה בשונה מההגדרות הכלליות" #~ msgid "Please select a folder" #~ msgstr "נא לבחור בתיקייה" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_רק עבור תיקייה זו" #, fuzzy #~ msgid "Computer" #~ msgstr "המחשב שלי" #, fuzzy #~ msgid "Network Drives" #~ msgstr "רשת" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "ה_פעלה בהדמיית מסוף" #~ msgid "Shortcuts" #~ msgstr "קיצורי דרך" #~ msgid "Mount Point" #~ msgstr "נקודת עגינה" #~ msgid "Create _Symlink" #~ msgstr "יצירת קישור _סימבולי" #~ msgid "Se_nd To" #~ msgstr "שליחה _אל" #~ msgid "Blank File" #~ msgstr "קובץ ריק" #~ msgid "Error, lxshortcut not installed" #~ msgstr "שגיאה, lxshortcut אינו מותקן" #~ msgid "Failed to start lxshortcut" #~ msgstr "הפעלת lxshortcut נכשלה" #~ msgid "_Group:" #~ msgstr "_קבוצה:" #~ msgid "Rename" #~ msgstr "שינוי שם" #~ msgid "Make the file executable" #~ msgstr "הפיכת הקובץ לניתן להפעלה" #~ msgid "Operations that all other users can do" #~ msgstr "פעולות אותן יכולים לבצע כלל המשתמשים" #~ msgid "Operations that the owner of the file can do" #~ msgstr "פעולות אותן יכולים לבצע רק הבעלים של הקובץ" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "פעולות שמשתמשים מאותה הקבוצה כמו הבעלים של הקובץ יכולים לבצע על הקובץ" #~ msgid "Read and Write" #~ msgstr "קריאה וכתיבה" #~ msgid "Read only" #~ msgstr "קריאה בלבד" #~ msgid "Write only" #~ msgstr "כתיבה בלבד" #~ msgid "The selection mode" #~ msgstr "נא לבחור בתיקייה" libfm-1.4.0/po/hr.po000066400000000000000000001364001475513661000142100ustar00rootroot00000000000000# Croatian translation for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as thelibfm package. # Ivica Kolić, 2010. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-05-17 05:24+0000\n" "Last-Translator: Ivica Kolić \n" "Language-Team: LANGUAGE \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1526534652.763632\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Željeni programi" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Odabrite programe koji će biti pozvani klikom na poveznicu ili e-mail adresu" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Uređivač prečaca" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Napravite novi ili promjenite postojeći unos radne površine" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Odaberite program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Koristi odabrani program za otvaranje datoteka" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Instalirani programi" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "N_aredbeni redak za izvršiti:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Pregledaj..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Izvršite u emulatoru terminala" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Zadrži prozor terminala otvorenim nakon izvršenja naredbe" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Ovi posebni kodovi mogu biti korišteni u naredbenom retku:\n" " %f: predstavljaju jedno ime datoteke\n" " %F: predstavljaju višestruka imena datoteka\n" " %u: predstavljaju jedan URI datoteke\n" " %U: predstavljaju višestruke URI-je" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Ime programa(neobavezno, postavi da zadrži asocijaciju)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Izvrši prilagođeni naredbeni redak za otvaranje datoteka" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "P_rilagođeni naredbeni redak" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Postavi odabrani program kao zadanu akciju za ovaj tip datoteka" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Potvrdi zamjenu datoteka" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Preskoči" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Preimenuj" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Prepiši" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Datoteka sa istim imenom već se nalazi na ovoj lokaciji.\n" "\n" "Želite li zamijeniti postojeću datoteku" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "sa slijedećom datotekom?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Ime datoteke:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Primjeni ovu opciju na sve postojeće datoteke" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Odaberite ikonu..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "slikovne datoteke" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Odaberi ikonu iz:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Izvrši datoteku" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Izvrši u _terminalu" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Svojstva datoteke" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikona datoteke u pogledu mapa" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Ime:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Lokacija:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Ciljana datoteka" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tip datoteke:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Otvori _pomoću:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Izaberi program koji je otvarao datoteke ovog tipa " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Ukupna veličina datoteka:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Ukupna veličina datoteka:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Veličina na disku:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Zadnja promjena:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Zadnji pristup:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Zadnja promjena dozvola:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Osnovno" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "V_lasnik:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupa:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Pogledaj sadržaj:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "P_romjeni sadržaj:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Izvrši:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Tko može čitati sadržaj datoteke/direktorija" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Tko može promjeniti sadržaj datoteke/direktorija" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Tko može izvršiti datoteku ili ući u direktorij" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Posebne zastave za izvršenje datoteke" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Posebne zatave za pristup direktoriju" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Kontrola pristupa" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skrivena datoteka" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Dozvole" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nijedan" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Ljepljivi" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Postavi GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Ljepljivi & postavi GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Postavi UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Postavi UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Samo vlasnik" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Samo vlasnik i grupa" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Bilo tko" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nitko" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bajti" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Odaberite datum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Odaberite datum iz slijedećeg kalendara" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Traži datoteke" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Uzorci_datotečnih imena:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Osjetljivo na mala i velika slo_va" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Koristi regularni izraz" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Mje_sta za traženje:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Traži u poddirektorijima" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Traži _skrivene datoteke" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Ime/_Lokacija" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tip datoteke" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Traži samo datoteke slijedećih vrsta:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_kstualne datoteke" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Slikovne datoteke" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Audio datoteke" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video datoteke" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenti" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Map_e" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Os_talo:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Vrsta _datoteke" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Datoteka sadrž_i:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "S_adržaj" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Veličina datoteke" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Manje nego:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Veće nego:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Zadnja promjena" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nijedan)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Ranije nego:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "K_asnije nego:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Svojstva" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Web preglednik" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Biti će korišten željeni Web preglednik za otvaranje hiperpoveznica." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Klijent pošte" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Biti će korišten poželjni klijent pošte za pisanje elektroničke pošte kada " "kliknete na E-mail adrese." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulator terminala" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Naredbeni redak:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Programi sustava" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Pridruživanje datoteke" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Za:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Pripremam..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Ciljana datoteka" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Preostalo vrijeme:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Došlo je do greške:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Prazna datoteka" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Neispravan izbor" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operacija nije podržana" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Neispravna datoteka unosa radne površine: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Nijedan zadani program nije postavljen da pokrene URIs %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Ne mogu postaviti radni direktorij na '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "NIje postavljen zadani program za MIME tip %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Uređaji" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Mreža" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Smeće" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "prečac za URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Nijedan emulator terminala nije postavljen u libfm config" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u byte-ovi" msgstr[2] "%u byte-ova" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element '%s' je zatvoren, ali nijedan element nije otvoren" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Element '%s' je zatvoren, ali trenutno otvoreni element je '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokument je neočekivano zatvoren" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument je bio prazan ili je sadržavao samo prazne znakove" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Prilagodi" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Izvršne datoteke" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Odaberite program za otvaranje \"%s\" datoteka" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Instalirani programi" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Učitavam..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Otkaži" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "K_opiraj ovdje" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Pomakni ovdje" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Poveži ovdje" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Otvori" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Otvori _pomoću..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Otvori _pomoću" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "S_akrij" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Dodaj u zabilješke" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Preimenuj..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Ko_mprimiraj..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Raspakiraj _ovdje" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "R_aspakiraj u..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Svoj_stva" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Pomakni u _smeće" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Vaše zabilješke već imaju zabilješku za ovu mapu." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Slikovne datoteke" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "byte-ovi" msgstr[2] "byte-ova" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Unesite valjano korisničko ime ili brojčani id." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Unesite valjano ime grupe ili brojčani id." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Želite li rekurzivno primjeniti ova promjene na sve datoteke i podmape?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Sakrij ili otkrij datoteku" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Datoteka je skrivena jer joj ime započinje sa točkom ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Sadržaj pristupa:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Datoteke različitog tipa" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Tip datoteke:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Višestruke datoteke" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Ime" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Opis" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Veličina" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Dozvole" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Vlasnik" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Izmjenjeno" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Lokacija" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Proširenje" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Napravi _novi..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Mapa" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Prazna datoteka" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Obrnuti odabir" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Posloži datoteke" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Preimenuj mapu..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Svojstva ma_pe" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Pokaži _skrivene" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Po _imenu" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Po _vremenu izmjene" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Po _veličini" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Po tipu _datoteke" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Unesite ime za novostvorenu mapu:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Stvaram novu mapu" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Unesite ime za praznu datoteku:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Stvaram ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Novi" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Unesite ime za novi %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Stvaram %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Ova tekstualna datoteka '%s' je izvršna skripta.\n" "Što želite učiniti s njom?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Ova datoteka '%s' je izvršna. Želite li je izvršiti?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Mape nisu određene." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Odaberite mapu" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Greška" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Potvrdi" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pitanje" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Samo administrator sustava ima dozvole ovo učiniti." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Želite li maknuti datoteku '%s' u smeće?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Želite li maknuti odabranu %d datoteku u smeće?" msgstr[1] "Želite li maknuti odabrane %d datoteke u smeće?" msgstr[2] "Želite li maknuti odabranih %d datoteka u smeće?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Želite li izbrisati datoteku '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Želite li izbrisati odabranu %d datoteku?" msgstr[1] "Želite li izbrisati odabrane %d datoteke?" msgstr[2] "Želite li izbrisati odabranih %d datoteka?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Preimenuj datoteku" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Unesite novo ime:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Jeste li sigurni da želite isprazniti smeće?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Za_lijepi i idi" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Lokacijska traka mape" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Osobna mapa" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Radna površina" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programi" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montiraj disk" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Odmontiraj disk" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Izbaci uklonjivi medij" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatiraj disk" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Preimenuj stavku zabilješke" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Uklo_ni iz zabilješki" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Pomakni bilješku _gore" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Pomakni bilješku _dolje" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Isprazni smeće" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Pokaži listu mjesta, uređaja i zabilješki u bočnom stupcu" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Preimenuj stavku zabilješke" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Unesi novo ime:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tip: %s\n" "Veličina: %s\n" "Izmjenjeno: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tip: %s\n" "Izmjenjeno: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Datotečna operacija je završena s greškama." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Otkazano" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Datotečna operacija je završena s greškama." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Završeno" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Neke datoteke ne mogu biti maknute u smeće jer datotečni sustav ne podržava " "ovu operaciju.\n" "Želite li ih izbrisati?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pauza" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Nastavi" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Pomicanje" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopiranje" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Bacanje datoteka u smeće" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Brisanje" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Stvaranje poveznice" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "U:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Stvaranje poveznica prema datotekama" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Promjena atributa" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Promjena atributa datoteke" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Obnovljam" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s datoteke" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s datoteka:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s datoteke:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Isključeno" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Mjesta" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Stablo direktorija" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Udaljeno" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Mjesta" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Stablo direktorija" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Pogled na sadržaj mape" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Sakrij %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Pomakni lijevo" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Pomakni _desno" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Pokaži %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Prikaz ikona" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Zbijeni pregled" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Pogled sa sličicama" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Pogled _detaljne liste" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Promijeni aktivnu karticu" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Određeni direktorij '%s' nije valjan" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Ne mogu pristupiti odredišnoj datoteci" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Izvor i odredište su isti." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Ne mogu premjestiti mapu u njenu podmapu" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Ne mogu kopirati mapu u njenu podmapu" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Odredište je podmapa izvora" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Ne mogu kopirati datoteku '%s': nije podržano" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Ne mogu napraviti XML definiciju za '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Putanja izbornika '%s' već postoji" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Neispravni direktorij izbornika" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Ime stavke izbornika ne može biti prazno" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Neispravan direktorij izbornika '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Neispravna stavka izbornika" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Postavljanje atributa '%s' nije podržano" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Neispravna vrijednost za atribut '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Ne mogu napraviti stavku izbornika '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Ime direktorija izbornika ne bi trebalo završavati sa \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Neispravno odredište" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Traži" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Rezultati pretraživanja" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Odaberite izvršnu datoteku" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Na_redba:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "O_pis:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Generičko ime programa" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Radni direktorij:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Unos radne površine" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Obnovi" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "IZVOR" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "REZULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM disk" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Prazni CD-ROM disk" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R disk" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Prazni CD-R disk" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW disk" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Prazni CD-RW disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Prazni DVD-ROM disk" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW disk" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Prazni DVD-RW disk" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM disk" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Prazni DVD-RAM disk" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R disk" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Prazni DVD+R disk" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW disk" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Prazni DVD+RW disk" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL disk" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Prazni DVD+R DL disk" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL disk" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Prazni DVD+RW DL disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Prazni Blu-Ray disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Prazni Blu-Ray R disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Prazni Blu-Ray RW disk" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD disk" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Prazni HD DVD disk" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R disk" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Prazni HD DVD-R disk" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW disk" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Prazni HD DVD-RW disk" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO disk" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Prazni MO disk" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW disk" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Prazni MRW disk" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W disk" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Prazni MRW/W disk" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Audio datoteke" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Prazni optički disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optički disk" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Procesiranje:" #~ msgid "Progress:" #~ msgstr "Napredak:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Datotečna operacije je završena, ali ima grešaka." #~ msgid "Creating Symlinks" #~ msgstr "Stvaranje simboličkih poveznica" #~ msgid "_Rename Folder" #~ msgstr "_Preimenuj mapu" #~ msgid "File type to be opened:" #~ msgstr "Tip datoteke koji će biti otvoren:" #~ msgid "_Installed Application" #~ msgstr "_Instalirani program" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "_Postavi odabrani program kao zadanu akciju za ovaj tip datoteka" #~ msgid "_Browse" #~ msgstr "_Pregledaj" #~ msgid "My Computer" #~ msgstr "Moje računalo" #~ msgid "_Move" #~ msgstr "_Pomakni" #~ msgid "_Trash" #~ msgstr "_Smeće" #~ msgid "_Only for this folder" #~ msgstr "_Samo za ovu mapu" #~ msgid "Please select a folder" #~ msgstr "Odaberite mapu" #~ msgid "Entry for folder path" #~ msgstr "Unos za putanju mape" #~ msgid "Computer" #~ msgstr "Računalo" #~ msgid "Network Drives" #~ msgstr "Mrežni pogoni" #~ msgid "_Run in terminal emulator" #~ msgstr "_Izvršite u emulatoru terminala" #~ msgid "Shortcuts" #~ msgstr "Prečaci" #~ msgid "Mount Point" #~ msgstr "Točka montiranja" #~ msgid "Create _Symlink" #~ msgstr "Napravi _simboličku poveznicu" #~ msgid "Se_nd To" #~ msgstr "Po_šalji za" #~ msgid "Blank File" #~ msgstr "Prazna datoteka" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Greška, lxshortcut nije instaliran" #~ msgid "Failed to start lxshortcut" #~ msgstr "Neuspjeh u pokretanju lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupa:" #~ msgid "Rename" #~ msgstr "Preimenuj" #~ msgid "Make the file executable" #~ msgstr "Učini datoteku izvršnom" #~ msgid "Operations that all other users can do" #~ msgstr "Operacije koje mogu vršiti svi korisnici" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operacije koje može vršiti vlasnik datoteke" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Operacije koje korisnici u istoj grupi sa vlasnikom mogu vršiti" #~ msgid "Read and Write" #~ msgstr "Čitaj i piši" #~ msgid "Read only" #~ msgstr "Samo čitaj" #~ msgid "Write only" #~ msgstr "Samo piši" libfm-1.4.0/po/hu.po000066400000000000000000001356631475513661000142250ustar00rootroot00000000000000# Hungarian translation of libfm. # Copyright (C) 2010-2011 The LXDE Team # This file is distributed under the same license as the libfm package. # Laszlo Dvornik , 2010-2011. # SZERVÁC Attila , 2013 # msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-05-05 17:48+0000\n" "Last-Translator: Balázs Úr \n" "Language-Team: \n" "Language: hu\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1430848111.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Alapértelmezett alkalmazások" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Parancsikon szerkesztő" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Új asztalbejegyzés létrehozása vagy meglévő módosítása" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Alkalmazás kiválasztása" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Kiválasztott alkalmazás használata a fájlok megnyitásához" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Telepített alkalmazások" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Parancssor a futtatáshoz:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Tallózás…" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Végrehajtás terminál emulátorban" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Terminálablak _nyitva hagyása parancsvégrehajtás után" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Ezek a speciális kódok használhatóak a parancsoknál:\n" " %f: Egy fájl nevét jelöli\n" " %F: Több fájl nevét jelöli\n" " %u: A fájlt egy URI-ját jelöli\n" " %U: Több URI-t jelöl" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "_Alkalmazásnév (opcionális, állítsa be a társítás megtartásához)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Egyéni parancs végrehajtása a fájlok megnyitásához" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Egyéni parancssor" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "A kijelölt alkalmazás _beállítása alapértelmezett műveletként ennél a " "fájltípusnál" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Fájlcsere megerősítése" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Kihagyás" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Át_nevezés" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Felülírás" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Már van egy azonos nevű fájl ezen a helyen.\n" "\n" "Felülírod a létező fájlt" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "a következő fájllal?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Fájlnév:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Beállítás _alkalmazása minden létező fájlra" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Válasszon egy ikont…" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "rendszer ikontéma" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "képfájlok" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Ikon választása innen:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Fájl futtatása" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Futtatás _terminálban" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Fájl tulajdonságai" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "A fájl ikonja mappanézetben" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Név:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Hely:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Célfájl:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Fájltípus:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Megnyitás e_zzel:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Válassza ki az ilyen típus fájlok megnyitásához használt alkalmazást " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Fájlok teljes száma:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Fájlok teljes mérete:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Méret a lemezen:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Utolsó módosítás:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Utolsó hozzáférés:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Utolsó jogosultság módosítás:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "Á_ltalános" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Tulajdonos:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Csoport:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Tartalom _megtekintése:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Tartalom mó_dosítása:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Végrehajtás:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Különleges részek:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Ki olvashatja a fájl/mappa tartalmát" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Ki módosíthatja a fájl/mappa tartalmát" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Ki futtathatja a fájlt vagy nyithatja meg a mappát" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Külön parancsok a fájl futtatásához" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Külön parancsok a mappa eléréséhez" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Hozzáférés-kezelés" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Rejtett fájl" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Jogosultságok" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nincs" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "Ragadós" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "GID beállítása" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Ragadós és GID beállítása" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "UID beállítása" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "UID és GID beállítása" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Csak a tulajdonos" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Csak a tulajdonos és a csoport" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Bárki" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Senki" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bájt" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Dátum kiválasztása" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Válassz dátumot az alábbi naptárból" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Fájlkeresés" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Fájl_név minták:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "A minta lehet POSIX héjminta lista („,” vesszővel elválasztva) vagy POSIX " "reguláris kifejezés." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Kis- és nagybetű ér_zéketlen" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Reguláris kifejezés használata" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Helyek a kereséshez:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Keresés az alkönyvtárakban" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_Rejtett fájlok keresése" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Név/_Hely" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Fájltípus" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Csak a következő típusú fájlokra keresés:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_Szövegfájlok" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Képfájlok" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Hangfájlok" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videófájlok" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumentumok" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Mappák" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Egyéb:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Fájl_típus" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Fájl _tartalmazza:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Tartalom" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Fájlméret" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Kisebb mint:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Nagyobb mint:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Utolsó módosítás" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nincs)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "K_orábbi mint:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Ké_sőbbi mint:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Tulajdonságok" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Webböngésző" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Hiperhivatkozások megnyitásához az alapértelmezett webböngésző lesz " "használva." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Levelezőkliens" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Ha e-mail címre kattintasz, az alapértelmezett levelezőkliens lesz használva " "a levélíráshoz." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminál" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Parancssor:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Rendszeralkalmazások" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Fájltársítások" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Ide:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Előkészítés..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Célfájl:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Hátralévő idő:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Hibák történtek:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Fájl futtatása" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Kijelölés _megfordítása" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "A művelet nem támogatott" #: ../src/base/fm-file-launcher.c:88 #, fuzzy, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Érvénytelen fájlnév: %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Eszközök" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Hálózat" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Kuka" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "parancsikon az URI-hoz" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: érvénytelen argumentum" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "Érvénytelen menü mappa" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bájt" msgstr[1] "%u bájt" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Testreszabás" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "Fájl futtatása" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Válasszon egy alkalmazást a(z) „%s” fájlok megnyitásához" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Telepített alkalmazások" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Betöltés..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Mégse" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave sikertelen." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Megnyitás" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Megnyitás _ezzel..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "Megnyitás _ezzel..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Hozzá_adás a könyvjelzőkhöz" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "Át_nevezés" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Tömörítés…" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Kibontás _ide" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Ki_bontás ide…" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Tulajdonságok" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Áthelyezés a _Kukába" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "Képfájlok" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bájt" msgstr[1] "bájt" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Adj meg egy érvényed felhasználónevet vagy numerikus azonosítót." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Adj meg egy érvényes csoportnevet vagy numerikus azonosítót." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Rekurzívan alkalmazod a módosításokat minden fájlra és almappára?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Betöltés..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Hozzáférés tartalomhoz:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Különböző típusú fájlok" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "Fájltípus:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Több fájl" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Név" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Leírás" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Méret" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Jogosultságok" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Tulajdonos" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Módosítva" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Hely" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "_Új létrehozása..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Mappa" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "Fájl futtatása" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Kijelölés _megfordítása" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Fájlok _rendezése" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Mappa átne_vezése…" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Mappat_ulajdonságok" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_Rejtett mutatása" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "_Név szerint" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "_Módosítás ideje szerint" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "_Méret szerint" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "_Fájltípus szerint" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Adj meg egy nevet az újonnan létrehozott mappához:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Fájl átnevezése" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "Adj meg egy nevet az újonnan létrehozott fájlhoz:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "Létrehozás..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Új" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Adja meg az új %s nevét:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s létrehozása" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "'%s' szöveges fájl futtatható parancsfájlnak tűnik.\n" "Mit szeretnél tenni vele?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "'%s' fájl futtatható. Futtatni szeretnéd?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nincs mappa megadva." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Válassz mappát" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Hiba" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Megerősítés" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Kérdés" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Csak a rendszergazdának van jogosultsága ezt tenni." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Szeretné áthelyezni a(z) „%s” fájlt a lomtárba?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Szeretné áthelyezni a kijelölt %d fájlt a lomtárba?" msgstr[1] "Szeretné áthelyezni a kijelölt %d fájlt a lomtárba?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Szeretné törölni a(z) „%s” fájlt?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Szeretné törölni a kijelölt %d fájlt?" msgstr[1] "Szeretné törölni a kijelölt %d fájlt?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Fájl átnevezése" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Adj meg egy új nevet:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Biztos kiüríted a kukát?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Fájltársítások" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Fájl átnevezése" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Asztal" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Alkalmazások" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Fájlrendszer gyökere" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Kötet _csatolása" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Kötet le_választása" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Cserélhető adathordozó _kiadása" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "Kötet _formázása" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Könyvjelzőelem át_nevezése" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Eltávolítás a könyvjelzőkből" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Könyvjelző mozgatása _fel" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Könyvjelző mozgatása _le" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Kuka ü_rítése" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Könyvjelző elem átnevezése" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Írd be egy új nevet:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Típus: %s\n" "Méret: %s\n" "Módosítva: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Típus: %s\n" "Módosítva: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "A fájlművelet hibákkal fejeződött be." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Megszakítva" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "A fájlművelet hibákkal fejeződött be." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Befejezve" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Néhány fájlt nem lehet áthelyezni a kukába, mivel az alattuk lévő " "fájlrendszer nem támogatja ezt a műveletet.\n" "Törlöd őket inkább?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_Visszaállítás" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Fájlok áthelyezése" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Fájlok másolása" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Fájlok áthelyezése a kukába" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Fájlok törlése" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Szimbolikus hivatkozások létrehozása" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "Ide:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Szimbolikus hivatkozások létrehozása" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Fájljellemzők megváltoztatása" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Fájljellemzők megváltoztatása" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Visszaállítás" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s fájlok" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s fájl:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s fájlok:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Ki" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Helyek" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Könyvtárszerkezet" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Távoli" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Helyek" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Könyvtárfa" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "A megadott „%s” könyvtár érvénytelen" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Nem lehet visszaállítani a(z) „%s” fájlt: az eredeti útvonal nem ismert" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "A forrás és cél egyezik" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Mappa nem mozgatható almappájába" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Mappa nem másolható almappájába" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "A cél a forrás almappája" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "A(z) „%s” fájl nem másolható: nem támogatott" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Menü gyorstár hiba" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Érvénytelen menü mappa" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Érvénytelen menükönyvtár: „%s”" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "Érvénytelen menü mappa" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "A(z) „%s” attribútum beállítása nem támogatott" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "Érvénytelen fájlnév: %s" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "A(z) „%s” egy menükönyvtár" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "A(z) „%s” nem menüelem" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, fuzzy, c-format msgid "Cannot create menu item '%s'" msgstr "Érvénytelen fájlnév: %s" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Keresés" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Fájlkeresés" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Fájl futtatása" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Parancs:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Leírás:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "_Tulajdonos:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Buboréksúgó:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "Válassz alkalmazást" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Asztalbejegyzés" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Visszaállítás" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Kukába áthelyezett fájlok visszaállítása az eredeti útvonalakba" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM lemez" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Üres CD-ROM lemez" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R lemez" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Üres CD-R lemez" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW lemez" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Üres CD-RW lemez" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM lemez" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Üres DVD-ROM lemez" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW lemez" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Üres DVD-RW lemez" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM lemez" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Üres DVD-RAM lemez" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R lemez" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Üres DVD+R lemez" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW lemez" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Üres DVD+RW lemez" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL lemez" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Üres DVD+R DL lemez" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL lemez" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Üres DVD+RW DL lemez" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray lemez" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Üres Blu-Ray lemez" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R lemez" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Üres Blu-Ray R lemez" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW lemez" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Üres Blu-Ray RW lemez" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD lemez" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Üres HD DVD lemez" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R lemez" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Üres HD DVD-R lemez" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW lemez" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Üres HD DVD-RW lemez" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO lemez" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Üres MO lemez" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW lemez" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Üres MRW lemez" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W lemez" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Üres MRW/W lemez" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Hangfájlok" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Üres optikai lemez" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optikai lemez" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Megnyitandó fájltípus:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Feldolgozás:" #~ msgid "Progress:" #~ msgstr "Folyamat:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "A fájlművelet befejeződött, de hibák történtek." #~ msgid "_Browse" #~ msgstr "_Tallózás" #~ msgid "My Computer" #~ msgstr "Számítógép" #~ msgid "_Only for this folder" #~ msgstr "Csak e mappára" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Jelöld be a rendezés megjegyzéséhez e mappához és ne globálisan" #~ msgid "Please select a folder" #~ msgstr "Válassz egy mappát" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "Csak e mappára" #, fuzzy #~ msgid "Computer" #~ msgstr "Számítógép" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Hálózat" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Futtatás terminál emulátorban" #~ msgid "Shortcuts" #~ msgstr "Parancsikonok" #~ msgid "Mount Point" #~ msgstr "Csatolási pont" #~ msgid "Create _Symlink" #~ msgstr "_Szimbolikus hivatkozás létrehozása" #~ msgid "Se_nd To" #~ msgstr "Küldés ide" #~ msgid "Blank File" #~ msgstr "Üres fájl" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Hiba, az lxshortcut nincs telepítve" #~ msgid "Failed to start lxshortcut" #~ msgstr "Az lxshortcut indítása meghiúsult" #~ msgid "_Group:" #~ msgstr "_Csoport:" #~ msgid "Rename" #~ msgstr "Átnevezés" #~ msgid "Make the file executable" #~ msgstr "A fájl futtathatóvá tétele" #~ msgid "Operations that all other users can do" #~ msgstr "Műveletek, amiket minden más felhasználó tehet" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Műveletek, amiket a fájl tulajdonosa tehet" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Műveletek, amiket a fájl tulajdonosával egyező csoportban lévő " #~ "felhasználók tehetnek" #~ msgid "Read and Write" #~ msgstr "Olvasás és írás" #~ msgid "Read only" #~ msgstr "Csak olvasás" #~ msgid "Write only" #~ msgstr "Csak írás" libfm-1.4.0/po/id.po000066400000000000000000001430721475513661000141760ustar00rootroot00000000000000# Indonesian translation of libfm # Copyright (C) 2010 THE libfm'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Andika Triwidada , 2010. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: Indonesian Translation Team \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774900.161716\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Aplikasi Pilihan" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "Pilih aplikasi yang dipanggil saat mengklik taut Web atau alamat surel" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Penyunting Pintasan" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Buat baru atau ubah entri desktop yang ada" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Pilih Aplikasi" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Gunakan aplikasi yang dipilih untuk membuka berkas" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Apl_ikasi Terpasang" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Perintah b_aris yang akan dieksekusi:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "Ram_ban..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Jalankan di _emulator terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Biar_kan jendela terminal tetap terbuka setelah eksekusi perintah" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Kode-kode khusus ini dapat dipakai di baris perintah:\n" " %f: Menyatakan sebuah nama berkas\n" " %F: Menyatakan banyak nama berkas\n" " %u: Menyatakan sebuah URI dari berkas\n" " %U: Menyatakan banyak URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "N_ama aplikasi (opsional, isilah untuk menjaga asosiasi)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Jalankan baris perintah ubahan untuk membuka berkas" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Perintah Baris G_ubahan" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Tata aplika_si yang dipilih sebagai aksi bawaan dari jenis berkas ini" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Konfirmasi Untuk Menggantikan Berkas" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Lewati" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Ganti nama" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Timpa" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Telah ada berkas dengan nama sama di lokasi ini.\n" "\n" "Anda ingin menimpa" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "dengan berkas berikut?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Nama _berkas:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Ter_apkan opsi ini atas semua berkas yang telah ada" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Pilih Suatu Ikon..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "tema ikon sistem" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "berkas gambar" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Pilih ikon dari:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Jalankan Berkas" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Jalankan di _Terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Properti Berkas" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikon dari berkas dalam tilikan folder" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nama:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Lokasi:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Berkas target:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipe berkas:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "B_uka dengan:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Pilih aplikasi yang dipakai untuk membuka berkas jenis ini" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Cacah total berkas:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Ukuran total dari berkas:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Ukuran di disk:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Terakhir diubah:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Terakhir diakses:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Terakhir ijin berubah:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Umum" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Pe_milik:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rup:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Tili_k isi:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Uba_h isi:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Eksekusi:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bit khusus:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Siapa yang dapat membaca isi berkas/direktori" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Siapa yang dapat mengubah isi berkas/direktori" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Siapa yang dapat menjalankan berkas atau memasuki direktori" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Flag khusus bagi eksekusi berkas" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Flag khusus bagi akses direktori" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Kendali Akses" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Berkas tersembunyi" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Hak akses" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Tak ada" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Lengket" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Set GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Lengket & set GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Set UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Set UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Hanya pemilik" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Hanya pemilik dan grup" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Siapapun" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Tak seorangpun" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Byte" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Pilih Tanggal" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Pilih suatu tanggal dari kalender berikut" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Cari Berkas" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Pola _Nama Berkas" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Pola boleh daftar pola shell POSIX (dengan ',' sebagai pemisah) atau " "ekspresi reguler POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "A_baikan besar kecil" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Gunakan ekpresi reg_uler" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "T_empat yang akan Dicari:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Cari dalam _sub direktori" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Cari berkas terse_mbunyi" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nama/_Lokasi" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipe Berkas" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Hanya cari berkas dengan tipe berikut:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Berkas te_ks" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Berkas _gambar" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Berkas _audio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Berkas _video" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumen" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Folde_r" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "L_ainnya:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Sebarang tipe isi yang valid dapat dimasukkan di sini. Wildcard '*' " "diijinkan di akhir tipe. Tipe berganda mesti dipisah dengan ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipe Berkas" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Berka_s Memuat:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Isi" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Ukuran Berkas" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Kurang dari:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Le_bih dari:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Waktu Terakhir Diubah" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nihil)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "S_ebelum:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Setel_ah:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Properti" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Peramban Web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Peramban Web yang disukai akan dipakai untuk membuka hyperlink." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Klien Surat" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Klien Surat yang disukai akan dipakai untuk menyusun surel ketika Anda " "mengklik alamat surel." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulator Terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Baris perintah:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Aplikasi Sistem" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Asosiasi Berkas" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Ke: " #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Mempersiapkan..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Berkas target:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Sisa waktu:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Terjadi beberapa galat:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Berkas Kosong" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Tujuan tak valid" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operasi tak didukung" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Berkas entri desktop tak valid: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Tak bisa menentukan tipe isi dari berkas '%s' untuk meluncurkannya" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Tak ada aplikasi baku yang ditata untuk meluncurkan URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Tak bisa menata direktori kerja ke '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Tak ada aplikasi baku yang diatur bagi tipe MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Perangkat" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Jaringan" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Tong Sampah" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "pintasan ke URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumen tak valid" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Tak ada emulator terminal yang diatur dalam konfig libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Deskripsi tak valid dari aplikasi pembuat gambar mini" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Subpath URI '%s' memuat karakter ter-escape yang tak valid" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Penangan duplikat bagi tag <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Gagal mengurai '%-.*s'. yang seharusnya sebuah digit dalam karakter acuan " "(misalnya ê) - mungkin digitnya terlalu besar" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Acuan karakter tidak diakhiri dengan titik koma; mungkin Anda menggunakan " "karakter ampersand tanpa bermaksud menjadikannya sebagai entitas - silakan " "gunakan & saja" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Acuan karakter '%-.*s' tidak mengenkodekan karakter yang diperbolehkan" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Terlihat entitas '&;' yang kosong; entitas yang valid adalah: & " " "< > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Nama entitas '%-.*s' tak dikenal" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entitas tidak diakhiri dengan titik koma; mungkin Anda menggunakan karakter " "ampersand tanpa bermaksud menjadikannya sebagai entitas - silakan pakai " "& saja" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Spasi tak diijinkan dalam tag tutup" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elemen '%s' ditutup tapi tak ada elemen yang dibuka" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Elemen '%s' ditutup, tapi elemen yang sedang terbuka adalah '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Karakter tak valid '%c' di awal nilai atribut" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Karakter tak valid '%c' di akhir nilai atribut, yang diharapkan '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokumen berakhir tak disangka-sangka" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokumen kosong atau berisi whitespace saja" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: kesalahan data XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Sesuaikan" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Berkas yang dapat dijalankan" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Pilih aplikasi untuk membuka berkas \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Aplikasi Terpasang" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Memuat..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Tunjukkan pohon direktori di bilah sisi" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Batal" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "S_alin Di Sini" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Pindah Ke Sini" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Tautkan Ke Sini" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave gagal." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Buka" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Buka _Dengan..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Buka _Dengan" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Salin Pa_th" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Sembuny_ikan" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Muncu_lkan" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "T_ambah ke Penanda Taut" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Ubah Nama..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Mampatkan..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Ekstrak Di _Sini" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_kstrak Ke..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Prop_erti" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Buang ke _Tong Sampah" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Tanda taut Anda telah ada untuk folder ini." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Berkas gambar" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "memindai... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Silakan masukkan suatu nama pengguna yang valid atau id numerik." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Silakan masukkan suatu nama grup yang valid atau id numerik." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Apakah Anda ingin menerapkan perubahan ini secara rekursif pada semua berkas " "dan sub folder?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Sembunyikan atau munculkan berkas" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Berkas tersebut tersembunyi karena namanya dimulai dengan titik ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Berkas pada sistem ini tersembunyi bila namanya diawali dengan titik ('.'). " "Tekan untuk menjungkitkan penampilan berkas tersembunyi." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "memindai..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Akses isi:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Berkas yang berbeda jenis" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Berkas:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Berkas berganda" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nama" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Keterangan" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Ukuran" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Hak akses" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Pemilik" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Diubah" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Lokasi" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Ekstensi" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Buat _Baru..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Folder" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Berkas Kosong" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Bal_ik Pilihan" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Urutkan Berkas" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Ubah Nama Folde_r..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Prop_erti Folder" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Tampilkan Yang _Tersembunyi" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Campurkan Berkas dan _Folder" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Aba_ikan Besar Kecil Huruf Nama Berkas" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Menurut _Nama" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Menurut Waktu _Modifikasi" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Menurut _Ukuran" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Menurut _Tipe Berkas" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Masukkan nama untuk folder yang baru dibuat:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Membuat Folder Baru" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Masukkan suatu nama untuk berkas kosong:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Membuat..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Baru" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Masukkan suatu nama untuk %s yang baru:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Membuat %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Jalankan aplikasi baku pada be_rkas setelah pembuatan" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Berkas teks '%s' ini sepertinya sebuah skrip yang dapat dijalankan.\n" "Apa yang ingin Anda lakukan dengannya?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Berkas '%s' ini dapat dijalankan. Anda ingin mengeksekusinya?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Tak ada folder yang dinyatakan." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Pilih Folder" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Galat" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Konfirmasi" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pertanyaan" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Hanya administrator sistem yang punya hak untuk melakukan ini." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Anda ingin memindah berkas '%s' ke tong sampah?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Anda ingin memindah %d berkas yang dipilih ke tong sampah?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Anda ingin menghapus berkas '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Anda ingin menghapus %d berkas yang dipilih?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Ganti Nama Berkas" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Silakan masukkan sebuah nama baru:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Anda yakin ingin mengosongkan tong sampah?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Tem_pel dan Pergi" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Bilah lokasi folder" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Folder Rumah" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Desktop" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplikasi" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Root Sistem Berkas" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Kaitkan Volu_me" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Lepas Kaitan Vol_ume" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Keluarkan M_edia Lepas Pasang" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Format Volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Ubah Nama Buti_r Penanda Taut" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Hapus _dari Penanda Taut" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Pindah Penanda Ta_ut Naik" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Pin_dah Penanda Taut Turun" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Kosongkan Tong Sampah" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Tunjukkan daftar penanda taut, perangkat, dan lokasi umum di bilah sisi" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Ubah Nama Butir Penanda Tautan" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Masukkan nama baru:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Jenis: %s\n" "Ukuran: %s\n" "Diubah: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Jenis: %s\n" "Diubah: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Terjadi galat sebelum operasi berkas dihentikan." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Dibatalkan" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Operasi berkas selesai dengan galat." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Selesai" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Beberapa berkas tak bisa dipindah ke tong sampah karena sistem berkas " "dibawahnya tak mendukung operasi ini.\n" "Apakah Anda mau menghapus saja berkasnya? " #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Jeda" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Lanjutkan" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Memindah" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Menyalin" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Membuang" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Menghapus" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Membuat tautan" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Dalam: " #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Membuat tautan ke berkas" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Mengubah atribut" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Mengubah atribut berkas" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Memulihkan" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s berkas" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Operasi berkas tengah berlangsung..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s berkas:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s berkas:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Mati" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Tempat" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Pohon _Direktori" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Ja_rak Jauh" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Lokasi" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Pohon Direktori" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Tilikan dari isi folder" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "Sem_bunyikan %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Pindah Ke K_iri" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Pindah Ke K_anan" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Tampilkan %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Lupakan Lebar" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Tilikan _Ikon" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Tilikan _Kompak" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Tilikan Gambar Mini" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Ti_likan Daftar Terrinci" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Mengubah tab aktif" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Direktori '%s' yang dinyatakan tak valid" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Tak bisa mengakses berkas tujuan" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Tak bisa membuat taut pada sistem berkas bukan native" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Tak bisa mengembalikan berkas '%s' yang dibuang ke tong sampah: path asli " "tak diketahui" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Sumber dan tujuan sama." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Tak bisa memindah folder ke dalam sub foldernya" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Tak bisa menyalin folder ke dalam sub foldernya" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Tujuan adalah sub folder dari sumber" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Tak bisa menyalin berkas '%s': tak didukung" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Penataan nama tampilan hanya dapat dilakukan bagi berkas tunggal" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Penataan target hanya dapat dilakukan bagi berkas tunggal" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Kesalahan berkas XML '%s' (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Berkas XML tak memuat Akar aplikasi" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Tak bisa membuat definisi XML bagi '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Path menu '%s' telah ada" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Galat singgahan menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Direktori menu tak valid" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Nama butir menu tak boleh kosong" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Direktori menu tak valid '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Butir menu tak valid" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Butir menu '%s' tak memiliki berkas entri yang sesuai" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Mengubah status tersembunyi tak didukung bagi direktori menu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Penataan atribut '%s' tak didukung" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Nilai tak valid bagi atribut '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' adalah direktori menu" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' bukan suatu butir menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Berkas entri '%s' rusak" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Tak bisa membuat butir menu '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Nama direktori menu tak boleh berakhir dengan \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Operasi tak valid dengan akar menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Tujuan tak valid" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: folder '%s' tak ditemukan di singgahan menu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Cari" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Hasil Pencarian" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Pilih Berkas Executable" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Peri_ntah: " #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Perintah yang dijalankan ketika ikon aplikasi diaktifkan" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_eskripsi:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Nama generik dari aplikasi" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Direktori _kerja:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Direktori kerja tempat menjalankan program" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Tooltip: " #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Tooltip yang ditunjukkan pada aplikasi" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "G_unakan pemberitahuan awal mula" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Entri _Desktop" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Pulihkan" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Kembalikan berkas yang dibuang ke tong sampah ke path aslinya" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nama berkas sumber atau id desktop" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "SUMBER" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nama berkas hasil" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "HASIL" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Cakram CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Cakram CD-ROM Kosong" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Cakram CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Cakram CD-R Kosong" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Cakram CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Cakram CD-RW Kosong" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Cakram DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Cakram DVD-ROM Kosong" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Cakram DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Cakram DVD-RW Kosong" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Cakram DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Cakram DVD-RAM Kosong" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Cakram DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Cakram DVD+R Kosong" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Cakram DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Cakram DVD+RW Kosong" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Cakram DVD+R DL " #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Cakram DVD+R DL Kosong" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Cakram DVD+RW DL " #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Cakram DVD+RW DL Kosong" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Cakram Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Cakram Blu-Ray Kosong" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Cakram Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Cakram Blu-Ray R Kosong" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Cakram Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Cakram Blu-Ray RW Kosong" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Cakram HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Cakram HD DVD Kosong" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Cakram HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Cakram HD DVD-R Kosong" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Cakram HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Cakram HD DVD-RW Kosong" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Cakram MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Cakram MO Kosong" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Cakram MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Cakram MRW Kosong" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Cakram MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Cakram MRW/W Kosong" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Berkas _audio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Cakram Optik Kosong" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Cakram Optik" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Lengket" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Set UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Hanya pemilik" #~ msgid "Symlinking" #~ msgstr "Membuat symlink" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Memroses:" #~ msgid "Progress:" #~ msgstr "Kemajuan:" #~ msgid "Some errors occurred:" #~ msgstr "Terjadi beberapa galat:" #~ msgid "Re_move from Bookmark" #~ msgstr "Hapus _dari Penanda Taut" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "Operasi berkas dibatalkan dan ada beberapa galat." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Operasi berkas selesai, tapi ada beberapa galat." #~ msgid "Moving Files" #~ msgstr "Memindahkan Berkas" #~ msgid "Copying Files" #~ msgstr "Menyalin Berkas" #~ msgid "Trashing Files" #~ msgstr "Membuang Berkas Ke Tong Sampah" #~ msgid "Deleting Files" #~ msgstr "Menghapus Berkas" #~ msgid "Creating Symlinks" #~ msgstr "Membuat Symlink" #~ msgid "Changing File Attributes" #~ msgstr "Mengubah Atribut Berkas" #~ msgid "_Rename Folder" #~ msgstr "Ganti Nama Folde_r" #~ msgid "File type to be opened:" #~ msgstr "Tipe berkas yang akan dibuka:" #~ msgid "_Installed Application" #~ msgstr "Apl_ikasi Terpasang" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "" #~ "Tata aplika_si yang dipilih sebagai aksi bawaan dari jenis berkas ini" #~ msgid "_Browse" #~ msgstr "Ram_ban" #~ msgid "My Computer" #~ msgstr "Komputerku" #~ msgid "_Only for this folder" #~ msgstr "Hanya bagi f_older ini" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Contreng untuk mengingat pengurutan sebagai pengaturan folder bukan untuk " #~ "global" #~ msgid "Please select a folder" #~ msgstr "Silakan pilih sebuah folder" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "Hanya bagi f_older ini" #, fuzzy #~ msgid "Computer" #~ msgstr "Komputerku" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Jaringan" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Jalankan di _emulator terminal" #~ msgid "Shortcuts" #~ msgstr "Pintas" #~ msgid "Mount Point" #~ msgstr "Titik Kait" #~ msgid "Create _Symlink" #~ msgstr "Buat _Symlink" #~ msgid "Se_nd To" #~ msgstr "Kiri_m Ke" #~ msgid "Blank File" #~ msgstr "Berkas Kosong" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Galat, lxshortcut tak dipasang" #~ msgid "Failed to start lxshortcut" #~ msgstr "Gagal memulai lxshortcut" libfm-1.4.0/po/is.po000066400000000000000000001345471475513661000142240ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Sveinn í Felli , 2014. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2014-12-08 09:28+0000\n" "Last-Translator: Sveinn í Felli \n" "Language-Team: Icelandic \n" "Language: is\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1418030924.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Forgangsforrit" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Veldu hvaða forrit þú vilt að tölvan noti þegar smellt er á vefslóð eða " "netfangstengil" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Flýtilyklaritill" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Búa til nýja eða breyta skjáborðsfærslu" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Veldu forrit" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Nota valið forrit til að opna skrár" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Uppsett forrit" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Ski_pun til að keyra:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Vafra..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "K_eyra í skjáhermi" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Halda skjáhermiglugga opnum eftir keyrslu skipunar" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Þessa sérkóða má nota á skipanalínu:\n" " %f: Stendur fyrir eitt skráarheiti\n" " %F: Stendur fyrir mörg skráaheiti\n" " %u: Stendur fyrir eina URI-slóð skráar\n" " %U: Stendur fyrir margar URI-slóðir" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Heiti forrits (valkvætt, settu það til að halda skráavenslum)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Keyra sérsniðna skipanalínu til að opna skrár" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Sérsniðin skipanalína" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Sett_u valið forrit sem sjálfgefna aðgerð fyrir þessa skráartegund" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Staðfesta útskiptingu skráa" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Sleppa" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Endu_rnefna" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "Skrifa _yfir" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Þegar er fyrir skrá með sama heiti á þessari staðsetningu.\n" "\n" "Viltu skipta út skránni" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "með eftirfarandi skrá?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Skráarheiti:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Beita þessu á allar skrár" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Veldu táknmynd..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "táknmyndaþema kerfis" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "myndskrár" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Veldu táknmynd úr:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Keyra skrá" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Keyra í skjá_hermi" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Eiginleikar skráar" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Táknmynd þessarar skrár í möppusýn" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Heiti:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Staðsetning:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Úttaksskrá:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Skráategund:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "O_pna með:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Veldu forritið til að opna skrár af þessari tegund" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Heildarfjöldi skráa:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Heildarstærð skráa:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Stærð á diski:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Síðast breytt:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Síðast notað:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Heimildum breytt síðast:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Almennt" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Eigandi:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Hópur:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "S_koða innihald:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Breyta innihaldi" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Keyra:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Sértækir bitar:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Hverjir geta lesið innihald skráa/mappa" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Hverjir geta breytt innihaldi skráa/mappa" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Hverjir geta keyrt innihald skráa/mappa" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Sérstök flögg fyrir keyrslu skráa" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Sérstök flögg fyrir aðgang að möppum" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Aðgangsstjórnun" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Falin skrá" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Heimildir" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ekkert" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Viðloðandi" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Setja GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Viðloðandi & setja GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Setja UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Setja UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Einungis eigandi" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Einungis eigandi og hópur" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Hver sem er" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Enginn" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bæti" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Veldu dagsetningu" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Veldu dagsetningu úr dagatalinu" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Leita að skrám" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "_Mynstur skráaheita:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Mynstur getur verið annaðhvort listi með POSIX skeljamynstrum (með ',' sem " "aðgreini) eða POSIX regluleg segð." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Ó_háð há-/lágstöfum" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Nota reg_lulega segð" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Staðir til að l_eita á:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Leita í _undirmöppum" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Leita í _földum skrám" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nafn / Staðsetning" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Skráategund" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Einungis leita eftir skrám af eftirfarandi gerðum:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xtaskrár" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Myndskrár" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Hljóðskrár" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "M_yndskeiðaskrár" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Skjöl" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Möppu_r" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Annað:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Skráa_tegund" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Skráin _inniheldur:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Innihald" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Skráastærð:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Minni en:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Stærri en:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Síðast breytt" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(ekkert)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Eldra en:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Yngra en:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Ei_ginleikar" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Vafri" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Uppáhalds netvafrinn mun vera notaður til að opna veftengla." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Póstforrit" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Uppáhalds póstforritið mun vera notað til að skrifa tölvupóstskeyti þegar " "smellt er á netfangstengla." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Skjáhermir" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Skipanalína:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Kerfisforrit" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Skráavensl" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Til:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Undirbý..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Úttaksskrá:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tími eftir:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Villur komu í ljós:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Tóma skrá" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Ógildur áfangastaður" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Aðgerðin er ekki studd" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Ógild desktop skjáborðsskrá: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Get ekki ákvarðað tegund innihalds skrárinnar '%s' til að geta keyrt hana" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Ekkert sjálfgefið forrit fannst til að keyra slóðir með %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Get ekki sett vinnumöppu sem '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Ekkert sjálfgefið forrit fannst fyrir MIME-tegundina %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Tæki" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Netkerfi" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Ruslmappa" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "flýtilykill á URI-slóð" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: ógild frumbreyta" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Skjáhermir er ekki valinn í stilliskrá libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Ógild lýsing á smámyndagerðarforriti" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bæti" msgstr[1] "%u bæti" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Viðfangið endar ekki á semikommu; líklega notaðir þú og-merkið án þess að " "ætla að byrja viðfang. Ritaðu það sem &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Mengi '%s' var lokað en ekkert mengi var opnað" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Mengið '%s' var lokað en mengið sem nú er opið er '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Skjalið endar óvænt" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Skjalið var tómt eða innihélt einungis orðabil" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML gagnavilla" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Sérsníða" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Keyrsluskrár" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Veldu forrit til að opna \"%s\" skrár" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Uppsett forrit" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Hleð inn..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Birtir möppur sem greinar á hliðarspjaldi" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Hætta við" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Afrita _hingað" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Færa hingað" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Tengja hingað" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave mistókst." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Opna" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "O_pna með..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "O_pna með" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Afri_ta feril (ferla)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Fela" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "B_irta" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Bæta við bókamerki" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Endu_rnefna…" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Þ_jappa..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Afþjappa _hér" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Afþja_ppa í..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Ei_ginleikar" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Flytja í _rusl" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Bókamerkin þín eru þegar með merki fyrir þessa möppu." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "myndskrár" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bæti" msgstr[1] "bæti" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "skanna... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Settu inn gilt notandanafn eða tölulegt auðkenni." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Settu inn gilt heiti á hóp eða tölulegt auðkenni." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Viltu virkja þessar breytingar á allar skrár og undirmöppur?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Fela eða birta skrána" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Þessi skrá er falin vegna þess að heiti hennar byrjar á punkti ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Skrár á þessu kerfi eru faldar ef heiti þeirra byrjar á punkti ('.'). Ýttu á " " til að víxla birtingu falinna skráa." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "skanna..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Aðgangur að efni:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Skrár af mismunandi gerðum" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Skrá:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Margar skrár" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Heiti" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Lýsing" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Stærð" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Heimildir" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Eigandi" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Breytt" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Staðsetning" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Skráarending" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Búa til _nýja..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Möppu" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tóma skrá" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Snúa vali við" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Raða skrám" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Endu_rnefna möppu..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Eiginleikar _möppu" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Sýna _falið" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "_Blanda skrám og möppum" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Hunsa há/lágstafi" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Eftir s_kráarheiti" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Eftir _breytingartíma" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Eftir _stærð" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Eftir skráa_tegund" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Gefðu nýju möppunni nafn:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Bý til nýja möppu" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Settu inn heiti fyrir tóma skrá:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Bý til ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nýtt" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Gefðu nafn fyrir nýja %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Bý til %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Keyra sjálfgefið forrit með skrá eftir að hún hefur verið búin til" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Textakráin '%s' lítur út fyrir að vera keyranleg skrifta.\n" "Hvað viltu gera við hana?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Skráin '%s' er keyrsluskrá (forrit). Viltu örugglega keyra hana?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Engar möppur eru tilgreindar." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Veldu möppu" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Villa" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Staðfesta" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Spurning" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Aðeins kerfisstjórar hafa aðgangsheimildir til að gera þetta." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Viltu færa skrána '%s' í ruslið?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Viltu færa %d valda skrá í ruslið?" msgstr[1] "Viltu færa %d valdar skrár í ruslið?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Viltu eyða skránni '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Ertu viss um að þú viljir eyða %d völdu skránni?" msgstr[1] "Ertu viss um að þú viljir eyða %d völdu skránum?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Endurnefna skrá" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Sláðu inn nýtt heiti:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Viltu örugglega tæma ruslmöppuna?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "_Líma og fara" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Staðsetningarslá möppu" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Heimamappa" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Skjáborð" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Forrit" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Rót skráarkerfis" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Tengja Gagnahirslu" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Aftengja gagnahirslu" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "S_pýta útskiptanlegum geymslumiðli út" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Forsníða gagnahirslu" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Endurnefna bókamerki" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Fjar_lægja bókamerki" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Flytja bókamerki _upp" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Flytja bókamerki _niður" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Tæma ruslið" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Birtir lista yfir algenga staði, tæki og bókamerki á hliðarspjaldi" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Endurnefna bókamerki" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Settu inn nýtt heiti:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tegund: %s\n" "Stærð: %s\n" "Breytt: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tegund: %s\n" "Breytt: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Villur komu upp áður en skráaaðgerð stöðvaðist." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Hætt við" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Skráaaðgerð stöðvaðist með villum." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Lokið" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Sumar skrár er ekki hægt að setja í ruslið vegna þess að undirliggjandi " "skráakerfi styður ekki þessa aðgerð.\n" "Viltu eyða þeim í staðinn?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Bíða" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "Halda áf_ram" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Færi" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Afrita" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Set skrár í ruslið" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Eyði" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Bý til tengil" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "í:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Bý til tengla í skrár" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Breyti eiginleikum" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Breyti eiginleikum skráa" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Endurheimti" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s skrár" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Skráaaðgerð í gangi..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s skrá:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s skrár:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "Slö_kkt" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Staðir" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Möppu_greinar" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Fja_rlægt" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Staðir" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Möppugreinar" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Sýn á innihald möppu" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Fela %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Færa til vinstri" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Fæ_ra til hægri" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Birta %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Gleyma breidd" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Táknm_yndasýn" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Þjö_ppuð sýn" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Smá_myndasýn" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Nákvæmur _listi" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Breytir hvaða flipi er virkur" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Uppgefin mappa '%s' er ógild" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Get ekki nálgast úttaksskrá" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" "Ekki er hægt að búa til tengil á skráakerfi sem ekki er með innbyggðan " "stuðning" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Get ekki endurheimt skrána '%s' úr ruslinu: upprunaleg slóð er ekki þekkt" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Uppruni og úttak eru það sama." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Þú getur ekki flutt möppu inn í sjálfa sig" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Þú getur ekki afritað möppu inn í sjálfa sig" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Áfangastaðurinn er undirmappa upprunastaðar" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Get ekki afritað skrána '%s': ekki studd" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Að setja birtingarheiti er aðeins hægt fyrir staka skrá" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Að setja úttak er aðeins hægt fyrir staka skrá" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Get ekki búið til XML skilgreiningu fyrir '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Valmyndarslóðin '%s' er þegar til" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Villa í skyndiminni valmyndar" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ógild valmyndarmappa" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Heiti atriðis má ekki vera tómt" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Ógild valmyndarmappa '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ógilt valmyndaratriði" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Valmyndarfærslan '%s' á sér ekki viðeigandi færsluskrá" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Breyting á sýnileika valmyndarmöppu er ekki studd" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Ekki stutt að stilla eigindin '%s'" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ógilt gildi fyrir eigindin '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' er valmyndarmappa" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' er ekki valmyndarfærsla" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' færsluskráin er skemmd" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Get ekki búið til valmyndarfærsluna '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Nafn valmyndarmöppu ætti ekki að enda á \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Ógild aðgerð í rótarvalmynd" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ógildur áfangastaður" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: mappan '%s' fannst ekki í skyndiminni valmyndar" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Leita" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Leitarniðurstöður" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Veldu keyranlega skrá" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "S_kipun:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Skipun til að keyra þegar táknmynd forrits er virkjuð" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Lýsing:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Almennt nafn forrits" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Vinnu_mappa:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Vinnumappa forritsins" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Vísbending:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Vísbending sem sýna skal á forriti" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Nota _tilkynningar við ræsingu" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Skjáborðsfærsla" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "Endu_rheimta" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Taka skrá úr ruslinu og setja hana á upprunalegan stað" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "heiti frumskrár eða skjáborðauðkenni" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "UPPRUNI" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "skráarheiti niðurstöðu" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "NIÐURSTAÐA" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM diskur" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Tómur CD-ROM diskur" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R diskur" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Tómur CD-R diskur" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW diskur" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Tómur CD-RW diskur" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM diskur" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Tómur DVD-ROM diskur" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Tómur DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM diskur" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Tómur DVD-RAM diskur" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R diskur" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Tómur DVD+R diskur" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW diskur" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Tómur DVD+RW diskur" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL diskur" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Tómur DVD+R DL diskur" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL diskur" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Tómur DVD+RW DL diskur" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray diskur" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Tómur Blu-Ray diskur" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R diskur" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Tómur Blu-Ray R diskur" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW diskur" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Tómur Blu-Ray RW diskur" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD diskur" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Tómur HD DVD diskur" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R diskur" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Tómur HD DVD-R diskur" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Tómur HD DVD-RW diskur" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO diskur" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Tómur MO diskur" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW diskur" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Tómur MRW diskur" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W diskur" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Tómur MRW/W diskur" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Hljóðskrár" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Tómur geisladiskur" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Geisladiskur" libfm-1.4.0/po/it.po000066400000000000000000001462001475513661000142120ustar00rootroot00000000000000# Translation of libfm to Italian # Copyright (C) YEAR THE libfm'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Andrea Florio , 2010 # Daniele Forsi , 2012. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-07-10 08:58+0000\n" "Last-Translator: Daniele Forsi \n" "Language-Team: Italian\n" "Language: it\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1436518734.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Applicazioni preferite" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Scegli le applicazioni eseguite al clic su un collegamento Web o un " "indirizzo e-mail" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Modifica le scorciatorie" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Crea un elemento del desktop o modifica uno esistente" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Scegli una applicazione" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utilizza l'applicazione selezionata per aprire i file" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Applicazioni _installate" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Riga di c_omando da eseguire:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "S_foglia..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Esegui nell'emulatore di terminale" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Tenere aperta la finestra del terminale dopo l'esecuzione del comando" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Questi codici speciali possono essere usati nella riga di comando:\n" " %f: Rappresenta un singolo nome di file\n" " %F: Rappresenta nomi di file multipli\n" " %u: Rappresenta un singolo URI di file\n" " %U: Rappresenta URI multipli" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "Nome dell'_applicazione (opzionale, impostarlo per mantenere " "l'associazione)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Esegui la riga di comando personalizzata per aprire i file" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Riga di comando personali_zzata" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "Impo_sta l'applicazione selezionata come azione predefinita per questo tipo " "di file" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Conferma sostituzione file" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "S_alta" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Rinomina" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Sovrascrivi" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Esiste già un file con lo stesso nome in questa posizione.\n" "\n" "Vuoi sovrascrivere il file esistente" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "con il seguente file?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Nome _file:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Applica questa opzione a tutti i file esistenti" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Scegli un'icona..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "tema icone di sistema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "file immagine" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Scegli un'icona da::" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Esegui file" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Esegui nel _terminale" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Proprietà del file" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Icona del file in visualizzazione cartella" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nome:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Posizione:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "File destinazione:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipo file:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Apri _con:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Seleziona l'applicazione utilizzata per aprire i file di questo tipo " # Tolgo "dei" perché c'è poco spazio e la stessa stringa è usata per singolare e plurale #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Conteggio totale file:" # Tolgo "dei" perché c'è poco spazio e la stessa stringa è usata per singolare e plurale #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Dimensione totale file:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Dimensione su disco:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Ultima modifica:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Ultimo accesso:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Ultima modifica dei permessi:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Generale" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Proprietario:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_ruppo:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Visualizzazione contenuto:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Modifica contenuto:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Esecuzione:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bit speciali:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Chi può leggere il contenuto del file/directory" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Chi può modificare il contenuto del file/directory" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Chi può eseguire il file o entrare nella directory" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Flag speciali per l'esecuzione del file" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Flag speciali per l'accesso alla directory" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Controllo accesso" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "File nascosto" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permessi" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nessuno" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Imposta GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky e imposta GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Imposta UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Imposta UID e GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Solo il proprietario" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Solo il proprietario e il gruppo" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Chiunque" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nessuno" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Byte" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Scegli una data" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Scegli una data dal seguente calendario" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Cerca file" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Modelli di _nomi di file:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Il modello può essere un elenco di modelli POSIX per la shell (con «;» come " "separatore) o un'espressione regolare POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Ignora MAIUSCOLE/minuscole" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Usa espressione regolare" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Posizioni in cui c_ercare:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Cerca nelle _sotto directory" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Mo_stra file nascosti" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "_Nome/Posizione" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipo di file" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Cerca solo file dei seguenti tipi:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "File di te_sto" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "File _immagine" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "File _audio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "File _video" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documenti" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Ca_rtelle" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Altr_i:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Si può inserire qualunque tipo di contenuto valido. Il metacarattere «*» è " "permesso alla fine del tipo. Tipi multipli devono essere separati da «;»." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipo file" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Il file _contiene:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_ontenuto" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Dimensione file" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Più _piccolo di:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Più _grande di:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Ultima modifica" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nessuno)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Prima del:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Dopo il:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Proprietà" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Browser web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Il browser web preferito sarà usato per aprire collegamenti ipertestuali." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Client di posta" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Il client di posta preferito sarà usato per comporre email quando si fa clic " "su un indirizzo e-mail." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulatore di terminale" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Riga di comando:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Applicazioni di sistema" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Associazioni dei file" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "In:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "In preparazione..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "File destinazione:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tempo restante:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Sono occorsi alcuni errori:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "File vuoto" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Destinazione non valida" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operazione non supportata" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "File entrata desktop non valido: «%s»" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Impossibile determinare il tipo di contenuto del file «%s» per lanciarlo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "Nessuna applicazione predefinita è impostata per lanciare gli URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Impossibile impostare la directory di lavoro a «%s»: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Nessuna applicazione predefinita è impostata per il tipo di MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Dispositivi" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Rete" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Cestino" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "scorciatoia per URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argomento non valido" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" "Nessun emulatore di terminale è impostato nella configurazione di libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Descrizione dell'applicazione per le miniature non valida" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Il subpath dell'URI «%s» contiene caratteri di escape non validi" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Gestore duplicato per il tag <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Analisi di «%-.*s» non riuscita: dovrebbe presentare un numero all'interno " "di un riferimento a carattere (es. ê), forse il numero è troppo grande" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Il riferimento a carattere non termina con un punto e virgola; probabilmente " "è stato utilizzato un carattere \"e commerciale\" senza l'intenzione di " "iniziare una nuova entità. In tal caso ricorrere a &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Il riferimento a carattere '%-.*s' non codifica un carattere permesso" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Rilevata entità vuota «&;»; sono entità valide: & " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Il nome di entità «%-.*s» è sconosciuto" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "L'entità non termina con un punto e virgola; probabilmente è stato " "utilizzato un carattere \"e commerciale\" senza l'intento di iniziare una " "entità. In tal caso ricorrere a &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Non sono permessi spazi nel tag di chiusura" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "L'elemento «%s» è stato chiuso ma nessun elemento era aperto" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "L'elemento «%s» è stato chiuso ma l'elemento attualmente aperto è «%s»" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Carattere «%c» non valido all'inizio del valore di un attributo" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Carattere «%c» non valido alla fine del valore di un attributo, atteso «%c»" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Il documento è terminato inaspettatamente" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Il documento era vuoto oppure conteneva unicamente spazi" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: errore dati XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalizza" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "File eseguibili" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Scegliere un'applicazione per aprire i file «%s»" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Applicazioni installate" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Caricamento..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Mostra l'albero delle directory nel riquadro laterale" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Annulla" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "C_opia qui" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Sposta qui" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Co_llega qui" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave fallito." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Apri" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Apri _con..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Apri _con" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copia pe_rcorsi" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Nascon_di" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Mos_tra" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "A_ggiungi ai segnalibri" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Rinomina..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mprimi..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Estrai _qui" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_strai in..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propri_età" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Sposta nel ces_tino" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Esiste già un segnalibro per questa cartella." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "File _immagine" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "byte" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "scansione... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Digitare un nome utente o un id numerico valido." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Per favore digita un nome gruppo o id numerico valido." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Applicare questi cambiamenti ricorsivamente a tutti i file e a tutte le " "sotto cartelle?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Nasconde o mostra il file" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Questo file è nascosto perché il suo nome inizia con un punto («.»)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "I file su questo sistema sono nascosti se il loro nome inizia con un punto " "(«.»). Premere Ctrl+H per nascondere o mostrare i file nascosti." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "scansione..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Accesso al contenuto:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "File di diverso tipo" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "File:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "File multipli" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nome" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descrizione" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Dimensione" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permessi" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Proprietario" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificato" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Posizione" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Estensione" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Crea _nuovo..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Cartella" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "File vuoto" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverti selezione" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Ordina file" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Rinomina cartella..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propri_età della cartella" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Mostra _nascosti" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Non dividere _file e cartelle" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignora MAIUSCOLE/minuscole" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Per _nome" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Per data di _modifica" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Per dimen_sione" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Per _tipo di file" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Inserisci un nome per la cartella appena creata:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Creazione nuova cartella" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Inserire un nome per il file vuoto:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Creazione..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nuovo" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Inserire un nome per il nuovo %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Creazione di %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Esegui_re l'applicazione predefinita sul file dopo la creazione" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Il file di testo '%s' sembra uno script eseguibile.\n" "Cosa vuoi fare?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Il file '%s' è eseguibile. Vuoi eseguirlo?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nessuna cartella specificata." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Seleziona una cartella" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Errore" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Conferma" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Domanda" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Solo l'amministratore del sistema ha il permesso di fare questo." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Spostare il file «%s» nel cestino?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Spostare %d file selezionato nel cestino?" msgstr[1] "Spostare %d file selezionati nel cestino?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Eliminare il file «%s»?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Eliminare %d file selezionato?" msgstr[1] "Eliminare %d file selezionati?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Rinomina file" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Per favore inserisci un nuovo nome:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Sei sicuro di voler svuotare il cestino?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Incolla e vi_sita" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barra posizione cartella" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Cartella Home" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Scrivania" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Applicazioni" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Radice del file system" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Monta volume" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Smonta vol_ume" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Espelli supporto rimovibile" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatta volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Rinomina segnalibro" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Ri_muovi dai segnalibri" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Sposta segnalibro s_u" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Sposta segnalibro _giù" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Svuota c_estino" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Mostra l'elenco di posti, dispositivi e segnalibri nel riquadro laterale" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Rinomina segnalibro" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Inserisci un nuovo nome:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Dimensione: %s\n" "Modificato: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Modificato: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "" "Sono occorsi degli errori prima che l'operazione sui file fosse fermata." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Annullato" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "L'operazione sui file è stata completata con errori." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Finito" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Alcuni file non possono essere spostati nel cestino perché il file system su " "cui si trovano non supporta questa operazione.\n" "Vuoi invece eliminarli?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausa" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Riprendi" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Spostamento" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Copia" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Spostamento nel cestino" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Eliminazione" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Creazione collegamento" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "In:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Creazione collegamenti ai file" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Cambiamento attributi di" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Cambiamento attributi dei file" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Ripristino" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "file %s" # Per convenzione Il Translator Project italiano mette o i puntini di sospensione i "in corso" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "L'operazione sui file è in corso" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s file:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s file:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "Spent_o" # Nautilus traduce Places->Risorse #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Risorse" # Nautilus traduce Tree->Albero #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Albero _directory" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remoto" # Nautilus traduce Places->Risorse #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Risorse" # Nautilus traduce Tree->Albero #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Albero directory" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Vista dei contenuti della cartella" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Nascondi %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Sposta a _sinistra" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Sposta a _destra" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Mostra %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Dimentica larghezza" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Vista _icone" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Vista _compatta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Vista minia_ture" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Vista _lista dettagliata" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Cambia la linguetta attiva" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "La directory «%s» specificata non è valida" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Impossibile accedere al file di destinazione" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Impossibile create un collegamento a un file system non nativo" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Impossibile ripristinare il file «%s» dal cestino: percorso originale " "sconosciuto" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Sorgente e destinazione sono uguali." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Impossibile spostare una cartella in una sua sotto cartella" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Impossibile copiare una cartella in una sua sotto cartella" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "La destinazione è una sotto cartella della sorgente" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Impossibile copiare il file «%s»: non supportato" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" "L'impostazione del nome visualizzato può essere fatta solo per file singoli" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" "L'impostazione della destinazione può essere fatta solo per file singoli" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Errore nel file XML «%s»: (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Il file XML non contiene la radice «Applications»" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Impossibile creare la definizione XML per «%s»" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Il percorso di menu «%s» esiste già" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Errore nella cache dei menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Directory del menu non valida" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Il nome della voce di menu non può essere vuoto" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Directory di menu «%s» non valida" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Voce di menu non valida" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "La voce di menu «%s» non ha un elemento file appropriato" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Cambiamento dello stato nascosto non supportato per la directory menu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Impostazione dell'attributo «%s» non supportata" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Valore non valido per l'attributo «%s»" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "«%s» non è una directory di menu" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "«%s» non è una voce di menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "L'elemento file «%s» è danneggiato" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Impossibile creare la voce di menu «%s»" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Il nome della directory di menu non deve finire con «.desktop»" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Operazione non valida con la radice del menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Destinazione non valida" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: cartella «%s» non trovata nella cache del menu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Cerca" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Risultati della ricerca" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Scegli un file eseguibile" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Co_mando:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Comando da eseguire quando l'icona dell'applicazione viene attivata" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escrizione:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Nome generico dell'applicazione" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Directory corrente:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "La directory di lavoro in cui eseguire il programma" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Suggerimen_to:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Suggerimento da mostrare sull'applicazione" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Usa notifica all'avvio" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Elemento scrivania" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Ripristina" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Ripristina i file del cestino ai loro percorsi originali" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nome file sorgente o id del desktop" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "SORGENTE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nome file risultato" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RISULTATO" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disco CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disco CD-ROM vuoto" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disco CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disco CD-R vuoto" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disco CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disco CD-RW vuoto" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disco DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disco DVD-ROM vuoto" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disco DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disco DVD-RW vuoto" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disco DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disco DVD-RAM vuoto" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disco DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disco DVD+R vuoto" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disco DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disco DVD+RW vuoto" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disco DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Disco DVD+R DL vuoto" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disco DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Disco DVD+RW DL vuoto" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disco Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disco Blu-Ray vuoto" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disco Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disco Blu-Ray R vuoto" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW vuoto" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disco HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disco HD DVD vuoto" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disco HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Disco HD DVD-R vuoto" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disco HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Disco HD DVD-RW vuoto" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disco MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disco MO vuoto" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disco MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disco MRW vuoto" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disco MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disco MRW/W vuoto" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "File _audio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disco ottico vuoto" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disco ottico" #~ msgid "Symlinking" #~ msgstr "Creazione collegamento simbolico" #~ msgid "File type to be opened:" #~ msgstr "Tipo di file da aprire:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "In elaborazione:" #~ msgid "Progress:" #~ msgstr "Avanzamento:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "L'operazione sul file è terminata, ma ci sono alcuni errori." #~ msgid "_Browse" #~ msgstr "_Sfoglia" #~ msgid "My Computer" #~ msgstr "Il mio computer" #~ msgid "_Move" #~ msgstr "_Sposta" #~ msgid "_Trash" #~ msgstr "_Cestino" #~ msgid "_Only for this folder" #~ msgstr "S_olo per questa cartella" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Seleziona per ricordare l'ordinamento come impostazione di questa " #~ "cartella invece di quello globale" #~ msgid "Please select a folder" #~ msgstr "Per favore, seleziona una cartella" #~ msgid "Entry for folder path" #~ msgstr "Entrata per il percorso della cartella" #~ msgid "Computer" #~ msgstr "Computer" #~ msgid "Network Drives" #~ msgstr "Unità di rete" #~ msgid "_Run in terminal emulator" #~ msgstr "_Eseguire nell'emulatore di terminale" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Tenere aperta la finestra del terminale dopo l'esecuzione" #~ msgid "Shortcuts" #~ msgstr "Scorciatoie" #~ msgid "Mount Point" #~ msgstr "Punto di montaggio" #~ msgid "Create _Symlink" #~ msgstr "Crea collegamento _simbolico" #~ msgid "Se_nd To" #~ msgstr "I_nvia a" #~ msgid "Blank File" #~ msgstr "File vuoto" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Errore, lxshortcut non è installato" #~ msgid "Failed to start lxshortcut" #~ msgstr "Impossibile eseguire lxshortcut" #~ msgid "_Group:" #~ msgstr "_Gruppo:" #~ msgid "Rename" #~ msgstr "Rinomina" #~ msgid "Make the file executable" #~ msgstr "Rendi il file eseguibile" #~ msgid "Operations that all other users can do" #~ msgstr "Operazioni che tutti gli altri utenti possono fare" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operazioni ch il proprietario del file pò fare" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operazioni che possono fare gli utenti appartenenti allo stesso gruppo " #~ "del il proprietario del file" #~ msgid "Read and Write" #~ msgstr "Lettura e Scrittura" #~ msgid "Read only" #~ msgstr "Sola Lettura" #~ msgid "Write only" #~ msgstr "Sola Scrittura" libfm-1.4.0/po/ja.po000066400000000000000000001530701475513661000141730ustar00rootroot00000000000000# Japanese translations for PACKAGE package # PACKAGE パッケージに対する英訳. # Copyright (C) 2010-2013 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Hironao Komatsu , 2010-2013. msgid "" msgstr "" "Project-Id-Version: libfm 1.2.0-alpha1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-05-04 04:25+0000\n" "Last-Translator: rago1975 \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1430713550.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "既定のアプリケーション" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Web のリンクや e-mail アドレスをクリックした時に呼ばれるアプリケーションを選" "択してください" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "ショートカット・エディタ" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "デスクトップ・エントリの新規作成、あるいは既存のを変更する" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "アプリケーションの選択" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "選択したアプリケーションでファイルを開く" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "インストールされたアプリケーション(_I)" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "実行するコマンドライン(_O):" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "ダイアログで選択(_B)" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "端末エミュレータで実行する(_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "コマンドの実行が終わっても端末のウィンドウを開いておく(_K)" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "以下の特別な記号がコマンドラインで使えます:\n" " %f: 単一のファイル名を表す\n" " %F: 複数のファイル名を表す\n" " %u: 単一のファイルのURIを表す\n" " %U: 複数のURIを表す" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "アプリケーションの名前(_A) (オプション; 関連付けの保持に使う)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "コマンドラインを実行してファイルを開く" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "コマンドラインを指定(_U)" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "選択したアプリケーションをこのファイルタイプのデフォルトのアクションとする" "(_S)" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "ファイルを置き換えるときは確認する" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "スキップ(_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "別の名前で(_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "上書きする(_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "ここには同じ名前のファイルが既にあります。\n" "\n" "ファイルを置き換えますか" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "このファイルで置き換えますか?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "ファイル名(_F):" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "このオプションを既存のすべてのファイルに適用する(_A)" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "アイコンの選択" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "システムのアイコンテーマ" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "画像ファイル" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "アイコンを以下から選択:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "ファイルを実行する" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "端末で実行する(_T)" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "ファイルのプロパティ" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "フォルダ・ビューでファイルを表すアイコン" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "名前(_N):" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "場所:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "リンク先:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "ファイルタイプ:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "開くアプリケーション(_W):" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "このタイプのファイルを開くアプリケーションを選んでください " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "合計のファイル数:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "ファイルの総サイズ:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "ディスク上のサイズ:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "最終更新時刻:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "最終アクセス時刻:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "最終パーミッション変更時刻:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "一般(_G)" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "所有者(_W):" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "グループ(_R):" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "内容の閲覧(_V):" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "内容の変更(_H):" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "実行(_E):" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "特別なビット:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "誰がファイル/ディレクトリを読むことができるか" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "誰がファイル/ディレクトリを変更することができるか" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "誰がファイルを実行、またはディレクトリに入ることができるか" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "ファイル実行の特別なフラグ" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "ディレクトリへのアクセスの特別なフラグ" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "アクセス制御" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "隠しファイル" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "パーミッション(_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "なし" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "スティッキー" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Set GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "スティッキー & set GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Set UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Set UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "所有者のみ" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "所有者とグループのみ" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "すべて" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "なし" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "バイト" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "日付を選んでください" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "以下のカレンダーから日付を選びます" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "ファイルの検索" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "ファイル名のパターン(_N):" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "パターンには POSIX のシェルパターンのリスト(',' を区切りにします)、あるいは " "POSIX の正規表現が使えます。" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "大文字/小文字を区別しない(_V)" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "正規表現を使う(_U)" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "検索する場所(_E)" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "サブディレクトリも探す(_S)" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "隠しファイルも探す(_H)" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "名前/場所(_L)" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "ファイルタイプ" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "以下のタイプのファイルのみを探す:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "テキストファイル(_X)" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "画像ファイル(_I)" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "音声ファイル(_A)" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "動画ファイル(_V)" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "文書(_D)" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "フォルダ(_R)" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "その他(_H):" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "有効なコンテントタイプであれば何でも可能です。ワイルドカード '*' はタイプの末" "尾に使えます。複数のタイプは ';' で区切られます。" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "ファイルタイプ(_T)" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "…を含むファイル(_S):" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "内容(_C)" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "ファイルサイズ" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "…より小さい(_S):" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "…より大きい(_B):" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "最終更新時刻" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(なし)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "…より以前(_E):" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "…以後(_L):" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "プロパティ(_P)" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "ウェブブラウザ" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "既定のウェブブラウザはハイパーリンクを開くのに使われます。" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "メール・クライアント" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "既定のメール・クライアントはメールアドレスをクリックした際にメールを作成する" "のに使われます。" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "端末エミュレータ" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "コマンドライン:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "システムのアプリケーション" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "ファイルの関連づけ" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "送り先:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "準備中..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "リンク先:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "残り時間:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "エラーが発生しました:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "空のファイル" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "不正な移動先です" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "サポートされていない動作" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "不正なデスクトップエントリ名 '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "'%s' を立ち上げようとしましたが、そのコンテントタイプを決定できませんでした" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "URI %s:// を立ち上げようとしましたが、デフォルトのアプリケーションが設定され" "ていません" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "作業ディレクトリを '%s' へ移動出来ませんでした: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "MIME タイプ %s にデフォルトのアプリケーションが設定されていません" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "デバイス" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "ネットワーク" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "ゴミ箱" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI のショートカット" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: 不正な引数" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "libfm の設定に端末エミュレータが設定されていません" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "サムネイル生成アプリケーションの記述が不正です" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u バイト" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI '%s' の中に不正にエスケープされた文字が含まれています" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "タグ <%s> に対するハンドラを複製" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "'%-.*s' をパースできません。文字参照の範囲内の数字でなければなりません (例: " "ê) 数字が大きすぎる可能性もあります" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "文字実体参照がセミコロンで終わっていません。意図せずに「&」を含めたためでは" "ないでしょうか… '&' のようにエスケープしてください" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "文字実体参照 '%-.*s' が指す文字はここでは使用出来ません" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "空の文字実体参照 '&;' があります。& " < > ' のいずれかだ" "けが有効です。" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "未知の文字実体参照 '%-.*s' があります" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "文字実体参照がセミコロンで終わっていません。意図せずに 「&」 を含めたためで" "はないでしょうか… '&' のようにエスケープしてください" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "終了タグには空白を含めてはいけません" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "要素 '%s' が閉じられていますが、それはまだ開かれていません" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "要素 '%s' が閉じられていますが、開かれているのは '%s' です" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "属性の値が不正な文字 '%c' で始まっています" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "属性の値が期待された '%c' ではなく不正な文字 '%c' で終わっています" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "文書が予期せず終わっています" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "ドキュメントが空、もしくは空白だけになっています" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML データのエラーです" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "カスタマイズ" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "実行ファイル" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "ファイル \"%s\" を開くアプリケーションを選択してください" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "インストールされているアプリケーション" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<サブフォルダはありません>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "読み込み中..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "サイドバーにディレクトリツリーを表示する" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "キャンセル(_C)" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "ここにコピー(_O)" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "ここへ移動(_M)" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "ここにリンク(_L)" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave に失敗。" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "開く(_O)" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "アプリケーションで開く(_W)" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "アプリケーションで開く(_W)" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "パスをコピーする(_T)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "隠しファイルにする(_I)" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "隠しファイルの解除" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "ブックマークに追加する(_A)" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "ファイル名の変更(_R)" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "ファイルを圧縮する(_M)" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "ここでファイルを展開(_H)" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "指定先にファイルを展開(_X)" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "ファイルのプロパティ(_E)" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "ゴミ箱へ移動(_T)" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "このフォルダはすでにブックマークされています。" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "画像ファイル" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "バイト" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "スキャン中... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "正しいユーザ名、またはIDの数値を入力してください。" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "正しいグループ名、またはIDの数値を入力してください。" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "これらの変更をすべてのファイルと下位フォルダに適用しますか?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "ファイルを隠しファイルにする、あるいはそれを解除します" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "名前が . で始まっているので、このファイルは隠しファイルとなります。" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "このシステムでは、名前が . で始まるファイルは隠しファイルとなります。 を押すことで、隠しファイルの表示を切り替え出来ます。" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "スキャン中..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "内容へのアクセス(_A):" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "異なるタイプのファイル" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "ファイル:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "複数のファイル" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "名前" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "説明" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "サイズ" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "パーミッション" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "所有者" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "更新時刻" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "場所" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "拡張子" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "新規作成(_N)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "フォルダ" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "空のファイル" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "選択の反転(_I)" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "ファイルのソート(_S)" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "フォルダ名の変更(_R)" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "フォルダのプロパティ(_E)" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "隠しファイルの表示(_H)" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "ファイルとフォルダを混ぜる(_F)" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "大文字/小文字を区別しない(_I)" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "名前(_N)" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "変更時刻(_M)" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "サイズ(_S)" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "ファイルタイプ(_T)" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "新しいフォルダの名前を入力してください:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "フォルダの新規作成" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "空のファイルにつける名前を入力してください:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "新規作成..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "新規" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "新しい %s の名前を入力してください:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s の新規作成" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "ファイルの作成後、デフォルトのアプリケーションでそれを開く(_R)" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "このテキストファイル '%s' は実行可能スクリプトのようです。\n" "これをどうしますか?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "このファイル '%s' は実行可能ファイルです。実行しますか?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "フォルダが指定されていません。" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "フォルダの選択" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "エラー" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "確認" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "質問" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "システム管理者だけがこれを行うことができます。" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "ファイル '%s' をゴミ箱に移動しますか?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "選択した %d 個のファイルをゴミ箱に移動しますか?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "ファイル '%s' を削除しますか?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "選択した '%d' 個のファイルを削除しますか?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "ファイル名の変更" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "新しい名前を入力してください:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "本当にゴミ箱を空にしますか?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "ペーストし、移動(_S)" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "フォルダ移動バー" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "ホームフォルダ" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "デスクトップ" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "アプリケーション" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "ファイルシステムのルート" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "ボリュームをマウントする(_M)" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "ボリュームをマウント解除する(_U)" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "リムーバブル・メディアを取り出す(_E)" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "ボリュームをフォーマットする(_F)" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "ブックマークのアイテムの名前を変更する(_R)" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "ブックマークから削除する(_M)" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "ブックマークを上へ移動(_U)" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "ブックマークを下へ移動(_D)" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "ゴミ箱を空にする(_E)" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "よく使う場所・デバイス・ブックマークのリストをサイドバーで表示する" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "ブックマークのアイテムの名前を変更する" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "新しい名前を入力してください:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "ファイルタイプ: %s\n" "サイズ: %s\n" "更新時刻: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "ファイルタイプ: %s\n" "更新時刻: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "ファイル操作が終わる前にエラーが発生しました。" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "キャンセルされました" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "ファイル操作は完了しましたが、エラーがあります。" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "完了しました" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "ファイルシステムのサポートがないため、ゴミ箱へ移動できないファイルがありま" "す。\n" "かわりにこれらを削除しますか?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "中断(_P)" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "再開(_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "移動中" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "コピー中" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "ゴミ箱への移動中" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "削除中" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "シンボリック・リンクの作成中" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "ここに:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "ファイルへのリンクの作成中" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "属性変更中" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "ファイルの属性変更中" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "復元中" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "ファイルを%s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "ファイル操作の進行中..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "ファイルを%s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "ファイルを%s:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "オフ(_O)" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "場所(_P)" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "ディレクトリツリー(_D)" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "リモート(_R)" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "場所" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "ディレクトリツリー" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "フォルダの内容を表示する" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "%s を隠す(_H)" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "左へ移動(_M)" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "右へ移動(_R)" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "%s を表示する" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "幅を記憶しない(_F)" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "アイコン(_I)" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "コンパクト(_C)" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "サムネイル(_T)" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "詳細(_L)" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "アクティブなタブを切り替える" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "指定されたディレクトリ '%s' は無効です" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "リンク先のファイルにアクセスできません" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "ネイティブのファイルシステム以外ではリンクを作成できません" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "ゴミ箱のファイル '%s' を復元出来ません。元の場所が不明です" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "送り元と送り先が同一です。" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "フォルダをその下位フォルダに移動することはできません" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "フォルダをその下位フォルダにコピーすることはできません" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "送り先は送り元の下位フォルダです" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "ファイル '%s' をコピー出来ません: サポートされていません" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "表示名の設定は単一のファイルに対してのみ行えます" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "リンク先の設定は単一のファイルに対してのみ行えます" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML ファイル '%s' のエラー (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML ファイルがアプリケーションのルートを含んでいません" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "'%s' に対する XML 定義を作成できません" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "メニューパス '%s' は既に存在します" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "メニュー・キャッシュのエラー" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "不正なメニューディレクトリ" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "メニューアイテムは空にはできません" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "不正なメニューディレクトリ '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "不正なメニューアイテム" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "メニューアイテム '%s' には適切なエントリファイルがありません" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "メニューディレクトリについては隠し属性の変更はサポートされていません" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "属性 '%s' の設定はサポートされていません" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "属性 '%s' の不正な値です" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' はメニューディレクトリです" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' はメニューファイルではありません" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "エントリファイル '%s' は壊れています" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "メニューアイテム '%s' を作成できません" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "メニューディレクトリの名前は \".desktop\" で終わる必要があります" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "メニュールートに対する不正な操作です" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "不正な移動先です" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: フォルダ '%s' はメニューキャッシュに見つかりません" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "検索" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "検索結果" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "実行ファイルの選択" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "コマンド(_M):" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "アプリケーションのアイコンをダブルクリック時に実行するコマンド" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "説明(_E):" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "アプリケーションの一般名" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "作業ディレクトリ(_W):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "プログラムの実行時の作業ディレクトリ" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "ツールチップ(_T):" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "アプリケーションについてのツールチップ" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "スタートアップ通知を使用する(_U)" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "デスクトップエントリ(_D)" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "元に戻す(_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "ゴミ箱のファイルを元の場所に戻す" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "生成元のファイル名、あるいはデスクトップ ID" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "生成元" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "生成するファイル名" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "生成先" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM ディスク" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "空の CD-ROM ディスク" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R ディスク" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "空の CD-R ディスク" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW ディスク" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "空の CD-RW ディスク" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM ディスク" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "空の DVD-ROM ディスク" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW ディスク" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "空の DVD-RW ディスク" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM ディスク" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "空の DVD-RAM ディスク" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R ディスク" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "空の DVD+R ディスク" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW ディスク" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "空の DVD+RW ディスク" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL ディスク" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "空の DVD+R DL ディスク" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL ディスク" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "空の DVD+RW DL ディスク" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray ディスク" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "空の Blu-Ray ディスク" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R ディスク" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "空の Blu-Ray R ディスク" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW ディスク" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "空の Blu-Ray RW ディスク" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD ディスク" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "空の HD DVD ディスク" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R ディスク" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "空の HD DVD-R ディスク" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW ディスク" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "空の HD DVD-RW ディスク" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO ディスク" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "空の MO ディスク" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW ディスク" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "空の MRW ディスク" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W ディスク" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "空の MRW/W ディスク" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "音声ファイル(_A)" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "空の光ディスク" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "光ディスク" #~ msgid "File type to be opened:" #~ msgstr "開くファイルタイプ:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "処理中:" #~ msgid "Progress:" #~ msgstr "進行中:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "ファイル操作は完了しましたが、エラーがあります。" #~ msgid "Creating Symlinks" #~ msgstr "シンボリック・リンクの作成" #~ msgid "_Browse" #~ msgstr "ダイアログで選択(_B)" #~ msgid "My Computer" #~ msgstr "マイコンピュータ" #, fuzzy #~ msgid "_Move" #~ msgstr "左へ移動(_M)" #, fuzzy #~ msgid "_Trash" #~ msgstr "ゴミ箱" #~ msgid "_Only for this folder" #~ msgstr "このフォルダにのみ適用(_O)" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "グローバルでなくこのフォルダへの設定とする時はここをチェック" #~ msgid "Please select a folder" #~ msgstr "フォルダの選択" #~ msgid "Entry for folder path" #~ msgstr "フォルダへのパスを入力する" #, fuzzy #~ msgid "Computer" #~ msgstr "マイコンピュータ" #, fuzzy #~ msgid "Network Drives" #~ msgstr "ネットワーク" #~ msgid "_Run in terminal emulator" #~ msgstr "端末エミュレータで実行する(_R)" #~ msgid "_Keep terminal window open after run" #~ msgstr "実行が終わっても端末のウィンドウを開いておく(_K)" #~ msgid "Mount Point" #~ msgstr "マウントポイント" #~ msgid "Create _Symlink" #~ msgstr "シンボリック・リンクを作成する(_S)" #~ msgid "Se_nd To" #~ msgstr "送る(_N)" libfm-1.4.0/po/ka.po000066400000000000000000002000331475513661000141640ustar00rootroot00000000000000# Georgian translation for libfm. # Copyright (C) 2023 libfm' authors # This file is distributed under the same license as the libfm package. # Temuri Doghonadze , 2023. # msgid "" msgstr "" "Project-Id-Version: libfm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2023-07-30 18:12+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian <(nothing)>\n" "Language: ka\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-Generator: Poedit 3.3.2\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "სასურველი პროგრამები" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "აირჩიეთ აპლიკაციები, რომლებსაც ვებ-ბმულის ან ელფოსტის ბმულზე გამოვიძახებთ" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "მალსახმობების რედაქტორი" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "ახალი სამუშაო მაგიდის ელემენტის შექმნა ან არსებულის ჩასწორება" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "აირჩიეთ აპლიკაცია" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "აირჩიეთ აპლიკაცია მონიშნული ფაილების გასახსნელად" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_დაყენებული აპლიკაციები" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_გასაშვები ბრძანება:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "დ_ათვალიარება..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_ტერმინალის ემულატორში გაშვება" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_ტერმინალის ფანჯრის შენარჩუნება ბრძანების შენარჩუნების შემდეგ" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "ეს სპეციალური კოდები შეგიძლიათ ბრძანების სტრიქონშიც გამოიყენოთ:\n" " %f: წარმოადგენს ერთი ფაილის სახელს\n" " %F: წარმოარდენს ერთზე მეტი ფაილის სახელს\n" " %u: წარმოადგენს ერთი ფაილის URI-ის\n" " %U: წარმოადგენს ერთზემეტი ფაილის URI-ის" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "_აპლიკაციი სახელი (არასავალდებულოა, მხოლოდ იმისთვის, რომ დაიმახსოვროთ)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "ფაილების გასახსნელად პროგრამების ხელით მითითება" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_განსხვავებული ბრძანების გამოყენება" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "_ამ ფაილის ტიპისთვის მითითებული აპლიკაციის ნაგულისხმევ ქმედებად დაყენება" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "დაადასტურეთ ფაილის ჩანაცვლება" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_გამოტოვება" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_გადარქმევა" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_ზედგადაწერა" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "ამ ადგილას მითითებული სახელის მქონე ფაილი უკვე არსებობს.\n" "\n" "გნებავთ ჩაანაცვლოთ არსებული ფაილი" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "შემდეგი ფაილით?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "ფაილის _სახელი:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_ამ არჩევნის გამოყენება ყველა არსებულ ფაილზე" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "აირჩიეთ ხატულა..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "სისტემური ხატულის თემა" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "გამოსახულების ფაილები" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "აირჩიეთ ხატულები სიიდან:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "ფაილის შესრულება" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "ტერმინალში _გაშვება" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "ფაილის თვისებები" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "ფაილის ხატულა საქაღალდეების ხედში" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_სახელი:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "მდებარეობა:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "სამიზნე ფაილი:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "ფაილის ტიპი:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "გახსნა _პროგრამით:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "აირჩეით აპლიკაცია ამ ტიპის ფაილების გასახსნელად: " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "ფაილების რაოდენობა სულ:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "ფაილების ჯამური ზომა:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "ზომა დისკზე:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "ბოლო ცვლილება:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "ბოლო წვდომა:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "ბოლო წვდომის ცვლილება:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_ზოგადი" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_მფლობელი:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_ჯგუფი:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_შემცველობის ნახვა:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "შემცველობის შეცვლა:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_გაშვება:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "სპეციალური ბიტები:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "ვის შეუძლია ამ ფაილის/საქაღალდის შემცველობის წაკითხვა" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "ვის შეუძლია ამ ფაილის/საქაღალდის შემცველობის შეცვლა" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "ვის შეუძლია ამ ფაილის/საქაღალდის შემცველობის გაშვება" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "სპეც. ალმები ფაილის გასაშვებად" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "სპეც. ალმები საქაღალდესთან წვდომისთვის" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "წვდომის მართვა" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "დამალული ფაილი" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_წვდომები" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "არაფერი" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "წებოვანი" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "GID-ის დაყენება" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "წებოვნის და GID-ის დაყენება" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "UID-ის დაყენება" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "UID-ის და GID-ის დაყენება" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "მხოლოდ მფლობელი" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "მხოლოდ მფლობელი და ჯგუფი" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "ყველა" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "არავინ" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "ბაიტი" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "კბ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "მბ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "გბ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "აირჩიეთ თარიღი" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "აირჩეთ თარიღი შემდეგი კალენდრიდან" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "ფაილების ძებნა" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "ფაილის _სახელის ნიმუშები:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "ნიმუში ან POSIX-ის გარსის ნიმუშების სია (გამყოფად მძიმე ',' გამოიყენება) ან " "POSIX-ის რეგულარული გამოსახულებაა." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "რეგისტრზე _დამოკიდებული" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "რეგულარული გამოსახულებების _გამოყენება" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "ძებნის _ადგილები:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "ქვესაქაღლდეებში _ძებნა" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_დამალულ ფაილებში ძებნა" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "სახელი/_მდებარეობა" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "ფაილის ტიპი" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "მოძებნე მხოლოდ შემდეგი ტიპის ფაილები:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_ტექსტური ფაილები" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_გამოსახულების ფაილები" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_აუდიო ფაილები" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_ვიდეო ფაილები" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_დოკუმენტები" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_საქაღალდეები" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "სხ_ვა:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "აქ შეგიძლიათ ნებისმიერი სწორი შემცველობის ტიპი ჩაწეროთ. ვაილდკარდი '*' " "მხოლოდ ტიპის ბოლოში დაიშვება. ერთზე მეტი ტიპი შეგიძლიათ ';'-ით გამოყოთ." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "ფაილის _ტიპი" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "ფაილი _შეიცავს:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_შემცველობა" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "ფაილის ზომა" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_პატარა, ვიდრე:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_დიდი, ვიდრე:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "ბოლო ცვლილების დრო" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(არცერთი)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_არა უადრეს:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_არა უგვიანეს:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_თვისებები" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "ვებ ბროუზერი" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "რჩეული ბრაუზერი ჰიპერბმულების გასახსნელად." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "ელფოსტის კლიენტიი" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "ელფოსტის მისამართზე დაწკაპუნებისას ახალი ელფოსტის დასაწერად რჩეული ელფოსტის " "კლიენტი იქნება გამოყენებული." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "ტერმინალის ემულატორი" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "ბრძანების სტრიქონი:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "სისტემური აპლიკაციები" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "ფაილების ასოციაციები" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "ვის:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "მომზადება..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "გადაცემული მონაცემები:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "დარჩენილი დრო:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "აღმოჩენილი შეცდომები:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "ცარიელი მნიშვნელობა" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "არასწორი მონიშნული" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "ოპერაცია მხარდაუჭერელია" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "არასწორი სამუშაო მაგიდის ელემენტის ფაილი: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "ფაილის '%s' გასაშვებად მისი ტიპის დადგენა შეუძლებელია" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "URI-ს ტიპისთვის %s:// ნაგულისხმევი აპლიკაცია მითითებული არაა" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "სამუშაო საქაღალდის '%s'-ზე შეცვლა შეუძლებელია: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "MIME ტიპისთვის '%s' ნაგულისხმევი აპლიკაცია დაყენებული არაა" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "მოწყობილობები" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "ქსელი" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "ნაგვის ყუთი" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "მალსახმობი URI-მდე" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: არასწორი არგუმენტი" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "ტერმინალის ემულატორი libfm-ის კონფიგურაციაში მითითებული არაა" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "მინიატურების აპლიკაციის არასწორი აღწერა" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "კბ" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ტბ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u ბაიტი" msgstr[1] "%u ბაიტი" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "კიბ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "მიბ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "გიბ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ტიბ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI-ის ქვებილიკი '%s' არასწორ სპეციალურ სიმბოლოებს შეიცავს" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "დუბლირებული დამმუშავებელი ჭდისთვის <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "ვერ მუშავდება სტრიქონი '%-.*s', რომელშიც უნდა იყოს სიმბოლოს ნომერი " "(მაგალითად, ê): შესაძლოა რიცხვი მეტისმეტად დიდია" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "სიმბოლოს ნომერი არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში " "გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "სიმბოლოს ნომერი '%-.*s' დაუშვებელია" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "ცარიელი ერთეული \"&;\"; შესაძლო ერთეულებია: & " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "ელემენტის სახელი '%-.*s' უცნობია" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "ერთეული არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში " "გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "დამხურავ ჭდეში ცარიელ ადგილს ვერ დატოვებთ" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "ელემენტი '%s' დაიხურა, მაგრამ ელემენტი გახსნილი არ იყო" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "ელემენტი '%s' დაიხურა, მაგრამ ამჟამად ღია ელემენტია '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "ატრიბუტის მნიშვნელობის დასაწყისში სიმბოლო '%c' არასწორია" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "ატრიბუტის მნიშვნელობის დასაწყისში სიმბოლო '%c' არასწორია. მოველოდი: '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "დოკუმენტი მოულოდნელად დასრულდა" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "დოკუმენტი ცარიელია ან მხოლოდ ხარეებს შეიცავს" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML მონაცემების შეცდომა" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "მორგება" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "გამშვები ფაილები" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "აირჩიეთ პროგრამა \"%s\" ფაილების გასახსნელად" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "დაყენებული აპლიკაციები" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<ქვესაქაღალდეების გარეშე>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "იტვირთება..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "საქაღალდეების ხის ჩვენება გვერდით პანელში" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_გაუქმება" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_აქ კოპირება" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_აქ გადმოტანა" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "აქ _ბმულის შექმნა" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave ჩავარდა." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_გახსნა" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "_გამხსნელი პროგრამა..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "გამხსნელი პროგრამა" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "ბილიკების კოპირება" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_დამალვა" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_გამოჩენა" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "სანიშნეებში _დამატება" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "სახელის გადარქმევა..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_შეკუმშვა..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_აქ გაშლა" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_გაშლა…" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_თვისებები" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "_ნაგვის ყუთში გადატანა" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "თქვენს სანიშნეებში სანიშნე ამ საქაღალდისთვის უკვე არსებობს." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "გამოსახულების ფაილები" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "ბაიტი" msgstr[1] "ბაიტი" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "სკანირება...%d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "შეიყვანეთ სწორი მომხმარებლის სახელი ან რიცხვითი ID." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "შეიყვანეთ სწორი ჯგუფის სახელი ან რიცხვითი ID." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "გნებავთ ეს ცვლილებები ყველა ფაილებზე და ქვესაქაღალდეებზე რეკურსიულად " "გადაატაროთ?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "ფაილის დამალვა ან გამოჩენა" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "ფაილი დამალულია, რადგან მისი სახელი წერტილით ('.') იწყება." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "ფაილები ამ ფაილურ სისტემაზე დამალულია, თუ მათი სახელი წერტილით ('.') იწყება. " "დამალული ფაილების ჩვენების გადასართავად გამოიყენეთ." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "სკანირება..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_შემცველობასთან წვდომა:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "განსხვავებული ტიპის ფაილები" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "ფაილი:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "ერთზე მეტი ფაილი" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "სახელი" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "აღწერა" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "ზომა" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "წვდომები" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "მფლობელი" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "შეცვლილია" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "მდებარეობა" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "გაფართოება" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "ახლის _შექმნა..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "საქაღალდე" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "ცარიელი ფაილი" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_მონიშვნის ინვერსია" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_ფაილების დალაგება" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "საქაღალდის სახელის შეცვლა..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "საქაღალდის _თვისებები" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_დამალულების ჩვენება" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "ფაილების და საქაღალდეების _შერევა" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "სახელის რეგისტრის _იგნორი" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "_სახელით" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "_ცვლილების დროით" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "ზომ_ის მიხედვით" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "_ფაილის ტიპით" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "შეიყვანეთ ახალი საქაღალდის სახელი:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "ახალი საქაღალდის შექმნა" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "შეიყვანეთ სახელი ცარიელი ფაილისთვის:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "შექმნა..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "ახალი" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "შეიყვანეთ სახელი ახალი '%s'-სთვის:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s-ის შექმნა" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "შექმნის შემდეგ ფაილზე ნაგულისხმევი აპლიკაციის _გაშვება" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "ტექსტური ფაილი '%s' გამშვებ სკრიპტს წააგავს.\n" "რა გნებავთ, მას უქნათ?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "ფაილი '%s' გამშვებია. გნებავთ, გაუშვათ ის?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "საქაღალდეები მითითებული არაა." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "აირჩიეთ საქაღალდე" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "შეცდომა" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "დადასტურება" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "კითხვა" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "ამის გაკეთების უფლება მხოლოდ სისტემურ ადმინისტრატორს გააჩნია." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "მართლა გნებავთ ფაილის '%s' ნაგვის ყუთში გადატანა?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "მართლა გნებავთ %d მონიშნული ფაილის სანაგვე ყუთში გადატანა?" msgstr[1] "მართლა გნებავთ %d მონიშნული ფაილის სანაგვე ყუთში გადატანა?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "მართლა გნებავთ ამ ფაილის ('%s') წაშლა?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "მართლა გნებავთ %d მონიშნული ფაილის წაშლა?" msgstr[1] "მართლა გნებავთ %d მონიშნული ფაილის წაშლა?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "ფაილის გადარქმევა" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "შეიყვანეთ ახალი სახელი:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, გაასუფთაოთ ნაგვის ყუთი?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "_ჩასმა და გადასვლა" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "საქაღალდის მდებარეობის ზოლი" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "საწყისი საქაღალდე" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "სამუშაო მაგიდა" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "აპლიკაციები" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "ფაილური სისტემის საწყისი საქაღალდე" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "ტომის _მიმაგრება" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_ტომის მოხსნა" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "მოხსნადი დისკის _გამოღება" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "დანაყოფის _ფორმატირება" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_სანიშნის გადარქმევა" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "სანიშნეებიდან _წაშლა" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "სანიშნეს _აწევა" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "სანიშნეს _დაწევა" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "ნაგვის ყუთის _დაცარიელება" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "გვერდით ზოლში ჩვეულებრივი ადგილების, მოწყობილობებისა და სანიშნეების სიის " "ჩვენება" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "სანიშნის გადარქმევა" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "შეიყვანეთ ახალი სახელი:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "ტიპი: %s\n" "ზომა: %s\n" "ცვლილება: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "ტიპი: %s\n" "შეიცვალა: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "დაფიქსირდა შეცდომები ფაილის ოპერაციის გაჩერებამდე." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "გაუქმებულია" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "ფაილის ოპერაცია შეცდომებით დასრულდა." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "დასრულებულია" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "ზოგიერთი ფაილის ნაგვის ყუთში გადატანა შეუძლებელია, რადგან ფაილურ სისტემებს, " "რომლებზეც ისინი მდებარეობს, ამის მხარდაჭერა არ გააჩნიათ.\n" "გნებათ, წაშალოთ ისინი?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_შეჩერება" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_გაგრძელება" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "გადატანა" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "კოპირება" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "ნაგვის ყუთში გადატანა" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "წაშლა" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "ბმულის შექმნა" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "სად:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "ფაილებამდე ბმულების შექმნა" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "ობიექტის ატრიბუტების შეცვლა" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "ფაილის ატრიბუტების შეცვლა" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "აღდგენა" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s ფაილი" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "მიმდინარეობს ფაილის ოპერაცია..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s ფაილი:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s ფაილი:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_გამორთ" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_მდებარეობები" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_საქაღალდეების ხე" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_დაშორებული" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "ადგილები" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "საქაღალდეების ხე" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "საქაღალდის შემცველობის ხედი" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "%s-ის _დამალვა" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_მარცხნივ გაწევა" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "მარჯვნივ _გაწევა" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "%s-ის ჩვენება" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_სიგანის დავიწყება" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_ხატულების ხედი" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_კომპაქტური ხედი" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "მინიატურის ხედ_ი" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "დეტალური ჩამ_ონათვალის ხედი" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "შეცვლის აქტიურ ჩანართს" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "მითითებული საქაღალდე '%s' არასწორია" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "სამიზნე ფაილთან წვდომა აკრძალულია" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "არა-საკუთარ ფაილურ სისტემებზე ბმულის შექმნა შეუძლებელია" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "ფაილის '%s' სანაგვე ყუთიდან ამოღება შეუძლებელია: საწყისი ბილიკი უცნობია" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "სამიზნე არ არსებობს" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "წყარო და სამიზნე ფაილი ერთი და იგივეა." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "საქაღალდის თავისივე ქვესაქაღალდეში გადატანა შეუძლებელია" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "საქაღალდის თავისივე ქვესაქაღალდეში კოპირება შეუძლებელია" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "სამიზნე საქაღალდე წყაროს ქვესაქაღალდეა" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "ფაილის '%s' კოპირება შეუძლებელია: მხარდაჭერილი არაა" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "საჩვენებელი სახელის დაყენება მხოლოდ ერთ ფაილზე შეგიძლიათ" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "სამიზნის დაყენება მხოლოდ ერთ ფაილზე შეგიძლიათ" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML ფაილის '%s' შეცდომა (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML ფაილს აპლიკაციის ძირითად ჭდეს არ შეიცავს" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "'%s'-სთვის XML აღწერის შექმნა შეუძლებელია" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "მენიუს ბილიკი '%s' უკვე არსებობს" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "მენიუს კეშის შეცდომა" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "არასწორი მენიუს საქაღალდე" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "მენიუს პუნქტის სახელი ცარიელი ვერ იქნება" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "არასწორი მენიუს საქაღალდე '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "არასწორი მენიუს პუნქტი" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "მენიუს პუნქტს '%s' შესაბამისი ელემენტის ფაილი არ გააჩნია" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "დამალულობის სტატუსის ცვლილება მენიუს საქაღალდეზე მხარდაჭერილი არაა" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "ატრიბუტის (%s) დაყენება მხარდაუჭერელია" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "არასწორი მნიშვნელობა ატრიბუტისთვის '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' მენიუს საქაღალდეა" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' მენიუს პუნქტი არაა" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "ელემენტი '%s' გაფუჭებულია" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "მენიუს პუნქტი '%s' ვერ შევქმენი" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "მენუს საქაღალდის სახელი '.desktop'-ით არ უნდა მთავრდებოდეს" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "არასწორი ოპერაცია ძირითად მენიუზე" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "არასწორი სამიზნე" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: საქაღალდე '%s' მენიუს კეშში აღმოჩენილი არაა" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "ძებნა" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "ძებნს შედეგები" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "აირჩიეთ გამშვები ფაილი" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_ბრძანება:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "ბრძანება, რომელიც აპლიკაციის ხატულის აქტივაციისას გაეშვება" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_აღწერა:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "აპლიკაციის ზოგადი სახელი" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_სამუშაო საქაღალდე:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "სამუშაო საქაღალდე, რომლიდანაც პროგრამა გაეშვება" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_მინიშნება:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "აპლიკაციაზე ნაჩვენები მინიშნება" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_გაშვების გაფრთხილების გამოყენება" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_სამუშაო მაგიდის ელემენტი" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_აღდგენა" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "ნაგავში ჩაგდებული ფაილის საწყის მდებარეობაზე აღდგენა" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "საწყისი ფაილის სახელი ან სამუშაო მაგიდის ID" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "წყარო" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "შედეგების ფაილის სახელი" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "შედეგი" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM დისკი" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "ცარიელი CD-ROM დისკი" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R დისკი" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "ცარიელი CD-R დისკი" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW დისკი" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "ცარიელი CD-RW დისკი" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM დისკი" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "ცარიელი DVD-ROM დისკი" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW დისკი" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "ცარიელი DVD-RW დისკი" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM დისკი" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "ცარიელი DVD-RAM დისკი" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R დისკი" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "ცარიელი DVD+R დისკი" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW დისკი" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "ცარიელი DVD+RW დისკი" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL დისკი" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "ცარიელი DVD+R DL დისკი" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL დისკი" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "ცარიელი DVD+RW DL დისკი" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray დისკი" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "ცარიელი Blu-Ray დისკი" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R დისკი" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "ცარიელი Blu-Ray R დისკი" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW დისკი" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "ცარიელი Blu-Ray RW დისკი" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD დისკი" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "ცარიელი HD DVD დისკი" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R დისკი" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "ცარიელი HD DVD-R დისკი" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW დისკი" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "ცარიელი HD DVD-RW დისკი" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO დისკი" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "ცარიელი MO დისკი" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW დისკი" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "ცარიელი MRW დისკი" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W დისკი" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "ცარიელი MRW/W დისკი" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_აუდიო ფაილები" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "ცარიელი ოპტიკური დისკი" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "ოპტიკური დისკი" libfm-1.4.0/po/kk.po000066400000000000000000001656031475513661000142130ustar00rootroot00000000000000# Kazakh translation for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Baurzhan Muftakhidinov , 2012. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-04-14 01:57+0000\n" "Last-Translator: Baurzhan Muftakhidinov \n" "Language-Team: Kazakh \n" "Language: kk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1523671063.206535\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Таңдамалы қолданбалар" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Веб сілтемесі не эл. пошта адресі шертілген кезде ашылатын қолданбаларды " "таңдау" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Жарлықтар түзетушісі" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Жаңа desktop элементін жасау немесе бар болып тұрғанды өзгерту" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Қолданбаны таңдаңыз" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Таңдалған қолданбаны файлдарды ашу үшін қолдану" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Орнаты_лған қолданбалар" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Орындалатын командалық жол:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Шолу..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Терминал эмуляторында ор_ындау" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Команда орындалғаннан кейін де терминалды а_шық қалдыру" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Бұл арнайы кодтарты командалық жолда қолдануға болады:\n" " %f: Бір файл атын сипаттайды\n" " %F: Бірнеше файлдар аттарын сипаттайды\n" " %u: Файлдың бірлік URI-ін сипаттайды\n" " %U: Бірнеше URI сипаттайды" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Қо_лданба атауы (міндетті емес, шатаспау үшін)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Файлдарды ашу үшін таңдауыңызша командалық жолды орындау" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Таң_дауыңызша командалық жол" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Таңдалған қолданбаны файлдардың осы түрі үшін негізгі ретінде ор_нату" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Файлдарды алмастыруды растау" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "А_ттап кету" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Атын ауысты_ру" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "Үстінен _жазу" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Бұл жерде осындай аты бар файл бар болып тұр.\n" "\n" "Бар болып тұрған файлды алмастыруды қалайсыз ба" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "келесі файлмен?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Файл аты:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Бұл опцияны барлық бар файлдарға іске а_сыру" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Таңбашаны таңдаңыз..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "жүйелік таңбашалар темасы" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "сурет файлдары" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Таңбашаны келесіден таңдау:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Файлды орындау" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Тер_миналды орындау" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Файл қасиеттері" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Бумалар көрінісінде файл таңбашасы" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "А_ты:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Орналасуы:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Мақсат файлы:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Файл түрі:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Кө_мегімен ашу:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Бұл түрдегі файлдарды ашу үшін қолданбаны көрсетіңіз" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Файлдар саны:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Файлдардың сомаланған өлшемі:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Дисктегі өлшемі:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Соңғы өзгерту:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Соңғы қатынау:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Құқықтардың соңғы өзгерісі:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "Жал_пы" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Иесі:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "То_бы:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Құр_амасын қарау:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Құрамасын тү_зету:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "О_рындау:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Арнайы биттер:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Файл/бума құрамасын кім оқи алады" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Файл/бума құрамасын кім өзгерте алады" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Файлды кім орындай алады не бумаға кім кіре алады" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Файл орындалуы үшін арнайы жалаушалар" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Бумаға қатынау үшін арнайы жалаушалар" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Рұқсаттарды басқару" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Жасырын файл" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Рұқсаттар" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ешнәрсе" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Байланыс биті" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Set GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky & set GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "UID орнату" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Set UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Тек иесі" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Тек иесі мен тобы" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Әркім" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ешкім" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Байт" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "КБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Күнді таңдаңыз" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Күнтізбеден күнді таңдаңыз" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Файлдарды іздеу" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Файл а_таудың шаблондары:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Өрнек не POSIX өрнектері тізімі (үтірлермен ажыратылған) не POSIX тұрақты " "өрнегі болуы мүмкін." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Регистрге тәу_елсіз" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Тұрақты өрнектерді қо_лдану" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "І_здеу үшін орындар" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Ішкі бумалардан і_здеу" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Жас_ырын файлдарды іздеу" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Аты/Орна_ласуы" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Файл түрі" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Тек келесі түрдегі файлдарды іздеу:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Мә_тіндік файлдар" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "С_урет файлдары" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Аудио файлдары" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Видео файлдары" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "Құ_жаттар" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Бума_лар" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Ба_сқа:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Файлдың керек түрін енгізіңіз. '*' үлгісі түр соңында рұқсат етілген. " "Бірнеше түрді ';' көмегімен ажырату керек." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Файл _түрі" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Файл құрам_ында бар" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Құра_масы" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Файл өлшемі" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Келесіден кі_шірек:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Келесіден ү_лкенірек:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Соңғы өзгерту уақыты" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ешнәрсе)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Келесіден ер_терек:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Келесіден ке_інірек:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Қас_иеттері" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Веб браузері" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Веб сілтемелерін ашу үшін таңдамалы веб браузері." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Эл. пошта қолданбасы:" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Таңдамалы пошта қолданбасы сіз эл. пошта адресіне шерткен кезде эл. хатты " "жазу үшін қолданылады." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Терминал эмуляторы" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Командалық жол:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Жүйелік қолданбалар" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Файлдар сәйкестіктері" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Қайда:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Дайындау..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Тасымалданған деректер:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Қалған уақыты:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Бірнеше қате орын алды:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Бос мән" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Таңдау қате" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Әрекетке қолдау жоқ" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Жұмыс үстел файлы қате: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "'%s' файлын жөнелту үшін оның түрін анықтау мүмкін емес" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "URI %s:// түріндегі сілтемелерді жөнелту үшін үнсіз келісім қолданбасы " "орнатылмады" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Жұмыс бумасын '%s' етіп орнату қатесі: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "%s MIME түрі үшін үнсіз келісім бойынша қолданба табылмады" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Құрылғылар" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Желі" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Қоқыс шелегі" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI үшін жарлық" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: қате аргумент" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "libfm баптауларында терминал эмуляторы көрсетілмеген" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Кіші көріністерді жасайтын қолданбаның анықтамасы қате" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "КБ" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "КиБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МиБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГиБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТиБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI ішкі '%s' жолында экрандалған таңбалар бар" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "<%s> тегі үшін қайталанатын өндеуші" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "«%-.*s» жолын талдау қатесі, ол таңбаға (мыс. ê) сілтеменің ішіндегі " "сан болуы тиіс — мүмкін, нөмір тым үлкен" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Таңбаға сілтеме нүктелі үтірмен аяқталып тұрған жоқ; «&» таңбасы өрнектің " "басы ретінде емес қолданылған — оны «&» ретінде көрсетіңіз" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "«%-.*s» таңбаға сілтемесі рұқсат етілген таңбаны анықтап тұрған жоқ" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "«&;» бос өрнегі табылды; рұқсат етілген өрнектер: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "«%-.*s» өрнегінің аты белгісіз" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Таңбаға сілтеме нүктелі үтірмен аяқталып тұрған жоқ; «&» таңбасы өрнектің " "басы ретінде емес қолданылған — оны «&» ретінде көрсетіңіз" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Жабылу тегінде бос аралыққа рұқсат етілмеген" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "«%s» элементі жабылды, бірақ бірде-бір элемент ашық болмаған" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "«%s» элементі жабылды, бірақ ағымдағы ашық элемент «%s» болып тұр" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Атрибут мәнінің басында қате «%c» таңбасы" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Атрибут мәнінің аяғында қате «%c» таңбасы, күтілген «%c»" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Құжат күтпегенде аяқталды" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Құжат бос болды немесе оның құрамында тек бос аралықтар болды" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML деректер қатесі" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Баптау" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Орындалатын файлдар" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "\"%s\" файлдарын ашу үшін қолданбаны таңдаңыз" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Орнатылған қолданбалар" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Ішкі бумалары жоқ>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Жүктелуде..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Бүйір панелінде бумалар ағашын көрсету" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "Ба_с тарту" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Осында _көшіру" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "Осында жы_лжыту" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Сі_лтемені жасау" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave сәтсіз." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "А_шу" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Көме_гімен ашу..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Көме_гімен ашу..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Файл(дар) ж_ол(дар)ын көшіру" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Жа_сыру" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Көр_сету" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Б_етбелгілерге қосу" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Атын ауысты_ру..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "С_ығу..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Осын_да тарқату" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Қайда та_рқату..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Қас_иеттері" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Қоқы_с шелегіне тастау" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Бұл бума бетбелгілерде бар болып тұр." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Сурет файлдары" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "байт" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "сканерлеу... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Дұрыс пайдаланушы атын не сандық id енгізіңіз." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Дұрыс топ атын не сандық id енгізіңіз." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Бұз өзгерістерді рекурсивті түрде барлық ішкі файлдар мен бумаларға іске " "асыруды қалайсыз ба?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Файлды жасыру немесе көрсету" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Бұл файл жасырын, өйткені оның аты нүктеден басталады ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Бұл жүйеде файлдар атауы нүктеден басталса ('.'), олар жасырын болады. " "Жасырын файлдарды көрсетуді іске қосу/сөндіру үшін басыңыз." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "сканерлеу..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Құрамаға қ_атынау:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Әр түрлі түрдегі файлдар" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Файл:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Бірнеше файлдар" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Аты" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Сипаттамасы" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Өлшемі" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Рұқсаттары" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Иесі" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Өзгертілген" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Орналасуы" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Кеңейту" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "_Жаңа жасау..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Бума" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Бос файл" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Таңдауды тері_стеу" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Фа_йлдарды сұрыптау" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Бума атын ау_ыстыру..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Файл қаси_еттері" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Жа_сырынды көрсету" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Файл мен бумаларды ара_ластырып көрсету" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Атаудың регистрін еле_меу" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "А_ты бойынша" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Өз_гертілген уақыты бойынша" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Өлше_мі бойынша" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Фай_л түрі бойынша" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Жаңадан жасалып жатқан бума атын енгізіңіз:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Жаңа буманы жасау" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Жаңа бос файл атын енгізіңіз:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Жасалуда ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Жаңа" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Жаңа %s үшін атын енгізіңіз:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Жасалуда %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Файлды жасағаннан кейін үнсіз келісім бойынша қолданбаны жө_нелту" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "'%s' мәтіндік файлы орындалатын скрипт сияқты.\n" "Онымен не жасауды қалайсыз?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "'%s' файлы - орындалатын файл. Оны жөнелтуді қалайсыз ба?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Ешбір бума көрсетілмеді." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Буманы тандаңыз" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Қате" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Растау" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Сұрақ" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Бұны тек жүйелік әкімшілер жасай алады." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "'%s' файлын қоқыс шелегіне тастауды қалайсыз ба?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Ерекшеленген %d файлды қоқыс шелегіне тастауды қалайсыз ба?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "'%s' файлын өшіруді қалайсыз ба?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Ерекшеленген %d файлды өшіруді қалайсыз ба?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Файл атын ауыстыру" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Жаңа атын енгізіңіз:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Қоқыс шелегін тазартуды шынымен қалайсыз ба?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Кірі_стіру және өту" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Бума орналасуын енгізу панелі" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Үй бумасы" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Жұмыс үстелі" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Қолданбалар" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Файлдық жүйе түбірі" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Бө_лімді тіркеу" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Бөлімді тіркеуден _босату" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Ауыстырмалы тасушыны _шығару" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "Бөлімді пі_шімдеу" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Бетбелгі а_тауын өзгерту" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Бетбелгілерден ө_шіру" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Бетбелгіні ж_оғары жылжыту" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Бетбелгіні тө_мен жылжыту" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Қоқыс шелегін та_зарту" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Қалыпты орналасулар, құрылғылар және бетбелгілер тізімін бүйір панелінде " "көрсетеді" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Бетбелгі атауын өзгерту" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Жаңа атын енгізіңіз:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Түрі: %s\n" "Өлшемі: %s\n" "Өзгертілген: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Түрі: %s\n" "Өзгертілген: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Файлдармен әрекет аяқталуға дейін қателер орын алды." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Бас тартылған" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Файлдармен әрекет қателермен аяқталды." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Аяқталған" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Бірнеше файлдарды қоқыс шелегіне тастау мүмкін емес, өйткені олар орналасқан " "файлдық жүйе бұл әрекетті қолдамайды.\n" "Оларды өшіруді қалайсыз ба?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Аялдату" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "Жа_лғастыру" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Жылжыту" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Көшіру" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Қоқыс шелегіне тастау" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Өшіру" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Сілтемені жасау" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Қайда:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Файлдарға сілтемелерді жасау" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Атрибуттарын өзгерту" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Файлдар атрибуттарын өзгерту" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Қалпына келтіру" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s файл" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Файлдармен әрекет жүруде..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s файл:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s файл:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Сөнд" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "Орын_дар" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Бу_малар ағашы" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Ка_шықтағы" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Орындар" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Бумалар ағашы" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Бума құрамасының көрінісі" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "%s _жасыру" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Солға жы_лжыту" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "_Оңға жылжыту" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "%s көрсету" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "Е_нін ұмыту" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Таң_башалар көрінісі" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Ық_шам көрінісі" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Кіші көрініс_тер" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "То_лық тізім көрінісі" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Белсенді бетті өзгертеді" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Көрсетілген '%s' бумасы жарамсыз" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Мақсат файлына қатынау мүмкін емес" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Бөтен файлдық жүйесінде сілтемені жасау мүмкін емес" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "'%s' файлын қоқыс шелегінен қалпына келтіру мүмкін емес: бастапқы орналасуы " "белгісіз" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Мақсаты жоқ болып тұр" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Қайнар көзі мен мақсаты бірдей болып тұр." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Буманы оның ішкі бумасына жылжыту мүмкін емес" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Буманы оның ішкі бумасына көшіру мүмкін емес" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Мақсат бумасы қайнар көздің ішкі бумасы болып тұр" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "'%s' файлын көшіру мүмкін емес: қолдауы жоқ" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Көрсетілетін атын орнату тек бірлік файл үшін орындауға болады" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Мақсат атын орнату тек бірлік файл үшін орындауға болады" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML файлының '%s' қатесі (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML файлында Applications түбірі" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "«%s» үшін XML анықтамасын жасау мүмкін емес" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "«%s» мәзір жолы бар болып тұр" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Мәзір кэшінің қатесі" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Мәзір бумасы қате" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Мәзір элементінің аты бос болмауы тиіс" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "'%s' мәзірлер бумасы жарамсыз" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Мәзір элементі қате" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "«%s» мәзір элементінде сәйкес келетін жазба файлы жоқ" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Мәзір бумасы үшін жасырын жалаушасын ауыстыруға қолдау жоқ" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "'%s' атрибутын орнатуына қолдау жоқ" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "'%s' атрибуты үшін мәні қате" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' мәзір бумасы болып тұр" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' мәзір элементі емес" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' элемент файлы жарамсыз" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "'%s' мәзір элементін жасау мүмкін емес" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Мәзір бумасының атауы \".desktop\" аяқталмауы тиіс" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Мәзір түбірімен қате әрекет" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Мақсат орналасуы қате" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: '%s' бумасы мәзір кэшінен табылмады" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Іздеу" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Іздеу нәтижелері" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Орындалатын файлды таңдаңыз" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ко_манда:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Қолданба таңбашасы белсендірілген кезде орындалатын команда" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "Си_паттамасы:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Қолданбаның жалпы аты" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Жұмы_с бумасы:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Бағдарлама жөнелтілетін жұмыс бумасы" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Қалқ_ымалы кеңес:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Қолданба үшін көрсетілетін қалқымалы кеңес" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Іске қосылу хабарламасын қол_дану" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Жұ_мыс үстелі элементі" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "Қал_пына келтіру" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Қоқыс шелегіндегі файлдарды бастапқы орындарына қайтару" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "қайнар көз файл атауы немесе desktop id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ҚАЙНАР_КӨЗІ" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "мақсат файлдың атауы" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "НӘТИЖЕ" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM дискі" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Таза CD-ROM дискі" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R дискі" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Таза CD-R дискі" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW дискі" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Таза CD-RW дискі" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM дискі" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Таза DVD-ROM дискі" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW дискі" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Таза DVD-RW дискі" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM дискі" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Таза DVD-RAM дискі" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R дискі" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Таза DVD+R дискі" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW дискі" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Таза DVD+RW дискі" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL дискі" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Таза DVD+R DL дискі" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL дискі" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Таза DVD+RW DL дискі" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray дискі" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Таза Blu-Ray дискі" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R дискі" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Таза Blu-Ray R дискі" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW дискі" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Таза Blu-Ray RW дискі" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD дискі" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Таза HD DVD дискі" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R дискі" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Таза HD DVD-R дискі" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW дискі" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Таза HD DVD-RW дискі" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO дискі" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Таза MO дискі" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW дискі" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Таза MRW дискі" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W дискі" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Таза MRW/W дискі" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Аудио файлдары" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Таза оптикалық дискі" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Оптикалық дискі" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Ашылатын файл түрі:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Өңделуде:" #~ msgid "Progress:" #~ msgstr "Барысы:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Файлдар әрекеті аяқталды, бірак бірнеше қателер бар." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Сілтемелерді жасау" #~ msgid "_Browse" #~ msgstr "Қара_п шығу" #~ msgid "My Computer" #~ msgstr "Менің компьютерім" #~ msgid "_Move" #~ msgstr "Жылж_ыту" #~ msgid "_Trash" #~ msgstr "Қоқыс шелегіне тас_тау" #~ msgid "_Only for this folder" #~ msgstr "Т_ек осы бума үшін" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Глобалды баптауларды өзгертпей, бұл бума үшін баптауларды сақтау" #~ msgid "Please select a folder" #~ msgstr "Буманы таңдаңыз" #~ msgid "Entry for folder path" #~ msgstr "Бума жолы" #~ msgid "Computer" #~ msgstr "Компьютер" #~ msgid "Network Drives" #~ msgstr "Желілік дискілер" #~ msgid "_Run in terminal emulator" #~ msgstr "Терминал эмуляторында ор_ындау" #~ msgid "_Keep terminal window open after run" #~ msgstr "Команда орындалғаннан кейін де терминалды а_шық қалдыру" #~ msgid "Shortcuts" #~ msgstr "Жарлықтар" #~ msgid "Mount Point" #~ msgstr "Тіркелу нүктесі" #~ msgid "Create _Symlink" #~ msgstr "_Сілтемені жасау" #~ msgid "Se_nd To" #~ msgstr "Қайда _жіберу" #~ msgid "Empty tag" #~ msgstr "Бос тегі" #~ msgid "Tag should have exactly one child" #~ msgstr " тегінде тек бір ғана ұрпақ болуы тиіс" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ " тегінде тек , , не ұрпақтары болуы " #~ "тиіс" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Біріктіру файлында тек жоғары деңгейлі тегі болуы тиіс, <%s> алынды" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "<%s> тегін біріктіру файлынан кірістіру сәтсіз аяқталды" #~ msgid "Invalid tag" #~ msgstr " тегі қате" #~ msgid "Invalid tag" #~ msgstr " тегі қате" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "XML анықтамаларында %s жолын табу мүмкін емес" #~ msgid "Category manipulation internal error" #~ msgstr "Санатпен әрекетінде ішкі қатесі" #~ msgid "Blank File" #~ msgstr "Бос файл" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Қате, lxshortcut орнатылмаған" #~ msgid "Failed to start lxshortcut" #~ msgstr "lxshortcut жөнелту сәтсіз" #~ msgid "_Group:" #~ msgstr "_Тобы:" #~ msgid "Rename" #~ msgstr "Атын ауыстыру" #~ msgid "Make the file executable" #~ msgstr "Файлды орындалатын етіп белгілеу" #~ msgid "Operations that all other users can do" #~ msgstr "Барлық басқа пайдаланушылар жасай алатын әрекеттер" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Файл иесі жасай алатын әрекеттер" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Файл иесімен бір топқа жататын пайдаланушылар жасай алатын әрекеттер" #~ msgid "Read and Write" #~ msgstr "Оқу мен жазу" #~ msgid "Read only" #~ msgstr "Тек оқу" #~ msgid "Write only" #~ msgstr "Тек жазу" libfm-1.4.0/po/ko.po000066400000000000000000001431241475513661000142110ustar00rootroot00000000000000# Korean translation for the libfm package. # Copyright (C) 2009-2012 Free software foundation Inc. # This file is distributed under the same license as the libfm package. # Seo Sanghyeon , 2011. # Seong-ho Cho , 2012-2014. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-07-20 13:36+0000\n" "Last-Translator: Seong-ho Cho \n" "Language-Team: Seong-ho Cho \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1437399391.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "기본 프로그램" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "웹 링크 또는 전자메일 주소를 누를때 호출할 프로그램을 선택하십시오" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "바로 가기 편집기" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "기존 데스크톱 항목을 새로 만들거나 바꿉니다" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "프로그램 선택" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "파일을 열 때 선택한 프로그램 사용" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "설치한 프로그램(_I)" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "실행할 명령 줄(_O):" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "찾아보기(_B)..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "터미널 에뮬레이터에서 실행(_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "명령 실행 후 터미널 창 열기 유지(_K)" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "아래 특별한 코드는 명령줄에서 사용할 수 있습니다:\n" " %f: 하나의 파일 이름을 나타냅니다\n" " %F: 여러 개의 파일 이름을 나타냅니다\n" " %u: 하나의 파일에 대한 URI를 나타냅니다\n" " %U: 여러 개의 URI를 나타냅니다" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "프로그램 이름(옵션, 관련을 유지하게 설정하십시오)(_A)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "파일을 열 기 위해 사용자 정의 명령줄 실행" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "사용자 정의 명령줄(_U)" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "선택한 프로그램을 이 파일에 대한 기본 동작으로 설정(_S)" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "파일 바꾸기 확인" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "건너뛰기(_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "이름 바꾸기(_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "덮어쓰기(_O):" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "이 위치에 같은 이름의 파일이 존재합니다\n" "\n" "기존의 파일을 바꾸시겠습니까" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "다음 파일에 대해 적용하시겠습니까?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "파일 이름(_F):" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "모든 존재하는 파일에 이 옵션 적용(_A)" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "아이콘을 선택하십시오..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "시스템 아이콘 테마" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "그림 파일" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "다음에서 아이콘 선택:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "파일 실행" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "터미널에서 실행(_T)" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "파일 속성" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "폴더 보기에서의 파일 아이콘" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "이름(_N):" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "위치:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "대상 파일:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "파일 형식:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "다음으로 열기(_W):" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "이 형식의 파일을 열 프로그램을 선택하십시오 " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "파일 총 갯수:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "파일의 총 크기:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "디스크상 용량:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "최종 수정:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "최종 접근:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "최종 권한 바꿈:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "일반(_G)" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "소유자(_W):" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "그룹(_R):" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "내용 보기(_V):" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "내용 바꾸기(_H):" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "실행(_E):" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "특수 비트:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "파일/디렉터리 내용을 볼 수 있는 사람" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "파일/디렉터리의 내용을 바꿀 수 있는 사람" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "파일을 실행하거나 디렉터리에 들어갈 수 있는 사람" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "파일 실행을 위한 특수 플래그" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "디렉터리 접근을 위한 특수 플래그" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "접근 제어" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "숨김 파일" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "권한(_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "없음" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "끈적이" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "GID 설정" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "끈적이와 GID 설정" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "UID 설정" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "UID와 GID 설정" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "소유자만" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "소유자와 그룹만" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "아무나" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "허용 안함" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "바이트" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "날짜 선택" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "다음 달력에서 날짜를 선택하십시오" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "파일 검색" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "파일 이름 패턴(_N):" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "패턴은 포직스 쉘 패턴 목록(','를 구분 문자로 사용) 또는 포직스 정규표현식이 " "되어야 합니다." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "대소문자 구별 안함(_V)" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "정규표현식 사용(_U)" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "검색 위치(_E):" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "하위 디렉터리 검색(_S)" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "숨겨진 파일 검색(_H)" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "이름/위치(_L)" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "파일 형식" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "다음 형식의 파일만 검색:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "텍스트 파일(_X)" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "그림 파일(_I)" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "오디오 파일(_A)" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "동영상 파일(_V)" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "문서(_D)" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "폴더(_R)" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "기타(_H):" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "유효한 내용 형식을 여기에 입력할 수 있습니다. 와일드카드 문자 '*'는 형식 마지" "막 부분의 입력을 허용합니다. 다중 형식은 ';'으로 구분해야 합니다." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "파일 형식(_T)" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "파일 내용(_S):" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "내용(_O)" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "파일 용량" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "다음보다 작은 것(_S):" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "다음보다 큰 것(_B):" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "최종 수정 일시" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(없음)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "다음보다 먼저 만들어짐(_E):" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "다음보다 늦게 만들어짐(_A):" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "속성(_P)" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "웹 브라우저" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "하이퍼 링크를 열 때 사용할 기본 웹 브라우저 입니다." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "메일 클라이언트" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "전자메일 주소를 눌렀을 때 메일 작성시 기본으로 사용할 기본 메일 클라이언트 입" "니다." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr " 터미널 에뮬레이터 " #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "명령 줄:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "시스템 프로그램" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "파일 연계" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "대상:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "준비중..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "대상 파일:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "남은 시간:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "오류 발생:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "빈 파일" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "잘못된 대상입니다" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "동작을 지원하지 않습니다" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "%s 파일 이름이 잘못되었습니다" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "실행할 '%s' 파일 내용 형식을 판단할 수 없습니다" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "%s:// URI를 실행할 기본 프로그램을 설정하지 않았습니다" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "작업 디렉터리를 '%s'(으)로 설정할 수 없습니다: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "%s MIME 형식에 대한 기본 프로그램을 설정하지 않았습니다" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "장치" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "네트워크" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "휴지통" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI 바로 가기" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: 잘못된 인자입니다" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "libfm 설정에 터미널 에뮬레이터 설정이 없습니다." #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "섬네일러 프로그램의 설명이 잘못되었습니다" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u 바이트" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "'%s' URI 하위 경로에 잘못된 이스케이프 문자가 있습니다" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "<%s> 태그에 대한 처리자가 중복되었습니다" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "문자 참조에 숫자가 들어가야 하는 '%-.*s'를 해석하는데 실패했습니다 - 아마도 " "숫자값이 너무 큰 것 같습니다" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "문자 참조를 세미콜론으로 끝내지 않았습니다. 엔티티를 시작하는 의미가 아닌 다" "른 의미로 앰퍼샌드 문자를 사용한 것 같습니다 - 앰퍼샌드 이스케이프는 &로 " "표현하십시오" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "'%-.*s' 문자 참조를 허용 문자로 인코딩할 수 없습니다" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "빈 '&;' 엔티티를 발견했습니다. 유효한 엔티티는 & " < > ' " "입니다" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "'%-.*s' 엔티티 이름을 알 수 없습니다" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "엔티티가 세미콜론으로 끝나지 않았습니다. 엔티티를 시작하는 의미가 아닌 다른 " "의미로 앰퍼샌드 문자를 사용한 것 같습니다 - 앰퍼샌드 이스케이프는 &로 표" "현하십시오" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "태그 주변 공백은 허용하지 않습니다" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "'%s' 요소를 닫았지만 열린 요소는 없습니다" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "'%s' 요소를 닫았지만 현재 '%s' 요소가 열렸습니다" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "속성 값 시작 부분에 잘못된 '%c' 문자가 있습니다" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "속성값 마지막 부분에 '%2$c' 문자를 예상했지만 잘못된 '%1$c' 문자가 있습니다" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "문서에 예상치 못한 끝맺음이 있습니다" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "문서가 비어있거나 공백 문자만 있습니다" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML 데이터 오류" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "사용자 정의" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "실행 파일" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "\"%s\" 파일을 열 프로그램을 선택하십시오" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "설치한 프로그램" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<하위 폴더 없음>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "불러오는 중..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "가장자리 표시줄에 디렉터리 트리 표시" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "취소(_C)" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "여기로 복사(_O)" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "여기로 이동(_M)" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "여기에 링크 만들기(_L)" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave 실패." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "열기(_O)" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "다른 프로그램으로 열기(_W)..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "다른 프로그램으로 열기(_W)" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "경로 복사(_T)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "숨기기(_I)" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "보이기(_I)" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "북마크에 추가(_A)" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "이름 바꾸기(_R)..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "압축(_M)..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "여기에 풀기(_H)" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "다음에 풀기(_X)..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "속성(_E)" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "휴지통으로 이동(_T)" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "이 폴더에 대한 책갈피가 이미 있습니다." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "그림 파일" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "바이트" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "검색중... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "유효한 사용자 이름이나 번호 ID를 입력하여 주십시오." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "유효한 그룹 이름이나 번호 ID를 입력하여 주십시오." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "모든 파일과 하위 폴더에 대해 바뀔 내용을 재귀적으로 적용하시겠습니까?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "파일을 보이거나 숨깁니다" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "파일 이름이 구두점('.')으로 시작하여 숨겨져 있습니다." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "파일 이름이 구두점('.')으로 시작하면 시스템의 파일은 숨겨집니다. 숨김 파일 표" "시 여부를 전환하려면 키를 치십시오." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "검색중..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "내용 접근(_A):" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "다른 형식의 파일" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "파일:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "여러 파일" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "이름" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "설명" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "크기" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "권한" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "소유자" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "수정" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "위치" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "확장자" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "새로 만들기(_N)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "폴더" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "빈 파일" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "선택 반전(_I)" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "파일 정렬(_S)" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "폴더 이름 바꾸기(_R)..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "폴더 속성(_E)" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "숨겨진 요소 보이기(_H)" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "파일 및 폴더 뒤섞기(_F)" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "이름 대소문자 무시(_I)" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "이름순(_N)" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "수정일순(_M)" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "크기순(_S)" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "파일 유형순(_T)" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "새로 만들 폴더의 이름을 입력하십시오:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "새 폴더 만드는중" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "빈 파일의 이름을 입력하십시오:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "만드는 중..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "새로 만들기" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "새 %s에 대한 이름을 입력하십시오:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s 만드는 중" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "파일을 만든 후 기본 프로그램 실행(_R)" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "'%s' 텍스트 파일은 실행 가능한 스크립트 인 것 같습니다.\n" "무엇을 하시겠습니까?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "'%s' 파일은 실행 가능합니다. 실행하시겠습니까?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "지정한 폴더가 없습니다." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "폴더를 선택하십시오" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "오류" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "확인" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "질문" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "시스템 관리자만 이를 수행할 권한을 보유하고 있습니다." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "선택한 '%s' 파일을 휴지통으로 옮기시겠습니까?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "선택한 파일 %d개를 휴지통으로 옮기시겠습니까?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "선택한 '%s' 파일을 삭제하시겠습니까?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "선택한 파일 %d개를 삭제하시겠습니까?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "파일 이름 바꾸기" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "새 이름을 입력하여 주십시오:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "정말로 휴지통을 비우시겠습니까?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "붙여넣고 이동(_S)" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "폴더 위치 표시줄" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "내 폴더" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "데스크톱" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "프로그램" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "파일 시스템 루트" # 동작 #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "볼륨 마운트(_M)" # 동작 #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "볼륨 마운트 해제(_U)" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "이동식 미디어 꺼내기(_E)" # 동작 #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "볼륨 포맷(_F)" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "북마크 항목 이름 바꾸기(_R)" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "북마크에서 제거(_M)" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "위로 북마크 이동(_U)" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "아래로 북마크 이동(_D)" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "휴지통 비우기(_E)" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "일반 위치, 장치, 책갈피를 가장자리 표시줄에 목록으로 표시합니다" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "북마크 항목 이름 바꾸기" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "새 이름을 입력하십시오:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "유형: %s\n" "크기: %s\n" "수정: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "유형: %s\n" "수정: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Virheitä ilmaantui ennen tiedosto-operaation pysäyttämistä." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "취소함" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "오류가 난 상태로 파일 처리를 끝냈습니다." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "완료함" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "파일 시스템에서 근본적으로 이 동작을 지원하지 않아 휴키동으로 일부 파일을 이" "동할 수 없습니다.\n" "대신 삭제하시겠습니까?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "일시 정지(_P)" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "재개(_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "이동중" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "복사중" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "휴지통으로 이동중" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "삭제중" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "링크 만드는 중" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "대상:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "파일로 링크 만드는 중" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "다음의 속성 바꾸는 중" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "파일 속성 바꾸는 중" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "복원중" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "파일 %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "파일 처리 진행중..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "파일 %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "파일 %s:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "끄기(_O)" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "위치(_P)" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "디렉터리 트리(_D)" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "원격(_R)" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "위치" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "디렉터리 트리" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "폴더 내용 표시" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "%s 숨기기(_H)" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "왼쪽으로 이동(_M)" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "오른쪽으로 이동(_R)" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "%s 표시" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "폭 기억하지 않기(_F)" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "아이콘 보기(_I)" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "최소화 보기(_C)" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "섬네일 보기(_T)" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "자세한 목록 보기(_L)" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "활성 탭을 전환합니다" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "지정한 '%s' 디렉터리는 유효하지 않습니다" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "대상 파일에 접근할 수 없습니다" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "비 전용 파일 시스템에 링크를 만들 수 없습니다" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "'%s' 파일을 휴지통에서 복원할 수 없음: 원본 경로를 알 수 없습니다" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "원본과 대상이 같습니다." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "하위 폴더에 폴더를 이동할 수 없습니다" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "하위 폴더에 폴더를 복사할 수 없습니다" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "대상은 원본의 하위 폴더 입니다" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "'%s' 파일을 복사할 수 없음: 지원하지 않습니다" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "하나의 파일에 대해서만 표시 이름을 설정할 수 있습니다" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "하나의 파일에 대해서만 대상을 설정할 수 있습니다" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "'%s' XML 파일에 오류가 있습니다 (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML 파일에 프로그램 루트가 없습니다" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "'%s'에 대한 XML 정의를 만들 수 없습니다" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "'%s' 메뉴 경로가 이미 있습니다" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "메뉴 캐시 오류" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "메뉴 디렉터리가 잘못되었습니다" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "메뉴 항목 이름을 비워둘 수 없습니다" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "잘못된 '%s' 메뉴 디렉터리입니다" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "잘못된 메뉴 항목 입니다" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "'%s' 메뉴 항목에 적당한 항목 파일이 없습니다" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "메뉴 디렉터리에 대한 숨김 상태 바꾸기를 지원하지 않습니다" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "'%s' 속성 설정을 지원하지 않습니다" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "%s 파일 이름이 잘못되었습니다" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s'은(는) 메뉴 디렉터리입니다" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s'은(는) 메뉴 항목이 아닙니다" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' 항목 파일이 깨졌습니다" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "%s 파일 이름이 잘못되었습니다" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "메뉴 디렉터리 이름이 \".desktop\"으로 끝나면 안됩니다" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "메뉴 루트에 대한 잘못된 동작입니다" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "잘못된 대상입니다" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: '%s' 폴더가 메뉴 캐시에 없습니다" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "검색" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "검색 결과" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "실행 파일 선택" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "명령(_M):" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "프로그램 아이콘을 활성화 했을 때 실행할 명령입니다" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "설명(_E):" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "프로그램의 일반 이름" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "작업 디렉터리(_W):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "프로그램을 시작할 작업 디렉터리" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "풍선 도움말(_T):" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "프로그램에 표시할 풍선 도움말" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "시작 알림 사용(_U)" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "데스크톱 항목(_D)" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "복원(_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "휴지통의 파일을 본래 경로로 복원합니다" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "원본 파일 이름 또는 데스크톱 ID" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "원본" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "결과 파일 이름" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "결과" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM 디스크" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "빈 CD-ROM 디스크" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R 디스크" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "빈 CD-R 디스크" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW 디스크" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "빈 CD-RW 디스크" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM 디스크" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "빈 DVD-ROM 디스크" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW 디스크" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "빈 DVD-RW 디스크" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM 디스크" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "빈 DVD-RAM 디스크" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R 디스크" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "빈 DVD+R 디스크" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW 디스크" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "빈 DVD+RW 디스크" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R 양면 디스크" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "빈 DVD+R 양면 디스크" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW 양면 디스크" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "빈 DVD+RW 양면 디스크" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "블루레이 디스크" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "빈 블루레이 디스크" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "블루레이 R 디스크" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "빈 블루레이 R 디스크" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "블루레이 RW 디스크" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "빈 블루레이 RW 디스크" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "고밀도 DVD 디스크" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "빈 고밀도 DVD 디스크" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "고밀도 DVD-R 디스크" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "빈 고밀도 DVD-R 디스크" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "고밀도 DVD-RW 디스크" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "빈 고밀도 DVD-RW 디스크" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "광자기 디스크" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "빈 광자기 디스크" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW 디스크" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "빈 MRW 디스크" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W 디스크" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "빈 MRW/W 디스크" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "오디오 파일(_A)" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "빈 광 디스크" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "광 디스크" libfm-1.4.0/po/lg.po000066400000000000000000001543221475513661000142040ustar00rootroot00000000000000# Ganda translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2013-09-04 21:51+0000\n" "Last-Translator: kizito \n" "Language-Team: lg \n" "Language: lg\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1378331511.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Puloguramu ennondemu" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Londa puloguramu z'oyagala zitandike nga okoonye ku nyunzi ey'oku yintaneti " "oba ku ndagiriro ya email" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Kola ku Panya" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Kolawo oba kyusa ekisangibwa awakolerwa" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Londa puloguramu" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Fayiro zibikkuze puloguramu erondedwa" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Puloguramu eziri ku kompyuta" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "K_iragiro kya mu kiwandikiro:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Yandaaza..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Omulimu gukolere okuva mu kiwandikiro" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Ekiwandikiro kisagalewo nga ekiragiro kimaze okukolebwako" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Obubonero buno bulin'amakulu ga njawlo mu kiwandikiro:\n" " %f: We kaba waddawo erinnya lya fayiro emu\n" " %F: We kaba wadawo mannya ga fayiro ezisukka mu emu\n" " %u: We kaba waddawo ndagiriro ey'oku yintaneti emu\n" " %U: We kabawaddawo ndagiriro ez'oku yintaneti ezisukkamu emu" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "_Linnya lya puloguramu (osobola okutegeka eno ebe nga bulijjo y'ekola)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Fayiro zibukkuze ekiragiro ky'owandise" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "W_andika Ekiragiriro Kya mu Kiwandikiro Ekikyo" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Puloguramu erondedwa _y,eba ekola ku fayiro ez'ekika kino bulijjo" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Kakasa nti fayiro ezisangidwawo za kugyibwawo" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Buuka" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Kyusa erinnya" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Gyawo esangidwawo" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Wasangidwawo fayiro endala nga erinnya lye lirimu.\n" "\n" "Fayiro eyo oyagala esooke egyibwewo" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "waddewo fayiro eno?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Erinnya lya fayiro:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Ekirondedwa ki_tegekebwe ne ku fayiro endala zonna eziriwo" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Londa Kafaananyi..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "lubu lw'obufaananyi obuyunzi olukola ku sisitemu yonna" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "fayiro z'ebifaananyi" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Londa kafaananyi okuva mu:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Tandika puloguramu eno" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Omulimu gukolere okuva mu _kiwandikiro" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Ebikwata ku fayiro" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Kabonero ka fayiro eno mu ndabika ey'enkwatagana y'amaterekero" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Linnya:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Obusangiro:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Fayiro ey'ekigenderwa:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Kika kya fayiro:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "B_ikkuza:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Londa puloguramu enaakozesebwanga okubikkula fayiro ez'ekika kino " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Mugatte gwa fayiro:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Mugatte gwa bunene bwa fayiro:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Bbanga eritwalibwa ku disiki:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Amakyuka agaasemba:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Amabikkula agaasemba:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Ndukusa lwe zaasemba kukyusibwamu:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Ebitalibimu" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "N_yini yo:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_uluupu:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Laba ebirimu:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Ky_usamu ebirimu:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Tandika mulimu:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Ebigambo ebiw'endukusa ez'enjawulo:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Abakkirizibwa okulaba ebiri mu fayiro/tterekero" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Abakkirizibwa okukyusa ebiri mu fayiro/tterekero" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Abakkirizibwa okutandika omulimu guno oba okuyingira etterekero lino" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Ebigambo ebifuula enkola y'omulimu ogukolebwa fayiro eno" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Ebigambo ebifuga okuyingira mu tterekero lino" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Enteekateeka ya Ndukusa" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Fayiro nkise" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Ndukusa" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Bwereere" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Lukusa lw'obwa nannyini" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Olukusa olwazika GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Olukusa olw'obwanannyini n'olukusa oluyingiza mu guluupu" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Olukusa olweyazika UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" "Olukusa olwazika obuyinza bwa nnyini fayiro n'olukusa oluyingiza mu guluupu" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Nyini fayiro yekka" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Nyini fayiro n'aba mu guluupu ya yo bokka" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Buli ayagala" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Bbule" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bayiti" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Londa Lunaku" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Londa olunaku okuva mu kalenda eno" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Noonyeza mu fayiro" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Ebisangibwa Mu _Manya Ga Fayiro:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Ekinoonyezbwa kiyinza okubeera lukalala lwa mu kiwandikiro olugoberera " "mateeka ga POSIX (nga akabonero ',' ke k'awula wakati w'ebigambo ebirulimu " "oba kiyinza okubeera mboozi egoberera mateeka ga POSIX enoonya ebifaanagana " "n'ezimu ku nukuta ezigirimu." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Toyawula mu nnukuta nnene n'ento_no" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Noonyezesa emboozi ennoonya ebigifaanana" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "A_wanaanoonyezebwa:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Noonyeza ne mu materekero agali munda mwa gannaago" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Kebera ne fayiro enk_ise" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Linnya/_Busangiro" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Kika Kya Fayiro" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Noonya fayiro ez'ebika bino byokka:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Fayiro ez'ebi_gambobugambo" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Fayiro ez'ebif_aananyi" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Fayiro ez'ebiw_ulirizibwa" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Fayiro eza _vidiyo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Biwandike" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "M_aterekero" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Ki_rala:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Wano osobola okuwandika kika kya ngeri yonna ekitegeerebwa sisitemu. " "Tokkirizibwa okussa akabonero aka muwawa '*' ku nkomerero y'ekigambo ky'oba " "owandise. Bw'oba oyagala okuwandikawo ebika ebisukka mu kimu, kozesa " "akabonero ';' okwawula mu bigambo ebyo." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Kika Kya Fayiro" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Ebi_sangibwa Mu Fayiro:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Ebiri_mu" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Bunene Bwa Fayiro" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Ntono ku:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Nn_ene ku:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Amakyuka Agaasemba" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Bbule)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Dda okusinga:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Lu_vanyuma lwa:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Ebi_kwata ku fayiro" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Ekyandaaza" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Ekyandaaza ky'olonzemu kye kinaakozesebwanga okukebera ennyunzi." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Puloguramu eya Email" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Puloguramu ennondemu eya email y'enaatandikanga ng'okoonye ku ndagiriro eya " "email." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Kika kya kiwandikiro" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Ekiragiro:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Puloguramu eziteekateeka sisitemu" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Ebika bya fayiro ne puloguramu ezibikolako" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Egende mu:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Ntegeka..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Fayiro ey'ekigenderwa:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Ebulayo:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Musangidwamu obuzibu buno:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Fayiro Njereere" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Ekitegekedwa ng'ekigenderwa tekikkirizibwa" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Omukolo tegusoboka ku sisitemu eno" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "'%s' tekikola nga fayiro y'ekisangibwa awakolerwa" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Fayiro '%s' sisobodde kugibikkula lwa kulemwa kutegeera kika ky'ebigirimu " #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "Endagiriro oba URI ezitandika ne %s:// zilondere puloguramu enaazikolangako" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Sisobla kutegeka tterekero erikolerwamu libeere '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Data ey'ekika kya %s gilondere puloguramu enagikolangako" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Byuma" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Kayungirizi" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Bisuulidwa" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "panya egguka ku ndagiriro oba URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: agumenti tekkirizibwa" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Entegeka za libfm ebulamu ekika ky'ekiwandikiro" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" "Ekitegekedwa ng'okunnyonyola puloguramu ekola ku kulozako tekikkirizibwa" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "bayiti %u" msgstr[1] "bayiti %u" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" "Ekitundu ky'ekkubo '%s' erigguka ku ndagiriro oba URI kirimu obubonero " "obufuule obutakkirizibwa" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Ekikolera okulamba <%s> ku bisangidwa mu emirundi egisukka mu gumu" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Nnemedwa okuyungulula makulu mu '%-.*s', eyandibadde digiti ey'omu bubonero " "obukongojja kannabwo (okugeza nga ê) - oba oli awo digiti eyitiridde " "obunene" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Waliwo ekiringa obubonero obukongojja kannabwo ekitafundikidwa ka " "semikoloni; bwobanga ampasandi yokka gye wetaaga - zawo akagambo & ke " "kajja okugireeta" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" "Obubonero obukongojja kannabwo '%-.*s' tebukongojja kabonero akakkirizibwa" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Ndabyemu ekikongozzi ekisobu '&;' ebikongozzi ebikkirizibwa bye bino: & " "" < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Ekikongozzi '%-.*s' tekimanyidwa" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Waliwo ekiringa ekikongozzi ekitafundikidwa ka ; Bwobanga ampasandi yokka " "gye wetaaga - zawo akagambo & ke kajja okugireeta" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Tekikkirizibwa okufundikira okulamba n'akabangirizi" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" "Ekitundu '%s' kiriko okulamba okulaga we kikoma naye tekirina kunnaakwo " "okulaga we kitandikira" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Waliwo okulamba okulaga ekitundu ekiyitibwa '%s' we kikoma nga kudda ku " "kulamba okulaga ekitundu ekiyitibwa '%s' we kitandikira" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" "Waliwo ekikongojjedwa mu atiributi ekitandika n'akabonero '%c' atakkirizibwa" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Waliwo ekikongojjedwa mu atiributi ekifundikidwa akabonero '%c' " "akatakkirizibwa, sso wandibaddewo '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Ekiwandiko kifundikidwa bubi" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Ekiwandiko kyereere oba kirimu bubangirizi bwokka" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: data ya XML erimu ensobi" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Wekyusize" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Fayiro eza puloguramu" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Londa puloguramu enaabikkulanga fayiro ez'ekika kya \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Puloguramu eziri ku sisitemu" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Ntegeka..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Enkwatagana y'amaterekero erabikire mu kaddirisa ak'okubbali" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Sazamu" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "K_oppi Gise Wano" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Leeta Wano" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Kolawo nyunzi" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Omulimu ogwa XDirectSave gugaanye." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Bikkula" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "B_ikkuza..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "B_ikkuza" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "K_wata (ma)kubo" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "K_isa" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Labi_sa" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Kwata ekifo kino" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Kyusa erinnya..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Pakira..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Pakulira _Wano" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "P_akulira..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Ebi_kwata ku fayiro" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Twala mu _Bisuulidwa" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Akakwatakifo k'etterekero lino gyekali." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Fayiro z'ebifaananyi" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bayiti" msgstr[1] "bayiti" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "nkebera... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Wandika erinnya oba namba ya mukozesa ebikkirizibwa." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Wandika erinnya oba namba ya guluupu ebikkirizibwa." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Enkyuka zino nzikole ku fayiro zonna n'amaterekero agali munda mu lino?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Kisa oba labisa fayiro" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" "Fayiro eno ekisidwa kubanga erinnya lya yo litandika n'akatonyeze ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Ku sisitemu eya fayiro eno fayiro ezirina amannya agatandika n'akatonnyeze " "('.') zikisibwa. Okuyusa fayiro wakati w'okulabika n'okukisibwa nyiga " "amapeesa aga ." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "nkebera..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Kukola ku birimu:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Fayiro ez'ebika ebyawufu" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fayiro:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Fayiro ezisukka mu emu" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Linnya" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Okunnyonyola" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Bunene" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Ndukusa" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Nnanyini" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Amakyusa" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Obusangiro" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Ekyongerwako" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "_Kolawo..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Tterekero" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Fayiro Njereere" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Vuunika okulondamu" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sengeka fayiro" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Fayiro _Gikyuse Erinnya" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "E_bikwata ku Fayiro" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_Laga fayiro enkise" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Tabika _Fayiro n'amaterekero" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Tofa ku mpandika y'ennukuta z'omu linnya" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Sengekera ku _mannya" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Sengekera ku ma_kyusa" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Sengekera ku _bunene" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Sengekera ku _kika kya fayiro" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Wandikawo erinnya ly'etterekero erikoledwawo:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Nkolawo tterekero ppya" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Wandikawo erinnya erya fayiro njereere ekoledwawo:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Nkolawo ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Ntuma" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Wandikawo erinnya erya %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Nkolawo %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" "_Olumala kugikolawo fayiro gibikkuze puloguramu ekola ku z'ekika kyayo eya " "bulijjo" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Fayiro ey'ebigambo '%s' eringa erimu ebiragiro bya kompyuta.\n" "Kiki ekiba kikolebwa wano?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Fayiro '%s' esobola okukola nga puloguramu. Oyagala okugitandika?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Tolaze makubo." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Londa tterekero" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Kiremya" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Kakasa" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Okubuuza" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Kino kiyinzibwa bateesiteesi ba sisitemu bokka." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Fayiro '%s' ngitwale mu bisuulidwa?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Fayiro %d gy'olonze ngitwale mu bisuulidwa?" msgstr[1] "Fayiro %d z'olonze nzitwale mu bisuulidwa?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Fayiro '%s' ngigyewo?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Fayiro %d gy'olonze ngigyewo?" msgstr[1] "Fayiro %d z'olonze nzigyewo?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Fayiro gikyuse erinnya" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Wandika erinnya ppya:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Okakasa nti oyagala okukunkumula ebisuulidwa?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Pa_atiika otandikirewo okunoonya" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Lubaawo olulaga busangiro bw'etterekero" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Tterekero lya Akawunti" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Awakolerwa" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Puloguramu" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Musingi gwa Sisitemu ya fayiro" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Wanga Volyumu" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Wang_ula Volyumu" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Wandula Ekitereka Data Ekigyikamu" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Kolawo Sisitemu Ya Fayiro Ku Volyumu" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Kyusa Erinnya Ly'akakwatakifo" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Gyawo kakwatakifo" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Y_ambusa akakwatakifo" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "S_sa akakwatakifo" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Kunkumu_la Ebisuulidwa" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Olukalala lw'ebifo, ebyuma n'obukwatakifo by'ojjumbira lulabikire mu " "kadirisa ak'okubbali" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Kyusa erinnya ly'akakwatakifo" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Wandika erinnya ppya:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Kika: %s\n" "Bunene: %s\n" "Amakyusa: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Kika: %s\n" "Amakyusa: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "" "Omukolo ogw'oku fayiro gwazzemu ebitali bituufu nga tegunnayimirizibwa. " #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Kisazidwamu" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" "Ekibadde kikolebwa ku fayiro kimalirizidwa naye mulimu ebitateredde." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Guwedde" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Fayiro ezimu tekisobose okuzitwala mu bisuulidwa olw'okubanga sisitemu eza " "fayiro kwe ziri tezikikkiriza.\n" "Fayiro ezo nzigyewobugya?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Yimirizamu" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Guzuukuze" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Nzijulula" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Nkola koppi mu" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Mu bisuulidwa nteekayo" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Nzigyawo" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Nkolawo nyunzi" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Egende mu:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Nkolawo nyunzi ezigguka ku fayiro" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Nkyusa atiributo za fayiro" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Nkyusa atiributo za fayiro" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Nzizawo" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s fayiro" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Waliwo ebikolebwa ku fayiro..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s fayiro:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s fayiro:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Kisa" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Bifo" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Nkwatagana Y'amaterekero" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Ku Kompyuta N_dala" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Ebifo" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Enkwatagana y'amaterekero" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Eddirisa lukome ku kulaga ebiri mu tterekero" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Kisa %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Sembeza ku kkono" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Sembeza ku _ddyo" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Laga %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Ereme okujjukiranga bugazi bweyaliko obwasemba" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Kozesa Bufaananyi Okulaga Ebiri Wano" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Ebiri Wano Birage Mu Bufunze" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Laga Obulozako Bw'ebiri Wano" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Ebiri Wano _Birage Mu Bujjuvu" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Kyusa oludda" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Olonze '%s' ekitakkirizidwa ng'etterekero" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Sisobola kubikkula fayiro egenderwa" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" "Sisobola kukolawo nyunzi egguka ku sisitemu eya fayiro etali ya mu luse " "lw'ez'oku sisitemu eno" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Fayiro %s' eri mu bisuulidwa ennemye okuzzawo: Ekkubo erigguka gye yali " "sirimanyi" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Ennono n'ekigenderwa bye bimu." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Tekisoboka okujjulula tterekero ligende mu eririri munda ate" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Tekisoboka okuteeka kopi y'etterekero munda mw'eririri munda ate" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Gyoyagala okutwala wali munda mwalyo ate" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Nnemedwa okugya koppi mu fayiro '%s': Ekika kya yo tewali bikikolako" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Eriinya ly'omulimu ogw'okwolesa gutekegebwa fayiro emu yokka" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Ekigenderwa kitegekebwa fayiro emu yokka" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Fayiro eya XML eriko kiremya w'ekika kya '%s' (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" "Okusinzira ku kulamba kw'ekitundu kyayo ekizingiramu ebirala byonna fayiro " "eya XML ssi ya menyu ya Puloguramu" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Nnemedwa okukola nteekateeka ya mu XML efuga '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Ekkubo '%s' erigguka ku menyu weriri" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Eggwanika eriyamba menyu lifunye kiremya" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ssi tterekero erya menyu" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Eky'omu menyu tekikkirizibwa butaba na linnya" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "'%s' ssi tterekero lya menyu" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Tekikkirizibwa mu menyu" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Eky'omu menyu '%s' kibulako fayiro entuufu ekigenderako" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Tosobola kukyusa okuboneka kw'etterekero erya menyu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Tosobola kutegeka atiributi '%s' kubanga sisitemu eno tegimanyi" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ekitegekedwa ku atiributi '%s' tekikkirizibwa" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' tterekero lya menyu" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' ssi kintu kya mu menyu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' eriko kiremya" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Nnemedwa okukolawo eky'omu menyu '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" "Erinnya ly'etterekero erya menyu terikkirizibwa kusembyayo \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" "Waliwo kiremya ku mukolo ogukwatagana n'ekitundu ekizingiramu ebirala byonna " "ekya fayiro eya menyu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ekitegekedwa ng'ekigenderwa tekikkirizibwa" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" "FmMenuVFileMonitor: tterekero '%s' libuzeyo mu ggwanika zzibizi erya menyu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Noonya" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Ebizuulidwa" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Londa fayiro eya puloguramu" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ki_ragiro:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Ekiragiro ekiba kiyisibwa ng'onyize ku kafaananyi aka puloguramu" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "O_kunnyonyola:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Erinnya ttwalirawamu erya puloguramu" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Tterekero mwe gubumbujjira:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Tterekero puloguramu mw'en'etandikibwa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Magezi:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Amagezi agaba galagibwa ku puloguramu" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Wabengawo akabonero akalaga nti puloguramu etandika" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Ekisangibwa awakolerwa" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Zawo" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Fayiro eziri mu bisuulidwa zizewo gyezagyibwa" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "Linnya lya fayiro ey'ennono oba ery'awakolerwa" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "NNONO" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "linnya lya fayiro ekolebwawo" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "KIGENDERWA" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disiki eya CD etayongerekako bintu - CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disiki enkalu eya CD etayongerekako bintu - CD-ROM enkalu" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disiki eya CD etayongerekako bintu - CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disiki enkulu eya CD etayongerekako bintu - CD-R enkalu" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disiki eya CD eyongerekako bintu - CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disiki enkalu eya CD eyongerekako bintu - CD-RW enkalu" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disiki eya DVD etayongerekako bintu - DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disiki enkalu eya DVD etayongerekako bintu - DVD-ROM enkalu" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disiki eya DVD eyongerekako bintu - DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disiki enkalu eya DVD eyongerekako bintu - DVD-RW enkalu" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disiki eya DVD ey'ekika kya RAM - DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disiki enkalu eya DVD ey'ekika kya RAM - DVD-RAM enkalu" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disiki eya DVD+ etayongerekako bintu - DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disiki enkalu eya DVD+ etayongerekako bintu - DVD+R enkalu" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disiki eya DVD+ eyongerekako bintu - DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disiki enkalu eya DVD+ eyongerekako bintu - DVD+RW enkalu" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disiki eya DVD+ etayongerekako bintu ey'ekika kya DL - DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" "Disiki enkalu eya DVD+ etayongerekako bintu ey'kika kya DL - DVD+R DL enkalu" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disiki eya DVD+ eyongerekako bintu ey'ekika kya DL - DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" "Disiki enkalu eya DVD+ eyongerekako bintu ey'ekika kya DL - DVD+RW DL enkalu" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disiki eya Bulu re - Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disiki enkalu eya Bulu re - Blu-Ray enkalu" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disiki eya Bulu re etayongerekako bintu - Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disiki enkalu eya Bulu re etayongerekako bintu - Blu-Ray R enkalu" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disiki eya Bulu re eyongerekako bintu - Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disiki enkalu eya Bulu re eyongerekako bintu - Blu-Ray RW enkalu" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disiki eya DVD ey'ekika kya HD - HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disiki enkalu eya DVD ey'ekika kya HD - HD DVD enkalu" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disiki eya DVD etayongerekako bintu ey'ekika kya HD - HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" "Disiki enkalu eyaDVD etayongerwako bintu ey'ekika kya HD - HD DVD-R enkalu" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disiki eya DVD eyongerekako bintu ey'ekika kya HD - HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" "Disiki enkalu eya DVD eyongerekako bintu ey'ekika kya HD - HD DVD-RW enkalu" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disiki ey'ekika kya MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disiki enkalu ey'ekika kya MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disiki ey'ekika kya MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disiki enkalu ey'ekika kya MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disiki ey'ekika kya MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disiki nkalu ey'ekika kya MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Fayiro ez'ebiw_ulirizibwa" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disiki enkalu eya CD oba DVD" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disiki eya CD oba DVD" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Kika kya fayiro ekinaabikkulibwa:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Omulimu gubindabinda:" #~ msgid "Progress:" #~ msgstr "We gutuuse:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Omulimu guwedde, naye mubaddemu ku bulemu." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Nkolawo nyunzi" #~ msgid "_Browse" #~ msgstr "_Yandaaza" #~ msgid "My Computer" #~ msgstr "Kompyuta Yange" #~ msgid "_Move" #~ msgstr "_Jjulula" #~ msgid "_Trash" #~ msgstr "_Bisuulidwa" #~ msgid "_Only for this folder" #~ msgstr "Tterekero lino ly_okka" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Enteekateeka ey'okusengeka ekome ku tterekero lino lyokka" #~ msgid "Please select a folder" #~ msgstr "Londa tterekero" #~ msgid "Entry for folder path" #~ msgstr "Awagenda ekkubo erigguka ku tterekero" #~ msgid "Computer" #~ msgstr "Kompyuta" #~ msgid "Network Drives" #~ msgstr "Ebibondo Ebiri Ku Kayungirizi" #~ msgid "_Run in terminal emulator" #~ msgstr "_Omulimu gukolere okuva mu kiwandikiro" #~ msgid "_Keep terminal window open after run" #~ msgstr "O_mulimu bwe guggwa ekiwandikiro kisagalewo" #~ msgid "Shortcuts" #~ msgstr "Panya" #~ msgid "Mount Point" #~ msgstr "Awawangirwa" #~ msgid "Create _Symlink" #~ msgstr "Kolawo Nyun_zi" #~ msgid "Se_nd To" #~ msgstr "_Sindikira" #~ msgid "Empty tag" #~ msgstr "Waliwo okulamba kwa okutalimu kantu" #~ msgid "Tag should have exactly one child" #~ msgstr "" #~ "Ekitundu ekya kikkirizibwa okuzingiramu ekitundu ekirala kimu kyokka" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Ekitundu ekya kinnaakyo kye kizingira mu kikkirizibwa okuba kimu ku " #~ ", , oba byokka" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Fayiro omugenda okuva ebipya okulamba kwa mu okubereberye kuteekwa okuba " #~ ", mu eno kuli <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Nnemedwa okuleetamu okulamba kwa <%s> okuva mu fayiro omuva ebipya" #~ msgid "Invalid tag" #~ msgstr "Waliwo okulamba kwa okutakkirizibwa" #~ msgid "Invalid tag" #~ msgstr "Waliwo okulamba kwa okutakkirizibwa" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Sirabye ekkubo %s mu nteekateeka ezifuga enneyisa ya XML" #~ msgid "Blank File" #~ msgstr "Fayiro enjereere" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Kiremya, sisitemu terina puloguramu lxshortcut" #~ msgid "Failed to start lxshortcut" #~ msgstr "Tekisobose kutandika lxshortcut" #~ msgid "_Group:" #~ msgstr "_Guluupu:" #~ msgid "Rename" #~ msgstr "Kyusa erinnya" #~ msgid "Make the file executable" #~ msgstr "Fayiro efuuke puloguramu" #~ msgid "Operations that all other users can do" #~ msgstr "Buli omu by'ayinza okukola" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Nyini fayiro by'ayinza okukola" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Abafaananya nyini fayiro guluupu bye bayinza okukola" #~ msgid "Read and Write" #~ msgstr "Kugibikkula n'okugiwandikamu" #~ msgid "Read only" #~ msgstr "Kugibikkula kwokka" #~ msgid "Write only" #~ msgstr "Kuwandika kwokka" libfm-1.4.0/po/libfm.pot000066400000000000000000001105431475513661000150540ustar00rootroot00000000000000# 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: 2024-12-03 13:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/lt.po000066400000000000000000001474121475513661000142230ustar00rootroot00000000000000# Lithuanian translations for libfm package. # Julius , 2012. # Algimantas Margevičius , 2012. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-05-22 22:35+0000\n" "Last-Translator: Moo \n" "Language-Team: Lietuvių <>\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1527028547.095845\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Pageidaujamos programos" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Pasirinkti programas, kurios bus paleidžiamos, spustelėjus saityno nuorodą " "ar el. pašto adresą" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Šaukinių redaktorius" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Sukurti naują ar keisti esamą darbalaukio įrašą" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Pasirinkite programą" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Atverti failus, naudojant pasirinktą programą" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Į_diegtos programos" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Komandų eilutė, kurią vykdyti:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Naršyti..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Vykdyti terminale" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Įv_ykdžius komandą, palikti terminalo langą atvertą" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Komandų eilutėje gali būti naudojami šie specialūs kodai:\n" " %f: atvaizduoja vieno failo pavadinimą\n" " %F: atvaizduoja kelių failų pavadinimus\n" " %u: atvaizduoja vieną failo URI\n" " %U: atvaizduoja kelis URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Programos pavadinimas (nebūtinas, reikalingas tik asociacijai)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Failų atvėrimui naudoti pasirinktinę komandą" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Pasirinktinė komandų eilutė" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "Nu_statyti pasirinktą programą kaip numatytąjį veiksmą šiam failo tipui" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Patvirtintikite failų pakeitimą" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "P_raleisti" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "P_ervadinti" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Perrašyti" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Šioje vietoje jau yra failas tokiu pačiu pavadinimu.\n" "\n" "Ar norite pakeisti esamą failą" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "šiuo failu?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Failo pavadinimas:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Taikyti šią parinktį visiems esamiems failams" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Pasirinkite piktogramą..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "sistemos piktogramų temos" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "paveikslų failų" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Pasirinkti piktogramą iš:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Vykdyti failą" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Vykdyti _terminale" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Failo savybės" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Failo piktograma, aplanko rodinyje" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Pavadinimas:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Vieta:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Paskirties failas:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Failo tipas:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "_Atverti naudojant:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Pasirinkite programą, kuri bus naudojama atverti šio tipo failus" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Viso failų:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Bendras failų dydis:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Dydis diske:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Paskutinį kartą keista:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Paskutinį kartą naudota:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Paskutinį kartą keistos teisės:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Bendra" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Savininkas:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupė:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Gali peržiūrėti turinį:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Gali keisti turinį:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Gali vykdyti:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Specialūs bitai:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Kas gali skaityti failo/katalogo turinį" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Kas gali keisti failo/katalogo turinį" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Kas gali vykdyti failą ar įeiti į katalogą" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Specialios vėliavėlės failo vykdymui" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Specialios vėliavėlės prieigai prie katalogo" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Prieigos valdymas" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Paslėptas failas" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Leidimai" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nėra" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Lipnus" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Nustatyti GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Lipnus ir nustatyti GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Nustatyti UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Nustatyti UID ir GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Tik savininkas" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Tik savininkas ir grupė" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Bet kas" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Niekas" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Baitai" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Pasirinkite datą" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Pasirinkite kalendoriuje datą" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Ieškoti failų" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Failo pavadi_nimo šablonai:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Šablonas gali būti POSIX apvalkalo šablono sąrašas (kur „,“ yra kaip " "skirtukas) arba POSIX reguliarusis reiškinys." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Neskirti raidžių dydžio" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Naudoti reguliariuosius reiškinius" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Kur ieškoti:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Ieškoti pakatalogiuose" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Ieškoti _paslėptų failų" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Pavadinimas/_Vieta" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Failo tipas" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Ieškoti tik šių failo tipų:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_kstiniai failai" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Paveikslų failai" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Garso įrašų failai" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Vaizdo įrašų failai" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumentai" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Aplankai" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Kita:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Čia galima įvesti bet kokį tinkamą turinį. Tipo gale yra leidžiamas naudoti " "„*“ pakaitos simbolis. Keli tipai turėtų būti atskiriami „;“. " #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Failo _tipas" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Faile _yra:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Turinys" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Failo dydis" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Mažesnis nei:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Didesnis nei:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Paskutinį kartą keistas" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nėra)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Anksčiau nei:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Vėliau nei:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Savybės" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Saityno naršyklė:" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Pageidaujama saityno naršyklė bus naudojama saitams atverti." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Pašto klientas" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Pageidaujamas el. pašto klientas bus naudojamas laiškų rašymui, kai " "spustelėsite ant el. pašto adreso." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminalo emuliatorius" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Komandų eilutė:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Sistemos programos" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Failų susiejimai" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Į:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Ruošiama..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Persiųsta duomenų:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Liko laiko:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Įvyko klaidos:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Tuščia reikšmė" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Neteisingas pasirinkimas" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operacija nepalaikoma" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Neteisingas darbalaukio įrašo failas: „%s“" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Norint paleisti, nepavyko nustatyti failo „%s“ turinio tipo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Nėra nustatytos numatytosios programos, skirtos URI „%s://“ paleidimui" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Nepavyksta nustatyti darbinį katalogą į „%s“: „%s“" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Nėra numatytosios programos MIME tipui „%s“" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Įrenginiai" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Tinklas" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Šiukšlinė" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "nuoroda į URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: neteisingas argumentas" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Libfm konfigūracijoje nenustatytas terminalo emuliatorius" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Neteisingas miniatiūrų programos aprašas" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u baitas" msgstr[1] "%u baitai" msgstr[2] "%u baitų" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI po-kelyje „%s“ yra netinkamų simbolių" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Padaryti žymės <%s> doroklės dublikatą" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Nepavyko išanalizuoti „%-.*s“, kuris galėjo turėti skaičius simbolio " "nuorodoje (pvz., ê) - tikriausiai, skaičius yra per didelis" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Simbolio nuoroda nepasibaigė kabliataškiu; greičiausiai, jūs panaudojote " "ampersendo simbolį nepradėdami elemento įvedimo - apeikite ampersendą " "įvesdami &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Simbolio nuoroda „%-.*s“ neatitinka leistinų simbolių" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Aptiktas tuščias elementas '&;'; galimi elementai yra: & " < " "> '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Elemento vardas „%-.*s“ yra nežinomas" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Elementas nepasibaigė kabliataškiu; greičiausiai, jūs panaudojote ampersendo " "simbolį nepradėdami elemento įvedimo - apeikite ampersendą įvesdami &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Uždarymo žymėje negali būti tarpo" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elementas „%s“ užvertas, tačiau joks elementas nebuvo atvertas" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Elementas „%s“ buvo užvertas, tačiau šiuo metu yra atvertas „%s“" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Atributo reikšmės pradžioje aptiktas netinkamas simbolis „%c“" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Atributo reikšmės pabaigoje aptiktas netinkamas simbolis „%c“, tikėtasi „%c“" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokumentas netikėtai baigėsi" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokumentas buvo tuščias arba jame buvo tik tarpai" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML duomenų klaida" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Derinti" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Vykdomieji failai" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Pasirinkite programą, kurią naudojant bus atveriami „%s“ failai" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Įdiegtos programos" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Įkeliama..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Šoninėje juostoje rodo katalogų medį" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Atsisakyti" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Kopijuoti čia" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Perkelti čia" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Kurti nuorodą čia" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave nepavyko." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "At_verti" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Atverti _naudojant..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Atverti _naudojant" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopijuoti _kelią(-ius)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "S_lėpti" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Nebe_slėpti" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Pri_dėti į žymeles" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Pe_rvadinti..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Glaudinti..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Išskleisti čia" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_Išskleisti į..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Savybės" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Perkelti į _šiukšlinę" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Jūsų žymelėse jau yra šio aplanko žymelė." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Paveikslų failai" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "baitas" msgstr[1] "baitai" msgstr[2] "baitų" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "peržiūrima... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Prašome įvesti teisingą naudotojo vardą arba skaitmeninį id." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Prašome įvesti teisingą grupės pavadinimą arba skaitmeninį id." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Ar norite taikyti šiuos pakeitimus rekursyviai visiems failams ir " "poaplankiams?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Slėpti ar nebeslėpti failą" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Šis failas yra paslėptas, nes jo pavadinimas prasideda tašku („.“)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Failai šioje sistemoje yra paslepiami, jeigu jų pavadinimai prasideda tašku " "(„.“). Paspauskite , norėdami perjungti paslėptų failų rodymą." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "peržiūrima..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Gali gauti prieigą prie turinio:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Skirtingų tipų failai" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Failas:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Keli failai" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Pavadinimas" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Aprašas" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Dydis" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Leidimai" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Savininkas" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Keista" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Vieta" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Prievardis" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Sukurti _naują..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Aplanką" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tuščią failą" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Invertuoti žymėjimą" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Rikiuoti failus" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Pervadinti aplanką..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Aplanko _savybės" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Rodyti _paslėptus" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "_Sumaišyti kartu failus ir aplankus" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Nepaisyti pavadinimų raidžių dydžio" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Pagal pa_vadinimą" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Pagal _keitimo laiką" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Pagal _dydį" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Pagal failo _tipą" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Įveskite naujo aplanko pavadinimą:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Kuriamas naujas aplankas" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Įveskite naujo tuščio failo pavadinimą:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Kuriama ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Naujas" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Įveskite naują %s pavadinimą:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Kuriama „%s“" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Sukūrus failą, paleisti jį, naudojant numatytąją programą" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Atrodo, kad šis tekstinis failas „%s“ yra vykdomasis scenarijus.\n" "Ką norite su juo daryti?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Šis failas „%s“ yra vykdomasis failas. Ar norite jį įvykdyti?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nenurodyti jokie aplankai." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Pasirinkite aplanką" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Klaida" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Patvirtinti" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Klausimas" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Šie veiksmai leidžiami tik sistemos administratoriams." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Ar norite perkelti failą „%s“ į šiukšlinę?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Ar norite perkelti %d pažymėtą failą į šiukšlinę?" msgstr[1] "Ar norite perkelti %d pažymėtus failus į šiukšlinę?" msgstr[2] "Ar norite perkelti %d pažymėtų failų į šiukšlinę?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Ar norite ištrinti failą „%s“?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Ar norite ištrinti %d pažymėtą failą?" msgstr[1] "Ar norite ištrinti %d pažymėtus failus?" msgstr[2] "Ar norite ištrinti %d pažymėtų failų?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Pervadinti failą" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Įveskite naują pavadinimą:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Ar tikrai norite išvalyti šiukšlinę?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Į_dėti ir pereiti" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Aplanko vietos juosta" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Namų aplankas" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Darbalaukis" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programos" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Failų sistemos šakninis aplankas" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Prijungti tomą" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Atjungti tomą" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Išstumti keičiamąją laikmeną" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatuoti tomą" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Pervadinti žymelę" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Šalinti iš žymelių" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Pa_kelti žymelę" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "_Nuleisti žymelę" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Išvalyti šiukšlinę" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Šoninėje juostoje rodo įprastų vietų, įrenginių ir žymelių sąrašą" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Pervadinti žymelę" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Įveskite naują pavadinimą:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipas: %s\n" "Dydis: %s\n" "Keista: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipas: %s\n" "Keista: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Prieš sustabdant failų operaciją, atsirado klaidų." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Atsisakyta" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Failų operacija buvo užbaigta su klaidomis." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Užbaigta" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Kai kurie failai negali būti perkelti į šiukšlinę, nes failų sistema to " "nepalaiko.\n" "Ar norite vietoj to, juos ištrinti visiems laikams?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pristabdyti" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Pratęsti" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Perkeliama" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopijuojama" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Perkeliama į šiukšlinę" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Ištrinama" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Kuriama nuoroda" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Paskirtis:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Kuriamos nuorodos į failus" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Keičiami failo atributai" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Keičiami failų atributai" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Atkuriama" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s failai" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Vykdoma failų operacija..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s failas:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s failai:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Išjungta" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Vietos" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Katalogų medis" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Nuotolinis" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Vietos" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Katalogų medis" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Žiūrėti aplanko turinį" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Slėpti %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Perkelti _kairėn" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Perkelti _dešinėn" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Rodyti %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Pamiršti plotį" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Piktogramų rodinys" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Glaustasis rodinys" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Miniatiūrų rodinys" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "_Išsamaus sąrašo rodinys" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Pakeičia aktyvią kortelę" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Nurodytas aplankas „%s“ yra neteisingas" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Nepavyksta gauti prieigos prie paskirties failo" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Nepavyksta sukurti nuorodos ne savoje failų sistemoje" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Nepavyko atstatyti į šiukšlinę perkelto failo „%s“: pradinis kelias nėra " "žinomas" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Paskirties nėra" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Šaltinio ir paskirties vieta yra ta pati." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Negalima perkelti aplanko į jo poaplankį" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Negalima kopijuoti aplanko į jo poaplankį" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Paskirties vieta yra šaltinio vietos poaplankis" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Nepavyksta nukopijuoti failo „%s“: nepalaikoma" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Rodomą pavadinimą galima nustatyti tik vienam failui" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Nustatyti paskirtį galima tik vienam failui" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML failo „%s“ klaida (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML faile nėra „Applications root“" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Nepavyksta sukurti XML apibrėžimo, skirto „%s“" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Meniu kelias „%s“ jau yra" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Meniu podėlio klaida" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Neteisingas meniu katalogas" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Meniu elemento pavadinimas negali būti tuščias" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Neteisingas meniu katalogas „%s“" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Neteisingas meniu elementas" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Meniu įrašas „%s“ neturi atitinkamo įrašo failo" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Meniu katalogui slėpimo būsenos keitimas nėra palaikomas" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Atributo „%s“ nustatymas yra nepalaikomas" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Neteisingas „%s“ atributo reikšmė" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "„%s“ yra meniu katalogas" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "„%s“ nėra meniu elementas" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Įrašo failas „%s“ yra sugadintas" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Nepavyksta sukurti meniu elemento „%s“" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Meniu katalogo pavadinimas neturėtų baigtis „.desktop“" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Neteisinga operacija su meniu šaknimi" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Neteisinga paskirtis" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: aplankas „%s“ meniu podėlyje nerastas" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Ieškoti" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Paieškos rezultatai" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Pasirinkite vykdomąjį failą" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ko_manda:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Komanda, kuri bus vykdoma aktyvavus programos piktogramą" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Aprašas:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Bendrinis programos pavadinimas" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Darbinis _katalogas:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Katalogas, kuriame bus vykdoma programa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Paaiškinimas:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Programai rodomas paaiškinimas" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Naudoti pranešimą apie paleidimą" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Darbalaukio įrašas" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Atkurti" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Atkurti į šiukšlinę perkeltus failus į jų pradines vietas" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "šaltinio failo pavadinimas arba darbalaukio id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ŠALTINIS" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "rezultato failo pavadinimas" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "REZULTATAS" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM diskas" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Tuščias CD-ROM diskas" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R diskas" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Tuščias CD-R diskas" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW diskas" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Tuščias CD-RW diskas" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM diskas" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Tuščias DVD-ROM diskas" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW diskas" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Tuščias DVD-RW diskas" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM diskas" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Tuščias DVD-RAM diskas" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R diskas" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Tuščias DVD+R diskas" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW diskas" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Tuščias DVD+RW diskas" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL diskas" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Tuščias DVD+R DL diskas" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL diskas" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Tuščias DVD+RW DL diskas" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray diskas" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Tuščias Blu-Ray diskas" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R diskas" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Tuščias Blu-Ray R diskas" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW diskas" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Tuščias Blu-Ray RW diskas" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD diskas" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Tuščias HD DVD diskas" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R diskas" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Tuščias HD DVD-R diskas" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW diskas" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Tuščias HD DVD-RW diskas" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO diskas" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Tuščias MO diskas" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW diskas" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Tuščias MRW diskas" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W diskas" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Tuščias MRW/W diskas" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Garso įrašų failai" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Tuščias optinis diskas" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optinis diskas" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Lipnus" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Nustatyti UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Tik savininkas" #~ msgid "Symlinking" #~ msgstr "Kuriama simbolinė nuoroda" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Apdorojama:" #~ msgid "Progress:" #~ msgstr "Eiga:" #~ msgid "Some errors occurred:" #~ msgstr "Įvyko kelios klaidos:" #~ msgid "Re_move from Bookmark" #~ msgstr "_Pašalinti iš žymelių" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "Failo operacija atšaukta, įvyko klaidų." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Failų operacija baigta, bet įvyko klaidų." #~ msgid "Moving Files" #~ msgstr "Perkeliami failai" #~ msgid "Copying Files" #~ msgstr "Kopijuojami failai" #~ msgid "Trashing Files" #~ msgstr "Failai siunčiami į šiukšlinę" #~ msgid "Deleting Files" #~ msgstr "Šalinami failai" #~ msgid "Creating Symlinks" #~ msgstr "Kuriamos simbolinės nuorodos" #~ msgid "Changing File Attributes" #~ msgstr "Keičiami failo atributai" #~ msgid "_Rename Folder" #~ msgstr "_Pervadinti aplanką" #~ msgid "File type to be opened:" #~ msgstr "Atveriamo failo tipas:" #~ msgid "_Installed Application" #~ msgstr "Įdiegtos _programos" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "_Pasirinkite programą su kuria bus atveriami šio tipo failai" #~ msgid "Computer" #~ msgstr "Kompiuteris" #~ msgid "_Move" #~ msgstr "_Perkelti" #~ msgid "_Trash" #~ msgstr "Ši_ukšlinė" #~ msgid "_Only for this folder" #~ msgstr "_Tik šiam aplankui" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Pažymėkite jei norite jog šis nustatymas būtų prisimintas tik šiam " #~ "aplankui" #~ msgid "Please select a folder" #~ msgstr "Pasirinkite aplanką" #~ msgid "Entry for folder path" #~ msgstr "Aplanko kelio įvestis" #~ msgid "Network Drives" #~ msgstr "Tinklo įrenginys" #~ msgid "_Browse" #~ msgstr "_Naršyti" #~ msgid "My Computer" #~ msgstr "Mano kompiuteris" #~ msgid "_Run in terminal emulator" #~ msgstr "_Vykdyti terminale" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Įvykdžius komandą, palikti terminalo langą atvertą" #~ msgid "Mount Point" #~ msgstr "Prijungimo taškas" #~ msgid "Empty tag" #~ msgstr "Tuščia žymė" #~ msgid "Tag should have exactly one child" #~ msgstr "Žymė turėtų turėti tik vieną vaikinį elementą" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Žymė gali turėti tik , , ar žymę" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Sujungiant failą gali būti tik aukščiausio lygio žymė, gauta <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Sujungiant failą nepavyko įterpti žymės <%s>" #~ msgid "Invalid tag" #~ msgstr "Netinkama žymė" #~ msgid "Invalid tag" #~ msgstr "Netinkama žymė" #~ msgid "Cannot find path '%s' in XML definitions" #~ msgstr "XML aprašymuose kelias „%s“ nerastas" #~ msgid "Category manipulation internal error" #~ msgstr "Kategorijų tvarkymo vidinė klaida" #~ msgid "Invalid menu item '%s'" #~ msgstr "Netinkamas meniu elementas „%s“" libfm-1.4.0/po/ml.po000066400000000000000000001106031475513661000142040ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: ml\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774902.329856\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/ms.po000066400000000000000000001105251475513661000142160ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774902.504112\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/nb.po000066400000000000000000001357661475513661000142140ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2019-08-22 14:42+0200\n" "Last-Translator: Imre Kristoffer Eilertsen \n" "Language-Team: \n" "Language: nb\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-Generator: Poedit 2.2.3\n" "X-POOTLE-MTIME: 1439774902.815313\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Forvalgte programmer" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Velg programmer som skal benyttes ved klikking på nettlenker eller E-" "postadresser" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Snarveisredigerer" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Opprett en ny skrivebordsoppføring eller endre en som eksisterer" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Velg et program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Bruk det valgte programmet til å åpne filer" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Installerte programmer" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Ledeteksten s_om skal kjøres:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Bla gjennom …" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Kjør i terminalemulator" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Hold terminalvinduet åpent etter kommandokjøring" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Disse spesielle kodene kan brukes i ledeteksten:\n" " %f: Representerer et individuelt filnavn\n" " %F: Representerer flere filnavn\n" " %u: Representerer et individuelt URI av filen\n" " %U: Representerer flere URIer" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Progr_amnavn (valgfritt, bestem for å beholde tilknytning)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Kjør en tilpasset ledetekst for å åpne filer" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "T_ilpasset ledetekst" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "_Velg det valgte programmet som den forvalgte handlingen for denne filtypen" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Bekreft filutbytting" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Hopp over" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "End_re navn" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Overskriv" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Det er allerede en fil med det samme navnet i denne plasseringen\n" "\n" "Vil du overskrive den eksisterende filen" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "med den følgende filen?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Filnavn:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Benytt denne innstillingen for alle eksisterende filer" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Velg et ikon …" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "systemikontema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "bildefiler" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Velg et ikon fra:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Kjør filen" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Kjør i terminalen" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Filegenskaper" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikonet til filen i mappevisning" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Navn:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Plassering:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Målfil:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Filtype:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Åpne _med:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Velg et program som skal brukes til å åpne filer av denne typen " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Totalt antall filer:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Total størrelse på filer:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Plass på disk:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Seneste endring:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Seneste tilgang:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Seneste endring av tillatelser:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Generelt" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "E_ier:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_ruppe:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Vis innhold:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "E_ndre innhold:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Kjør:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Spesial-bits:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Hvem som kan lese filens/mappens innhold" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Hvem som kan endre filens/mappens innhold" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Hvem som kan kjøre filen eller gå inn i mappen" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Spesielle flagg for filkjøring" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Spesielle flagg for mappetilgang" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Tilgangskontroll" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skjult fil" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Tillatelser" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ingen" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Klister" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Bestem GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Klistre fast og bestem GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Bestem UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Bestem UID og GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Kun eieren" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Kun eieren og gruppen" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Alle" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ingen" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Byte" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Velg en dato" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Velg en dato fra den følgende kalenderen" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Søk etter filer" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Fil_navnmønstre:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Mønsteret kan enten være en POSIX-skallmønsterliste (med ',' som adskiller) " "eller POSIX-ordinæruttrykk." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Versal-insensiti_v" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Benytt" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Sted_er å søke i:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Søk i undermapper" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Søk i _skjulte filer" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Navn/P_lassering" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Filtype" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Søk kun etter filer av de følgende typene:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_kstfiler" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Billedfiler" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Lydfiler" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videofiler" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenter" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Mappe_r" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "An_net:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Enhver gyldig innholdstype kan bli skrevet inn her. '*'-jokertegn er tillatt " "på slutten av typen. Flere typer burde bli adskilt med ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Fil_type" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Filen _inneholder:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Innh_old" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Filstørrelse" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Mindre enn:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Større enn:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Tidspunkt for seneste endring" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ingen)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Tidligere enn:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "S_enere enn:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Egenskaper" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Nettleser" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Den foretrukne nettleseren vil bli brukt til å åpne hyperlenker." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "E-postklient" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Den foretrukne E-postklienten vil bli brukt til å skrive E-poster når du " "klikker på E-postadresser." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminalemulator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Ledetekst:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Systemprogrammer" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Filtilknytninger" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Til:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Forbereder..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Data overført:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Gjenværende tid:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Feil oppstod:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Tom verdi" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Ugyldig utvalg" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Handlingen er ikke støttet" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Ugyldig skrivebordsoppføringsfil: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Klarte ikke å bestemme innholdstypen til '%s'-filen for å kunne kjøre den" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Ingen forvalgte programmer er valgt til å åpne URIer %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Kan ikke sette utgangspunktmappen til '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Ingen standardprogrammer er valgt for MIME-typen %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Enheter" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Nettverk" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Papirkurv" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "snarvei til URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: ugyldig argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Ingen terminalemulator er valgt i libfm-oppsettet" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Ugyldig beskrivelse av miniatyrbildeprogrammet" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI-underfilbanen '%s' inneholder ugyldige uinngjerdede tegn" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Duplikathåndterer for stemplet <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Klarte ikke å tolke '%-.*s', som burde ha vært et tegn inni en tegnreferanse " "(for eksempel ê) - kanskje er sifferet for stort" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Tegnreferansen sluttet ikke med et semikolon; mest sannsynlig brukte du et " "ampersand-tegn uten at du mente å starte en enhet - avslutt ampersander som " "&" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Tegnreferansen '%-.*s' omkoder ikke et tillatt tegn" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "En tom enhet '&;' er observert; gyldige enheter er: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Enhetsnavnet '%-.*s' er ukjent" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Enheten sluttet ikke med et semikolon; mest sannsynlig brukte du et " "ampersand-tegn uten at du mente å starte en enhet - avslutt ampersander som " "&" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Mellomrom er ikke tillatt i lukkingsstemplet" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "'%s'-elementet ble lukket, men ingen elementer ble åpnet" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "'%s'-elementet ble lukket, men det nåværende åpne elementet er '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Ugyldig tegn '%c' ved starten av attributtverdien" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Ugyldig tegn '%c' ved starten av attributtverdien, forventet '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokumentet tok uventet slutt" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokumentet var tomt eller inneholdt kun tomrom" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML-datafeil" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Tilpass" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Kjørbare filer" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Velg et program å åpne «%s»-filer med" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Installerte programmer" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Laster ..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Viser et tre av mapper i sidelinjen" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Avbryt" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "K_opier hit" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Flytt hit" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Lenk hit" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave mislyktes." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Åpne" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Åpne _med …" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Åpne _med" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopier fil_banen(e)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "S_kjul" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "V_is" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Legg til i bokmerkene" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Gi nytt navn …" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Ko_mprimer …" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Utvinn _hit" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "U_tvinn til …" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Egenskap_er" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Flytt _til papirkurven" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Bokmerkene dine har allerede et bokmerke for denne mappen." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Billedfiler" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "skanner… %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Vennligst skriv inn et gyldig brukernavn eller numerisk ID." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Vennligst skriv inn et gyldig gruppenavn eller numerisk ID." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Vil du benytte disse endringene rekursivt til alle filer og undermapper?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Skjul eller vis filen" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Filen er skjult fordi dens navn begynner med et punktum ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Filer på dette systemet er skjult dersom navnet dens begynner med et punktum " "('.'). Trykk for å skru av/på visning av skjulte filer." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "skanner …" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Tilgang til innhold:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Filer av forskjellige typer" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fil:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Flere filer" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Navn" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Beskrivelse" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Størrelse" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Tillatelser" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Eier" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Sist endret" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Lokalisering" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Utvidelse" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Opprett _ny …" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Mappe" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tom fil" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverter utvalg" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sortér filer" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Gi nytt navn til mappen …" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Mappe-egenskap_er" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Vis s_kjulte" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Bland _filer og mapper" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorer store/små bokstaver i navn" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Etter _navn" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Etter _endringstidspunkt" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Etter _størrelse" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Etter fil_type" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Angi navn til den nye mappen:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Oppretter ny mappe" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Skriv inn navnet til den tomme filen:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Oppretter …" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nye" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Angi navn til den nye %sen:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Oppretter %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Kjør standardprogrammet på filen etter oppretting" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "'%s'-testfilen ser ut til å være et kjørbart skript.\n" "Hva vil du gjøre med det?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "'%s'-filen er kjørbar. Vil du kjøre den?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Ingen mapper er valgt." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Velg mappe" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Feil" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Bekreft" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Spørsmål" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Kun systemadministratorer har tillatelse til å gjøre dette." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Vil du flytte '%s'-filen til papirkurven?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Vil du flytte %d valgt fil til papirkurven?" msgstr[1] "Vil du flytte de %d valgte filene til papirkurven?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Er du sikker på at du vil slette '%s'-filen?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Vil du slette %d valgt fil?" msgstr[1] "Vil du slette de %d valgte filene?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Gi nytt navn til fil" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Vennligst skriv inn et nytt navn:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Er du sikker på at du vil tømme papirkurven?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Li_m inn og gå til" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Mappeplasseringslinje" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Hjemmemappe" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Skrivebord" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Applikasjoner" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Filsystem-rotmappen" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montér volum" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Avmontér volum" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Ta ut fjernbart medie" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formater volumet" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Gi nytt navn til bokmerkeelement" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Fjern fra bok_merker" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Flytt bokmerket _opp" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Flytt bokmerket _ned" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Tøm papirkurven" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Viser en liste over vanlige steder, enheter, og bokmerker i sidelinjen" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Gi nytt navn til bokmerkeelement" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Skriv inn et nytt navn:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Størrelse: %s\n" "Endret: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Endret: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Feil oppstod før filhandlingen ble avbrutt." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Avbrutt" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Filhandlingen ble fullført med feil." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Fullført" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Noen filer kan ikke bli flyttet til papirkurven, ettersom de underliggende " "filsystemene ikke støtter denne handlingen.\n" "Vil du slette dem i stedet?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Sett på pause" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Fortsett" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Flytter" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopierer" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Kaster" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Sletter" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Oppretter lenke" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Er i:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Oppretter lenker til filer" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Endrer attributtene til" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Endrer attributtene til filer" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Gjenoppretter" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s filer" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Filhandling pågår..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s fil:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s filer:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Av" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Steder" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Mappetre" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Eksternt" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Steder" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Mappetre" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Visning av mappeinnhold" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Skjul %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Flytt til venstre" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Flytt til høy_re" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Vis %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Glem bredden" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikonvisning" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Kompakt visning" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Miniatyrbildevisning" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Detaljert _listevisning" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Endrer den aktive fanen" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Den spesifiserte mappen '%s' er ugyldig" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Får ikke tilgang til målfilen" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Kan ikke opprette en lenke i et ikke-Unix-filsystem" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Kan ikke gjenopprette '%s'-filen: den opprinnelige filbanen dens er ukjent" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Målstedet finnes ikke" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Kilden og målstedet er det samme." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kan ikke flytte en mappe inn i dens undermappe" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kan ikke kopiere inn en mappe i dens undermappe" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Målbanen er en undermappe av kilden" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Kan ikke kopiere filen '%s': ikke støttet" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Å bestemme visningsnavn kan kun gjøres for én fil om gangen" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Å bestemme målpunkt kan kun gjøres for én fil om gangen" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML-filfeil '%s' (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML-filen støtter ikke Programmer-roten" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Kan ikke opprette en XML-definisjon for '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "'%s'-menyfilbanen finnes allerede" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Menyhurtiglager-feil" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ugyldig menymappe" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Menyelementnavnet kan ikke være tomt" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Ugyldig menymappe '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ugyldig menyelement" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "'%s'-menygjenstanden har ikke en passende oppføringsfil" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Å endre skjulingsstatus er ikke støttet for menymappen" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Å bestemme '%s'-attributten er ikke støttet" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ugyldig verdi for '%s'-attributten" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s'-en er en menymappe" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' er ikke et menyelement" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s'-oppføringsfilen er ødelagt" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Kan ikke opprette menygjenstanden '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Navnet til menymappen kan ikke slutte med «.desktop»" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Ugyldig handling med menyrotmappen" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ugyldig destinasjon" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: '%s'-mappen ble ikke funnet i menyhurtiglageret" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Søk" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Søkeresultater" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Velg en kjørbar fil" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ko_mmando:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Kommandoen som skal kjøres når programikonet er aktivert" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "B_eskrivelse:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Programmets generiske navn" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Utgangspunktmappe:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Utgangspunktmappen som programmet skal kjøres i" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Verktøytips:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Verktøytipset som skal vises for programmet" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Benytt oppstartsbeskjeden" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Skrivebordsoppføring" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Gjenopprett" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Gjenopprett kastede filer til sine opprinnelige filbaner" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "kildefilnavn eller skrivebords-id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "KILDE" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "resultatfilnavn" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM-disk" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Blank CD-ROM-disk" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R-disk" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Blank CD-R-disk" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW-disk" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Blank CD-RW-disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM-disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Blank DVD-ROM-disk" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW-disk" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Blank DVD-RW-disk" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM-disk" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Blank DVD-RAM-disk" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R-disk" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Blank DVD+R-disk" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW-disk" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Blank DVD+RW-disk" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL-disk" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Blank DVD+R DL-disk" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL-disk" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Blank DVD+RW DL-disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray-disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Blank Blu-Ray-disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R-disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Blank Blu-Ray R-disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW-disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Blank Blu-Ray RW-disk" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD-disk" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Blank HD DVD-disk" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R-disk" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Blank HD DVD-R-disk" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW-disk" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Blank HD DVD-RW-disk" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO-disk" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Blank MO-disk" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW-disk" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Blank MRW-disk" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W-disk" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Blank MRW/W-disk" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Lydfiler" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Blank optisk disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optisk disk" libfm-1.4.0/po/nl.po000066400000000000000000001450651475513661000142170ustar00rootroot00000000000000# Dutch translation for the libfm package. # Copyright (C) the author of the libfm package. # This file is distributed under the same license as the libfm package. # Pjotr, 2011. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-05-17 08:06+0000\n" "Last-Translator: Pjotr \n" "Language-Team: Dutch\n" "Language: nl\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1526544398.585986\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Voorkeurstoepassingen" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Kies toepassingen die worden aangeroepen bij een klik op een webkoppeling of " "e-mailadres" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Snelkoppelingbewerker" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" "Maak nieuw of verander bestaand configuratiebestand voor de werkomgeving" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Kies toepassing" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Gebruik gekozen toepassing om bestanden te openen" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Geïnstalleerde toepassingen" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Opdrachtregel om uit te voeren:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Bladeren..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Uitvoeren in terminalvenster" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Houd terminalvenster open na het uitvoeren van de opdracht" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Deze speciale codes kunt u gebruiken in de opdrachtregel:\n" " %f: Representeert een enkele bestandsnaam\n" " %F: Representeert meerdere bestandsnamen\n" " %u: Representeert een enkele URI van het bestand\n" " %U: Representeert meerdere URI's" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "Naam van toepassing (naar keuze, stel dit in om associatie te behouden)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Voer aangepaste opdrachtregel uit om bestanden te openen" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Aangepaste opdrachtregel" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Stel gekozen toepassing in als standaardactie voor dit bestandtype" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Bevestig vervangen van bestand" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Overslaan" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Hernoemen" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "Over_schrijven" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Er is al een bestand met dezelfde naam op deze plek.\n" "\n" "Wilt u het bestaande bestand overschrijven" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "met het volgende bestand?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Bestandsnaam:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Pas deze optie toe op alle bestaande bestanden" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Kies een pictogram..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "thema voor systeempictogrammen" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "afbeeldingbestanden" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Kies pictogram vanuit:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Bestand uitvoeren" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Uitvoeren in _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Bestandeigenschappen" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Pictogram van het bestand in mapweergave" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "Naam:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Locatie:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Doelbestand:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Bestandtype:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Openen _met:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Selecteer de toepassing om bestanden van dit type te openen " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Totaal aantal bestanden:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Totale omvang van bestanden:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Grootte op schijf:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Laatste aanpassing:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Laatste benadering:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Laatste rechtenwijziging:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Algemeen" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Eigenaar:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Groep:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Inhoud bekijken:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Inhoud veranderen:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "Uitvoeren:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Speciale bits:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Wie de inhoud van het bestand of de map kan lezen" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Wie de inhoud van het bestand of de map kan veranderen" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Wie het bestand kan uitvoeren of de map kan binnengaan" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Speciale vlaggen voor het uitvoeren van bestanden" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Speciale vlaggen voor maptoegang" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Toegangcontrole" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Verborgen bestand" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Rechten" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Geen" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Klevend" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Stel GID in" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Klevend en stel GID in" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Stel UID in" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Stel UID en GID in" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Alleen de eigenaar" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Alleen de eigenaar en de groep" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Iedereen" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Niemand" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Kies datum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Kies een datum uit de volgende kalender" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Bestanden zoeken" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Patronen in bestandsnamen:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Patroon mag oftewel een POSIX-schilpatroonlijst zijn (met ',' als " "scheidingsteken) oftewel een POSIX-reguliere uitdrukking." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Hoofdletterongevoelig" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Gebruik reguliere uitdrukking" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Plaatsen om te doorzoeken:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Zoek in submappen" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Doorzoek verborgen bestanden" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Naam/Locatie" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Bestandtype" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Zoek alleen naar de volgende bestandtypes:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Tekstbestanden" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Afbeeldingbestanden" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Geluidbestanden" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Videobestanden" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "Documenten" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Mappen" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Overig:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Elke geldige inhoudssoort kan hier worden ingevoerd. Jokerteken '*' is " "toegestaan aan het einde van de soort. Meerdere soorten moeten worden " "gescheiden door ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Bestandtype" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Bestand bevat:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Inhoud" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Bestandgrootte" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Kleiner dan:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Groter dan:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Tijdstip van laatste wijziging" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Geen)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Eerder dan:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Later dan:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Eigenschappen" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Webbrowser" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "De webbrowser van uw voorkeur zal gebruikt worden om webkoppelingen te " "openen." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "E-mailprogramma" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Het e-mailprogramma van uw voorkeur zal gebruikt worden om e-mails te " "schrijven als u op een e-mailadres klikt." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminalvenster" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Opdrachtregel:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Systeemtoepassingen" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Bestandassociaties" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Naar:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Aan het voorbereiden..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Overgebrachte gegevens:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Resterende tijd:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Opgetreden fouten:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Lege waarde" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Ongeldige keuze" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Bewerking wordt niet ondersteund" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Ongeldig configuratiebestand voor de werkomgeving: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Kon inhoudtype van bestand '%s' niet vaststellen om het op te starten" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Er is geen standaardtoepassing ingesteld om URIs %s:// te starten" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Kan werkmap niet instellen op '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Er is geen standaardtoepassing ingesteld voor MIME-type %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Apparaten" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Netwerk" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Prullenbak" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "snelkoppeling naar URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: ongeldig argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Er is in de configuratie van libfm geen terminalvenster ingesteld" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Ongeldige beschrijving van miniatuurmakertoepassing" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Het URI-subpad '%s' bevat ongeldige metatekens (escaped characters)" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Dubbele handler voor etiket <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Kon '%-.*s' niet verwerken, hetgeen een getal in een tekenverwijzing zou " "moeten zijn (bijvoorbeeld ê) - misschien is het getal te groot" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Tekenverwijzing eindigt niet op een puntkomma; waarschijnlijk heeft u een " "ampersand-teken gebruikt zonder daarmee een entiteit te willen beginnen - " "gebruik in plaats daarvan &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Tekenverwijzing ‘%-.*s’ staat niet voor een geoorloofd teken" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Lege entiteit ‘&;’ gevonden; geldige entiteiten zijn: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Entiteitnaam '%-.*s' is niet bekend" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "De entiteit eindigde niet op een puntkomma; waarschijnlijk heeft u een " "ampersand-teken gebruikt zonder daarmee een entiteit te willen beginnen - " "gebruik in plaats daarvan &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Spatie is niet toegestaan in het afsluitetiket" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element '%s' werd gesloten maar er was geen element geopend" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Element ‘%s’ is afgesloten, maar op dit moment is element ‘%s’ open" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Ongeldig teken '%c' aan begin van attribuutwaarde" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Ongeldig teken '%c' aan einde van attribuutwaarde, '%c' werd verwacht" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Document eindigde onverwachts" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Document was leeg of bevatte alleen spaties" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML-gegevensfout" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Aanpassen" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Uitvoerbare bestanden" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Kies een toepassing om '%s' bestanden te openen" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Geïnstalleerde toepassingen" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Aan het laden..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Toont mapstructuur in zijbalk" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Annuleren" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Hierheen kopiëren" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "Hierheen verplaatsen" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Hier naartoe verwijzen" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave mislukt." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Openen" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Openen _met..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Openen _met..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Pad(en) kopiëren" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Ver_bergen" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Zichtbaar maken" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Toevoegen aan bladwijzers" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Hernoemen..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Comprimeren..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Hier uitpakken" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Uitpakken naar..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Eigenschappen" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Verplaats naar prullenbak" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Uw bladwijzers bevatten reeds een bladwijzer voor deze map." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Afbeeldingbestanden" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "bezig met doorzoeken... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Gelieve een geldige gebruikersnaam of numerieke ID in te voeren." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Gelieve een geldige groepsnaam of numerieke ID in te voeren." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Wilt u deze veranderingen recursief toepassen op alle bestanden en submappen?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Verberg het bestand of maak het zichtbaar" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Dit bestand is verborgen omdat zijn naam begint met een punt ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Bestanden op dit systeem zijn verborgen indien hun naam begint met een punt " "('.'). Met de toetscombinatie 'Ctrl h' kunt u het weergeven van verborgen " "bestanden omschakelen." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "aan het doorzoeken..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Inhoud benaderen:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Bestanden van verschillende soorten" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Bestand:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Meerdere bestanden" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Naam" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Omschrijving" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Grootte" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Rechten" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Eigenaar" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Aangepast" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Locatie" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extensie" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Maak _nieuw(e)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Map" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Leeg bestand" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Selectie _omdraaien" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Bestanden _sorteren" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Map hernoemen..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Mapeigenschappen" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Toon _verborgen" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Bestanden en mappen vermengen" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Negeer hoofdlettergebruik" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Op _naam" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Op _wijzigingstijdstip" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Op _grootte" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Op _bestandtype" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Voer een naam in voor de zojuist gemaakte map:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Nieuwe map maken..." #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Voer een naam in voor het lege bestand:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Aan het maken..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nieuw" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Voer een naam in voor het of de nieuwe %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s maken..." #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Draai standaardtoepassing voor bestand nadat het is gemaakt" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Dit tekstbestand '%s' lijkt een uitvoerbaar script te zijn.\n" "Wat wilt u ermee doen?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Dit bestand '%s' is uitvoerbaar. Wilt u het uitvoeren?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Er zijn geen mappen opgegeven." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Map kiezen" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Fout" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Bevestigen" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Vraag" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Alleen systeembeheerders hebben het recht om dit te doen." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Wilt u het bestand '%s' naar de prullenbak verplaatsen?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Wilt u het %d geselecteerde bestand naar de prullenbak verplaatsen?" msgstr[1] "" "Wilt u de %d geselecteerde bestanden naar de prullenbak verplaatsen?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Wilt u het bestand '%s' verwijderen?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Wilt u het %d gekozen bestand verwijderen?" msgstr[1] "Wilt u de %d gekozen bestanden verwijderen?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Bestand hernoemen" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Gelieve een nieuwe naam in te voeren:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Weet u zeker dat u de prullenbak wil legen?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Plakken en gaan" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Maplocatiebalk" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Thuismap" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Bureaublad" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Toepassingen" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Hoofdmap van bestandssysteem" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Medium aankoppelen" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Medium ontkoppelen" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Verwijderbare media uitwerpen" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "Medium _formatteren" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Bladwijzerelement hernoemen" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Verwijderen uit bladwijzers" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Verplaats bladwijzer omhoog" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Verplaats bladwijzer naar beneden" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Prullenbak ledigen" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Toont lijst van gebruikelijke plaatsen, apparaten en bladwijzers in zijbalk" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Bladwijzerelement hernoemen" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Voer een nieuwe naam in:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Grootte: %s\n" "Aangepast: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Type: %s\n" "Aangepast: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Er traden fouten op voordat de bestandbewerking werd gestaakt." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Geannuleerd" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "De bestandbewerking werd voltooid met fouten." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Voltooid" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Sommige bestanden kunnen niet naar de prullenbak worden verplaatst, omdat de " "onderliggende bestandssystemen deze bewerking niet ondersteunen.\n" "Wilt u hen in plaats daarvan onherroepelijk verwijderen?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "Pa_uzeren" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Hervatten" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Verplaatsen..." #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopiëren..." #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Weggooien..." #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Verwijderen..." #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Koppeling maken..." #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "In:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Koppelingen naar bestanden aan het maken" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Eigenschappen aan het veranderen van" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Bestandeigenschappen aan het veranderen" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Herstellen..." #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s bestanden" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Bestandbewerking is bezig..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s bestand:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s bestanden:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Uit" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Locaties" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Boomstructuur van mappen" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Op _afstand" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Locaties" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Boomstructuur van mappen" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Weergave van mapinhoud" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "Verberg %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Naar links verplaatsen" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Naar rechts verplaatsen" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Toon %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "Breedte vergeten" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Pictogramweergave" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Compacte weergave" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Miniatuurweergave" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Gedetailleerde lijstweergave" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Verandert actieve tabblad" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "De opgegeven map '%s' is niet geldig" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Kan bestemmingsbestand niet benaderen" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Kan geen koppeling maken op een niet-eigen bestandssysteem" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Kan bestand '%s' niet uit de prullenbak halen: oorspronkelijk pad onbekend" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Bestemming bestaat niet" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Bron en bestemming zijn dezelfde." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kan een map niet verplaatsen naar zijn eigen submap" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kan een map niet kopiëren naar zijn eigen submap" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Bestemming is een submap van bron" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Kan bestand '%s' niet kopiëren: niet ondersteund" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Schermnaam instellen kan alleen worden gedaan voor enkel bestand" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Doel instellen kan alleen worden gedaan voor enkel bestand" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML-bestand '%s' fout (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML-bestand bevat geen root voor toepassingen" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Kan geen XML-definitie maken voor '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Menupad '%s' bestaat al" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Fout in menu-opslag" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ongeldige menumap" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Naam van menu-onderdeel kan niet leeg zijn" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Ongeldige menumap '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ongeldig menu-onderdeel" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Het menu-onderdeel '%s' heeft geen geschikt invoerveld" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Verborgen-status veranderen wordt niet ondersteund voor menumap" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Het instellen van attribuut '%s' wordt niet ondersteund" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ongeldige waarde voor attribuut '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "De '%s' is een menumap" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "De '%s' is geen menu-onderdeel" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Het configuratiebestand '%s' is kapot" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Kan menu-onderdeel '%s' niet maken" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Naam van menumap zou niet mogen eindigen op '.desktop'" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Ongeldige bewerking met root van menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ongeldige bestemming" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: map '%s' niet aangetroffen in menu-opslag" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Zoeken" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Zoekresultaten" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Kies uitvoerbaar bestand" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Opdracht:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" "Opdracht om uit te voeren wanneer het toepassingspictogram is geactiveerd" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "Beschrijving:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Generieke naam van de toepassing" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Werkmap:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "De werkmap om het programma in te draaien" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Gereedschaptip:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Gereedschaptip om te tonen bij een toepassing" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Gebruik opstartmelding" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Bureaubladregel" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "Herstellen" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Zet bestanden vanuit de prullenbak terug op oorspronkelijke plekken" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "naam van bronbestand of bureaublad-id" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "BRON" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "bestandsnaam van resultaat" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTAAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM-schijf" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Lege CD-ROM-schijf" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R-schijf" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Lege CD-R-schijf" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW-schijf" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Lege CD-RW-schijf" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM-schijf" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Lege DVD-ROM-schijf" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW-schijf" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Lege DVD-RW-schijf" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM-schijf" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Lege DVD-RAM-schijf" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R-schijf" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Lege DVD+R-schijf" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW-schijf" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Lege DVD+RW-schijf" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL-schijf" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Lege DVD+R DL-schijf" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL-schijf" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Lege DVD+RW DL-schijf" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray-schijf" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Lege Blu-Ray-schijf" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R-schijf" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Lege Blu-Ray R-schijf" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW-schijf" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Lege Blu-Ray RW-schijf" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD-schijf" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Lege HD DVD-schijf" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R-schijf" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Lege HD DVD-R-schijf" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW-schijf" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Lege HD DVD-RW-schijf" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO-schijf" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Lege MO-schijf" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW-schijf" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Lege MRW-schijf" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W-schijf" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Lege MRW/W-schijf" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Geluidbestanden" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Lege optische schijf" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optische schijf" #~ msgid "Symlinking" #~ msgstr "Symbolische koppelingen maken" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Bestandtype dat moet worden geopend:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Aan het verwerken:" #~ msgid "Progress:" #~ msgstr "Voortgang:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "De bestandoperatie is voltooid, maar er zijn enkele fouten." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Symbolische koppelingen aanmaken" #~ msgid "_Browse" #~ msgstr "_Bladeren" #~ msgid "My Computer" #~ msgstr "Mijn Computer" #~ msgid "_Only for this folder" #~ msgstr "Alleen voor deze map" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Vink aan om sorteren te onthouden als mapinstelling in plaats van " #~ "algemene instelling" #~ msgid "Please select a folder" #~ msgstr "Gelieve een map te kiezen" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "Alleen voor deze map" #, fuzzy #~ msgid "Computer" #~ msgstr "Mijn Computer" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Netwerk" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Uitvoeren in terminalvenster" #~ msgid "Shortcuts" #~ msgstr "Sneltoetsen" #~ msgid "Mount Point" #~ msgstr "Koppelpunt" #~ msgid "Create _Symlink" #~ msgstr "Symbolische koppeling aanmaken" #~ msgid "Se_nd To" #~ msgstr "Stu_ren naar" #~ msgid "Blank File" #~ msgstr "Leeg bestand" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Fout. lxshortcut is niet geïnstalleerd" #~ msgid "Failed to start lxshortcut" #~ msgstr "Kon lxshortcut niet starten" #~ msgid "_Group:" #~ msgstr "_Groep:" #~ msgid "Rename" #~ msgstr "Hernoemen" #~ msgid "Make the file executable" #~ msgstr "Bestand uitvoerbaar maken" #~ msgid "Operations that all other users can do" #~ msgstr "Bewerkingen die alle andere gebruikers kunnen doen" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Bewerkingen die de eigenaar van het bestand kan doen" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Bewerkingen die gebruikers van dezelfde groep als de bestandeigenaar " #~ "kunnen doen" #~ msgid "Read and Write" #~ msgstr "Lezen en schrijven" #~ msgid "Read only" #~ msgstr "Alleen-lezen" #~ msgid "Write only" #~ msgstr "Alleen-schrijven" libfm-1.4.0/po/nn.po000066400000000000000000001106201475513661000142060ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: nn\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774903.517883\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/pa.po000066400000000000000000001106201475513661000141730ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: pa\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774903.720045\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/pl.po000066400000000000000000001510241475513661000142110ustar00rootroot00000000000000# Polish translation for libfm package. # Copyright (C) 2014 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Piotr Sokół , 2010, 2011, 2012, 2013, 2014. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-05-16 06:15+0000\n" "Last-Translator: Piotr Strębski \n" "Language-Team: polski <>\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bits\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1526451333.893010\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Preferowane programy" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Wybierz programy uruchamiane przy kliknięciu w odnośnik sieciowy lub adres e-" "mail" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Edytor skrótu" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Tworzy nowy lub modyfikuje istniejący element pulpitu" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Wybór programu" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Otwiera plik za pomocą wybranego programu" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Zainstalowane programy" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Wiersz p_oleceń do wykonania:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Przeglądaj..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Uruchomienie w emulatorze terminala" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Zachowanie otwartego okna terminala po wykonaniu polecenia" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "W wierszu poleceń można użyć następujących oznaczeń:\n" " %f: nazwa pierwszego z zaznaczonych plików,\n" " %F: nazwy wszystkich zaznaczonych plików,\n" " %u: ścieżka pierwszego z zaznaczonych plików,\n" " %U: ścieżki wszystkich zaznaczonych plików." #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "_Nazwa programu (opcjonalnie; ustaw ją, aby zachować powiązania)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Otwiera plik za pomocą wprowadzonego polecenia" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Własny wiersz poleceń" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Domyślnie dla tego typu plików" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Potwierdzenie zastąpienia pliku" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Pomiń" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Z_mień nazwę" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Zastąp" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Plik o takiej samej nazwie znajduje się już w położeniu docelowym.\n" "\n" "Zastąpić plik" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "następującym plikiem?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Nazwa pliku:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Wykonanie czynności dla wszystkich plików" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Wybór ikony..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "motyw ikon systemu" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "pliki obrazów" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Wybierz ikonę z:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Uruchom plik" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Uruchom w emulatorze _terminala" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Właściwości" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikona pliku w widoku katalogu" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nazwa:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Położenie:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Plik docelowy:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Typ pliku:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Otwieranie za p_omocą:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Wybierz program używany do otwierania tego typu plików " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Łączna ilość plików:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Łączny rozmiar plików:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Rozmiar na dysku:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Ostatnia modyfikacja:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Ostatni dostęp:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Ostatnia zmiana uprawnień:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Ogólne" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Właściciel:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupa:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "W_yświetlanie zawartości:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Modyfikowanie zawartości:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "Uruchamiani_e:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Specjalne:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Określa kto może odczytywać zawartość pliku lub katalogu" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Określa, kto może zmieniać zawartość pliku lub katalogu" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Określa, kto może uruchamiać pliki lub przechodzić do katalogu" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Specjalne uprawnienia uruchamiania plików" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Specjalne uprawnienia dostępu do katalogów" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Prawa dostępu" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Plik ukryty" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Uprawnienia" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Brak" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "SGID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky i SGID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "SUID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "SUID i SGID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Tylko właściciel" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Tylko właściciel i grupa" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Wszyscy" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nikt" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bajty" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Wybór daty" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Proszę wybrać datę z poniższego kalendarza:" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Wyszukiwanie plików" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Wzory _nazw plików:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Wprowadza listę wzorów powłoki POSIX rozdzielonych znakiem „,” lub wyrażenie " "regularne POSIX" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Uwzględnianie _wielkości liter" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Użycie wyrażeń regularnych" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Położenia do przeszukania:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Wyszukiwanie w p_odkatalogach" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Uwzględnianie _ukrytych plików" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "_Nazwa i położenie" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Typ pliku" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Wyszukiwanie tylko plików następujących typów:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Pliki te_kstowe" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Obrazy" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Nagrania _dźwiękowe" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Nagrania _wideo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenty" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Katalogi" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Inne:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Określa dowolny, prawidłowy typ pliku. Możliwe jest umieszczenie znaku " "wieloznacznego „*” na końcu definicji. Poszczególne definicje typów należy " "rozdzielić znakiem „;”." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Typ pliku" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "_Zawartość pliku:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Zawart_ość" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Rozmiar pliku" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Mniejszy niż:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Większy niż:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Czas ostatniej modyfikacji" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "Brak" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Wcz_eśniejszy niż:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Póź_niejszy niż:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Właściwości" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Przeglądarka internetowa" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Wybiera preferowaną przeglądarkę internetową służącą do otwierania " "odnośników sieciowych." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Program pocztowy" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Określa preferowany program pocztowy służący do tworzenia wiadomości, po " "kliknięciu w odnośnik adresu e-mail." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulator terminala" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Wiersz poleceń:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Programy systemowe" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Skojarzenia plików" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Położenie docelowe:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Przygotowywanie..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Przesłane dane:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Pozostały czas:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Wystąpiły błędy:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Pusta wartość" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Nieprawidłowy wybór" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Nieobsługiwana operacja" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Nieprawidłowy plik elementu pulpitu: „%s”" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Nie można określić typu zawartości pliku „%s”, aby go uruchomić" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "Brak przypisanego domyślnego programu dla uruchomiania adresu URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Nie można zmienić katalogu roboczego na „%s”: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Brak przypisanego domyślnego programu dla typu MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Urządzenia" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Sieć" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Kosz" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "skrót do URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: nieprawidłowy argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Nie ustalono emulatora terminala w konfiguracji libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Nieprawidłowy opis generatora miniatur" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "KB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bajt" msgstr[1] "%u bajty" msgstr[2] "%u bajtów" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Ścieżka URI „%s” zawiera nieprawidłowe znaki sterujące" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Podwojony program obsługi dla znacznika <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Nie udało się przetworzyć znaku „%-.*s”, w miejscu którego powinna wystąpić " "liczba, będąca częścią odniesienia do znaku (np. ê) - być może liczba " "jest za duża" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Odniesienie do znaku nie jest zakończone średnikiem; najprawdopodobniej " "został użyty znak &, który nie miał oznaczać jednostki - należy go zapisać " "jako &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Odniesienie do znaku „%-.*s” nie jest zapisem dozwolonego znaku" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Napotkano pustą jednostkę „&;”; poprawnymi jednostkami są: & " < " "> '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Nazwa jednostki „%-.*s” nie jest znana" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Jednostka nie jest zakończona średnikiem; najprawdopodobniej został użyty " "znak &, który nie miał oznaczać jednostki - należy go zapisać jako &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Spacja nie jest dozwolona w znaczniku zamknięcia" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element „%s” został zamknięty, ale żaden element nie został otwarty" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Element „%s” został zamknięty, lecz aktualnie otwartym elementem jest „%s”" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Nieprawidłowy znak „%c” na początku wartości atrybutu" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Nieprawidłowy znak „%c” na końcu wartości atrybutu, oczekiwany „%c”" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Nieoczekiwany koniec dokumentu" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument jest pusty lub zawiera tylko spacje" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: błąd danych XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Dostosuj..." #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Pliki wykonywalne" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Proszę wybrać program służący do otwierania plików typu „%s”." #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Zainstalowane programy" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Wczytywanie..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Wyświetla drzewo katalogów w panelu bocznym" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Anuluj" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "S_kopiuj tutaj" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Przenieś tutaj" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Dowiąż tutaj" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Nieudane działanie XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Otwórz" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Otwórz za po_mocą..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Otwórz za po_mocą" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Skopiuj ś_cieżkę" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Ukryj" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "N_ie ukrywaj" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Dodaj do zakładek" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Zmień nazwę..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Skompresuj..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Rozpakuj tutaj" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Ro_zpakuj do..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Właściwości" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Przeni_eś do kosza" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Utworzono już zakładkę do tego katalogu." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Pliki obrazów" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bajt" msgstr[1] "bajty" msgstr[2] "bajtów" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "przeszukiwanie... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Proszę wprowadzić prawidłową nazwę użytkownika lub jego identyfikator." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Proszę wprowadzić prawidłową nazwę grupy lub jej identyfikator." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Zatwierdzić zmiany rekursywnie dla wszystkich plików i podkatalogów?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Ukryj lub wyświetlaj plik" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Ten plik jest ukryty, ponieważ jego nazwa zaczyna się od kropki („.”)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Pliki są ukrywane, jeśli ich nazwy zaczynają się od kropki („.”). Proszę " "wcisnąć , aby przełączyć wyświetlanie ukrytych plików." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "przeszukiwanie..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Dostęp do zawartości:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Pliki różnych typów" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Plik:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Wiele plików" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nazwa" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Opis" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Rozmiar" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Uprawnienia" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Właściciel" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Czas modyfikacji" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Położenie" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Rozszerzenie" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Utwórz _nowy..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Katalog" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Pusty plik" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Odwróć zaznaczenie" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sortowanie" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Zmień nazwę katalogu..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "_Właściwości katalogu" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Wyświetlanie _ukrytych plików" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "_Mieszanie plików i katalogów" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorowanie wielkości liter" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Według _nazwy" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Według _czasu modyfikacji" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Według _rozmiaru" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Według _typu" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Proszę wprowadzić nazwę katalogu:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Tworzenie nowego katalogu" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Proszę wprowadzić nazwę pustego pliku:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Tworzenie..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nowy" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Proszę wprowadzić nazwę dla nowego %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Tworzenie %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Uruchom domyślny program dla pliku po jego utworzeniu" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Plik tekstowy „%s” jest skryptem wykonywalnym.\n" "Uruchomić go?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Plik „%s” jest plikiem wykonywalnym. Uruchomić go?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nie określono katalogów." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Wybór katalogu" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Błąd" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Potwierdzenie" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pytanie" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" "Tylko administratorzy systemu posiadają uprawnienia do wykonania tej " "czynności." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Przenieść plik „%s” do kosza?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Przenieść %d zaznaczony plik do kosza?" msgstr[1] "Przenieść %d zaznaczone pliki do kosza?" msgstr[2] "Przenieść %d zaznaczonych plików do kosza?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Usunąć plik „%s”?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Czy chcesz usunąć zaznaczony %d plik?" msgstr[1] "Czy chcesz usunąć zaznaczone %d pliki?" msgstr[2] "Czy chcesz usunąć zaznaczonych %d plików?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Zmiana nazwy" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Proszę wprowadzić nową nazwę:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Opróżnić kosz?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Wk_lej i dalej" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Pasek położenia katalogów" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Katalog domowy" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Pulpit" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programy" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Katalog główny systemu plików" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Za_montuj wolumen" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Odmont_uj wolumen" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Wysuń nośnik wymi_enny" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatuj wolumen" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Zmień nazwę zakładki" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Usuń zakładkę" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Przenieś zakładkę _wyżej" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Przenieś zakładkę _niżej" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Opróżnij _kosz" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Pokazuj listę miejsc, urządzeń i zakładek w panelu bocznym" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Zmień nazwę zakładki" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Proszę wprowadzić nową nazwę:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Rozmiar: %s\n" "Czas modyfikacji: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Czas modyfikacji: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Wystąpiły błędy przed zatrzymaniem działania na plikach." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Anulowano" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Działanie na plikach zakończono z błędami." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Zakończono" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Pewne pliki nie mogą zostać przeniesione do kosza, ponieważ system plików, " "na którym się znajdują nie obsługuje tego działania.\n" "Czy zamiast tego usunąć je trwale?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Wstrzymaj" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Wznów" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Przenoszenie" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopiowanie" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Przenoszenie plików do kosza" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Usuwanie" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Tworzenie łącza" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "W:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Tworzenie łącza do plików" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Zmienianie atrybutów" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Zmienianie atrybutów plików" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Przywracanie" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s plików" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Trwają działania na plikach..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s plik:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s pliki:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Wyłączone" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Położenia" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Drzewo katalogów" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Zdalne" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Położenia" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Drzewo katalogów" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Podgląd zawartości katalogu" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Ukryj %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Przesuń w lewo" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "P_rzesuń w prawo" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Wyświetl %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "Zapomnij _szerokość" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "W_idok ikon" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Lista _zwarta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Miniatury" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Lista _szczegółowa" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Zmienia aktywną kartę" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Określony katalog „%s” jest nieprawidłowy" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Nie można uzyskać dostępu do pliku docelowego" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Nie można utworzyć dowiązania do nienatywnego systemu plików" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Nie można przywrócić pliku „%s” z kosza: nieznana pierwotna ścieżka" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Miejsce docelowe nie istnieje" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Położenia źródłowe i docelowe są takie same." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Nie można przenieść katalogu do jego położenia podrzędnego" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Nie można skopiować katalogu do jego położenia podrzędnego" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Położenie docelowe jest katalogiem podrzędnym położenia źródłowego" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Nie można skopiować pliku „%s”: nieobsługiwane" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Wyświetlaną nazwę można ustalić tylko dla pojedynczego pliku" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Cel można ustalić tylko dla pojedynczego pliku" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Błąd pliku XML „%s” (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Plik XML nie zawiera katalogu głównego programów" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Nie można utworzyć definicji XML dla „%s”" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Ścieżka menu „%s” już istnieje" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Błąd pamięci podręcznej menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Nieprawidłowy katalog menu" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Nazwa elementu menu nie może być pusta" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Nieprawidłowy katalog menu „%s”" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Nieprawidłowy element menu" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Element menu „%s” nie posiada odpowiedniego pliku wpisu" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Zmiana stanu widoczności nie jest obsługiwana dla katalogów menu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Nieobsługiwane ustalenie atrybutu „%s”" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Nieprawidłowa wartość dla atrybutu „%s”" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "Element „%s” jest katalogiem menu" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "Element „%s” nie jest elementem menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Plik wpisu „%s” jest uszkodzony" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Nie można utworzyć elementu menu '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Nazwa katalogu menu nie powinna kończyć się ciągiem „.desktop”" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Nieprawidłowe działanie na katalogu głównym menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Nieprawidłowe położenie docelowe" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" "FmMenuVFileMonitor: nie odnaleziono katalogu „%s” w pamięci podręcznej menu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Wyszukaj" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Wyniki wyszukiwania" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Wybór pliku wykonywalnego" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Polecenie:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Definiuje polecenie wykonywane po uaktywnieniu ikony programu" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Opis:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Ogólna nazwa programu" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Katalog _roboczy:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Katalog roboczy, w którym zostanie uruchomiony program" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Podpowiedź:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Podpowiedź wyświetlana dla programu" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Powiadamianie o uruchamianiu" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Element pulpitu" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Przywróć" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Przywraca pliki z kosza do ich pierwotnego położenia" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nazwa pliku źródłowego lub identyfikator pulpitu" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ŹRÓDŁO" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "wynikowa nazwa pliku" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "WYNIK" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Płyta CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Pusta płyta CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Płyta CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Pusta płyta CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Płyta CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Pusta płyta CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Płyta DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Pusta płyta DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Płyta DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Pusta płyta DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Płyta DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Pusta płyta DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Płyta DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Pusta płyta DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Płyta DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Pusta płyta DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Płyta DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Pusta płyta DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Płyta DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Pusta płyta DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Płyta Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Pusta płyta Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Płyta Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Pusta płyta Blu-Ray" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Płyta Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Pusta płyta Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Płyta HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Pusta płyta HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Płyta HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Pusta płyta HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Płyta HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Pusta płyta HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Płyta MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Pusta płyta MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Płyta MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Pusta płyta MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Płyta MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Pusta płyta MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Nagrania _dźwiękowe" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Pusta płyta optyczna" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Płyta optyczna" #~ msgid "Symlinking" #~ msgstr "Tworzenie dowiązań" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Bieżący plik:" #~ msgid "Progress:" #~ msgstr "Postęp:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Ukończono operację ale wystąpiły błędy." #~ msgid "Creating Symlinks" #~ msgstr "Tworzenie dowiązań" #~ msgid "_Rename Folder" #~ msgstr "_Zmień nazwę katalogu" #~ msgid "File type to be opened:" #~ msgstr "Typ pliku do otwarcia:" #~ msgid "_Installed Application" #~ msgstr "Za_instalowany program" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "_Domyślnie dla tego typu plików" #~ msgid "_Browse" #~ msgstr "_Przeglądaj..." #~ msgid "My Computer" #~ msgstr "Komputer" #~ msgid "_Move" #~ msgstr "_Przenieś" #~ msgid "_Trash" #~ msgstr "_Kosz" #~ msgid "_Only for this folder" #~ msgstr "_Tylko dla tego katalogu" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Zapamiętuje ustawienia sortowania katalogu zamiast używać ustawień " #~ "globalnych" #~ msgid "Please select a folder" #~ msgstr "Proszę wybrać katalog" #~ msgid "Entry for folder path" #~ msgstr "Wprowadź ścieżkę katalogu" #~ msgid "Computer" #~ msgstr "Komputer" #~ msgid "Network Drives" #~ msgstr "Dyski sieciowe" #~ msgid "_Run in terminal emulator" #~ msgstr "_Uruchom w emulatorze terminala" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Zachowaj otwarcie okna terminala po uruchomieniu" #~ msgid "Shortcuts" #~ msgstr "Skróty klawiszowe" #~ msgid "Mount Point" #~ msgstr "Punkt montowania" #~ msgid "Create _Symlink" #~ msgstr "Utwórz _dowiązanie" #~ msgid "Se_nd To" #~ msgstr "_Wyślij do" #~ msgid "Empty tag" #~ msgstr "Pusty znacznik" #~ msgid "Tag should have exactly one child" #~ msgstr "Znacznik powinien mieć dokładnie jedną podrzędną" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Znacznik może zawierać tylko podrzędną , , lub " #~ "" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Łączony plik może zawierać tylko znacznik głównego poziomu, ma <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Niepowodzenie przy wprowadzaniu znacznika <%s> z łączonego pliku" #~ msgid "Invalid tag" #~ msgstr "Nieprawidłowy znacznik" #~ msgid "Invalid tag" #~ msgstr "Nieprawidłowy znacznik" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Nie udało się odnaleźć ścieżki %s w definicjach XML" #~ msgid "Category manipulation internal error" #~ msgstr "Wewnętrzny błąd manipulowania kategoriami" #~ msgid "Blank File" #~ msgstr "Pusty plik" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Błąd, nie zainstalowano lxshortcut" #~ msgid "Failed to start lxshortcut" #~ msgstr "Nie udało się uruchomić programu lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupa:" #~ msgid "Rename" #~ msgstr "Zmień nazwę" #~ msgid "Make the file executable" #~ msgstr "Uruchamianie" #~ msgid "Operations that all other users can do" #~ msgstr "Określa czynności, które mogą wykonywać wszyscy inni użytkownicy" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Określa czynności, które może wykonywać właściciel" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Określa czynności, które mogą wykonywać użytkownicy należący do tej samej " #~ "grupy co właściciel" #~ msgid "Read and Write" #~ msgstr "Odczytywanie i zapisywanie" #~ msgid "Read only" #~ msgstr "Tylko odczytywanie" #~ msgid "Write only" #~ msgstr "Tylko zapisywanie" libfm-1.4.0/po/ps.po000066400000000000000000001105511475513661000142200ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: ps\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774904.247449\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/pt.po000066400000000000000000001444241475513661000142270ustar00rootroot00000000000000# Portuguese translation for libfm package. # Copyright (C) 2010 THE libfm'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Sérgio Marques , 2010, 2011, 2012. # Hugo Carvalho , 2022, 2023. # Adaptado ao acordo ortográfico de 1990 msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2023-08-01 15:02+0100\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese\n" "Language: pt\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-Generator: Poedit 3.3.2\n" "X-POOTLE-MTIME: 1427376909.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Aplicações preferidas" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Selecione as aplicações a invocar ao clicar numa ligação ou endereço " "eletrónico" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor de atalhos" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Criar entrada ou alterar uma entrada existente" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Escolha uma aplicação" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utilizar aplicação selecionada para abrir os ficheiros" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Aplicações _instaladas" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Linha de c_omandos a executar:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Explorar..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Executar no emulador do terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Manter janela do terminal aberta depois de executar o comando" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Pode utilizar os códigos abaixo na linha de comandos:\n" "%f: representa o nome do ficheiro\n" "%F: representa o nome de vários ficheiros\n" "%u: representa o URI do ficheiro\n" "%U: representa vários URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "Nome da _aplicação (opcional e definido para manter a associação)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Executar comando personalizado para abrir ficheiros" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Linha de _comandos personalizada" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "Definir aplicação _selecionada como pré-definida apara este tipo de ficheiros" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Confirmar ao substituir ficheiros" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Ignorar" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Mudar nome" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "S_obrescrever" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Já existe, neste local, um ficheiro com o mesmo nome.\n" "\n" "Pretende substituir o ficheiro existente" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "por este ficheiro?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Nome do _ficheiro:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Aplicar esta opção a todos os ficheiros existentes" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Escolha um ícone..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "tema de ícones do sistema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "imagens" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Escolher ícones de:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Executar ficheiro" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Executar no _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Propriedades" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ícone do ficheiro na vista de pastas" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nome:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Localização:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Destino:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipo de ficheiro:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Abrir _com:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Selecione a aplicação utilizada para abrir ficheiros deste tipo " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Total de ficheiros:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Tamanho total dos ficheiros:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Tamanho em disco:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Última modificação:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Último acesso:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Alteração de permissões:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Geral" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Proprietári_o:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupo:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Ver conteúdo:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Alterar conteúdo:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Executar:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bits especiais:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Pode ler o conteúdo do ficheiro ou diretório" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Pode alterar o conteúdo do ficheiro ou diretório" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Pode executar o ficheiro ou aceder ao diretório" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Marcas para execução de ficheiros" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Marcas para acesso ao diretório" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Controlo de acesso" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Ficheiro oculto" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permissões" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nenhum" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Fixo" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Definir GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Fixo e definir GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Definir UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Definir UID e GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Apenas o proprietário" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Proprietário e o seu grupo" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Todos" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ninguém" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Escolha uma data" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Escolha uma data do calendário" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Procurar ficheiros" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Padrão de _nomes de ficheiro:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Pode ser uma lista de padrões de consola POSIX (com ',' como separador) ou " "uma expressão regular POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Não diferenciar maiúsculas de minúsculas" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Utilizar expressões regulares" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Locais a proc_urar" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Procurar nos _subdiretórios" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Procurar fic_heiros ocultos" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nome/_Localização" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipo de ficheiro" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Procurar apenas os ficheiros destes tipos:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xto" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Imagens" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Á_udio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Vídeos" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Documentos" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Pas_tas" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "O_utros:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Pode introduzir aqui todos os tipos de conteúdo. O carácter * pode ser " "utilizado no fim do tipo. Os tipos devem ser separados com ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipo de ficheiro" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Conté_m:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_onteúdo" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Tamanho do ficheiro" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Menor que:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "M_aior que:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Data da última modificação" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nenhum)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Ant_erior a:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Posterior _a:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propriedades" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navegador web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "O navegador web preferido será utilizado para abrir hiperligações." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Correio eletrónico" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "O cliente de correio preferido será utilizado para escrever mensagens ao " "clicar nos endereços eletrónicos." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Linha de comandos:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Aplicações do sistema" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Associação de ficheiros" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Para:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "A preparar..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Dados transferidos:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tempo restante:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Ocorreram erros:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Valor vazio" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Seleção inválida" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operação não suportada" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Ficheiro desktop inválido: %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Não foi possível determinar o conteúdo do ficheiro %s" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Não há uma aplicação definida para abrir as URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Não foi possível definir o diretório de trabalho para %s: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Não há uma aplicação definida para ficheiros %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Dispositivos" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Rede" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Lixo" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "atalho do URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumento inválido" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Não há um terminal definido na configuração libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Aplicação de miniaturas com descrição inválida" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "O caminho do URI %s contém caracteres inválidos" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Gestor duplicado para a etiqueta <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Falha ao analisar %-.*s, que devia ser um dígito dentro de uma sequência de " "caracteres (ê por exemplo) - talvez o dígito seja demasiado grande" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "A referência de caracteres não termina com ponto e vírgula. É possível que " "tenha utilizado o carácter & sem a intenção de iniciar uma entidade. Escreva " "o carácter \"&\" desta forma: &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "A referência de caracteres %-.*s não codifica um carácter permitido" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Encontrada entidade '&'; vazia. As entradas válidas são: & " < " "> '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "O nome de entidade %-.*s não é conhecido" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "A entidade não termina com ponto e vírgula. É possível que tenha utilizado o " "carácter & sem a intenção de iniciar uma entidade. Escreva o carácter '&' " "desta forma: &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Não são permitidos espaços na etiqueta de fecho" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "O elemento %s foi fechado mas não foi aberto qualquer elemento" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "O elemento %s foi fechado mas o elemento atualmente aberto é %s" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "O carácter %c é inválido no inicio do atributo" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "O carácter %c é inválido no final do atributo. Esperado %c" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "O documento terminou inesperadamente" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "O documento estava vazio ou só tinha espaços vazios" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: Erro de dados XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalizar" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Ficheiros executáveis" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Selecione a aplicação para abrir ficheiros \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Aplicações instaladas" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "A carregar..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Mostrar árvore de diretórios na barra lateral" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Cancelar" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "C_opiar aqui" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Mover aqui" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Ligar aqui" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Falha XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Abrir" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Abrir _com..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Abrir _com" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copiar ca_minho(s)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Ocultar" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Mostrar" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Adicionar aos marcadores" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Muda_r nome..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mprimir..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Ex_trair aqui" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtrair para..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propri_edades" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Mover para o li_xo" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Esta pasta já existe nos marcadores." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Imagens" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "analisando... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Indique um utilizador ou um identificador numérico válido." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Indique um grupo ou um identificador numérico válido." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Pretende aplicar estas alterações a todos os ficheiros e sub-pastas?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Ocultar ou mostrar o ficheiro" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Este ficheiro está oculto porque o seu nome começa com um ponto (.)." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Os ficheiros deste sistema estarão ocultos se forem precedidos de um ponto " "final. Utilize para alternar a sua visualização." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "analisando..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Aceder ao conteúdo:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Ficheiros de tipos diferentes" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Ficheiro:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Múltiplos ficheiros" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nome" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descrição" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Tamanho" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permissões" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Proprietário" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificado" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Localização" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extensão" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Criar _novo(a)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Pasta" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Ficheiro vazio" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverter seleção" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "Ordenar ficheiro_s" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Muda_r nome da pasta..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propri_edades da pasta" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Mostrar _ocultos" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Misturar _ficheiros e pastas" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorar maiúsculas" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Por _nome" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Por data de _modificação" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Por t_amanho" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Por _tipo de ficheiro" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Introduza o nome para a nova pasta:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Criar nova pasta" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Introduza o nome para o ficheiro vazio:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Criação..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Novo(a)" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Introduza o nome para %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "A criar %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Abri_r aplicação pré-definida depois de criar" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Parece que o ficheiro %s é um script executável.\n" "O que pretende fazer com o ficheiro?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "O ficheiro %s é um executável. Executar?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Não especificou qualquer pasta." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Selecione uma pasta" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Erro" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmação" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pergunta" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Só o administrador do sistema tem permissões para esta ação." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Pretende mover o ficheiro %s para o lixo?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Pretende mover %d ficheiro para o lixo?" msgstr[1] "Pretende mover %d ficheiros para o lixo?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Pretende eliminar o ficheiro %s?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Pretende eliminar %d ficheiro selecionado?" msgstr[1] "Pretende eliminar os %d ficheiros selecionados?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Mudar nome do ficheiro" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Introduza o novo nome:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Tem a certeza que pretende esvaziar o lixo?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Co_lar e ir" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barra de localização de pasta" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Pasta pessoal" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Área de trabalho" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplicações" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Sistema de ficheiros" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montar volume" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Desmontar vol_ume" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Ejetar disco amovível" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatar volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Muda_r nome do marcador" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Re_mover dos marcadores" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Mover marcador para _cima" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Mover marcador para _baixo" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Esvaziar lixo" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Mostrar lista de locais, dispositivos e marcadores na barra lateral" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Mudar nome do marcador" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Introduza o novo nome:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Tamanho: %s\n" "Modificado: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Modificado: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Ocorreram erros antes da operação ser interrompida." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Cancelada" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "A operação de ficheiros foi concluída com erros." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Concluída" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Alguns ficheiros não podem ser movidos para o lixo, porque o sistema de " "ficheiros não suporta esta ação.\n" "Eliminar permanentemente?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausa" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Retomar" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "A mover" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "A copiar" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "A destruir" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "A eliminar" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "A criar ligação" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Em:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "A criar ligações aos ficheiros" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "A mudar atributos de" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "A mudar atributos dos ficheiros" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "A restaurar" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s ficheiros" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Operação de ficheiros em curso..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s ficheiro:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s ficheiros:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "De_sativar" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Locais" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Árvore de _diretórios" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remotos" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Locais" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Árvore de diretórios" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Vista de conteúdo da pasta" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Ocultar %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Mover à esquerda" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Move_r à direita" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Mostrar %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "D_escartar largura" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "V_ista de ícones" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Vista _compacta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Vista de minia_turas" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Vista deta_lhada" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Muda para o separador ativo" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "O diretório %s não é válido" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Não foi possível aceder ao ficheiro de destino" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Não é possível criar uma ligação em sistemas de ficheiros não nativos" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Não foi possível restaurar %s: o caminho original não é conhecido" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "O destino não existe" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "A origem e destino são iguais." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Não pode mover uma pasta para uma sub-pasta" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Não pode copiar uma pasta para uma sub-pasta" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "O destino é uma sub-pasta da pasta originária" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Não foi possível copiar %s: não suportado" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Só pode definir o nome de exibição para um ficheiro" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Só pode definir o destino para um ficheiro" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Erro no ficheiro XML %s (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "O ficheiro XML não possui a raiz de aplicações" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Não foi possível criar a definição XML de %s" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "O caminho de menu %s já existe" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Erro de cache de menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Diretório de menu inválido" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "O nome do item de menu não pode estar vazio" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Diretório de menu inválido: %s" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Item de menu inválido" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "O item de menu %s não possui uma entrada válida" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Não é possível alterar o estado de ocultação para o diretório de menu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "A definição do atributo %s não é suportada" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Valor inválido para o atributo %s" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "%s é um diretório de menu" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "%s não é um item de menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "%s está danificado" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Não foi possível criar o item de menu %s" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "O nome do diretório de menu não pode terminar com \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Operação inválida para a raiz de menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Destino inválido" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: pasta %s não encontrada na cache de menu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Procurar" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Resultados da procura" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Escolha o ficheiro executável" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Co_mando:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Comando a executar ao ativar o ícone da aplicação" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escrição:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Nome genérico da aplicação" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Diretório de _trabalho:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "O diretório de trabalho para execução do programa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Ajuda:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Ajuda a mostrar na aplicação" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Utilizar notificação de arranque" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Entra_da da área de trabalho" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaurar" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaurar ficheiros para os locais de origem" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nome ou id do ficheiro fonte" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "Fonte" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nome de ficheiro de destino" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "Destino" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "CD-ROM vazio" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "CD-R vazio" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "CD-RW vazio" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "DVD-ROM vazio" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "DVD-RW vazio" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "DVD-RAM vazio" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "DVD+R vazio" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "DVD+RW vazio" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "DVD+R DL vazio" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "DVD+RW DL vazio" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Blu-Ray vazio" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Blu-Ray R vazio" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Blu-Ray RW vazio" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "HD DVD vazio" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "HD DVD-R vazio" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "HD DVD-RW vazio" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "MO vazio" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "MRW vazio" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "MRW/W vazio" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "CD de Áudio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disco ótico vazio" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disco ótico" #~ msgid "Symlinking" #~ msgstr "A criar ligação simbólica" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "A processar:" #~ msgid "Progress:" #~ msgstr "Evolução:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "A operação foi concluída mas ocorreram alguns errros." #~ msgid "Creating Symlinks" #~ msgstr "Criar ligações simbólicas" #~ msgid "_Rename Folder" #~ msgstr "Muda_r nome da pasta" #~ msgid "File type to be opened:" #~ msgstr "Tipo de ficheiro a abrir:" #~ msgid "_Installed Application" #~ msgstr "Aplicação _instalada" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "Definir a aplicação _selecionada para abrir este tipo de ficheiros" #~ msgid "_Browse" #~ msgstr "E_xplorar" #~ msgid "My Computer" #~ msgstr "Meu computador" #~ msgid "_Move" #~ msgstr "_Mover" #~ msgid "_Trash" #~ msgstr "Li_xo" #~ msgid "_Only for this folder" #~ msgstr "Só para _esta pasta" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Assinale para memorizar a definição de pasta em vez da definição global" #~ msgid "Please select a folder" #~ msgstr "Selecione uma pasta" #~ msgid "Entry for folder path" #~ msgstr "Entrada do caminho da pasta" #~ msgid "Computer" #~ msgstr "Computador" #~ msgid "Network Drives" #~ msgstr "Unidades de rede" #~ msgid "_Run in terminal emulator" #~ msgstr "Executa_r no emulador do terminal" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Manter janela de terminal aberta depois de executar" #~ msgid "Shortcuts" #~ msgstr "Atalhos" #~ msgid "Mount Point" #~ msgstr "Ponto de montagem" #~ msgid "Create _Symlink" #~ msgstr "Criar ligação _simbólica" #~ msgid "Se_nd To" #~ msgstr "E_nviar para" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Falha ao inserir <%s> do ficheiro" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Caminho %s não encontrado nas definições XML" #~ msgid "Category manipulation internal error" #~ msgstr "Erro interno de manipulação de categorias" #~ msgid "Blank File" #~ msgstr "Ficheiro vazio" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Erro. O lxshortcut não está instalado" #~ msgid "Failed to start lxshortcut" #~ msgstr "Ocorreu um erro ao iniciar o lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupo:" #~ msgid "Rename" #~ msgstr "Mudar nome" #~ msgid "Make the file executable" #~ msgstr "Tornar o ficheiro executável" #~ msgid "Operations that all other users can do" #~ msgstr "Operações permitidas a todos os utilizadores" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operações permitidas ao dono do ficheiro" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operações permitidas aos utilizadores que pertençam ao grupo do dono do " #~ "ficheiro" #~ msgid "Read and Write" #~ msgstr "Leitura e escrita" #~ msgid "Read only" #~ msgstr "Só leitura" #~ msgid "Write only" #~ msgstr "Só escrita" libfm-1.4.0/po/pt_BR.po000066400000000000000000001455061475513661000146140ustar00rootroot00000000000000# Brazilian Portuguese translations for libfm package. # Copyright (C) 2010 THE libfm'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Og Maciel , 2010. # Sérgio Cipolla , 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-05-20 13:40+0000\n" "Last-Translator: Felipe Braga \n" "Language-Team: Brazilian Portuguese <>\n" "Language: pt_BR\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1432129208.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Aplicativos Preferidos" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Selecione as aplicações que serão chamadas com click em Web link ou endereço " "de e-mail" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor de Atalhos" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Criar novo ou alterar uma entrada da área de trabalho" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Escolher aplicativo" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Usar o aplicativo selecionado para abrir arquivos" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Aplicativos _instalados" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Linha de c_omando para executar:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Navegar..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Executar no emulador de terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Manter a janela do terminal aberta após execução do comando" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Estes códigos especiais podem ser usados na linha de comando:\n" " %f: representa um único nome de arquivo\n" " %F: representa múltiplos nomes de arquivo\n" " %u: representa um único URI do arquivo\n" " %U: representa múltiplos URIs" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Nome da _Aplicação (opcional, setar para manter a associação)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Executar linha de comando personalizada para abrir arquivos" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Linha de C_omando Personalizada" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "Define o aplicativo _selecionado como a ação padrão para este tipo de arquivo" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Confirmar substituição de arquivos" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Pular" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Renomear" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "S_obrescrever" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Já existe um arquivo com o mesmo nome nessa localização.\n" "\n" "Você deseja substituir o arquivo atual" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "com o seguinte arquivo?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Nome do _arquivo:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Aplicar esta opção a todos os arquivos existentes" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Escolha um Ícone..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "tema de ícones do sistema" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "arquivo de imagem" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Escolher ícone de:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Executar arquivo" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Executar no _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Propriedades do arquivo" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "ìcone do arquivo na visualização da pasta" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Nome:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Localização:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Alvo do arquivo:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Tipo de arquivo:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Abrir _com:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Selecione o aplicativo a ser usado para abrir arquivos deste tipo " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Total da contagem de arquivos:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Tamanho total dos arquivos:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Tamanho no disco:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Última modificação:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Último acesso:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Última alteração de permissões:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Geral" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Proprietário:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Grupo:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Ver conteúdo:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Alterar conteúdo:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Executar:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Bits especiais:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Quem pode ler o conteúdo do arquivo/diretório" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Quem pode alterar o conteúdo do arquivo/diretório" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Quem pode executar o arquivo ou entrar no diretório" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Flags especiais para a execução do arquivo" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Flags especiais para acesso ao diretório" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Controle de acesso" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Arquivo oculto" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Permissões" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nenhum" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Fixar" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Configurar GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky bit & configurar GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Configurar UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Configurar UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Somente o proprietário" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Somente o proprietário e o grupo" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Qualquer um" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ninguém" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Escolha uma Data" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Escolha uma data no calendário" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Pesquisar Arquivos" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Padrões de _Nome de Arquivo" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "O padrão pode ser uma lista POSIX de padrões de shell (com \",\" como " "separador) ou uma expressão regular POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Maiúsculas e _minúsculas" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Usar expressões regulares" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Locais para P_esquisar" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Pesquisar em _subdiretórios" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Pesquisar arquivos _ocultos" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nome/_Localização" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tipo de arquivo" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Apenas pesquisar os seguintes tipos de arquivo:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Arquivos de te_xto" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Arquivos de _imagem" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Arquivos de _áudio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Arquivos de _vídeo" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "Docu_mentos" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "_Pastas" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Outros:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Qualquer tipo de conteúdo válido pode ser inserido aqui. Caracteres curinga " "'*' é permitido no fim do tipo. Vários tipos devem ser separados com ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipo de arquivo" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Arquivo _contém:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Conteú_do" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Tamanho do arquivo" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "M_enor que:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "M_aior que:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Última modificação" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nenhum)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Mais _novo que:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Mais _velho que:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Propriedades" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navegador web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "O navegador web preferido será usado para abrir hyperlinks." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Cliente de e-mail" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "O cliente de e-mail preferido será usado para compor e-mails quando você " "clicar nos endereços de e-mail." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Linha de comando:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Aplicativos do sistema" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Associações de arquivos" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Para:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Preparando..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Alvo do arquivo:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tempo restante:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Aconteceram alguns erros:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Arquivo vazio" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Destino inválido" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operação não suportada" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Entrada inválida no desktop: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" "Não foi possível determinar o conteúdo do tipo do arquivo '%s' para inicia-lo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Sem aplicação padrão para iniciar esta URIs %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Não foi possível definir o diretório de trabalho para \"%s\": %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Nenhum aplicativo padrão configurado para o tipo MIME %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Dispositivos" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Rede" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Lixeira" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "atalho para o URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: argumento inválido" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Nenhum emulador de terminal configurado na configuração libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Descrição inválida para a aplicação thumbnailer" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "O URI '%s' contém caracteres com escape inválido" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Manipulador duplicado para <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Falha ao analisar '%-.*s', que deveria ter sido um dígito dentro de uma " "referência de caractere (ê por exemplo) - talvez o dígito seja grande " "demais" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Referência de caractere não terminou com um ponto e vírgula; provavelmente " "utilizou um caractere \"e comercial\" sem desejar iniciar uma entidade - " "escape-o com &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Referência de caractere '%-.*s' não codifica um caractere permitido" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Entidade \"&;\" vazia; as entidades válidas são: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Nome da entidade '%-.*s' não é conhecida" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entidade não termina com um ponto e vírgula; provavelmente você utilizou um " "\"e comercial\" sem desejar iniciar uma entidade - escape-o com &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Espaços não são permitidos na tag de fechamento" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "O elemento \"%s\" foi fechado sem que fosse aberto" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "O elemento \"%s\" foi fechado, mas o elemento atualmente aberto é \"%s\"" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Caractere \"%c\" inválido no início do valor do atributo" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Caractere \"%c\" inválido no final do valor do atributo, esperado \"%c\"" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "O documento terminou de forma inesperada" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "O documento estava vazio ou apenas continha espaços" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: erro em dados XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalizar" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Arquivos executáveis" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Selecione um aplicativo para abrir os \"%s\" arquivos" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Aplicativos instalados" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Carregando..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Exibe árvores de diretórios na barra lateral" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Cancelar" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Copiar aqui" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Mover aqui" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Criar _link aqui" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave falhou." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Abrir" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Abrir _com..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Abrir _com" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Copiar c_aminho" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Ocultar" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "_Desocultar" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Adicionar aos marcadores" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Renomear..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Co_mprimir..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Extrair a_qui" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Extrair _para..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Propri_edades" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Mover para a _lixeira" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Seus marcadores já têm um marcador desta pasta." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Arquivos de imagem" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "examinando... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Favor digitar um nome de usuário ou identificador numérico válido." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Favor digitar um nome de grupo ou identificador numérico válido." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Você deseja aplicar essas modificações de forma recursiva a todos os " "arquivos e subpastas?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Oculta ou mostra o arquivo" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Este arquivo está oculto porque seu nome começa com um ponto (\".\")." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Arquivos deste sistema estão ocultos se seu nome começa com um ponto (\"." "\"). Use para alternar a exibição de arquivos ocultos." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "examinando..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Acessar conteúdo:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Arquivos de tipos diferentes" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Arquivo:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Múltiplos arquivos" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nome" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descrição" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Tamanho" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Permissões" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Proprietário" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificação" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Localização" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Extensão" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Criar _novo(a)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Pasta" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Arquivo vazio" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inverter seleção" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Organizar arquivos" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Renomear pasta..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Propri_edades da pasta" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Exibir _ocultos" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Mi_sturar arquivos e pastas" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorar sensibilidade à caixa nos nomes" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Por _nome" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Por data de _modificação" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Por _tamanho" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Por tipo de _arquivo" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Insira um nome para a pasta recém criada:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Criar nova pasta" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Insira um nome para o arquivo vazio:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Criando ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Novo(a)" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Insira um nome para o novo %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Criando %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Executar aplicação padrão após a criação do arquivo" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Esse arquivo de texto '%s' parece ser um script executável.\n" "O que você deseja fazer com ele?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Esse arquivo '%s' é executável. Você deseja executá-lo?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nenhuma pasta foi especificada." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Selecionar pasta" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Erro" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmação" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pergunta" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Somente administradores do sistema tem permissão para fazer isto." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Você deseja mover o arquivo '%s' selecionados para a lixeira?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Você deseja mover %d selecionado para a lixeira?" msgstr[1] "Você deseja mover %d selecionados para a lixeira?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Você deseja excluir o arquivo '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Você deseja excluir o arquivo %d selecionado?" msgstr[1] "Você deseja excluir os arquivos %d selecionados?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Renomear arquivo" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Favor digitar um novo nome:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Você tem certeza que deseja esvaziar a lixeira?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Colar e _ir" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Barra de localização de pasta" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Pasta pessoal" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Área de trabalho" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplicativos" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Raíz do sistema de arquivos" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montar volume" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Desmontar volume" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Ejetar mídia removível" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatar volume" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Renomear item dos marcadores" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Re_mover dos marcadores" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Mover marcador para _cima" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Mover marcador para _baixo" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Esvaziar a lixeira" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Exibe uma lista de localizações comuns, dispositivos e marcadores na barra " "lateral" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Renomear item dos marcadores" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Insira um novo nome:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Tamanho: %s\n" "Modificação: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tipo: %s\n" "Modificação: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Erros aconteceram antes da operação de arquivo parar." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Cancelada" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "A operação do arquivo foi finalizada com erros." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Terminou" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Alguns arquivos não podem ser movidos para a lixeira devido à falta de " "suporte pelo sistema de arquivos.\n" "Você gostaria de excluí-los permanentemente?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pausar" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Continuar" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Movendo" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Copiando" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Movendo para lixeira" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Excluindo" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Criando ligação" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Em:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Criando ligações para arquivos" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Alterando atributos de" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Alterando atributos de arquivos" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Restaurando" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s arquivos" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Operação em arquivos em progresso..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s arquivo:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s arquivos:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "De_sativar" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Locais" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Árvore de _diretórios" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Remoto" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Locais" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Árvore de diretórios" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Exibição do conteúdo da pasta" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Ocultar %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Mover para a _esquerda" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Mover para a _direita" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Mostrar %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Esquecer largura" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Visualização de _ícones" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Visualização _compacta" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Visualização de _miniaturas" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Visualização de lista _detalhada" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Muda a aba ativa" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "O diretório '%s' especificado não é válido" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Não foi possível acessar o arquivo de destino" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Não foi possível criar ligação no sistema de arquivo" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Não foi possível restaurar o arquivo '%s': caminho original desconhecido" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Origem e destino são iguais." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Não posso mover uma pasta para a sua subpasta" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Não posso copiar uma pasta para a sua subpasta" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "O destino é uma subpasta da origem" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Não foi possível copiar o arquivo '%s': não suportado" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "A configuração do nome pode ser feita apenas para único arquivo" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "A configuração do alvo pode ser feita apenas para único arquivo" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Erro no arquivo XML \"%s\" (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "O arquivo XML não contém a raiz de aplicativos" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Não foi possível criar a definição XML para \"%s\"" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "O caminho do menu \"%s\" já existe" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Erro de cache de menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Diretório de menu inválido" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "O nome do item de menu não pode ser vazio" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Diretório de menu inválido '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Item de menu inválido" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "O item de menu \"%s\" não tem um arquivo de entrada correto" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Mudar o estado da ocultação não é suportado no diretório do menu" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Configuração de atributo '%s' não suportado" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Valor inválido para o atributo \"%s\"" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "O '%s' é um menu diretório" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "O '%s' não é um item de menu" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "O arquivo de entrada \"%s\" está quebrado" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Não foi possível criar item de menu \"%s\"" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Nome do diretório do menu não deve terminar com \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Operação inválida com a raiz do menu" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Destino inválido" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: pasta \"%s\" não encontrada no cache do menu" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Pesquisar" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Resultados de busca" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Escolher o arquivo executável" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Co_mando:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Comando a ser executado quando o ícone do aplicativo é ativado" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "D_escrição:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "O nome genérico do aplicativo" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Diretório de trabalho:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "O diretório de trabalho para executar o programa" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Dica:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "O texto de dica para mostrar no aplicativo" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Usar _notificação de inicialização" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Entrada de desktop" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaurar" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaurar arquivos da lixeira de volta ao seu local original" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "nome do arquivo de origem ou \"desktop id\"" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ORIGEM" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "nome do arquivo de resultado" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTADO" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disco CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disco CD-ROM em branco" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disco CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disco CD-R em branco" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disco CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disco CD-RW em branco" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disco DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disco DVD-ROM em branco" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disco DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disco DVD-RW em branco" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disco DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disco DVD-RAM em branco" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disco DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disco DVD+R em branco" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disco DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disco DVD+RW em branco" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disco DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Disco DVD+R DL em branco" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disco DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Disco DVD+RW DL em branco" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disco Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disco Blu-Ray em branco" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disco Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disco Blu-Ray R em branco" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disco Blu-Ray RW em branco" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disco HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disco HD DVD em branco" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disco HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Disco HD DVD-R em branco" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disco HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Disco HD DVD-RW em branco" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disco MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disco MO em branco" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disco MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disco MRW em branco" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disco MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disco MRW/W em branco" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Arquivos de _áudio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disco óptico em branco" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disco óptico" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Tipo de arquivo para ser aberto:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Processando:" #~ msgid "Progress:" #~ msgstr "Progresso:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "A operação do arquivo terminou, mas aconteceram alguns erros." #~ msgid "_Browse" #~ msgstr "_Navegar" #~ msgid "My Computer" #~ msgstr "Meu computador" #~ msgid "_Only for this folder" #~ msgstr "_Somente para esta pasta" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Selecione para lembrar a ordenação apenas para a pasta e não de forma " #~ "global" #~ msgid "Please select a folder" #~ msgstr "Por favor selecione uma pasta" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_Somente para esta pasta" #, fuzzy #~ msgid "Computer" #~ msgstr "Meu computador" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Rede" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "_Executar no emulador de terminal" #~ msgid "Shortcuts" #~ msgstr "Atalhos" #~ msgid "Mount Point" #~ msgstr "Ponto de montagem" #~ msgid "Create _Symlink" #~ msgstr "Criar link _simbólico" #~ msgid "Se_nd To" #~ msgstr "_Enviar para" #~ msgid "Blank File" #~ msgstr "Arquivo em branco" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Erro, lxshortcut não instalado" #~ msgid "Failed to start lxshortcut" #~ msgstr "Falha ao iniciar o lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupo:" #~ msgid "Rename" #~ msgstr "Renomear" #~ msgid "Make the file executable" #~ msgstr "Tornar o arquivo executável" #~ msgid "Operations that all other users can do" #~ msgstr "Operações que todos os outros usuários podem fazer" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operações que o dono do arquivo pode fazer" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operações que usuários no mesmo grupo que o dono do arquivo podem fazer" #~ msgid "Read and Write" #~ msgstr "Leitura e escrita" #~ msgid "Read only" #~ msgstr "Somente leitura" #~ msgid "Write only" #~ msgstr "Somente escrita" #~ msgid "The selection mode" #~ msgstr "Favor selecionar uma pasta" libfm-1.4.0/po/ro.po000066400000000000000000001347601475513661000142260ustar00rootroot00000000000000# Romanian translations for the libfm package # Traducerea în limba română pentru pachetul libfm. # Copyright (C) 2012 THE libfm'S COPYRIGHT HOLDER # This file is distributed under the same license as the libfm package. # Mișu Moldovan , 2012. # msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2014-03-26 11:28+0000\n" "Last-Translator: Smokey \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1395833314.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Programe preferate" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "Lansator" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "Alegeți un program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Utilizează programul selectat pentru a deschide fișierele" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "Program _instalate" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "Comandă de executat:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "_Navigare" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Execută în emulatorul de terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Coduri speciale de utilizat în linia de comandă:\n" " %f: Reprezintă un singur nume de fișier\n" " %F: Reprezintă mai multe nume de fișiere\n" " %u: Reprezintă un singur URI de fișier\n" " %U: Reprezintă mai multe URI-uri de fișiere" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Utilizează comanda personalizată pentru a deschide fișierele" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "_Comandă personalizată" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "R_eține acțiunea ca fiind implicit asociată acestui tip de fișier" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "Confirmare pentru înlocuirea de fișiere" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Omite" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Redenumește" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Suprascrie" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Există deja un fișier cu același nume aici.\n" "\n" "Doriți să înlocuiți fișierul existent" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "cu următorul fișier?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "Nume _fișier:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Fă la fel pentru toate fișierele existente" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "Alegeți un program" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "Programe de sistem" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "Fișiere _imagine" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "_Editare conținut:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Execută fișierul" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Execută în _terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Proprietățile fișierului" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "Țintă:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Locație:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "Țintă:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "Tip de fișier:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "D_eschide cu:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Alegeți programul pentru deschiderea fișierelor de acest tip" #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "Mărime totală fișiere:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "Mărime totală fișiere:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "Mărime pe disc:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "Ultima modificare:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "Ultima accesare:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "Ultima accesare:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Generale" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Deți_nător:" # R is already used by "Renunță" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Gr_up:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Vizualizare conținut:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Editare conținut:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "E_xecutare:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Biți speciali:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Cine poate citi conținutul fișierului ori al directorului" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Cine poate schimba conținutul fișierului ori al directorului" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Cine poate executa fișierul ori intra în director" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Fanioane speciale pentru execuția fișierului" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Fanioane speciale pentru accesarea directorului" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Drepturi de acces" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "Fișiere _video" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Drepturi" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Nimic" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "Persistent" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "GID impus" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Persistent și GID impus" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy msgid "Set UID" msgstr "UID impus" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "UID și GID impuse" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy msgid "Only owner" msgstr "Doar deținătorul" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Doar deținătorul și grupul" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Oricine" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nimeni" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 #, fuzzy msgid "Choose Date" msgstr "Alegeți o dată" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Alegeți o dată din calendarul prezentat" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Căutare de fișiere" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "Model de _nume de fișier:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Majuscule semnificative" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Utilizează regexp" #: ../data/ui/filesearch.glade.h:12 #, fuzzy msgid "Plac_es to Search:" msgstr "Locuri de căutat" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Caută în _subdirectoare" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Caută și între _fișierele ascunse" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Nume/_Locație" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Tip de fișier" #: ../data/ui/filesearch.glade.h:17 #, fuzzy msgid "Only search for files of following types:" msgstr "Caută doar fișiere de tipul următor" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Fișiere te_xt" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Fișiere _imagine" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Fișiere _audio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Fișiere _video" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "Docu_mente" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "Dosar" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Tipul de fișier" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "Fișierul _conține:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "C_onținut" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Mărime fișiere" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Mai mic _decât:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Mai _mare decât:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Ultima modificare" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Nimic)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Î_nainte de:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "D_upă:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Proprietăți" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Navigator web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Navigatorul web preferat va fi folosit când accesați linkuri web." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "Client de mail" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Clientul de mail preferat va fi folosit pentru a compune mailuri când " "accesați adresele de mail." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulator de terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Linie de comandă:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Programe de sistem" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Asocieri de fișiere" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Către:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "În pregătire..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Țintă:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Timp rămas:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "Au intervenit anumite erori:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Execută fișierul" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "_Inversează selecția" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Nu există suport pentru această operațiune" #: ../src/base/fm-file-launcher.c:88 #, fuzzy, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Nume incorect de fișier %s" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Rețea" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Coș de gunoi" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "Lansator" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "Nume incorect de director" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" msgstr[2] "%u de bytes" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Personalizare" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "Execută fișierul" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "Utilizează programul selectat pentru a deschide fișierele" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Programe instalate" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Se încarcă..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "Anulat" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave a eșuat." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Deschide" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Deschide c_u..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "Deschide c_u..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "_Eliminare dintre favorite" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "_Redenumește" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Arhi_vare..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Dezarhivare _aici" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Dezarhivare î_n..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Proprietăți" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "Coș de gunoi" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "Fișiere _imagine" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "bytes" msgstr[2] "de bytes" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Introduceți un nume valid de utilizator sau un ID numeric." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Introduceți un nume valid de grup sau un ID numeric." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Doriți să aplicați recursiv aceste schimbări tuturor fișierelor și " "subdirectoarelor?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Se încarcă..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Accesare conținut:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Fișiere de diferite tipuri" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "Tip de fișier:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Fișiere multiple" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Nume" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Descriere" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Mărime" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Drepturi" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Deținător" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modificat" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Locație" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Creează un _nou..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Dosar" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "Execută fișierul" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Inversează selecția" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sortează fișierele" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "Redenumire fișier" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "Proprietățile fișierului" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Arată fișierele _ascunse" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "Amestecă _fișierele și dosarele" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "_Ignoră majusculele" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "După _nume" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "După data m_odificării" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "După _mărime" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "După _tipul de fișier" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Precizați un nume pentru dosarul nou creat:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Redenumire fișier" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "Precizați un nume pentru fișierul nou creat:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "Creare de element nou..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nou" #: ../src/gtk/fm-folder-view.c:876 #, fuzzy, c-format msgid "Enter a name for the new %s:" msgstr "Precizați un nume pentru fișierul nou creat:" #: ../src/gtk/fm-folder-view.c:879 #, fuzzy, c-format msgid "Creating %s" msgstr "Se creează legăturile simbolice" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Fișierul text „%s” pare să fie un script executabil.\n" "Ce doriți să faceți cu el?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Fișierul „%s” este executabil. Doriți să-l executați?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nu s-a specificat niciun dosar." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Selectați un dosar" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Eroare" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Confirmare" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Întrebare" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Doar administratorul de sistem are drepturi pentru a face asta." #: ../src/gtk/fm-gtk-utils.c:924 #, fuzzy, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Doriți să mutați fișierele selectate în coșul de gunoi?" #: ../src/gtk/fm-gtk-utils.c:929 #, fuzzy, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Doriți să mutați fișierele selectate în coșul de gunoi?" msgstr[1] "Doriți să mutați fișierele selectate în coșul de gunoi?" msgstr[2] "Doriți să mutați fișierele selectate în coșul de gunoi?" #: ../src/gtk/fm-gtk-utils.c:989 #, fuzzy, c-format msgid "Do you want to delete the file '%s'?" msgstr "Doriți să ștergeți fișierele selectate?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Doriți să ștergeți fișierele selectate?" msgstr[1] "Doriți să ștergeți fișierele selectate?" msgstr[2] "Doriți să ștergeți fișierele selectate?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Redenumire fișier" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Introduceți un nou nume:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Sigur doriți să goliți coșul de gunoi?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Asocieri de fișiere" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Redenumire fișier" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Desktop" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programe" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "_Tipul de fișier" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montează volumul" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Demontează volumul" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Ejectează mediul detașabil" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "_Montează volumul" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Redenumire a favoritului" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "_Eliminare dintre favorite" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "_Eliminare dintre favorite" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "_Eliminare dintre favorite" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Golește coșul" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Redenumire a favoritului" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Introduceți un nou nume:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Tip: %s\n" "Mărime: %s\n" "Modificat în: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Tip: %s\n" "Modificat în: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Acțiunea asupra fișierului a fost anulată și au apărut anumite erori." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Anulat" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "Acțiunea asupra fișierului a fost anulată și au apărut anumite erori." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Terminat" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Unele fișiere nu pot fi mutate la coșul de gunoi deoarece sistemul de " "fișiere nu are suport pentru o asemenea acțiune.\n" "Doriți însă să le ștergeți cu totul?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_Restaurează" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Se mută fișierele" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Se copiază fișierele" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Se mută la coș fișierele" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Se șterg fișierele" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Se creează legăturile simbolice" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "Către:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Se creează legăturile simbolice" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Se schimbă atributele de fișier" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Se schimbă atributele de fișier" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_Restaurează" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "Fișiere _imagine" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "Tip de fișier:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "Tip de fișier:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Fără" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Locuri" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Arbore de directoare" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "La _distanță" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Locuri" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Arbore de directoare" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "Directorul specificat nu este valid" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Restaurează fișierele din coș în căile de origine" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Sursa și destinația sunt identice." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Nu se poate muta un director în propriul subdirector." #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Nu se poate copia un director în propriul subdirector." #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Destinația este un subdirector al sursei" #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "Nu se poate copia un director în propriul subdirector." #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Eroare în cache-ul de meniu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Nume incorect de director" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, fuzzy, c-format msgid "Invalid menu directory '%s'" msgstr "Nume incorect de director" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "Nume incorect de director" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, fuzzy, c-format msgid "Setting attribute '%s' not supported" msgstr "Nu există suport pentru această operațiune" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "Nume incorect de fișier %s" #: ../src/modules/vfs-menu.c:1995 #, fuzzy, c-format msgid "The '%s' is a menu directory" msgstr "Nume incorect de director" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, fuzzy, c-format msgid "The '%s' isn't a menu item" msgstr "Nume incorect de director" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, fuzzy, c-format msgid "Cannot create menu item '%s'" msgstr "Nume incorect de fișier %s" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Căutare" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Căutare de fișiere" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Execută fișierul" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "Către:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "Locație:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "Țintă:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "Către:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "Alegeți un program" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Desktop" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Restaurează" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Restaurează fișierele din coș în căile de origine" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disc CD" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Disc CD gol" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disc CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Disc CD-R gol" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disc CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Disc CD-RW gol" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disc DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Disc DVD-ROM gol" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disc DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Disc DVD-RW gol" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disc DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Disc DVD-RAM gol" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disc DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Disc DVD+R gol" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disc DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Disc DVD+RW gol" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disc DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Disc DVD+R DL gol" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disc DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Disc DVD+RW DL gol" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disc Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Disc Blu-Ray gol" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disc Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Disc Blu-Ray R gol" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disc Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Disc Blu-Ray RW gol" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disc HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Disc HD DVD gol" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disc HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Disc HD DVD-R gol" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disc HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Disc HD DVD-RW gol" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disc MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Disc MO gol" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disc MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Disc MRW gol" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disc MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Disc MRW/W gol" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Fișiere _audio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Disc optic gol" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Disc optic" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Tip de fișier de deschis:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "În procesare:" #~ msgid "Progress:" #~ msgstr "Progres:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "" #~ "Acțiunea asupra fișierului s-a terminat, dar au apărut anumite erori." #~ msgid "_Browse" #~ msgstr "_Navigare" #~ msgid "My Computer" #~ msgstr "Calculatorul meu" #~ msgid "_Only for this folder" #~ msgstr "_Doar pentru acest dosar" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Bifați pentru a reține sortarea curentă ca fiind specifică acestui dosar" #~ msgid "Please select a folder" #~ msgstr "Selectați un director" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_Doar pentru acest dosar" #, fuzzy #~ msgid "Computer" #~ msgstr "Calculatorul meu" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Rețea" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "_Execută în emulatorul de terminal" #~ msgid "Shortcuts" #~ msgstr "Lansatori" #~ msgid "Mount Point" #~ msgstr "Punct de montare" #~ msgid "Create _Symlink" #~ msgstr "Creea_ză o legătură" #~ msgid "Se_nd To" #~ msgstr "Tri_mite către" #~ msgid "Blank File" #~ msgstr "Fișier gol" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Eroare, lxshortcut nu e instalat" #~ msgid "Failed to start lxshortcut" #~ msgstr "Nu s-a putut porni lxshortcut" libfm-1.4.0/po/ru.po000066400000000000000000001715271475513661000142360ustar00rootroot00000000000000# Copyright (C) 2010 PCmanFM & Oleg Koptev. # This file is distributed under the same license as the PCManFM libfm package. # Oleg Koptev , 2010. # boobaloo , 2010. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-04-12 21:31+0000\n" "Last-Translator: Andriy Grytsenko \n" "Language-Team: gnome-cyr\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.8\n" "X-Poedit-SourceCharset: utf-8\n" "X-POOTLE-MTIME: 1523568690.018865\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Предпочтительные приложения" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Выбрать приложения, открываемые при клике на Web-ссылку или адрес почты" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Редактор ярлыков" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Создавать или редактировать ярлык программы" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Выбрать приложение" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Использовать выбранное приложение для открытия файлов" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Установленные приложения" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Выполнить в командной строке:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Просмотреть…" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "В_ыполнить в эмуляторе терминала" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Оставить окно терминала открытым после _завершения" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Специальные параметры командной строки:\n" " %f: Представляет имя одиночного файла\n" " %F: Представляет имена нескольких файлов\n" " %u: Представляет путь одиночного файла\n" " %U: Представляет пути нескольких файлов" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Имя приложения (опционально, установите для ассоциации)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Выполнить пользовательскую команду для открытия файлов" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Пользовательская команда" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "У_становить выбранное приложение по умолчанию для данного типа файла" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Подтверждение замещения файлов" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Пр_опустить" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Переименовать" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Заменить" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Файл с таким именем уже существует в выбранном каталоге.\n" "\n" "Заменить существующий файл?" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "этим файлом?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Имя файла:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Применить параметр ко _всем файлам" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Выбор значка..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "системной темы значков" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "файлов с изображениями" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Выбрать значок из:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Запустить файл" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Запустить файл в _терминале" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Свойства файла" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Значок файла в просмотре папок" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Имя:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Расположение:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Ссылка на:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Тип файла:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Открыть _с помощью:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Выберите приложение для запуска файла " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Всего файлов:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Общий размер файлов:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Размер на диске:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Последнее изменение:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Время последнего доступа:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Последнее изменение прав:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Общее" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "Владелец:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Группа:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Просмотр:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Изменение:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "Запуск:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Особые флаги:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Кто может читать содержимое файла или каталога" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Кто может изменять содержимое файла или каталога" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Кто может запускать файл или входить в каталог" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Особые флаги запуска файла на выполнение" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Особые флаги доступа к каталогу" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Управление доступом" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Скрытый файл" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "Права _доступа" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Нет" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Бит привязки" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Установить GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Бит привязки и установить GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Установить UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Установить UID и GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Только владелец" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Только владелец и группа" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Все" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Никто" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Байт" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "КБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Выбор даты" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Выбрать дату из календаря" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Поиск файлов" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "_Шаблон имени файла:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Шаблон может быть или списком POSIX шаблонов (разделенных запятыми), или " "регулярным выражением POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Учитывать регистр" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Использовать регулярные выражения" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Места поиска:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Искать в поддиректориях" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Искать скрытые файлы" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Имя/_Расположение" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Тип файла:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Искать файлы только следующих типов:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Текстов_ые файлы" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Изображения" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Звуковые файлы" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Видеофайлы" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Документы" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Пап_ки" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Дру_гое:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Введите правильный тип файла. Шаблон '*' можно использовать на конце типа. " "Несколько типов должны быть разделены ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Тип файла" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "_Файл содержит:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Содержимое" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Размер файла:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "Меньше, чем:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "Больше, чем:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Время последнего изменения:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Нет)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Ранее, чем:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "Позже, чем:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Параметры" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Веб-браузер" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Для открытия ссылок будет использоваться предпочительный веб-браузер." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Почтовый клиент" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Для написания писем при клике на адресе электронной почты будет " "использоваться предпочтительный почтовый клиент." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Эмулятор терминала" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Командная строка:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Системные приложения" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Файловые ассоциации" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "В:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Подготовка..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Данных перемещено:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Осталось:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Возникли ошибки:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Пустое значение" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Неверный выбор" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Операция не поддерживается" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Неверное имя файла ярлыка: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Не удалось определить тип содержимого файла '%s' для его запуска" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Приложение для запуска URI %s:// не назначено" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Нельзя перейти в каталог '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Приложение по умолчанию для MIME-типа %s не назначено" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Устройства" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Сеть" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Корзина" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "ярлык URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: неверный параметр" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Не задан эмулятор терминала в настройках libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Неверное описание генератора миниатюр" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "кБ" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" msgstr[1] "%u байта" msgstr[2] "%u байтов" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "КиБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МиБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГиБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТиБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Часть пути URI '%s' содержит недопустимые экранированные символы" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Повторный обработчик для тэга <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Не удалось разобрать строку «%-.*s», которая должна быть числом внутри " "ссылки на символ (например ê) — возможно, номер слишком велик" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Ссылка на символ не оканчивается точкой с запятой; похоже, символ «&» был " "использован не для обозначения начала конструкции — экранируйте его как " "«&»" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Ссылка на символ «%-.*s» не определяет допустимый символ" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Обнаружена пустая конструкция «&;»; допустимыми конструкциями являются: " "& " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Имя сущности «%-.*s» неизвестно" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Конструкция не заканчивается точкой с запятой; похоже, что символ «&» был " "использован не для обозначения начала конструкции — экранируйте его как " "«&»" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Пробел не допустим в закрывающем тэге" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Элемент '%s' был закрыт, но открытых элементов не было" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Элемент «%s» был закрыт, но открытым в настоящий момент является элемент «%s»" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Неверный символ '%c' в начале значения атрибута" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Неверный символ '%c' в конце значения атрибута, ожидалось '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Документ завершился неожиданно" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Документ был пуст или содержал только пробелы" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: ошибка данных XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Настроить" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Исполняемые файлы" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Выберите приложение для открытия файлов \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Прочие приложения" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Нет поддиректорий>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Загрузка..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Отображает дерево каталогов в боковой панели" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Отменить" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Копировать сюда" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Переместить сюда" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Создать ссылку" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Ошибка XDirectSave." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "Открыть" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Открыть с помощью..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Открыть с помощью" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Копироват_ь путь файл(ов)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "С_крыть" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Сд_елать видимым" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Добавить в _закладки" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Переименовать…" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Добавить в архив..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Извлечь в текущую папку" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Извлечь в..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Свойства файла" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "_Отправить в корзину" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "В закладках уже есть эта папка." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Файлы с изображениями" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "байт" msgstr[1] "байта" msgstr[2] "байтов" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "сканирование... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Введите правильное имя пользователя или цифровой идентификатор." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Введите правильное имя группы или цифровой идентификатор." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Применить ко всем вложенным файлам и каталогам?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Скрыть или открыть файл" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Этот файл скрыт, потому что его имя начинается с точки ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Файлы на этой системе скрыты, если их имя начинается с точки ('.').Нажмите " ", чтобы разрешить или запретить их отображение." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "сканирование..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Доступ к содержимому:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Файлы разных типов" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Файл:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Несколько файлов" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Имя" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Описание" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Размер" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Права доступа" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Владелец" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Изменён" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Расположение" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Расширение" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Создать _новый..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Папку" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Пустой файл" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Инвертировать выделение" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Сортировать файлы" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "П_ереименовать папку..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Свойства пап_ки" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_Показать скрытые файлы" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Показывать папки и файлы вперемешку" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Игнорировать регистр в имени" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "По _имени" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "По _времени изменения" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "По _размеру" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "По _типу файла" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Введите имя создаваемой папки:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Создание новой папки" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Введите имя создаваемого файла:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Создается ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Новый" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Введите имя нового файла типа '%s':" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Создание %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Запустить приложение по умолчанию после создания файла" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Этот текстовый файл «%s», судя по всему, является исполняемым скриптом.\n" "Какое действие вы хотите выполнить?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Файл «%s» является исполняемым. Хотите его запустить?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Нет заданных каталогов" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Выберите каталог" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Ошибка" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Подтвердить" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Вопрос" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Для выполнения этого действия требуются права администратора." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Хотите переместить файл '%s' в корзину?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Хотите переместить %d выбранный файл в корзину?" msgstr[1] "Хотите переместить %d выбранных файла в корзину?" msgstr[2] "Хотите переместить %d выбранных файлов в корзину?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Хотите удалить файл '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Хотите удалить %d выбранный файл?" msgstr[1] "Хотите удалить %d выбранных файла?" msgstr[2] "Хотите удалить %d выбранных файлов?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Переименовать файл" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Введите новое имя:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Хотите очистить корзину?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Вставить и вперед" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Панель ввода пути папки" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Домашняя папка" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Рабочий стол" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Приложения" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Корень файловой системы" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Монтировать том" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Размонтировать том" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Извлечь внешнее устройство" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Форматировать том" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Переименовать закладку" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Удалить из закладок" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Переместить _закладку выше" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Переместить закладку _ниже" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Очистить корзину" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Отображает список общих мест, устройств и закладок в боковой панели" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Переименовать закладку" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Введите новое имя:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Тип: %s\n" "Размер: %s\n" "Изменён: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Тип: %s\n" "Изменён: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Операция над файлами была прервана с ошибками." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Отменено" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Операция над файлами была завершена с ошибками." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Завершено" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Некоторые файлы не могут быть помещены в корзину, поскольку файловая система " "не поддерживает эту операцию.\n" "Вы всё равно хотите их удалить?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Приостановить" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Возобновить" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Перемещение" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Копирование" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Удаление в корзину" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Удаление" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Создание ссылки" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "В:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Создание ссылок на файлы" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Изменение атрибутов" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Изменение атрибутов файлов" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Восстановление" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s файлов" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Производится операция с файлами..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s файла:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s файлов:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Выкл" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "Точки входа" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Дерево директорий" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Сеть" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Точки входа" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Дерево директорий" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Просмотр содержимого папки" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Убрать %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Сдвинуть влево" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Сдвинуть _вправо" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Показать %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "С_бросить ширину" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Просмотр в виде значков" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Компактный вид" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "В виде _миниатюр" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "_В виде подробного списка" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Сменяет активную вкладку" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Указанный каталог '%s' неверен" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Целевой файл недоступен" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Нельзя создать ссылку на этой файловой системе" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Нельзя восстаноить файл '%s': исходный путь не известен" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Назначение не существует" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Источник и путь назначения совпадают." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Невозможно переместить каталог в свой подкаталог" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Невозможно скопировать каталог в свой подкаталог" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Путь назначения — подкаталог источника" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Невозможно скопировать файл '%s': не поддерживается" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Нельзя установить одинаковое отображаемое имя для нескольких файлов" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Нельзя установить одинаковое назначение для нескольких файлов" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Ошибка XML файла '%s' (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Файл XML не содержит корня меню приложений" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Не удалось создать определение XML для '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Путь меню '%s' уже существует" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Ошибка кэша меню" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Неверный каталог меню" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Элемент меню должен иметь имя" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Неверный каталог меню '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Неверный элемент меню" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Элемент меню '%s' не имеет соответствующего файла ярлыка" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Смена статуса 'скрытый' не поддерживается для папки меню" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Установка атрибута '%s' не поддерживается" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Неверное значение атрибута %s" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' является каталогом меню" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' не является элементом меню" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Файл ярлыка '%s' испорчен" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Не удалось создать элемент меню '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Имя каталога меню не должно заканчиваться на \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Недопустимая операция с корнем меню" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Неправильное место назначения" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: папка '%s' не найдена в кэше меню" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Поиск" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Результаты поиска" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Выберите исполняемый файл" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ко_манда:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Команда для исполнения при активировании значка приложения" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "О_писание:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Общее имя для приложения (например: \"Проигрыватель музыки\")" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Рабочий каталог:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Каталог, в котором приложение должно запускаться" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Подс_казка:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Всплывающая подсказка о назначении приложения" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Использовать _уведомление о запуске" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Ярлык программы" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Восстановить" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Восстановление файлов из корзины" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "имя файла или идентификатор источника" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ИСТОЧНИК" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "имя редактирумого файла" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "РЕЗУЛЬТАТ" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-диск" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "пустой CD-диск" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R диск" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "пустой CD-R диск" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW диск" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "пустой CD-RW диск" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM диск" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "пустой DVD-ROM диск" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW диск" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "пустой DVD-RW диск" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM диск" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "пустой DVD-RAM диск" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R диск" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "пустой DVD+R диск" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW диск" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "пустой DVD+RW диск" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "двуслойный DVD+R DL диск" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "пустой двуслойный DVD+R DL диск" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "двуслойный DVD+RW DL диск" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "пустой двуслойный DVD+RW DL диск" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "пустой диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "записываемый диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "пустой записываемый диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "перезаписываемый диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "пустой перезаписываемый диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD-DVD диск" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "пустой HD-DVD диск" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "записываемый HD-DVD диск" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "пустой записываемый HD-DVD диск" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "перезаписываемый HD-DVD диск" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "пустой перезаписываемый HD-DVD диск" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO диск" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "пустой МО диск" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "диск MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "пустой диск MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "диск MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "пустой диск MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Звуковые файлы" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "пустой оптический диск" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "оптический диск" #~ msgid "Symlinking" #~ msgstr "Создание ссылки" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Выполняется:" #~ msgid "Progress:" #~ msgstr "Выполнено:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Операция над файлами была завершена с ошибками." #~ msgid "_Rename Folder" #~ msgstr "П_ереименовать папку" #~ msgid "File type to be opened:" #~ msgstr "Тип открываемого файла:" #~ msgid "_Browse" #~ msgstr "Выбр_ать" #~ msgid "My Computer" #~ msgstr "Мой компьютер" #~ msgid "_Move" #~ msgstr "Пере_местить" #~ msgid "_Trash" #~ msgstr "_Отправить в корзину" #~ msgid "_Only for this folder" #~ msgstr "Только для этой папки" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Запомнить настройки для этой папки, не меняя глобальных настроек" #~ msgid "Please select a folder" #~ msgstr "Выберите каталог" #~ msgid "Entry for folder path" #~ msgstr "Строка ввода пути папки" #~ msgid "Computer" #~ msgstr "Компьютер" #~ msgid "Network Drives" #~ msgstr "Сетевые диски" #~ msgid "_Run in terminal emulator" #~ msgstr "_Выполнить в эмуляторе терминала" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Оставить окно терминала открытым после завершения" #~ msgid "Shortcuts" #~ msgstr "Ярлыки" #~ msgid "Mount Point" #~ msgstr "Точка монтирования" #~ msgid "Create _Symlink" #~ msgstr "Создать символическую ссылку" #~ msgid "Se_nd To" #~ msgstr "Отправить" #~ msgid "Blank File" #~ msgstr "Пустой файл" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Ошибка: программа lxshortcut не установлена" #~ msgid "Failed to start lxshortcut" #~ msgstr "Не удалось запустить lxshortcut" #~ msgid "_Group:" #~ msgstr "_Группа:" #~ msgid "Rename" #~ msgstr "Переименовать" #~ msgid "Only group" #~ msgstr "Только группа" #~ msgid "Enter:" #~ msgstr "Входить:" #~ msgid "Make the file executable" #~ msgstr "Сделать исполняемым" #~ msgid "Operations that all other users can do" #~ msgstr "Права всех остальных пользователей" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Права владельца файла" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Права группы, к которой принадлежит владелец файла" #~ msgid "Read and Write" #~ msgstr "Чтение и запись" #~ msgid "Read only" #~ msgstr "Только для чтения" #~ msgid "Write only" #~ msgstr "Только для записи" #~ msgid "Column Spacing" #~ msgstr "Интервал между колонками" #~ msgid "Space which is inserted between grid column" #~ msgstr "Расстояние между колонками" #~ msgid "Number of columns" #~ msgstr "Количество колонок" #~ msgid "Number of columns to display" #~ msgstr "Число отображаемых колонок" #~ msgid "View allows user to search through columns interactively" #~ msgstr "Позволяет пользователю осуществлять интерактивный поиск по колонкам" #~ msgid "Width for each item" #~ msgstr "Ширина каждого элемента" #~ msgid "The width used for each item" #~ msgstr "Ширина, устанавливаемая для каждого элемента" #~ msgid "Layout mode" #~ msgstr "Способ размещения" #~ msgid "The layout mode" #~ msgstr "Способ размещения" #~ msgid "Margin" #~ msgstr "Поля" #~ msgid "Space which is inserted at the edges of the icon view" #~ msgstr "Поля по краям значка" #~ msgid "Orientation" #~ msgstr "Ориентация" #~ msgid "" #~ "How the text and icon of each item are positioned relative to each other" #~ msgstr "" #~ "Определяет расположение значков и подписей каждого элемента по отношению " #~ "друг к другу" #~ msgid "Row Spacing" #~ msgstr "Интервал между рядами" #~ msgid "Space which is inserted between grid rows" #~ msgstr "Расстояние между рядами" #~ msgid "The selection mode" #~ msgstr "Режим выделения" #~ msgid "Selection Box Color" #~ msgstr "Цвет рамки выделения" #~ msgid "Color of the selection box" #~ msgstr "Цвет рамки выделения" #~ msgid "Selection Box Alpha" #~ msgstr "Прозрачность рамки выделения" #~ msgid "Opacity of the selection box" #~ msgstr "Прозрачность рамки выделения" libfm-1.4.0/po/sk.po000066400000000000000000002163531475513661000142220ustar00rootroot00000000000000# translation of libfm to Slovak # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pcmanfm package. # # Ivan Masár , 2009, 2010. # msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2019-01-18 08:16+0000\n" "Last-Translator: mirek \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1547799362.705221\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Odporúčané aplikácie" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Vyberte aplikáciu, ktorá sa spustí pri kliknutí na webový odkaz alebo " "emailovú adresu" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Editor skratiek" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Vytvoriť novú alebo upraviť existujúcu položku plochy" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Vyberte aplikáciu" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Použiť vybranú aplikáciu na otvorenie súborov" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "Na_inštalované aplikácie" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Spustiť príkaz_ový riadok:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Prechádzať..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Spustiť v _emulátore terminálu" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Ponechať o_kno terminálu otvorené po ukončení príkazu" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Na príkazovom riadku môžete použiť tieto špeciálne kódy:\n" " %f: predstavuje názov jedného súboru\n" " %F: predstavuje názvy viacerých súborov\n" " %u: predstavuje URI jedného súboru\n" " %U: predstavuje URI viacerých súborov" #: ../data/ui/app-chooser.glade.h:14 #, fuzzy msgid "_Application name (optional, set it to keep association)" msgstr "" "_Názov aplikácie (voliteľný, nastavte ho pre zachovanie asociácie)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Definovať vlastný príkazový riadok na otvorenie súborov" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Vlastný príkazový riadok" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" "Na_staviť vybranú aplikáciu ako predvolenú operáciu pre tento typ súboru" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Potvrdiť nahradenie súboru" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Pre_skočiť" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "P_remenovať" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Prepísať" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Na tomto miete už existuje súbor s daným názvom.\n" "\n" "Želáte si nahradiť existujúci súbor" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "nasledovným súborom?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Názov súboru:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Použiť túto možnosť n_a všetky existujúce súbory" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Vyberte ikonu..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "systémová téma ikon" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "súbory obrázkov" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Vyberte ikonu z:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Spustiť súbor" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Spustiť v _termináli" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Vlastnosti súboru" #: ../data/ui/file-prop.glade.h:2 #, fuzzy msgid "Icon of the file in folder view" msgstr "Ikona súboru v zobrazení priečinkov" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "Me_no:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Umiestnenie:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Cieľový súbor:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Typ súboru:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Otvoriť čí_m:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Vyberte aplikáciu, ktorá sa použije na otvorenie súborov tohto typu" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Celkový počet súborov:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Celková veľkosť súborov:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Veľkosť na disku:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Posledná zmena:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Posledný prístup:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Posledná zmena práv:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Všeobecné" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Vlastník:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Skupina:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Zobraziť obsah:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "Zmeniť obsa_h" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Spustiť:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Špeciálne bity:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Kto môže čítať obsah súboru/priečinku" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Kto môže meniť obsah súboru/priečinku" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Kto môže spustiť súbor alebo vojsť do priečinku" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Špeciálne príznaky pre spustenie súboru" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Špeciálne príznaky pre prístup do priečinku" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Riadenie prístupu" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skrytý súbor" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "O_právnenia" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Žiadne" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "lepkavý" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "SETGID" #: ../data/ui/file-prop.glade.h:35 #, fuzzy msgid "Sticky & set GID" msgstr "SETGID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Nastaviť UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Nastaviť UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Iba vlastník" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Iba vlastník a skupina" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Ktokoľvek" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nikto" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Vybrať dátum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Vyberte dátum z nasledujúceho kalendára" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Hľadať súbory" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "Hľadať typy súborov" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Nezáleží na _veľkosti písmen" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Po_užiť regulárny výraz" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Kd_e hľadať:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Hľadať v podpriečinkoch" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_Hľadať skryté súbory" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Meno/_Umiestnenie" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Typ súboru" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Hľadať iba súbory týchto typov:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xtové súbory" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Súbory _obrázkov" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Zvukové súbory" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video súbory" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenty" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "P_riečinky" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Iné:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Typ súboru" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "_Súbor obsahuje:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Obsah" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Veľkosť súboru" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Menší ako:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Väčší ako:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Čas poslednej zmeny" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Žiadne)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Skôr n_ež:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Neskôr než:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Vlastnosti" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Webový prehliadač" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Na otvorenie hyperodkazov sa použije uprednostňovaný webový prehliadač." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Poštový klient" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Na písanie emailov sa použije uprednostňovaný poštový klient keď kliknete na " "emailovú adresu " #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulátor terminálu" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Príkazový riadok:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Systémové aplikácie" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Asociácie typov súborov" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Do:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Pripravuje sa..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Prenesené údaje:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Čas do dokončenia:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Vyskytli sa chyby:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Prázdna hodnota" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Neplatný výber" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operácia nie je podporovaná" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Neplatný súbor plochy: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Nepodarilo sa určiť typ obsahu súboru '%s', ktorý má byť spustený" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Nie je nastavená žiadna predvolená aplikácia na spustenie URI %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Nepodarilo sa nastaviť pracovný priečinok na '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Nie je nastavená žiadna predvolená aplikácia pre MIME typ %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Zariadenia" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Sieť" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Kôš" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "skratka pre URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: neplatný argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "V konfigurácii libfm nie je nastavený žiadny emulátor terminálu" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "Neplatný opis náhľadovej aplikácie" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bajt" msgstr[1] "%u bajty" msgstr[2] "%u bajtov" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Názov entity '%-.*s' je neznámy" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Medzera nie povolená v ukončovacej značke" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element '%s' bol zavretý, ale žiadny nebol otvorený" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Element '%s' bol zavretý, ale aktuálne je otvorený element '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Na začiatku hodnoty atribútu sa nachádza neplatný znak '%c'" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Na konci hodnoty atribútu sa nachádza neplatný znak '%c', pričom očakávaný " "je '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokument sa skončil neočakávane" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument bol prázdny alebo obsahoval iba biele znaky" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: chyba údajov XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Prispôsobiť" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Spustiteľné súbory" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Vyberte aplikáciu na otváranie súborov \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Nainštalované aplikácie" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Žiadne podpriečinky>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Načítava sa..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Zobrazí strom priečinkov v bočnom paneli" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Zrušiť" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Kopír_ovať sem" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Presunúť sem" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "Odkaz _sem" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave zlyhalo." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Otvoriť" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Otvoriť _pomocou..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Otvoriť _pomocou" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopírovať ces_tu(y)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Skr_yť" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Odkr_yť" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Prid_ať medzi záložky" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "P_remenovať..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Ko_mprimovať..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Rozbaliť _sem" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Rozbaliť _do..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Vlastnosti" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Presunúť do _koša" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Vaše záložky už obsahujú záložku pre tento priečinok." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Súbory obrázkov" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bajt" msgstr[1] "bajty" msgstr[2] "bajtov" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Prosím, zadajte platné meno používateľa alebo jeho číselný ID." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Prosím, zadajte platné meno skupiny alebo jej číselný ID." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Chcete tieto zmeny použiť rekurzívne na všetky súbory a podadresáre?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Skryť alebo zobraziť súbor" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Tento súbor je skrytý, pretože jeho názov obsahuje bodku ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Súbory na tomto systéme sú skryté, ak ich názov začína s bodkou ('.'). " "Stlačením prepnete zobrazovanie skrytých súborov." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "načítava sa..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Prístup k obsahu:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Súbory rozličných typov" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Súbor:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Viacero súborov" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Názov" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Opis" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Veľkosť" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Oprávnenia" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Vlastník" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Zmenené" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Umiestnenie" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Prípona" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "_Vytvoriť nové..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Priečinok" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Prázdny súbor" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Invertovať výber" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "U_sporiadať súbory" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Premenovať priečinok..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Vlastnosti pri_ečinku" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Zobraziť _skryté" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Miešať _súbory a priečinky" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorovať veľkosť znakov" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Podľa _názvu" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Podľa času poslednej z_meny" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Podľa veľko_sti" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Podľa _typu súborov" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Zadajte názov nového priečinku:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Vytváranie nového priečinku" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Zadajte názov pre prázdny súbor:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Vytváranie..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nový" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Zadajte názov pre nový %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Vytvára sa %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Spustiť predvolenú aplikáciu nad súborom po jeho vytvorení" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Zdá sa, že textový súbor '%s' je spustiteľný skript.\n" "Čo s ním chcete urobiť?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Súbor '%s' je spustiteľný. Chcete ho spustiť?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nie sú zadané žiadne priečinky." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Vyberte priečinok" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Chyba" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Potvrdiť" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Otázka" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Oprávenie vykonať túto operáciu majú iba správcovia systému." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Chcete presunúť súbor '%s' do koša?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Chcete presunúť %d vybraný súbor do koša?" msgstr[1] "Chcete presunúť %d vybrané súbory do koša?" msgstr[2] "Chcete presunúť %d vybraných súborov do koša?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Chcete odstrániť súbor '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Chcete odstrániť %d vybratý súbor?" msgstr[1] "Chcete odstrániť %d vybraté súbory?" msgstr[2] "Chcete odstrániť %d vybratých súborov?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Premenovať súbor" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Prosím, zadajte nový názov:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Ste si sitý, že chcete vyprázdniť Kôš?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Asociácie typov súborov" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Domovský priečinok" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Plocha" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Aplikácie" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Koreňový priečinok súborového systému" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Pripojiť zväzok" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Odpojiť zväzok" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Vysunúť prenosné médium" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formátovať zväzok" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "P_remenovať záložku" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Odstrániť zo záložiek" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Presunúť záložk_u vyššie" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Presunúť záložku _nižšie" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Vyprázdniť kôš" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 #, fuzzy msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Zobraziť zoznam bežných miest, zariadení a záložiek v bočnom paneli" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Premenovať záložku" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Zadajte nový názov:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Veľkosť: %s\n" "Zmenené: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Zmenené: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Pred ukončením súborovej operácie sa vyskytli chyby." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Zrušené" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Súborová operácia bola dokončená s chybami." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Dokončené" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Niektoré súbory nie je možné presunúť do Koša, pretože súborový systém, na " "ktorom ležia nepodporuje túto operáciu.\n" "Chcete ich namiesto toho zmazať?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Pozastaviť" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Pokračovať" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "c" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Presúvanie" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopírovanie" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Presúvajú sa súbory do Koša" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Odstraňovanie" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Vytváranie odkazu" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Do:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Vytvárajú sa odkazy na súbory" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Zmena atribútov" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Zmena atribútov súborov" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Obnovovanie" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s súbory" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Prebieha operácia so súborom..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s súbor:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s súbory:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Miesta" #: ../src/gtk/fm-side-pane.c:68 #, fuzzy msgid "_Directory Tree" msgstr "Strom adresárov" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Miesta" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Strom adresárov" #: ../src/gtk/fm-standard-view.c:265 #, fuzzy msgid "View of folder contents" msgstr "Skryť okraj obsahu priečinka" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Skryť %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Presunúť vľavo" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Presunúť _vpravo" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Zobraziť %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 #, fuzzy msgid "_Icon View" msgstr "Model zobrazenia ikon" #: ../src/gtk/fm-standard-view.c:1877 #, fuzzy msgid "_Compact View" msgstr "Jednotka Compact Flash" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 #, fuzzy msgid "Detailed _List View" msgstr "Zobraziť _podrobný zoznam" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Uvedený priečinok '%s' nie je platný" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "K cieľovému súboru sa nedá pristupovať" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Nie je možné vytvoriť odkaz na ne-natívnom súborovom systéme" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Nie je možné obnoviť súbor '%s': pôvodná cesta nie je známa." #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Cieľ neexistuje" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Zdroj a cieľ sa zhodujú." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Nie je možné presunúť priečinok do jeho podpriečinka" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Nie je možné skopírovať priečinok do jeho podpriečinka" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Cieľ je podpriečinkom zdroja" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Nie je možné skopírovať súbor '%s': operácia nie je podporovaná" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Chyba XML súboru '%s' (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML súbor neobsahuje koreň Applications" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Nie je možné vytvoriť XML definíciu pre '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Cesta menu '%s' už existuje" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Chyba cache menu" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Neplatný priečinok ponuky" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Názov položky ponuky nemôže byť prázdny" #: ../src/modules/vfs-menu.c:1480 #, fuzzy, c-format msgid "Invalid menu directory '%s'" msgstr "Domovský adresár" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "Domovský adresár" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Neplatná hodnota atribútu '%s'" #: ../src/modules/vfs-menu.c:1995 #, fuzzy, c-format msgid "The '%s' is a menu directory" msgstr "Domovský adresár" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, fuzzy, c-format msgid "The '%s' isn't a menu item" msgstr "Zväzok „%s“ nie je pripojený" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Nie je možné vytvoriť položku menu '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Hľadať" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Výsledky vyhľadávania" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Vyberte si spusiteľný súbor" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Príkaz:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Príkaz, ktorý sa spustí po aktivovaní ikony aplikácie" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Opis:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Obecný názov aplikácie" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "P_racovný priečinok:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Pracovný priečinok, v ktorom bude program spustený" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "P_opisok:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Popisok, ktorý sa zobrazí nad aplikáciou" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 #, fuzzy msgid "_Use startup notification" msgstr "Posledná zmena" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Nastavenia _plochy" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Obnoviť" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Obnoviť súbory z Koša na pôvodné miesto" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ZDROJ" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "VÝSLEDOK" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disk CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Prázdny disk CD" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disk CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Prázdny disk CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disk CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Prázdny disk CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Prázdny disk DVD" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disk DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Prázdny disk DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Prázdny disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disk DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Prázdny disk DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disk DVD-RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Prázdny disk DVD-RW" #: ../src/udisks/g-udisks-device.c:50 #, fuzzy msgid "DVD+R DL Disc" msgstr "Disk DVD+R" #: ../src/udisks/g-udisks-device.c:50 #, fuzzy msgid "Blank DVD+R DL Disc" msgstr "Prázdny disk DVD+R" #: ../src/udisks/g-udisks-device.c:51 #, fuzzy msgid "DVD+RW DL Disc" msgstr "Disk DVD-RW" #: ../src/udisks/g-udisks-device.c:51 #, fuzzy msgid "Blank DVD+RW DL Disc" msgstr "Prázdny disk DVD-RW" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disk Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Prázdny disk Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disk Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Prázdny disk Blu-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disk Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Prázdny disk Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disk HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Prázdny disk HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disk HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Prázdny disk HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disk HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Prázdny disk HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disk MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Prázdny disk MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disk MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Prázdny disk MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disk MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Prázdny disk MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "audio" msgid "Audio CD" msgstr "audio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Prázdny optický disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optický disk" #, fuzzy #~ msgid "Symlinking" #~ msgstr "Vytvára sa odkaz..." #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Ktoré typy súborov má otvárať:" #~ msgid "Processing:" #~ msgstr "Spracúva sa:" #~ msgid "Progress:" #~ msgstr "Priebeh:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Operácia so súborom je dokončená, ale vyskytli sa chyby." #, fuzzy #~ msgid "Moving Files" #~ msgstr "Presúvajú sa súbory" #, fuzzy #~ msgid "Copying Files" #~ msgstr "Kopírujú sa súbory" #~ msgid "_Browse" #~ msgstr "_Prehliadať" #~ msgid "My Computer" #~ msgstr "Môj počítač" #, fuzzy #~ msgid "_Move" #~ msgstr "Presunúť:" #, fuzzy #~ msgid "_Trash" #~ msgstr "Kôš" #, fuzzy #~ msgid "_Only for this folder" #~ msgstr "Prejsť do priečinka" #~ msgid "Please select a folder" #~ msgstr "Prosím, vyberte priečinok" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "Prejsť do priečinka" #, fuzzy #~ msgid "Computer" #~ msgstr "Môj počítač" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Sieť" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Spustiť v emulátore terminálu" #~ msgid "Shortcuts" #~ msgstr "Skratky" #~ msgid "Mount Point" #~ msgstr "Bod pripojenia" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Vytvoriť symbolický odkaz" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "Poslať do" #, fuzzy #~ msgid "Blank File" #~ msgstr "Textové súbory" #~ msgid "_Group:" #~ msgstr "_Skupina:" #~ msgid "Rename" #~ msgstr "Premenovať" #~ msgid "Make the file executable" #~ msgstr "Označiť súbor ako spustiteľný" #~ msgid "Operations that all other users can do" #~ msgstr "Operácie, ktoré môžu robiť ostatní používatelia" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operácie, ktoré môže robiť vlastník súboru" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operácie, ktoré môžu robiť používatelia v rovnakej skupine ako vlastník " #~ "súboru" #~ msgid "Read and Write" #~ msgstr "Čítať a zapisovať" #~ msgid "Read only" #~ msgstr "Len na čítanie" #~ msgid "Write only" #~ msgstr "Len na zápis" #~ msgid "Copyright (C) 2005 - 2008" #~ msgstr "Copyright (C) 2005 - 2008" #~ msgid "" #~ "Lightweight file manager\n" #~ "\n" #~ "Developed by Hon Jen Yee (PCMan)" #~ msgstr "" #~ "Odľahčený správca súborov\n" #~ "\n" #~ "Vyvinul Hon Jen Yee (PCMan)" #~ msgid "" #~ "The icon was taken from \"nuoveXT 2\" icon theme\n" #~ "created by Alexandre Moore (saki).\n" #~ "http://www.gnome-look.org/content/show.php/nuoveXT+2?content=56625" #~ msgstr "" #~ "Ikona pochádza z témy „nuoveXT 2“,\n" #~ "ktorú vytvoril Alexandre Moore (saki).\n" #~ "http://www.gnome-look.org/content/show.php/nuoveXT+2?content=56625" #~ msgid "translator-credits" #~ msgstr "Ivan Masár , 2009." #~ msgid "" #~ "洪任諭 Hong Jen Yee \n" #~ "\n" #~ "Source code taken from other projects:\n" #~ " * libmd5-rfc: Aladdin Enterprises\n" #~ " * Working area detection: Gary Kramlich\n" #~ " * ExoIconView: os-cillation e.K, Anders Carlsson, & Benedikt Meurer\n" #~ " * Text and icon renderer uses code from Jonathan Blandford\n" #~ " * Desktop icons use code from Brian Tarricone\n" #~ " * Volume management uses code from following projects/authors:\n" #~ " * gnome-vfs: David Zeuthen\n" #~ " * thunar-vfs and libexo: Benedikt Meurer\n" #~ " * gnome-mount: David Zeuthen" #~ msgstr "" #~ "洪任諭 Hong Jen Yee \n" #~ "\n" #~ "Zdrojový kód prevzatý z iných projektov:\n" #~ " * libmd5-rfc: Aladdin Enterprises\n" #~ " * Detekcia pracovného priestoru: Gary Kramlich\n" #~ " * ExoIconView: os-cillation e.K, Anders Carlsson, & Benedikt Meurer\n" #~ " * Vykresľovanie textu a ikon používa kód od Jonathana Blandforda\n" #~ " * Ikony na ploche používajú kód od Briana Tarriconeho\n" #~ " * Správa zväzkov používa kód od nasledovných projektov/autorov:\n" #~ " * gnome-vfs: David Zeuthen\n" #~ " * thunar-vfs a libexo: Benedikt Meurer\n" #~ " * gnome-mount: David Zeuthen" #~ msgid "Opened in Terminal" #~ msgstr "Otvára sa v termináli" #~ msgid "" #~ "Please choose an application from following lists or enter the command " #~ "line by hand:" #~ msgstr "" #~ "Prosím, vyberte aplikáciu z nasledovného zoznamu alebo zadajte príkaz " #~ "ručne:" #~ msgid "Actions Showed in Popup Menus" #~ msgstr "Operácie zobrazené v kontextových ponukách" #~ msgid "Add _Application" #~ msgstr "Pridať _aplikáciu" #~ msgid "Add _Custom Action" #~ msgstr "Pridať _vlastnú operáciu" #~ msgid "To:" #~ msgstr "Kam:" #~ msgid "" #~ "Any\n" #~ "Within One Day\n" #~ "Within One Week\n" #~ "Within One Month\n" #~ "Within One Year\n" #~ "Within Selected Date Range" #~ msgstr "" #~ "Kedykoľvek\n" #~ "V rámci dňa\n" #~ "V rámci týždňa\n" #~ "V rámci mesiaca\n" #~ "V rámci roka\n" #~ "V rámci vybraného rozsahu dátumov" #~ msgid "Audio Files (mp3, ogg,...)" #~ msgstr "Zvukové súbory (mp3, ogg,...)" #~ msgid "" #~ "Bytes\n" #~ "KB\n" #~ "MB\n" #~ "GB" #~ msgstr "" #~ "bajtov\n" #~ "KB\n" #~ "MB\n" #~ "GB" #~ msgid "General" #~ msgstr "Všeobecné" #~ msgid "Image Files (jpg, png,...)" #~ msgstr "Súbory obrázkov (jpg, png,...)" #~ msgid "Size & Date" #~ msgstr "Veľkosť a dátum" #~ msgid "Video Files (avi, mpg,...)" #~ msgstr "Video súbory (avi, mpg,...)" #~ msgid "Behavior" #~ msgstr "Správanie" #~ msgid "Colors" #~ msgstr "Farby" #~ msgid "Display" #~ msgstr "Zobrazenie" #~ msgid "General" #~ msgstr "Všeobecné" #~ msgid "Always show the tab bar" #~ msgstr "Vždy zobrazovať tento panel s kartami" #~ msgid "Background:" #~ msgstr "Pozadie:" #~ msgid "Bookmarks:" #~ msgstr "Záložky:" #~ msgid "Disable \"Trash Can\" and delete files from disk directly" #~ msgstr "Vypnúť „Kôš“ a mazať súbory priamo z disku" #~ msgid "Display image files with supported format as thumbnails" #~ msgstr "Zobraziť súbory obrázkov podporovaných formátov ako náhľady" #~ msgid "Hide 'Close tab' buttons" #~ msgstr "Skryť tlačidlá „Zatvoriť kartu“" #~ msgid "Hide side pane buttons" #~ msgstr "Skryť tlačidlá bočného panelu" #~ msgid "I_nterface" #~ msgstr "Rozhra_nie" #~ msgid "Manage the desktop and show file icons" #~ msgstr "Správa plochy a zobrazenie ikon súborov" #~ msgid "Max size of files displayed as thumbnails:" #~ msgstr "Max. veľkosť súborov zobrazených ako náhľady:" #~ msgid "Mode:" #~ msgstr "Režim:" #~ msgid "On-disk file name encoding:" #~ msgstr "Kódovanie názvov súborov na disku:" #~ msgid "Open files with single click" #~ msgstr "Otvoriť súbory jednoduchým kliknutím" #~ msgid "" #~ "Opened in Current Tab\n" #~ "Opened in New Tab\n" #~ "Opened in New Window" #~ msgstr "" #~ "Otvorené v aktuálnej karte\n" #~ "Otvorené v novej karte\n" #~ "Otvorené v novom okne" #~ msgid "Preferences" #~ msgstr "Nastavenie" #~ msgid "Shadow:" #~ msgstr "Tieň:" #~ msgid "Show \"My Documents\" icon on desktop" #~ msgstr "Zobraziť na ploche ikonu „Moje dokumenty“" #~ msgid "Show icons of volumes on desktop" #~ msgstr "Zobraziť na ploche ikony zväzkov" #~ msgid "Show menus provided by WM when desktop is clicked" #~ msgstr "Zobraziť po kliknutí na plochu ponuky správcu okien" #~ msgid "Size of Big Icons:" #~ msgstr "Veľkosť veľkých ikon:" #~ msgid "Size of Small Icons:" #~ msgstr "Veľkosť malých ikon:" #~ msgid "" #~ "Stretch to fill the entire screen\n" #~ "Stretch to fit the screen\n" #~ "Center on the screen\n" #~ "Tile the image to fill the entire screen" #~ msgstr "" #~ "Roztiahnuť na celú obrazovku\n" #~ "Roztiahnuť na obrazovku\n" #~ "Centrovať na obrazovke\n" #~ "Vedľa seba na celú obrazovku" #~ msgid "Terminal:" #~ msgstr "Terminál:" #~ msgid "Text:" #~ msgstr "Text:" #~ msgid "Use SI decimal prefixes instead of IEC binary prefixes" #~ msgstr "Používať desiatkové predpony SI namiesto dvojkových predpon IEC" #~ msgid "Wallpaper:" #~ msgstr "Tapeta:" #~ msgid "_Advanced" #~ msgstr "_Rozšírené" #~ msgid "_Volume Management" #~ msgstr "_Správa zväzkov" #~ msgid "Column Spacing" #~ msgstr "Rozostupy stĺpcov" #~ msgid "Space which is inserted between grid column" #~ msgstr "Miesto, ktoré sa vloží medzi stĺpce mriežky" #~ msgid "Number of columns" #~ msgstr "Počet stĺpcov" #~ msgid "Number of columns to display" #~ msgstr "Počet zobrazených stĺpcov" #~ msgid "Enable Search" #~ msgstr "Zapnúť hľadanie" #~ msgid "View allows user to search through columns interactively" #~ msgstr "Zobrazenie umožňuje používateľom interaktívne prehľadávať stĺpce" #~ msgid "Width for each item" #~ msgstr "Šírka každej položky" #~ msgid "The width used for each item" #~ msgstr "Použitá šírka pre každú položku" #~ msgid "Layout mode" #~ msgstr "Režim rozloženia" #~ msgid "The layout mode" #~ msgstr "Režim rozloženia" #~ msgid "Margin" #~ msgstr "Okraj" #~ msgid "Space which is inserted at the edges of the icon view" #~ msgstr "Miesto, ktoré sa vloží na okraje zobrazenia ikon" #~ msgid "Markup column" #~ msgstr "Stĺpec pre značkovanie" #~ msgid "Model column used to retrieve the text if using Pango markup" #~ msgstr "Modelový stĺpec na získanie textu ak sa používa značkovanie Pango" #~ msgid "The model for the icon view" #~ msgstr "Model pre zobrazenie ikon" #~ msgid "Orientation" #~ msgstr "Orientácia" #~ msgid "" #~ "How the text and icon of each item are positioned relative to each other" #~ msgstr "Ako sú vzájomne postavené text a ikona každej položky" #~ msgid "Pixbuf column" #~ msgstr "Stĺpec pixbuf" #~ msgid "Model column used to retrieve the icon pixbuf from" #~ msgstr "Modelový stĺpec, z ktorého sa získava pixbuf ikona" #~ msgid "Reorderable" #~ msgstr "Možná zmena poradia" #~ msgid "View is reorderable" #~ msgstr "Je možná zmena poriadia položiek v zobrazení" #~ msgid "Row Spacing" #~ msgstr "Rozostupy riadkov" #~ msgid "Space which is inserted between grid rows" #~ msgstr "Miesto, ktoré sa vkladá medzi riadky mriežky" #~ msgid "Search Column" #~ msgstr "Vyhľadávací stĺpec" #~ msgid "Model column to search through when searching through item" #~ msgstr "Modelový stĺpec v ktorom sa hľadá pri hľadaní položky" #~ msgid "Selection mode" #~ msgstr "Režim výberu" #~ msgid "The selection mode" #~ msgstr "Režim výberu" #~ msgid "Single Click" #~ msgstr "Jednoduché kliknutie" #~ msgid "Whether the items in the view can be activated with single clicks" #~ msgstr "Či je možné položky v zobrazení aktivovať jednoduchým kliknutím" #~ msgid "Single Click Timeout" #~ msgstr "Interval jednoduchého kliknutia" #~ msgid "" #~ "The amount of time after which the item under the mouse cursor will be " #~ "selected automatically in single click mode" #~ msgstr "" #~ "Čas po ktorom sa položka pod kurzorom automaticky vyberie v režime " #~ "jednoduchého kliknutia" #~ msgid "Spacing" #~ msgstr "Rozostupy" #~ msgid "Space which is inserted between cells of an item" #~ msgstr "Miesto, ktoré sa vkladá medzi bunky položky" #~ msgid "Text column" #~ msgstr "Textový stĺpec" #~ msgid "Model column used to retrieve the text from" #~ msgstr "Modelový stĺpec z ktorého sa získava text" #~ msgid "Selection Box Color" #~ msgstr "Farba poľa na výber" #~ msgid "Color of the selection box" #~ msgstr "Farba poľa na výber" #~ msgid "Selection Box Alpha" #~ msgstr "Alfa poľa na výber" #~ msgid "Opacity of the selection box" #~ msgstr "Krytie poľa na výber" #~ msgid "video" #~ msgstr "video" #~ msgid "text" #~ msgstr "text" #~ msgid "multipart" #~ msgstr "viac častí" #~ msgid "image" #~ msgstr "obrázok" #~ msgid "message" #~ msgstr "správa" #~ msgid "model" #~ msgstr "model" #~ msgid "inode" #~ msgstr " v" #~ msgid "packages" #~ msgstr "balíky" #~ msgid "Don't show desktop icons." #~ msgstr "Nezobrazovať ikony na ploche." #~ msgid "Run PCManFM as a daemon" #~ msgstr "Spúšťať PCManFM v režime démona" #~ msgid "" #~ "Open folders in new tabs of the last used window instead of creating new " #~ "windows" #~ msgstr "" #~ "Otvárať priečinky v nových záložkách posledného použitého okna namiesto " #~ "tvorby nových okien" #~ msgid "" #~ "Open preference dialog. 'n' is the number of page you want to show (1, 2, " #~ "3...)." #~ msgstr "" #~ "Otvoriť dialóg s nastavením. „n“ je počet stránok, ktorý chcete zobraziť " #~ "(1, 2, 3...)." #~ msgid "Find Files with PCManFM" #~ msgstr "Nájsť súbory pomocou PCManFM" #~ msgid "Set desktop wallpaper" #~ msgstr "Nastaviť tapetu plochy" #~ msgid "[FILE1, FILE2,...]" #~ msgstr "[SÚBOR1, SÚBOR2,...]" #~ msgid "GTK+ icon theme is not properly set" #~ msgstr "Téma ikon GTK+ nie je správne nastavená" #~ msgid "" #~ "%s\n" #~ "\n" #~ "This usually means you don't have an XSETTINGS manager running. Desktop " #~ "environment like GNOME or XFCE automatically execute their XSETTING " #~ "managers like gnome-settings-daemon or xfce-mcs-manager.\n" #~ "\n" #~ "If you don't use these desktop environments, you have two choices:\n" #~ "1. run an XSETTINGS manager, or\n" #~ "2. simply specify an icon theme in ~/.gtkrc-2.0.\n" #~ "For example to use the Tango icon theme add a line:\n" #~ "gtk-icon-theme-name=\"Tango\" in your ~/.gtkrc-2.0. (create " #~ "it if no such file)\n" #~ "\n" #~ "NOTICE: The icon theme you choose should be compatible with GNOME, or " #~ "the file icons cannot be displayed correctly. Due to the differences " #~ "in icon naming of GNOME and KDE, KDE themes cannot be used. Currently " #~ "there is no standard for this, but it will be solved by freedesktop.org " #~ "in the future." #~ msgstr "" #~ "%s\n" #~ "\n" #~ "To zvyčajne znamená, že vám nebeží správca XSETTINGS. Pracovné prostredia " #~ "ako GNOME alebo XFCE automaticky spúšťajú svojich správcov XSETTING ako " #~ "gnome-settings-daemon či xfce-mcs-manager.\n" #~ "\n" #~ "ak nepoužívate tieto pracovné prostredia, máte dve možnosti:\n" #~ "1. spustiť správcu XSETTINGS alebo\n" #~ "2. jednoducho uviesť tému ikon v súbore ~/.gtkrc-2.0.\n" #~ "Napríklad ak chcete použiť tému ikon Tango pridajte riadok:\n" #~ "gtk-icon-theme-name=\"Tango\" do svojho súboru ~/." #~ "gtkrc-2.0. (ak neexistuje vytvorte ho)\n" #~ "\n" #~ "POZN.: Téma ikon, ktorú vyberiete by mala byť kompatibilná s GNOME " #~ "inak nebude možné správne zobraziť ikony súborov. Kvôli rozdielom v " #~ "pomenovaní ikon GNOME a KDE nie je možné použiť témy KDE. Momentálne na " #~ "to neexistuje žiadny štandard, ale freedesktop.org to v budúcnosti " #~ "vyrieši." #~ msgid "" #~ "Error: Unable to establish connection with FAM.\n" #~ "\n" #~ "Do you have \"FAM\" or \"Gamin\" installed and running?" #~ msgstr "" #~ "Chyba: Nepodarilo sa nadviazať spojenie s FAM.\n" #~ "\n" #~ "Máte nainštalovaný a spustený „FAM“ alebo „Gamin“?" #~ msgid "File doesn't exist" #~ msgstr "Súbor neexistuje" #~ msgid "Don't know how to open the file" #~ msgstr "Nie je známe ako otvoriť súbor" #~ msgid "" #~ "Unable to open file:\n" #~ "\"%s\"\n" #~ "%s" #~ msgstr "" #~ "Nedá sa otvoriť súbor:\n" #~ "„%s“\n" #~ "%s" #~ msgid "_Folder" #~ msgstr "_Priečinok" #~ msgid "_Text File" #~ msgstr "_Textový súbor" #~ msgid "New _Window" #~ msgstr "Nové _okno" #~ msgid "New _Tab" #~ msgstr "Nová kar_ta" #~ msgid "File _Properties" #~ msgstr "_Vlastnosti súboru" #~ msgid "_Close Window" #~ msgstr "_Zatvoriť okno" #~ msgid "_Delete" #~ msgstr "_Zmazať" #~ msgid "Select _All" #~ msgstr "Vybr_ať všetky" #~ msgid "Go _Back" #~ msgstr "Prejsť _späť" #~ msgid "Go _Forward" #~ msgstr "Prejsť _dopredu" #~ msgid "Go to _Parent Folder" #~ msgstr "Prejsť do nadradeného _priečinka" #~ msgid "Go _Home" #~ msgstr "Prejsť _domov" #~ msgid "Sort by _Type" #~ msgstr "Zoradiť podľa _typu" #~ msgid "Sort by _Permission" #~ msgstr "Zoradiť podľa o_právnení" #~ msgid "Sort by _Owner" #~ msgstr "Zoradiť podľa _vlastníka" #~ msgid "Ascending" #~ msgstr "Vzostupne" #~ msgid "Descending" #~ msgstr "Zostupne" #~ msgid "_Open Side Pane" #~ msgstr "_Otvoriť bočný panel" #~ msgid "Show _Location Pane" #~ msgstr "Zobraziť panel _umiestneia" #~ msgid "Show _Directory Tree" #~ msgstr "Zobraziť strom a_dresárov" #~ msgid "_Refresh" #~ msgstr "_Obnoviť" #~ msgid "Side _Pane" #~ msgstr "Bočný _panel" #~ msgid "_Sort..." #~ msgstr "_Zoradiť..." #~ msgid "View as _Icons" #~ msgstr "Zobraziť ako _ikony" #~ msgid "View as _Compact List" #~ msgstr "Zobraziť _kompaktný zoznam" #~ msgid "Open _Terminal" #~ msgstr "Otvoriť _terminál" #~ msgid "Open Current Folder as _Root" #~ msgstr "Otvoriť aktuálny priečinok ako _root" #~ msgid "_File" #~ msgstr "_Súbor" #~ msgid "_Edit" #~ msgstr "Úpr_avy" #~ msgid "_Go" #~ msgstr "_Prejsť" #~ msgid "_Bookmark" #~ msgstr "_Záložka" #~ msgid "_View" #~ msgstr "_Zobraziť" #~ msgid "_Tool" #~ msgstr "_Nástroj" #~ msgid "_Help" #~ msgstr "_Pomocník" #~ msgid "New Tab" #~ msgstr "Nová karta" #~ msgid "Back" #~ msgstr "Späť" #~ msgid "Forward" #~ msgstr "Dopredu" #~ msgid "Parent Folder" #~ msgstr "Nadradený priečinok" #~ msgid "Refresh" #~ msgstr "Obnoviť" #~ msgid "Open Side Pane" #~ msgstr "Otvoriť bočný panel" #~ msgid "Go" #~ msgstr "Prejsť" #~ msgid "Warning: You are in super user mode" #~ msgstr "Upozornenie: Nachádzate sa v režime superpoužívateľa" #~ msgid "Terminal program has not been set" #~ msgstr "Nebol nastavený terminálový program" #~ msgid "_Edit Bookmarks" #~ msgstr "_Upraviť záložky" #~ msgid ", Free space: %s (Total: %s )" #~ msgstr ", Voľné miesto: %s (Celkom: %s )" #~ msgid "%d item selected (%s)%s" #~ msgid_plural "%d items selected (%s)%s" #~ msgstr[0] "%d vybraná položka (%s)%s" #~ msgstr[1] "%d vybrané položky (%s)%s" #~ msgstr[2] "%d vybraných položiek (%s)%s" #~ msgid "%d hidden" #~ msgid_plural "%d hidden" #~ msgstr[0] "%d skrytý" #~ msgstr[1] "%d skryté" #~ msgstr[2] "%d skrytých" #~ msgid "%d visible item (%s)%s" #~ msgid_plural "%d visible items (%s)%s" #~ msgstr[0] "%d viditeľná položka (%s)%s" #~ msgstr[1] "%d viditeľné položky (%s)%s" #~ msgstr[2] "%d viditeľných položiek (%s)%s" #~ msgid "Open in New _Tab" #~ msgstr "Otvoriť v novej _karte" #~ msgid "Open in New _Window" #~ msgstr "Otvoriť v novom _okne" #~ msgid "Type" #~ msgstr "Typ" #~ msgid "Permission" #~ msgstr "Oprávnenia" #~ msgid "Unable to mount device" #~ msgstr "Nepodarilo sa pripojiť zariadenie" #~ msgid "Unable to unmount device" #~ msgstr "Nepodarilo sa odpojiť zariadenie" #~ msgid "Unable to eject device" #~ msgstr "Nepodarilo sa vysunúť zariadenie" #~ msgid "_Mount File System" #~ msgstr "_Pripojiť súborový systém" #~ msgid "_Eject" #~ msgstr "_Vysunúť" #~ msgid "_Unmount File System" #~ msgstr "_Odpojiť súborový systém" #~ msgid "Copy: " #~ msgstr "Skopírovať:" #~ msgid "Delete: " #~ msgstr "Zmazať:" #~ msgid "Change Properties: " #~ msgstr "Zmeniť vlastnosti:" #~ msgid "Moving to Trash..." #~ msgstr "Presúva sa do Koša..." #~ msgid "Cancel the operation?" #~ msgstr "Prerušiť operáciu?" #~ msgid "Please choose a new file name." #~ msgstr "Prosím, vyberte nový názov súboru." #~ msgid "" #~ "\"%s\"\n" #~ "\n" #~ "Destination and source are the same file.\n" #~ "\n" #~ "%s" #~ msgstr "" #~ "„%s“\n" #~ "\n" #~ "Cieľ a zdroj sú rovnaký súbor.\n" #~ "\n" #~ "%s" #~ msgid "Overwrite All" #~ msgstr "Prepísať všetky" #~ msgid "Skip All" #~ msgstr "Preskočiť všetky" #~ msgid "Save Compressed Files to..." #~ msgstr "Uložiť komprimované súbory do..." #~ msgid "Format of compressed File:" #~ msgstr "Formát komprimovaného súboru:" #~ msgid "Creating Compressed File: %s" #~ msgstr "Vytvára sa komprimovaný súbor: %s" #~ msgid "Compress Files" #~ msgstr "Komprimovať súbory" #~ msgid "Extract File to..." #~ msgstr "Rozbaliť súbor do..." #~ msgid "Extracting Files to: %s" #~ msgstr "Rozbaľujú sa súbory do: %s" #~ msgid "" #~ "\n" #~ "Complete!" #~ msgstr "" #~ "\n" #~ "Dokončené!" #~ msgid "Command:" #~ msgstr "Príkaz:" #~ msgid "E_xtract" #~ msgstr "_Rozbaliť" #~ msgid "Open in Terminal" #~ msgstr "Otvoriť v termináli" #~ msgid "_Open with another program" #~ msgstr "_Otvoriť iným programom" #~ msgid "E_xecute" #~ msgstr "_Spustiť" #~ msgid "_Open with \"%s\"" #~ msgstr "_Otvoriť pomocou „%s“" #~ msgid "Really delete selected files?" #~ msgstr "Skutočne zmazať vybrané súbory?" #~ msgid "" #~ "The file name you specified already exists.\n" #~ "Please input a new one:" #~ msgstr "" #~ "Názov súboru ktorý ste zadali už existuje.\n" #~ "Prosím zadajte nový:" #~ msgid "New File" #~ msgstr "Nový súbor" #~ msgid "The new file cannot be created!" #~ msgstr "Nový súbor nemožno vytvoriť!" #~ msgid "Other program..." #~ msgstr "Iný program..." #~ msgid "Calculating..." #~ msgstr "Počíta sa..." #~ msgid "Invalid User" #~ msgstr "Neplatný používateľ" #~ msgid "Invalid Group" #~ msgstr "Neplatná skupina" #~ msgid "New Item" #~ msgstr "Nová položka" #~ msgid "Edit Bookmarks" #~ msgstr "Upraviť záložky" #~ msgid "Path" #~ msgstr "Cesta" #~ msgid "Use drag & drop to sort the items" #~ msgstr "Na zoradenie položiek použite Ťahaj & pusť" #~ msgid "Command not found" #~ msgstr "Príkaz nenájdený" #~ msgid "Destination directory \"%1$s\" is contained in source \"%2$s\"" #~ msgstr "Cieľový adresár „%1$s“ je podadresárom zdrojového „%2$s“" #~ msgid "CD-ROM" #~ msgstr "CD-ROM" #~ msgid "CD-R" #~ msgstr "CD-R" #~ msgid "CD-RW" #~ msgstr "CD-RW" #~ msgid "DVD-ROM" #~ msgstr "DVD-ROM" #~ msgid "DVD+R" #~ msgstr "DVD+R" #~ msgid "DVD+RW" #~ msgstr "DVD+RW" #~ msgid "DVD-R" #~ msgstr "DVD-R" #~ msgid "DVD-RW" #~ msgstr "DVD-RW" #~ msgid "DVD-RAM" #~ msgstr "DVD-RAM" #~ msgid "%s/%s Drive" #~ msgstr "%s/%s jednotka" #~ msgid "%s Drive" #~ msgstr "%s jednotka" #~ msgid "Floppy Drive" #~ msgstr "Disketová jednotka" #~ msgid "Memory Stick Drive" #~ msgstr "Jednotka Memory Stick" #~ msgid "Smart Media Drive" #~ msgstr "Jednotka Smart Media" #~ msgid "SD/MMC Drive" #~ msgstr "Jednotka SD/MMC" #~ msgid "Zip Drive" #~ msgstr "Jednotka Zip" #~ msgid "Jaz Drive" #~ msgstr "Jednotka Jaz" #~ msgid "Pen Drive" #~ msgstr "Jednotka Pen" #~ msgid "%s %s Music Player" #~ msgstr "Hudobný prehrávač %s %s" #~ msgid "%s %s Digital Camera" #~ msgstr "Digitálny fotoaparát %s %s" #~ msgid "Drive" #~ msgstr "Jednotka" #~ msgid "Volume" #~ msgstr "Zväzok" #~ msgid "Failed to connect to the HAL daemon: %s" #~ msgstr "Nepodarilo sa pripojiť k HAL démonu: %s" #~ msgid "Given device \"%s\" is not a volume or drive" #~ msgstr "Zadané zariadenie „%s“ nie je zväzok ani jednotka" #~ msgid "Device \"%s\" not found in file system device table" #~ msgstr "Zariadenie „%s“ nebolo nájdené v tabuľke súborových systémov" #~ msgid "You are not privileged to mount the volume \"%s\"" #~ msgstr "Nemáte oprávnenie pripojiť zväzok „%s“" #~ msgid "You are not privileged to unmount the volume \"%s\"" #~ msgstr "Nemáte oprávnenie odpojiť zväzok „%s“" #~ msgid "You are not privileged to eject the volume \"%s\"" #~ msgstr "Nemáte oprávnenie vysunúť zväzok „%s“" #~ msgid "Invalid mount option when attempting to mount the volume \"%s\"" #~ msgstr "Zadaná neplatná voľba počas pokusu pripojiť zväzok „%s“" #~ msgid "" #~ "The volume \"%s\" uses the %s file system which is not supported " #~ "by your system" #~ msgstr "" #~ "Zväzok „%s“ používa súborový systém %s, ktorý váš systém " #~ "nepodporuje" #~ msgid "An application is preventing the volume \"%s\" from being unmounted" #~ msgstr "Aplikácia bráni odpojeniu zväzku „%s“" #~ msgid "Error %s" #~ msgstr "Chyba %s" #~ msgid "The volume \"%s\" was probably mounted manually on the command line" #~ msgstr "Zväzok „%s“ bol pravdepodobne pripojený ručne z príkazového riadka" #~ msgid "" #~ "Blank discs cannot be mounted, use a CD recording application to record " #~ "audio or data on the disc" #~ msgstr "" #~ "Prázdne disky nemožno pripojiť. Na nahranie údajov na disk použite " #~ "aplikáciu na napaľovanie diskov." #~ msgid "" #~ "Audio CDs cannot be mounted, use music players to play the audio tracks" #~ msgstr "" #~ "Zvukové disky nemožno pripojiť. Na prehranie zvukových stôp použite " #~ "prehrávač hudby." #~ msgid "_Icons" #~ msgstr "_Ikony" #~ msgid "Open Containing _Folder" #~ msgstr "Otvoriť nadradený _priečinok" #~ msgid "All Local Disk Partitions" #~ msgstr "Všetky lokálne diskové oblasti" libfm-1.4.0/po/sl.po000066400000000000000000001430621475513661000142170ustar00rootroot00000000000000# Slovenian translation of libfm. # Copyright (C) 2011 - 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the libfm package. # Klemen Košir , 2011 - 2013. msgid "" msgstr "" "Project-Id-Version: libfm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2014-08-31 18:44+0000\n" "Last-Translator: Klemen Košir \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1409510665.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Prednostni programi" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Izberite programe, ki se zaženejo, ko pritisnite na spletno povezavo ali " "naslov elektronske pošte" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Urejevalnik bližnjic" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Ustvarite novo ali spremenite obstoječo datoteko namizja" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Izberite program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Za odpiranje datotek te vrste bo uporabljen izbrani program." #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Nameščeni programi" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Ukaz:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Brskaj ..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Izvedi v terminalu" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Obdrži okno terminala po zagonu ukaza odprto" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "V ukazni vrstici lahko uporabite naslednje kode:\n" " %f: predstavlja ime datoteke\n" " %F: predstavlja več imen datotek\n" " %u: predstavlja URI datoteke\n" " %U: predstavlja več URI-jev" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Ime programa" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Za odpiranje datotek te vrste bo uporabljen ukaz po meri." #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Ukaz po _meri" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Nastavi izbrani program kot _privzeto dejanje za datoteke te vrste" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Potrdite zamenjavo datoteke" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Pre_skoči" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "P_reimenuj" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Prepiši" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Datoteka s tem imenom že obstaja.\n" "\n" "Ali želite zamenjati obstoječo datoteko" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "z naslednjo datoteko?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Ime _datoteke:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Uporabi to možnost za _vse obstoječe datoteke" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Izberite ikono" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "sistemske ikone" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "slike" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Izberite ikono:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Izvedi datoteko" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Izvedi v _terminalu" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Lastnosti datoteke" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikona datoteke v pogledu map" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Ime:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Mesto:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Ciljna datoteka:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Vrsta datoteke:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Odpri _z:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Izberite program, s katerim želite odpreti datoteke te vrste " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Skupno število datotek:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Skupna velikost:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Velikost na disku:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Zadnja sprememba:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Zadnji dostop:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Zadnja sprememba dovoljenj:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Splošno" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Lastnik:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Skupina:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Branje:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Pisanje:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Izvajanje:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Posebni biti:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Kdo lahko bere vsebino datoteke/mape" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Kdo lahko spreminja vsebino datoteke/mape" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Kdo lahko izvede datoteko oz. odpre mapo" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Posebne zastavice za izvajanje datoteke" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Posebne zastavice za dostop do mape" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Dostop" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skrita datoteka" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Dovoljenja" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Brez" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Lepljivo" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Nastavi GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Nastavi GID in lepljivost" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Nastavi UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Nastavi UID in GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Samo lastnik" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Samo lastnik in skupina" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Kdorkoli" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Nihče" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bajtov" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Izberite datum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "S koledarja izberite datum" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Iskanje datotek" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Vzorci _imen datotek:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Vzored mora biti sestavljen iz seznama vzorcev lupone POSIX (kot ločilnik " "uporabite podčrtaj) ali regularnih izrazov POSIX." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Ne razlikuj _velikosti črk" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Uporabi logični izraz" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "_Mesta iskanja:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Išči po podmapah" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Najdi _skrite datoteke" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Ime/_mesto" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Vrsta datoteke" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Išči le naslednje vrste datotek:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_Besedilne datoteke" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Slike" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Zvočne datoteke" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video datoteke" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenti" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Map_e" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Dru_go:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Tukaj lahko vnesete katerokoli veljavno vrsto vsebine. Na koncu vrste je " "dovoljena uporaba nadomestnega znaka *. Vrste vsebine je potrebno ločiti s " "podpičjem." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Vrsta datoteke" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "_Vsebina datoteke:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Vse_bina" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Velikost datoteke" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Manjše kot:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Večje kot:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Zadnja sprememba:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Brez)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Starejše kot:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Novejše kot:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Lastnosti" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Spletni brskalnik" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Prednostni spletni brskalnik bo uporabljen za odpiranje povezav." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Poštni odjemalec" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Prednostni poštni odjemalec bo uporabljen za sestavljanje elektronske pošte, " "ko kliknete na elektronski naslov." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminal" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Ukazna vrstica:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Sistemski programi" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Datotečne povezave" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "V:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Pripravljanje ..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Ciljna datoteka:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Preostali čas:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Pojavile so se napake:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Prazna datoteka" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Neveljaven cilj" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Dejanje ni podprto" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Neveljavna datoteka namizja: »%s«" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Vrste vsebine datoteke »%s« za zagon ni mogoče določiti" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Za URI %s:// ni nastavljenega privzetega programa" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Delovne mape ni mogoče spremeniti v »%s«: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Za vrsto MIME %s ni nastavljenega privzetega programa" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Naprave" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Omrežje" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Smeti" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "bližnjica do URI-ja" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: neveljaven argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "V nastavitvah ni nastavljenega terminala" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Neveljaven opis programa za ustvaritev predoglednih sličic" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bajtov" msgstr[1] "%u bajt" msgstr[2] "%u bajta" msgstr[3] "%u bajti" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Podpot »%s« naslova URI vsebuje neveljavne ubežne znake" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Ročnik oznake <%s> že obstaja" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "»%-.*s« ni mogoče razčleniti, kar bi moralo biti številka znotraj sklica " "znaka (na primer ê). Mogoče je številka prevelika." #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Sklic znaka ni zaključena s podpičjem. Najverjetneje ste uporabili znak '&' " "brez povezave z entiteto. Znak '&' mora biti zapisan kot '&'" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Sklic znaka »%-.*s« ne kodira dovoljenega znaka." #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Najdena je bila prazna entiteta »&;«. Dovoljene entitete so: & " " "< > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Ime entitete »%-.*s« je neznano" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entiteta ni zaključena s podpičjem. Najverjetneje ste uporabili znak '&' " "brez povezave z entiteto. Znak '&' mora biti zapisan kot '&'" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "V končni oznaki presledek ni dovoljen" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Element »%s« je bil zaprt, vendar ni bil odprt" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Namesto elementa »%2$s« je bil zaprt element »%1$s«" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Začetek vrednosti atributa vsebuje neveljaven znak '%c'" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Konec vrednosti atributa vsebuje neveljaven znak '%c' (pričakuje se '%c')." #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokument se je nepričakovano končal" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument je prazen ali pa vsebuje le presledne znake" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: napaka podatkov XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Po meri" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Izvedljive datoteke" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Izberite program, s katerim želite odpreti datoteke vrste »%s«" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Nameščeni programi" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Nalaganje ..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Pokaže drevo map v stranskem pladnju" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Prekliči" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Kopiraj _sem" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "Premakni s_em" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Poveži sem" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "Opravilo XDirectSave ni uspelo." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Odpri" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Odpri _z ..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Odpri _z" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopiraj po_ti" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "_Skrij" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "P_okaži" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Dodaj med zaznamke" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "P_reimenuj …" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Stisni ..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Razširi s_em" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_Razširi v ..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Lastnosti" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Premakni v _smeti" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Vaši zaznamki že vsebujejo zaznamek za to mapo." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Slike" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bajtov" msgstr[1] "bajt" msgstr[2] "bajta" msgstr[3] "bajti" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "Preiskovanje … %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Vnesite veljavno uporabniško ime ali ID." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Vnesite veljavno ime skupine ali ID." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Ali želite rekurzivno uveljaviti te spremembe na vseh datotekah in podmapah?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Skrij ali pokaži datoteko" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Ta datoteka je skrita, ker se njeno ime začne s piko ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Če se ime datoteke začne s piko ('.'), je datoteka skrita. Pritisnite , če želite videti skrite datoteke." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "Preiskovanje ..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Dostop:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Različne vrste datotek" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Datoteka:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Več datotek" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Ime" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Opis" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Velikost" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Dovoljenja" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Lastnik" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Datum spremembe" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Mesto" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Pripona" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Ustvari _novo ..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Mapa" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Prazna datoteka" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Obrni izbor" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Razvrsti datoteke" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Preimenuj mapo ..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Lastnosti _mape" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Pokaži _skrite" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Pome_šaj datoteke in mape" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Pre_zri velikost črk v imenu" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Po _imenu" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Po _času zadnje spremembe" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Po _velikosti" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Po vrsti _datoteke" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Vnesite ime nove mape:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Ustvarjanje nove mape" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Vnesite ime nove datoteke:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Ustvarjanje ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nova" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Vnesite ime nove %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Ustvarjanje %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Zaženi privzeti program, ko se datoteka ustvari" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Besedilna datoteka »%s« je izvedljivi skript.\n" "Kaj želite storiti?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Datoteka »%s« je izvedljiva. Ali jo želite izvesti?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Prosimo, določite mape." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Izberite mapo" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Napaka" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Potrditev" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Vprašanje" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "To dejanje lahko izvedejo le skrbniki sistema." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Ali želite premakniti datoteko »%s« v smeti?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Ali želite premakniti %d izbranih datotek v smeti?" msgstr[1] "Ali želite premakniti %d izbrano datoteko v smeti?" msgstr[2] "Ali želite premakniti %d izbrani datoteki v smeti?" msgstr[3] "Ali želite premakniti %d izbrane datoteke v smeti?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Ali želite izbrisati datoteko »%s«?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Ali želite izbrisati %d izbranih datotek?" msgstr[1] "Ali želite izbrisati %d izbrano datoteko?" msgstr[2] "Ali želite izbrisati %d izbrani datoteki?" msgstr[3] "Ali želite izbrisati %d izbrane datoteke?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Preimenuj datoteko" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Vnesite novo ime:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Ali ste prepričani, da želite izprazniti smeti?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Prilepi in po_jdi" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Naslovna vrstica" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Domača mapa" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Namizje" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programi" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Koren datotečnega sistema" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Priklopi nosilec" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Odklopi nosilec" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Izvrzi odstranljiv nosilec" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatiraj nosilec" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Preimenuj zaznamek" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Odstrani zaznamek" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Premakni zaznamek navz_gor" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Premakni zaznamek navz_dol" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Izprazni _smeti" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Pokaže seznam mest, naprav in zaznamkov v stranskem pladnju" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Preimenuj zaznamek" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Vnesite novo ime:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Vrsta: %s\n" "Velikost: %s\n" "Datum spremembe: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Vrsta: %s\n" "Datum spremembe: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "" "Preden je bilo opravilo datoteke zaustavljeno, je prišlo do napake." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Preklicano" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Opravilo datoteke se je končalo z napakami." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Končano" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Nekaterih datotek ni mogoče premakniti v smeti, ker datotečni sistem tega " "dejanja ne podpira.\n" "Ali želite namesto tega datoteke izbrisati?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Premor" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Nadaljuj" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Premikanje" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopiranje" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Brisanje" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Dokončno brisanje" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Ustvarjanje povezave" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "V:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Ustvarjanje povezav do datotek" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Spreminjanje atributov" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Spreminjanje atributov datotek" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Obnavljanje" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s datotek" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Poteka opravilo datoteke …" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s datoteke:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s datotek:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Izključi" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Mesta" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Drevo _map" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Oddaljeno" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Mesta" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Drevo map" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Pogled vsebine mape" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Skrij %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Premakni _levo" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Premakni _desno" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Pokaži %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "Pozabi _širino" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikone" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Strnjen seznam" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Predogledne sličice" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Po_droben seznam" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Spremeni dejavni zavihek" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Mapa »%s« ni veljavna" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Do ciljne datoteke ni mogoče dostopiti" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Povezave na tujem datotečnem sistemu ni mogoče ustvariti" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Datoteke »%s« ni mogoče obnoviti: izvirna pot je neznana" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Izvorna in ciljna mapa sta enaki." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Mape ni mogoče premakniti v lastno podmapo." #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Mape ni mogoče kopirati v lastno podmapo." #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Cilj je podmapa izvorne mape." #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Datoteke »%s« ni mogoče kopirati: dejanje ni podprto" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Prikazno ime lahko nastavite le za posamezno datoteko" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Cilj lahko nastavite le za posamezno datoteko" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Napaka v datoteki XML »%s« (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "Datoteka XML ne vsebuje korena »Applications«" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Določila XML za »%s« ni mogoče ustvariti" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Pot menija »%s« že obstaja" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Napaka predpomnilnika menija" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Neveljavna mapa menija" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Ime predmeta menija ne sme biti prazno" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Neveljavna mapa menija: »%s«" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Neveljaven predmet menija" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Predmet menija »%s« nima ustrezne datoteke namizja" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Skrivanje mape menija ni podprto" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Nastavljanje atributa »%s« ni podprto" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Neveljavna vrednost atributa »%s«" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "»%s« je mapa menija" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "»%s« ni predmet menija" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Datoteka namizja »%s« je pokvarjena" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Predmeta menija »%s« ni mogoče ustvariti" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Ime mape menija se ne sme končati z ».desktop«" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Neveljavno dejanje s korenom menija" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Neveljaven cilj" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: mape »%s« ni mogoče najti v predpomnilniku menija" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Iskanje" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Rezultati iskanja" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Izberite izvedljivo datoteko" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Ukaz:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Ukaz, ki naj se izvede, ko je kliknjena ikona programa" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Opis:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Splošno ime programa" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Delovna mapa:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Delovna mapa, v kateri bo zagnan program" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Orodni _namig:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Orodni namig" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Uporabi obvestilo o _zagonu" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Datoteka _namizja" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Obnovi" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Obnovi datoteke v smeteh na izvirno mesto" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "ime datoteke vira ali ID namizja" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "VIR" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "ime izhodne datoteke" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "REZULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Disk CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Prazen disk CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Disk CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Prazen disk CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Disk CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Prazen disk CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Prazen disk DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Disk DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Prazen disk DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Disk DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Prazen disk DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Disk DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Prazen disk DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Disk DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Prazen disk DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Disk DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Prazen disk DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Disk DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Prazen disk DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Disk Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Prazen disk Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Disk Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Prazen disk Blu-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Disk Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Prazen disk Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Disk HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Prazen disk HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Disk HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Prazen disk HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Disk HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Prazen disk HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Disk MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Prazen disk MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Disk MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Prazen disk MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Disk MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Prazen disk MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Zvočne datoteke" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Prazen optični disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optični disk" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Vrsta datoteke:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Obdelovanje:" #~ msgid "Progress:" #~ msgstr "Napredek:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Dejanje je končano, vendar so se pojavile napake." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Ustvarjanje simbolnih povezav" #~ msgid "_Browse" #~ msgstr "_Brskaj" #~ msgid "My Computer" #~ msgstr "Moj računalnik" #~ msgid "_Move" #~ msgstr "Pre_makni" #~ msgid "_Trash" #~ msgstr "Sme_ti" #~ msgid "_Only for this folder" #~ msgstr "Samo za _to mapo" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Zapomni si način razvrstitve datotek le za to mapo" #~ msgid "Please select a folder" #~ msgstr "Izberite mapo" #~ msgid "Entry for folder path" #~ msgstr "Pot do mape" #~ msgid "Computer" #~ msgstr "Računalnik" #~ msgid "Network Drives" #~ msgstr "Omrežni diski" #~ msgid "_Run in terminal emulator" #~ msgstr "_Zaženi v terminalu" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Obdrži okno terminala po zagonu programa odprto" #~ msgid "Mount Point" #~ msgstr "Priklopna točka" #~ msgid "Create _Symlink" #~ msgstr "Ustvari sim_bolno povezavo" #~ msgid "Se_nd To" #~ msgstr "_Pošlji" #~ msgid "Empty tag" #~ msgstr "Oznaka je prazna" #~ msgid "Tag should have exactly one child" #~ msgstr "Oznaka ima lahko samo eno podrejeno oznako" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Oznaka lahko vsebuje samo oznake , , ali " #~ "" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Najdena je bila oznaka <%s>. Vrhnja oznaka datoteke je lahko le ." #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Oznake <%s> ni bilo mogoče vstaviti" #~ msgid "Invalid tag" #~ msgstr "Neveljavna oznaka " #~ msgid "Invalid tag" #~ msgstr "Neveljavna oznaka " #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Poti \"%s\" ni mogoče najti v določilih XML" #~ msgid "Category manipulation internal error" #~ msgstr "Notranja napaka med obdelavo kategorije" libfm-1.4.0/po/sr.po000066400000000000000000001627451475513661000142360ustar00rootroot00000000000000# Serbian translation for Libfm package # Copyright (C) 2010 the LXDE team # This file is distributed under the same license as the Libfm package. # Jay A. Fleming , 2010-2013. # # msgid "" msgstr "" "Project-Id-Version: Libfm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-12-23 18:05+0000\n" "Last-Translator: markos \n" "Language-Team: \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1545588324.285562\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Подразумевани програми" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "Одаберите програме покренуте кликом на веб везе или адресу е-поште" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Уредник пречица" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Створите нову или мењајте постојећу датотеку радне површи" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Одаберите програм" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "За отварање датотека употребићу одабрани програм" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Постојећи програми" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Наредба за п_окретање:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Разгледај..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Покрени у _емулатору терминала" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "По извршеној наредби за_држи прозор терминала" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Наредби можете да придружите и специјалне променљиве:\n" " %f: Путања до датотеке\n" " %F: Путање до датотека\n" " %u: Путања до локације (URI)\n" " %U: Путање до локација (URIs)" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Назив прогр_ама (опционо, поставите га да задржите придружено)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Покрени произвољну наредбу за отварање датотека" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Произ_вољна наредба" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Увек отварај ову врсту датотека одабраним програмом" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Потврдите преписивање датотека" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Пре_скочи" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "П_реименуј" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Препиши" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Датотека са истим називом већ постоји на овој локацији.\n" "\n" "Желите ли да замените постојећу датотеку" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "са следећом датотеком?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Назив датотеке:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Примени ово подешавање на _све постојеће датотеке" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Изаберите икону..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "системске теме икона" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "графичких датотека" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Одабери икону из:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Покрени датотеку" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Покрени у емулатору _терминала" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Особине датотеке" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Икона датотеке у прегледу директоријума" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Назив:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Место:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Одредишна датотека:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Врста датотеке:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Отвори по_моћу:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Изаберите програм за отварање датотека ове врсте " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Величина (укупно):" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Величина (укупно):" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Заузет простор:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Последњи пут измењено:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Последњи приступ:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Последња измена дозвола:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "Оп_ште" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Власник:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Група:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Преглед _садржаја:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Мењање садржаја:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Изврши:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Посебни битови:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Ко може читати садржај датотеке/директоријума" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Ко може мењати садржај датотеке/директоријума" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Ко може покренути датотеку или приступити директоријуму" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Посебне дозволе при покретању датотеке" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Посебне дозволе код приступа директоријуму" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Контрола приступа" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Скривена датотека" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Дозволе" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ништа" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Лепљиво" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Постави ГИД" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Лепљиво и постави ГИД" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Постави УИД" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Постави УИД и ГИД" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Само власник" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Само власник и чланови групе" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Сви" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Нико" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Бајтова" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "КБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Одаберите датум" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Одаберите датум из следећег календара" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Нађи датотеке" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Предлошци наз_ива датотеке:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Образац може бити POSIX образац листе (са ',' као размаком) или POSIX " "регуларни израз." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Занемари _величину слова" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Користи рег_уларан израз" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Пре_тражи места:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Претражи у под_директоријумима" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Претражи _скривене датотеке" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Назив/_Место" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Врста датотеке" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Претражи само датотеке следећих врста:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Те_кстуалне датотеке" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Гра_фичке датотеке" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Звучне датотеке" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Видео датотеке" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Документа" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Директор_ијуми" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Др_уго:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Било који исправан садржај може бити унет овде. Џокер '*' је дозвољен на " "крају. Више врста одвајајте са ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Врста датотеке" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Датотека _садржи:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Садржај" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Величина датотеке" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Мање од:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Више од:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Последњи пут измењено" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ништа)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Раниј_е од:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Касније од:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Особине" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Прегледник веба" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Посећуј е-адресе помоћу подразумеваног веб-прегледника." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Програм за е-пошту" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Када кликнете на адресе е-поште подразумевани програм за е-пошту ће се " "користити за писање е-писама." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Емулатор терминала" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Наредба:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Системски програми" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Придруживања датотека" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "У место: " #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Припрема..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Отпремљени подаци:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Преостало време:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Догодиле су се неке грешке:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Празна вредност" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Неисправан одабир" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Ова радња није подржана" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Датотека радне површи није ваљана: „%s“" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Не могу да одредим врсту садржаја датотеке „%s“ да бих је покренуо" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Није постављен подразумевани програм за покретање УРИ-а %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Не могу да поставим радни директоријум у „%s“: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Није постављен подразумевани програм за МИМЕ врсту %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Уређаји" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Мрежа" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Непотребно" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "пречица до УРИ" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: неважећи аргумент" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Нема постављеног емулатора терминала у либфм подешавањима" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Неисправан опис програма за стварање умањених приказа датотека" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "кБ" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u бајт" msgstr[1] "%u бајта" msgstr[2] "%u бајтова" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "КиБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МиБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГиБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТиБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "У путањи до места „%s“ налазе се неважећи, недозвољени знакови" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Удвостручи управљач за ознаку <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Нисам успео да рашчланим „%-.*s“, што је требало да представља цифру унутар " "знаковне референце (нпр. ê) - можда је цифра превелика" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Знаковна референца се не завршава тачка-запетом; највероватније сте " "користили амперсанд без намере да започнете ентитет - назначите амперсанд са " "&" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Знаковна референца „%-.*s“ не представља дозвољени знак" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Уочен празан ентитет '&; '; прихватљиви ентитети су & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Назив ентитета „%-.*s“ није познат" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Ентитет се не завршава тачка-запетом; највероватније сте користили амперсанд " "без намере да започнете ентитет - назначите амперсанд са &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "У завршној ознаци нису дозвољене празнине" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Елеменат „%s“ је затворен али не постоји отворен елеменат" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Неважећи знак „%c“ на почетку вредности атрибута" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Неважећи знак „%c“ на крају вредности атрибута, очекиван је „%c“" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Неочекиван крај документа" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Документ је био празан или је садржавао само празнине" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: Грешка у ИксМЛ подацима" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Прилагоди" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Извршне датотеке" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Одабери програм за отварање \"%s\" датотека" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Доступни програми" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Без подфасцикли>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Учитавање..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Прикажи стабло директоријума у бочном панелу" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "По_ништи" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "У_множи" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Премести лево" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Повежи" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave није успело." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Отвори" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Отвори _помоћу..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Отвори _помоћу" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Умножи пут_ању(е)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Сакр_иј" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Пр_икажи" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Дод_ај у обележиваче" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Преименуј..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Направи _архиву..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Распакуј _овде" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_Распакуј..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Особине" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Премести у Непо_требно" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Овај директоријум је већ у Вашим обележивачима." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Слике" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "бајт" msgstr[1] "бајта" msgstr[2] "бајта" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "учитавање... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Унесите ваљано корисничко име или ИБ." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Унесите ваљан назив групе или ИБ." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Желите ли да рекурзивно применим ову радњу на све датотеке и " "поддиректоријуме?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Сакриј или прикажи ову датотеку" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Ова датотека је скривена јер јој име почиње тачком ('.')." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Датотеке овог система су скривене уколико њихови називи почињу тачком('.'). " "Да би сте их видели или сакрили притисните ." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "учитавање..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Приступ с_адржају:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Датотеке различитих врста" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Датотека:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Вишеструке датотеке" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Назив" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Опис" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Величина" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Дозволе" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Власник" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Измењено" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Место" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Проширења" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Створи _нов..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Директоријум" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Празна датотека" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Обрни _избор" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Сложи датотеке" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Преименуј директоријум..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Особине дир_екторијума" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Прикажи с_кривене" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Помешај _датотеке и директоријуме" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Занемари величину слова у називу" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "По _називу" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "По времену _измене" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "По _величини" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "По _врсти датотеке" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Унесите назив за новостворени директоријум:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Стварање новог директоријума" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Унесите назив празне датотеке:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Стварање ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Нов" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Унесите назив нове(ог) %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Стварање %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Пок_рени подразумевани програм за датотеку после њ. стварања" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Датотека „%s“ је означена као извршна скрипта.\n" "Шта желите да урадите са њом?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Датотека „%s“ је програм. Желите ли да је покренете?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Нису одређени директоријуми." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Изаберите директоријум" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Грешка" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Потврди" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Питање" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Ову радњу може извршити само администратор система." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Да ли желите да преместите датотеку „%s“ у Непотребно?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Да ли желите да преместите %d изабрану датотеку у Непотребно?" msgstr[1] "Да ли желите да преместите %d изабране датотеке у Непотребно?" msgstr[2] "Да ли желите да преместите %d изабраних датотека у Непотребно?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Да ли желите да обришете датотеку '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Да ли желите да обришете %d изабрану датотеку?" msgstr[1] "Да ли желите да обришете %d изабране датотеке?" msgstr[2] "Да ли желите да обришете %d изабраних датотека?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Преименуј датотеку" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Унесите нов назив:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Јесте ли сигурни да желите да испразните Непотребно?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "У_баци и иди" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Трака места директоријума" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Главни директоријум" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Радна површ" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Програми" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Систем датотека" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Прикључи" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Искључи" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Избаци преносиви медиј" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Форматирај партицију" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "П_реименуј обележивач" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Уклони из обележивача" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Помери обележивач на_горе" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Помери обележивач на_доле" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Обриши датотеке из Непотребно" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Прикажи листу уобичајених места, уређаја и обележивача у бочном панелу" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Преименуј обележивач" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Унесите нов назив:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Врста: %s\n" "Величина: %s\n" "Измењено: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Врста: %s\n" "Измењено: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Грешке су се догодиле пре заустављања радње са датотеком." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Поништено" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Радња над датотеком се завршила са грешкама." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Завршено" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Неке датотеке се не могу преместити у Непотребно јер примарни систем " "датотека не подржава ову операцију.\n" " Желите ли да их трајно уклоните?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "За_стани" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "П_родужи" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Премештање датотека" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Умножавање датотека" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Премештање у Непотребно" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Брисање датотека" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Прављење веза" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "У место:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Прављење веза до датотека" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Измена особина датотеке" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Измена особина датотеке" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Поврати" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s датотека" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Радње са датотекама су у току..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s датотека:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s датотека:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "У_гаси" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Места" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Стабло _директоријума" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "У_даљено" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Места" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Стабло директоријума" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Преглед садржаја директоријума" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Сакриј %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Премести улево" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Премести у_десно" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Прикажи %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Заборави ширину" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Модел за преглед _икона" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Модел _збијеног приказа" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Умањени приказ дато_тека" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Прикажи као детаљну _листу" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Мења текући језичак" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Задати директоријум „%s“ није исправан" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Немам приступ одредишној датотеци" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Не могу да створим везу на страном систему датотека" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Не могу да вратим датотеку „%s“ из Непотребно: није позната оригинална путања" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Одредиште не постоји" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Извор и одредиште су исти." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Не може се премештати директоријум у његов поддиректоријум" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Не може се умножавати директоријум у његов поддиректоријум" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Одредиште је поддиректоријум извора" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Не могу да умножим датотеку „%s“: није подржано" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Постављање назива приказа је могуће само за једну датотеку" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Постављање одредишта је могуће само за једну датотеку" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Грешка у ИксМЛ датотеци „%s“ (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "ИксМЛ датотека не садржи програмски корен" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Не могу да створим ИксМЛ дефиницију за '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Већ постоји путања изборника „%s“" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Грешка предмеморије изборника" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Директоријум изборника није ваљан" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Ставка у изборнику не може бити без назива" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Директоријум изборника „%s“ није ваљан" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ставка у изборнику није ваљана" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Ставка изборника „%s“ нема одговарајућу улазну датотеку" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Измена скривеног стања није подржана за директоријум изборника" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Није подржано постављање атрибута „%s“" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Неважећа вредност атрибута „%s“" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "„%s“ је директоријум изборника" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "„%s“ није ставка у изборнику" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Оштећена је улазна датотека „%s“" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Не могу да створим ставку у изборнику „%s“" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Назив директоријума изборника се не завршава са \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Неисправна радња са кореном менија" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Неисправно одредиште" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" "FmMenuVFileMonitor: нисам нашао директоријум '%s' у предмеморији менија" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Пронађи" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Пронађено је" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Изаберите извршну датотеку" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Наредба:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Наредба која се покреће притиском на програмску икону" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "Опи_с:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Општи назив програма" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Радни дире_кторијум:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Радни директоријум из којег ће се овај програм покренути" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Саве_т: " #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Савет за приказ у програму" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Користи обавештења при покретањ_у" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Ставка радне површи" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "По_врати" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Врати датотеке из Непотребног на њ. изворна места" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "назив изворне датотеке или ИБ радне површи" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ИЗВОР" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "назив исходишне датотеке" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "ИСХОД" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "ЦД-РОМ диск" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Празан ЦД-РОМ диск" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "ЦД-Р диск" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Празан ЦД-Р диск" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "ЦД-РВ диск" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Празан ЦД-РВ диск" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "ДВД-РОМ диск" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Празан ДВД-РОМ диск" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "ДВД-РВ диск" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Празан ДВД-РВ диск" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "ДВД-РАМ диск" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Празан ДВД-РАМ диск" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "ДВД+Р диск" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Празан ДВД+Р диск" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "ДВД+РВ диск" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Празан ДВД+РВ диск" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Двослојни ДВД+Р диск" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Празан двослојни ДВД+Р диск" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Двослојни ДВД+РВ диск" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Празан двослојни ДВД+РВ диск" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "БД диск" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Празан БД диск" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "БД-Р диск" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Празан БД-Р диск" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "БД-РВ диск" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Празан БД-РВ диск" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "ХД ДВД диск" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Празан ХД ДВД диск" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "ХД ДВД-Р диск" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Празан ХД ДВД-Р диск" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "ХД ДВД-РВ диск" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Празан ХД ДВД-РВ диск" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "МО диск" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Празан МО диск" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "МРВ диск" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Празан МРВ диск" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "МРВ/В диск" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Празан МРВ/В диск" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Звучне датотеке" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Празан оптички диск" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Оптички диск" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Врста датотеке за отварање:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Радим са: " #~ msgid "Progress:" #~ msgstr "Напредак: " #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Радња над датотеком је завршена, али су се догодиле и неке грешке." #~ msgid "_Browse" #~ msgstr "_Разгледај" #~ msgid "My Computer" #~ msgstr "Рачунар" #~ msgid "_Move" #~ msgstr "Пре_мести" #~ msgid "_Trash" #~ msgstr "Непо_требно" #~ msgid "_Only for this folder" #~ msgstr "Само _за овај директоријум" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Означено, памти распоред за директоријум, а не за све директоријуме" #~ msgid "Please select a folder" #~ msgstr "Изаберите директоријум" #~ msgid "Entry for folder path" #~ msgstr "Унос за путању директоријума" #~ msgid "Computer" #~ msgstr "Рачунар" #~ msgid "Network Drives" #~ msgstr "Мрежни дискови" #~ msgid "_Run in terminal emulator" #~ msgstr "Пок_рени у емулатору терминала" #~ msgid "_Keep terminal window open after run" #~ msgstr "Задржи прозор терминала отвореним после по_кретања" libfm-1.4.0/po/sr@latin.po000066400000000000000000001425121475513661000153540ustar00rootroot00000000000000# Serbian translation for Libfm package # Copyright (C) 2010 the LXDE team # This file is distributed under the same license as the Libfm package. # Jay A. Fleming , 2010-2013. # # msgid "" msgstr "" "Project-Id-Version: Libfm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2014-12-24 14:23+0000\n" "Last-Translator: markos \n" "Language-Team: \n" "Language: sr@latin\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1419431011.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Podrazumevani programi" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "Odaberite aplikacije klikom na veb link ili adresu e-pošte" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Uređivač prečica" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Stvorite novu ili menjajte postojeću datoteku radne površi" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Izaberite program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Koristi izabrani program za otvaranje datoteka" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Postojeći programi" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Naredba za p_okretanje:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Razgledaj..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Pokreni u _emulatoru terminala" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Po izvršenoj naredbi za_drži prozor terminala" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Naredbi možete da pridružite i specijalne promenljive:\n" " %f: Putanja do datoteke\n" " %F: Putanje do datoteka\n" " %u: Putanja do lokacije (URI)\n" " %U: Putanje do lokacija (URIs)" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Naziv progr_ama (opciono, postavite ga da zadržite pridruženo)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Pokreni proizvoljnu naredbu za otvaranje datoteka" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "Proiz_voljna naredba" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Uvek otvaraj ovu vr_stu datoteka odabranim programom" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Potvrdite prepisivanje datoteka" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Pre_skoči" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "P_reimenuj" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Prepiši" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Datoteka sa istim nazivom već postoji na ovoj lokaciji.\n" "\n" "Želite li da zamenite postojeću datoteku" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "sa sledećom datotekom?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "Naz_iv datoteke:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Primeni ovo podešavanje na _sve postojeće datoteke" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Izaberite ikonu..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "sistemske teme ikona" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "grafičkih datoteka" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Odaberi ikonu iz:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Pokreni datoteku" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Pokreni u emulatoru _terminala" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Osobine datoteke" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikona datoteke u pregledu direktorijuma" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Naziv:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Putanja:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Odredišna datoteka:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Vrsta datoteke:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Otvori po_moću:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Izaberite program za otvaranje datoteka ove vrste" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Veličina (ukupno):" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Veličina (ukupno):" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Zauzet prostor:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Poslednji put izmenjeno:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Poslednji pristup:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Poslednja izmena dozvola:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "Op_šte" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Vlasnik:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Grupa:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Pregled _sadržaja:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Menjanje sadržaja:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Izvrši:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Posebni bitovi:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Ko može čitati sadržaj datoteke/direktorijuma" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Ko može menjati sadržaj datoteke/direktorijuma" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Ko može pokrenuti datoteku ili pristupiti direktorijumu" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Posebne dozvole pri pokretanju datoteke" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Posebne dozvole kod pristupa direktorijumu" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Kontrola pristupa" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Skrivena datoteka" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Dozvole" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ništa" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Lepljivo" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Postavi GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Lepljivo i postavi GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Postavi UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Postavi UID i GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Samo vlasnik" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Samo vlasnik i članovi grupe" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Svi" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Niko" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bajtova" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Odaberite datum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Odaberite datum iz sledećeg kalendara" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Nađi datoteke" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Predlošci naz_iva datoteke:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Obrazac može biti POSIX obrazac liste (sa ',' kao razmakom) ili POSIX " "regularni izraz." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Zanemari _veličinu slova" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Koristi reg_ularan izraz" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Pretraži mesta:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Pretraži u pod_direktorijumima" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Pretraži _skrivene datoteke" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Naziv/_Lokacija" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Vrsta datoteke" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Pretraži samo datoteke sledećih vrsta:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_kstualne datoteke" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Gra_fičke datoteke" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Zvučne datoteke" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video datoteke" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokumenta" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Direk_torijumi" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "Dr_ugo:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Bilo koji ispravan sadržaj može biti unet ovde. Džoker '*' je dozvoljen na " "kraju. Više vrsta treba odvojiti sa ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Vrsta datoteke" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Datoteka _sadrži:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Sadržaj" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Veličina datoteke" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Manje od:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Više od:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Poslednji put izmenjeno" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ništa)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Ranij_e od:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Kasnije od:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Osobine" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Preglednik veba" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Za otvaranje internet adresa koristiće se podrazumevani Preglednik veba." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Program za e-poštu " #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Kada kliknete na adrese e-pošte podrazumevani program za e-poštu će se " "koristiti za pisanje e-pisama." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Emulator terminala" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Naredba:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Sistemski programi" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Pridruživanja datoteka" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "U mesto: " #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Priprema..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Odredišna datoteka:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Preostalo vreme: " #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Dogodile su se neke greške:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Prazna datoteka" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Neispravno odredište" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Ova radnja nije podržana" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Neispravna datoteka radne površi: „%s“" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Ne mogu da odredim vrstu sadržaja datoteke „%s“ da bih je pokrenuo" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" "Nije postavljen podrazumevani program za pokretanje lokacija („URIs“) %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Ne mogu da postavim radni direktorijum u „%s“: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Nije postavljen podrazumevani program za MIME vrstu %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Uređaji" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Mreža" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Nepotrebno" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "prečica do lokacije („URI“)" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: nevažeći argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Nema postavljenog emulatora terminala u libfm podešavanjima" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Neispravan opis programa za stvaranje umanjenih prikaza datoteka" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "KB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bajt" msgstr[1] "%u bajta" msgstr[2] "%u bajtova" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "U putanji do lokacije „%s“ nalaze se nevažeći, nedozvoljeni znakovi" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Dupliraj upravljač za oznaku <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Nisam uspeo da raščlanim „%-.*s“, što je trebalo da predstavlja cifru unutar " "znakovne reference (npr. ê) — možda je cifra prevelika" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Znakovna referenca se ne završava tačka-zapetom; najverovatnije ste " "koristili ampersand bez namere da započnete entitet — naznačite ampersand sa " "&" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Znakovna referenca „%-.*s“ ne predstavlja dozvoljeni znak" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Uočen prazan entitet „&;“; prihvatljivi entiteti su & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Naziv entiteta „%-.*s“ nije poznat" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entitet se ne završava tačka-zapetom; najverovatnije ste koristili ampersand " "bez namere da započnete entitet — naznačite ampersand sa &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "U završnoj oznaci nisu dozvoljene praznine" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elemenat „%s“ je zatvoren ali ne postoji otvoren elemenat" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Elemenat „%s“ je zatvoren ali je trenutno otvoren elemenat „%s“" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Nevažeći znak „%c“ na početku vrednosti atributa" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Nevažeći znak „%c“ na kraju vrednosti atributa (očekivan je „%c “)" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Neočekivan kraj dokumenta" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokument je bio prazan ili je sadržavao samo praznine" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: Greška u IksML podacima" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Prilagodi" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Izvršne datoteke" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Koristi izabrani program za otvaranje \"%s\" datoteka" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Dostupni programi" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Učitavanje..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Prikaži stablo direktorijuma u bočnom panelu" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "Po_ništi" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Umnoži" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "Premesti _levo" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Poveži" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "„XDirectSave“ nije uspelo." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Otvori" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Otvori _pomoću..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "Otvori _pomoću" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Kopiraj puta_nju(e)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Sakr_ij" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Pr_ikaži" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Dod_aj u obeleživače" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "P_reimenuj..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Napravi _arhivu..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Raspakuj _ovde" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "_Raspakuj..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Osobine" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Ubaci u _kantu" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Vaše zabeleške već imaju ovaj direktorijum." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Grafičke datoteke" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bajt" msgstr[1] "bajta" msgstr[2] "bajta" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "učitavanje... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Unesite ispravno korisničko ime ili IB." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Unesite ispravno ime grupe ili IB." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Želite li da rekurzivno primenim ovu radnju na sve datoteke i " "poddirektorijume?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Sakrij ili prikaži ovu datoteku" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Ova datoteka je skrivena jer joj ime počinje tačkom." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Datoteke ovog sistema su skrivene ukoliko njihovi nazivi počinju tačkom. Da " "bi ste ih videli ili sakrili pritisnite ." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "učitavanje..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Pristup s_adržaju:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Datoteke različitih vrsta" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Datoteka:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Višestruke datoteke" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Naziv" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Opis" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Veličina" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Dozvole" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Vlasnik" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Izmenjeno" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Lokacija" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Proširenja" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Stvori _nov..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Direktorijum" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Prazna datoteka" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Obrni _izbor" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Složi datoteke" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "Preimenuj di_rektorijum..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Osobine dir_ektorijuma" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Prikaži s_krivene" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Pomešaj _datoteke i direktorijume" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Zanemari vel_ičinu slova u nazivu" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Po _nazivu" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Po vremenu _izmene" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Po _veličini" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Po _vrsti datoteke" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Unesite naziv za novostvoreni direktorijum:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Stvaranje novog direktorijuma" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Unesite naziv prazne datoteke:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Stvaranje..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Nov" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Unesite naziv nove(og) %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Stvaranje %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Pok_reni podrazumevani program za datoteku posle nj. stvaranja" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Datoteka „%s“ je označena kao izvršna skripta.\n" "Šta želite da uradite sa njom?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Datoteka „%s“ je program. Želite li da je pokrenete?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Nisu određeni direktorijumi." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Izaberite direktorijum" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Greška" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Potvrdi" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Pitanje" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Ovu radnju može izvršiti samo administrator sistema." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Da li želite da premestite datoteku „%s“ u Nepotrebno?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Da li želite da premestite %d izabranu datoteku u Nepotrebno?" msgstr[1] "Da li želite da premestite %d izabrane datoteke u Nepotrebno?" msgstr[2] "Da li želite da premestite %d izabranih datoteka u Nepotrebno?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Da li želite da obrišete datoteku „%s“?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Da li želite da obrišete %d izabranu datoteku?" msgstr[1] "Da li želite da obrišete %d izabrane datoteke?" msgstr[2] "Da li želite da obrišete %d izabranih datoteka?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Preimenuj datoteku" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Unesite nov naziv: " #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Jeste li sigurni da želite da ispraznite Nepotrebno?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "U_baci i idi" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Lokacioni bar direktorijuma" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Glavni direktorijum" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Radna površ" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Programi" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Sistem datoteka" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Priključi" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Isključi" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Izbaci prenosivi medij" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatiraj particiju" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "P_reimenuj obeleživač" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Ukloni iz obeleženog" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Pomeri obeleživač na_gore" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Pomeri obeleživač na_dole" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Obriši datoteke iz Nepotrebno" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Prikaži listu uobičajenih mesta, uređaja i obeleživača u bočnom panelu" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Preimenuj obeleživač" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Unesite nov naziv: " #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Vrsta: %s\n" "Veličina: %s\n" "Izmenjeno: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Vrsta: %s\n" "Izmenjeno: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Greške su se dogodile pre zaustavljanja radnje sa datotekom." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Poništeno" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Radnja nad datotekom je poništena. Dogodile su se neke greške." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Završeno" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Neke datoteke se ne mogu premestiti u Nepotrebno jer primarni sistem " "datoteka ne podržava\n" " ovu operaciju. Želite li da ih trajno uklonite?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "Za_stani" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "P_roduži" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Premeštanje datoteka" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Umnožavanje datoteka" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Premeštanje u Nepotrebno" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Brisanje datoteka" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Pravljenje mekih veza" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "U mesto: " #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Pravljenje mekih veza" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Izmena osobina datoteke" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Izmena osobina datoteke" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Povrati" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s datoteka" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Radnje sa datotekama su u toku..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s datoteka:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s datoteka:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "U_gasi" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Mesta" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "Stablo _direktorijuma" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "U_daljeno" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Mesta" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Stablo direktorijuma" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Pregled sadržaja direktorijuma" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Sakrij %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Premesti _levo" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Premesti _desno" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Prikaži %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "Zaboravi _širinu" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "Model za pregled _ikona" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "Model _zbijenog prikaza" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Umanjeni prikaz dato_teka" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Prikaži kao detaljnu _listu" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Menja tekući jezičak" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Zadati direktorijum „%s“ nije ispravan" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Nemam pristup odredišnoj datoteci" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Ne mogu da stvorim vezu na stranom sistemu datoteka" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "Ne mogu da vratim datoteku „%s“ iz Nepotrebno: nije poznata originalna " "putanja" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Izvor i odredište su isti." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Ne može se premeštati direktorijum u njegov poddirektorijum" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Ne može se umnožavati direktorijum u njegov poddirektorijum" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Odredište je poddirektorijum izvora" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Ne mogu da umnožim datoteku „%s“: nije podržano" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Postavljanje naziva prikaza je moguće samo za jednu datoteku" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Postavljanje odredišta je moguće samo za jednu datoteku" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Greška u IksML datoteci „%s“ (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "IksML datoteka ne sadrži programski koren" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Ne mogu da stvorim IksML definiciju za „%s“" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Već postoji putanja menija „%s“" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Greška predmemorije menija" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Direktorijum menija nije ispravan" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Stavka menija ne može biti bez naziva" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Direktorijum menija „%s“ nije ispravan" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Stavka menija nije ispravna" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Stavka menija „%s“ nema odgovarajuću ulaznu datoteku" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Izmena skrivenog stanja nije podržana za direktorijum menija" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Nije podržano postavljanje atributa „%s“ " #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Nevažeća vrednost atributa „%s“" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "„%s“ je direktorijum menija" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "„%s“ nije stavka menija" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Oštećena je ulazna datoteka „%s“" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Ne mogu da stvorim stavku menija „%s“" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Naziv direktorijuma menija se ne završava sa „.desktop“" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Neispravna radnja sa korenom menija" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Neispravno odredište" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" "FmMenuVFileMonitor: nisam našao direktorijum „%s“ u predmemoriji menija" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Pronađi" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Pronađeno je" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Izaberite izvršnu datoteku" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Naredba:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Naredba koja se pokreće pritiskom na programsku ikonu" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "Opi_s:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Generički naziv programa" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "Radni dire_ktorijum:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Radni direktorijum iz kojeg će se ovaj program pokrenuti" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Save_t: " #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Savet za prikaz u programu" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Koristi obaveštenja pri pokretanj_u" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "Stavka ra_dne površi" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "Po_vrati" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Vrati datoteke iz Nepotrebno na originalne lokacije" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "naziv izvorne datoteke ili IB radne površi" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "IZVOR" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "naziv rezultujuće datoteke" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "REZULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM disk" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Prazan CD-ROM disk" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R disk" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Prazan CD-R disk" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RV disk" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Prazan CD-RV disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Prazan DVD-ROM disk" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RV disk" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Prazan DVD-RV disk" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM disk" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Prazan DVD-RAM disk" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R disk" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Prazan DVD+R disk" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RV disk" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Prazan DVD+RV disk" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Dvoslojni DVD+R disk" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Prazan dvoslojni DVD+R disk" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Dvoslojni DVD+RV disk" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Prazan dvoslojni DVD+RV disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "BD disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Prazan BD disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "BD-R disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Prazan BD-R disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "BD-RE disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Prazan BD-RE disk" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD disk" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Prazan HD DVD disk" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R disk" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Prazan HD DVD-R disk" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RV disk" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Prazan HD DVD-RV disk" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO disk" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Prazan MO disk" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRV disk" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Prazan MRV disk" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRV/V disk" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Prazan MRV/V disk" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Zvučne datoteke" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Prazan optički disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optički disk" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Vrsta datoteke za otvaranje:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Radim sa: " #~ msgid "Progress:" #~ msgstr "Napredak: " #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Radnja nad datotekom je završena, ali su se dogodile i neke greške." #~ msgid "_Browse" #~ msgstr "_Razgledaj" #~ msgid "My Computer" #~ msgstr "Računar" #~ msgid "_Move" #~ msgstr "Pre_mesti" #~ msgid "_Trash" #~ msgstr "Nepo_trebno" #~ msgid "_Only for this folder" #~ msgstr "Samo _za ovaj direktorijum" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "Označeno, pamti raspored za direktorijum, a ne za sve direktorijume" #~ msgid "Please select a folder" #~ msgstr "Izaberite direktorijum" #~ msgid "Entry for folder path" #~ msgstr "Unos za putanju direktorijuma" #~ msgid "Computer" #~ msgstr "Računar" #~ msgid "Network Drives" #~ msgstr "Mrežni diskovi" #~ msgid "_Run in terminal emulator" #~ msgstr "Pok_reni u emulatoru terminala" #~ msgid "_Keep terminal window open after run" #~ msgstr "Zadrži prozor terminala otvorenim posle po_kretanja" libfm-1.4.0/po/sv.po000066400000000000000000001461341475513661000142340ustar00rootroot00000000000000# Swedish translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: Swedish \n" "Language: sv\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774906.712679\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Program" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "Välj applikation att starta vid klick på webb- eller e-post-adress" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Genvägsredigerare" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Skapa nytt eller uppdatera ett skrivbordselement" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Välj program" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Använd angivet program för att öppna filer" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Installerade program" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "K_ommandorad som ska exekveras:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Utforska..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Exekvera i terminalemulator" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "Behåll terminalfönster öppet efter exekvering av _kommando" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Dessa specialkoder kan användas på kommandoraden:\n" " %f: För ett filnamn\n" " %F: För flera filnamn\n" " %u: För en URI till en fil\n" " %U: För URI till flera filer" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Applikationsnamn (valfritt, ange för att behålla koppling)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Exekvera anpassad kommandorad för att öppna filer" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Anpassad kommandorad" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Ange valt program som _standardåtgärd för denna filtyp" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Bekräfta ersättning av filer" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Hoppa över" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Byt namn" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Skriv över" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Det finns redan en fil med samma namn på denna plats.\n" "\n" "Vill du ersätta den fil som redan existerar" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "med följande fil?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Filnamn:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Utför detta på _alla existerande filer" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Välj en ikon..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "ikontema för systemet" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "bildfiler" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Välj ikon från:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Exekvera fil" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Exekvera i _Terminalemulator" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Filegenskaper" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Ikon för fil i katalogvy" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Namn:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Plats:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Måfill:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Filtyp:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "_Öppna med:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Ange program för att öppna filer av denna typ " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Totalt antal filer:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Total storlek på filer:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Storlek på disk:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Senast ändrad:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Senast använd:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Rättigheterna ändrades senast:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Allmänt" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Ägare:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "G_rupp:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Visa innehåll:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "R_edigera innehåll:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Exekvera:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Specialbitar:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Vem kan läsa innehållet i filen/katalogen" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Vem kan redigera innehållet i filen/katalogen" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Vem kan exekvera filen eller ange katalogen som arbetskatalog" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Specialflaggor för exkvering" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Specialflaggor för katalogåtkomst" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Åtkomstkontroll" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Dold fil" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Rättigheter" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Ingen" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Ange GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky och ange GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "Ange UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Ange UID och GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "Endast ägare" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Endast ägare och grupp" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Vem som helst" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ingen" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Byte" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Välj datum" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Välj datum från kalendern" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Sök filer" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Mönster för fil_namn:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Mönster kan vara antingen en POSIX-skal-lista (med \",\" som avdelare) eller " "ett reguljärt uttryck (POSIX)." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Ignorera skiftläge" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Använd reguljära _uttryck" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Platser att söka i:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Sök i underkataloger" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Sök i _dolda filer" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "Namn/P_lats" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Filtyp" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Sök endast efter filer av följande typ:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Te_xtfiler" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "B_ildfiler" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Ljudfiler" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Videofiler" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Dokument" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Kataloge_r" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "A_nnat:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Innehållstyp kan anges här. Jokertecken \"*\" är tillåtet i slutet på typen. " "Flera typer separeras med \";\"." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Fil_typ" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Fil _innehåller:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "I_nnehåll" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Filstorlek" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Mindre än:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Större än:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Senast ändrad" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Ingen)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Äldre än:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Nyare än:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "Egenska_per" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Webbläsare" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Den föreslagna webbläsaren kommer att användas för att öppna hyperlänkar." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "E-post-klient" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Den föreslagna e-post-klienten kommer att användas för att skicka ett " "meddelande när du klickar på en e-post-adress." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Terminalemulator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Kommandorad:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Systemprogram" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Filassociation" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Till:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Förbereder..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Måfill:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Tid kvar:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Fel uppstod:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Tom fil" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Ogiltigt mål" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Operationen stöds inte" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Felaktig fil för skrivbords-element: \"%s\"" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "\"%s\" kunde inte öppnas då innehållstypen inte känns igen." #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Ingen standardapplikation satt för att öppna URI-typ %s://" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Kan inte ange \"%s\" som arbetskatalog: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Ingen standardapplikation satt för MIME-typ %s" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Enheter" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Nätverk" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Papperskorg" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "genväg till URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: ogiltigt argument" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Inställning för terminalemulator saknas i libfm" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Ogiltig beskrivning av applikation för att skapa tumnagelbilder" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" msgstr[1] "%u byte" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Delmängden \"%s\" av URI:n innehåller ogiltigt kodade tecken" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Dubbletthanterare för taggen <%s>" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Misslyckades med att tolka \"%-.*s\", som skulle ha varit ett tal inuti en " "teckenreferens (ê till exempel). Talet är kanske för stort" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Teckenreferensen slutade inte med ett semikolon. Troligtvis använde du ett &-" "tecken utan att avse att starta en entitet. Skriv om &-tecknet som &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Teckenreferensen \"%-.*s\" kodar inte ett tillåtet tecken" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Tom entitet \"&;\" hittades, giltiga entiteter är: & " < > " "'" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Entitetsnamnet \"%-.*s\" är okänt" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Entiteten slutade inte med ett semikolon. Troligtvis använde du ett &-tecken " "utan att avse att starta en entitet. Skriv om &-tecknet som &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Blanksteg är inte tillåtet i avslutande tagg" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Elementet \"%s\" avslutades men hade aldrig öppnats" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" "Elementet \"%s\" stängdes, men det element som är öppet för tillfället är " "\"%s\"" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Otillåtet tecken \"%c\" i början på attributvärde" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" "Otillåtet tecken \"%c\" i slutet av attributvärde, \"%c\" var förväntat" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Dokumentet slutade oväntat" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Dokumentet var tomt eller innehöll endast tomrum" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML-data-fel" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Anpassa" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Körbara filer" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Välj ett program för att öppna \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Installerade program" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Läser..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Visar katalogträdet i sidovyn" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Avbryt" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Kopiera hit" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Flytta hit" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Länka hit" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave misslyckades." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Öppna" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "_Öppna med..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "_Öppna med" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "_Kopiera sökväg(ar)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "Dö_lj" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "V_isa" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Lägg till bland bokmärken" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Byt namn..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "Ko_mprimera..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Extrahera _här" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "E_xtrahera till..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Egenskaper" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Flytta till _Papperskorgen" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Det finns redan ett bokmärke för denna mapp." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Bildfiler" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" msgstr[1] "byte" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "söker av... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Ange ett korrekt användarnamn eller numeriskt ID." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Ange ett korrekt gruppnamn eller numeriskt ID." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Vill du utföra förändringarna rekursivt på alla filer och underkataloger?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Göm eller visa filen" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Filen är gömd eftersom namnet börjar med en punkt (\".\")." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Filer på detta system är gömda när deras namn börjar med en punkt (\".\"). " "Använg för att styra visningen av gömda filer." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "söker..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "K_an komma åt informationen:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Filer av olika typ" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Fil:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Flera filer" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Namn" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Beskrivning" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Storlek" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Rättigheter" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Ägare" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Modifierad" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Plats" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Filändelse" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Skapa _ny..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Katalog" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Tom fil" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Omvänd markering" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sortera filer" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Byt namn på katalog..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Katalogegenskaper" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Visa _dolda" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Låt _filer och kataloger blandas" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Ignorera variation med stor och liten bokstav för namn" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Efter _namn" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Efter _ändringstid" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Efter _storlek" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Efter fil_typ" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Ange namn för katalogen som just skapades:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Skapar ny katalog" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Ange namn för tom fil:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Skapar.." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Ny" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Ange namn för filen %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Skapar %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "Kö_r standardapplikation efter att filen skapats" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Textfilen \"%s\" verkar vara ett körbart skript.\n" "Vad vill du göra med den?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Filen \"%s\" är körbar. Vill du köra den nu?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Inga kataloger angavs." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Välj katalog" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Fel" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Bekräfta" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Fråga" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Endast en systemadministratör kan utföra detta." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Vill du flytta filen \"%s\" till papperskorgen?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Vill du flytta %d markerad fil till papperskorgen?" msgstr[1] "Vill du flytta de %d markerade filerna till papperskorgen?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Vill du radera filen \"%s\"?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Vill du radera %d markerad fil?" msgstr[1] "Vill du radera de %d markerade filerna?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Byt namn på fil" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Ange nytt namn:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Är du säker på att du vill tömma papperskorgen?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Klistra in och kör" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Fält för katalogplats" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Hemkatalog" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Skrivbord" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Program" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Filsystemsrot" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Montera volym" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Avmontera volym" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "Mata _ut flyttbart medium" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Formatera volym" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Byt namn på bokmärke" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Ta bort från bokmärken" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Flytta bokmärke _uppåt" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Flytta bokmärke ne_dåt" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Töm _papperskorgen" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "Visar en lista med vanliga platser, enhet och bokmärken i sidovyn" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Byt namn på bokmärke" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Ange ett nytt namn:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Size: %s\n" "Ändrad: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Typ: %s\n" "Ändrad: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Fel inträffade innan filoperationen stoppades." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Avbruten" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Filoperationen avslutades med fel." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Avslutades" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Några filer kan inte flyttas till papperskorgen på grund av att filsystemet " "som används inte har stöd för operationen.\n" "Vill du radera dessa filer istället?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Paus" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "Åte_ruppta" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Flyttar" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopierar" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Slänger" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Tar bort" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Skapar länk" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "I:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Skapar länkar till filer" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Ändrar egenskaper" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Ändra filernas egenskaper" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Återställer" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s filer" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Filoperation genomförs..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s filer:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s filer:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Av" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Platser" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Katalogträd" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Fjärr" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Platser" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Katalogträd" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Visar kataloginnehållet" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Göm %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Flytta åt _vänster" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Flytta åt _höger" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Visa %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Glöm bredd" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Ikonvy" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Kompakt vy" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Miniatyrbildsvy" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Detaljerad _listvy" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Byter aktuell flik" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Katalogen \"%s\" som angavs är inte korrekt" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Kan inte komma åt målfil" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Kan inte skapa länk på filsystem utanför systemet" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Kan inte återställa filen \"%s\": ursprunglig plats okänd" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Källa och mål är samma." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Kan inte flytta en katalog till en av dess underkataloger" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Kan inte kopiera en katalog till en av dess underkataloger" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Målet är en underkatalog till källkatalogen" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Kan inte kopiera filen \"%s\": stöds inte" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Anger visningsnamn och kan endast göras för en fil" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Mål kan endast anges för en fil" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Fel i XML-fil \"%s\" (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML-filen innehåller inte applikationernas rot" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Kan inte skapa XML-definitionen för \"%s\"" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Menysökvägen \"%s\" existerar redan" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Fel i menydata" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Ogiltig menykatalog" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Meny-elementet kan inte vara tomt" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Ogiltig menykatalog \"%s\"" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Ogiltigt menyalternativ" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Meny-elementet \"%s\" har ingen motsvarande elementfil" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Byta status för dold eller visning stöds inte för meny-katalog" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Stöd för att sätta attributet \"%s\" saknas" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Ogiltigt värde för attributet \"%s\"" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "\"%s\" är en meny-katalog" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "\"%s\" är inte ett meny-element" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "\"%s\" är trasig" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Kan inte skapa meny-elementet \"%s\"" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Namnet på menykatalogen ska inte sluta med \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Ogiltig operation på menyrot" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Ogiltigt mål" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: katalogen \"%s\" kunde inte hittas i menu cache" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Sök" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Sökresultat" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Välj en körbar fil" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "Ko_mmando:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Kommando att exekvera när applikationsikonen aktiveras" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "B_eskrivning:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Generellt namn på applikationen" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Arbetskatalog:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Arbetskatalogen som applikationen ska köra i" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "Verk_tygstips:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Verktygstips att visa på applikationen" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Använd uppstartsnotifiering" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Skrivbordselement" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Återställ" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Återställer filer från papperskorgen till sin ursprungliga plats" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "källfil eller id för skrivbord" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "KÄLLA" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "resultatfil" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "RESULTAT" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM-skiva" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Tom CD-ROM-skiva" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R-skiva" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Tom CD-R-skiva" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW-skiva" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Tom CD-RW-skiva" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM-skiva" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Tom DVD-ROM-skiva" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW-skiva" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Tom DVD-RW-skiva" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM-skiva" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Tom DVD-RAM-skiva" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R-skiva" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Tom DVD+R-skiva" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW-skiva" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Tom DVD+RW-skiva" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL-skiva (dubbellager)" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Tom DVD+R DL-skiva (dubbellager)" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL-skiva (dubbellager)" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Tom DVD+RW DL-skiva (dubbellager)" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray-skiva" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Tom Blu-Ray-skiva" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R-skiva" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Tom Blu-Ray R-skiva" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW-skiva" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Tom Blu-Ray RW-skiva" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD-skiva" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Tom HD DVD-skiva" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R-skiva" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Tom HD DVD-R-skiva" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW-skiva" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Tom HD DVD-RW-skiva" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO-skiva" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Tom MO-skiva" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW-skiva" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Tom MRW-skiva" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W-skiva" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Tom MRW/W-skiva" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Ljudfiler" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Tom optisk skiva" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optisk skiva" #~ msgctxt "" #~ "It is a directory access bit - 'sticky' - where only owner can delete a " #~ "file from it" #~ msgid "Sticky" #~ msgstr "Sticky" #~ msgctxt "this is a file access mode bit, also known as 'suid'" #~ msgid "Set UID" #~ msgstr "Ange UID" #~ msgctxt "" #~ "this is a file access mode - only owner can access the file, for others " #~ "access is denied" #~ msgid "Only owner" #~ msgstr "Endast ägare" #, fuzzy #~ msgid "Symlinking" #~ msgstr "Mjuklänkar" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Bearbetning:" #~ msgid "Progress:" #~ msgstr "Förlopp:" #~ msgid "Some errors occurred:" #~ msgstr "Fel uppstod:" #~ msgid "_Rename Folder" #~ msgstr "_Byt namn på katalog" #~ msgid "Re_move from Bookmark" #~ msgstr "_Ta bort bokmärke" #~ msgid "The file operation is cancelled and there are some errors." #~ msgstr "Filoperationen avbröts och fel rapporterades." #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Filoperationen avslutade men fel förekom." #~ msgid "Moving Files" #~ msgstr "Flyttar filer" #~ msgid "Copying Files" #~ msgstr "Kopierar filer" #~ msgid "Trashing Files" #~ msgstr "Kastar filer" #~ msgid "Deleting Files" #~ msgstr "Raderar filer" #~ msgid "Creating Symlinks" #~ msgstr "Skapar symboliska länkar" #~ msgid "Changing File Attributes" #~ msgstr "Byter filegenskaper" #~ msgid "File type to be opened:" #~ msgstr "Filtyp att öppna:" #~ msgid "_Installed Application" #~ msgstr "_Installerade program" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "Ange valt program som _standardåtgärd för denna filtyp" #~ msgid "_Browse" #~ msgstr "_Utforska" #~ msgid "My Computer" #~ msgstr "Den här datorn" #~ msgid "_Move" #~ msgstr "_Flytta" #~ msgid "_Trash" #~ msgstr "_Papperskorg" #~ msgid "_Only for this folder" #~ msgstr "Endast för denna katal_og" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Markera för att spara sorteringen för katalogen istället för globalt" #~ msgid "Please select a folder" #~ msgstr "Vänligen ange en katalog" #~ msgid "Entry for folder path" #~ msgstr "Sökväg till katalog" #~ msgid "Computer" #~ msgstr "Dator" #~ msgid "Network Drives" #~ msgstr "Nätverksenheter" #~ msgid "_Run in terminal emulator" #~ msgstr "Kö_r i terminalemulator" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Behåll terminalfönster öppet efter körning" #~ msgid "Shortcuts" #~ msgstr "Genvägar" #~ msgid "Mount Point" #~ msgstr "Monteringspunkt" #~ msgid "Create _Symlink" #~ msgstr "Skapa s_ymlänk" #~ msgid "Se_nd To" #~ msgstr "_Skicka till" #~ msgid "Empty tag" #~ msgstr "Tom tagg " #~ msgid "Tag should have exactly one child" #~ msgstr "Taggen ska ha exakt ett barn" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Taggen kan innehålla en av taggarna , , eller " #~ "" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "Sammanfogad fil kan bara innehålla huvudtaggen , hittade <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Misslyckades med att läsa in taggen <%s> från sammanfogad fil" #~ msgid "Invalid tag" #~ msgstr "Felaktig tagg " #~ msgid "Invalid tag" #~ msgstr "Felaktig tagg " #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "Kan inte hitta sökvägen %s i XML-definitionerna" #~ msgid "Category manipulation internal error" #~ msgstr "Internt fel vid manipulation av kategorier" #~ msgid "Blank File" #~ msgstr "Tom fil" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Fel, lxshortcut inte installerat" #~ msgid "Failed to start lxshortcut" #~ msgstr "Kunde inte starta lxshortcut" #~ msgid "_Group:" #~ msgstr "_Grupp:" #~ msgid "Rename" #~ msgstr "Byt namn" #~ msgid "Make the file executable" #~ msgstr "Gör fil exekverbar" #~ msgid "Operations that all other users can do" #~ msgstr "Operationer som alla användare kan utföra" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Operationer som filens ägare kan utföra" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Operationer som användare i samma grupp som ägaren av filen kan utföra" #~ msgid "Read and Write" #~ msgstr "Läs och skriv" #~ msgid "Read only" #~ msgstr "Endast läs" #~ msgid "Write only" #~ msgstr "Endast skriv" libfm-1.4.0/po/te.po000066400000000000000000001633771475513661000142240ustar00rootroot00000000000000# Telugu translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-05-27 14:12+0000\n" "Last-Translator: Praveen Illa \n" "Language-Team: LANGUAGE \n" "Language: te\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-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1527430356.169218\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "ప్రాధాన్య అనువర్తనాలు" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "జాల లంకె లేదా ఈమెయిలు చిరునామా పై నొక్కినప్పుడు తెరవబడే అనువర్తనాన్ని ఎంచుకోండి" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "అడ్డదారుల కూర్పకం" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "ఉన్నటువంటి డెస్కుటాప్ ప్రవేశాన్ని మార్చండి లేదా కొత్తది సృష్టించండి" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "అనువర్తనాన్ని ఎన్నుకోండి" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "ఫైళ్ళను తెరుచుటకు ఎంచుకున్న అనువర్తనమును వాడు" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "స్థాపించబడిన అనువర్తనాలు (_I)" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "ఎక్జిక్యూట్‌చేయుటకు కమాండు లైను (_o):" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "విహరించు...(_B)" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "టెర్మినల్ ఎమ్యులేటర్‌లో అమలుచేయి (_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "ఆదేశం అమలు తరువాత కూడా టెర్మినల్ కిటికీని ఉంచు (_K)" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "కమాండు లైనులో ఈ ప్రత్యేక కోడులను వాడవచ్చును:\n" " %f: ఒక ఫైలు పేరుని సూచిస్తుంది\n" " %F: ఒకటికంటే ఎక్కువ ఫైల్ పేరులను సూచిస్తుంది\n" " %u: ఫైలు యొక్క ఒక URIను సూచిస్తుంది\n" " %U: ఒకటికంటే ఎక్కువ URIsను సూచిస్తుంది" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "అనువర్తనం పేరు (ఐచ్ఛికం, సంబంధించిన దానితో తెరుచుటుకు అమర్చండి)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "ఫైళ్ళను తెరుచుటకు అనురూపిత కమాండు లైనును అమలుపరుచు" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "అనురూపిత ఆదేశ పంక్తి (_u)" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "ఈ రకపు దస్త్రాన్ని తెరుచుటకు ఎంచుకున్న అనువర్తనమును అప్రమేయముగా అమర్చు (_S)" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "ఫైళ్ళను పునఃస్థాపించుటకు నిర్ధారించండి" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "దాటవేయి (_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "పేరుమార్చు (_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "దిద్దివ్రాయి (_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "ఇంతకుముందే అక్కడ ఒక ఫైల్ ఇదే పేరుతో ఉంది.\n" "\n" "మీరు దానిని పునఃస్థాపించాలనుకుంటున్నారా" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "కింద పేర్కొన్న ఫైలుతోనా?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "దస్త్రం పేరు (_F):" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "ఉన్నటువంటి అన్ని దస్త్రాలకు ఈ ఐచ్ఛికాన్ని అనువర్తించు (_A)" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "ఒక అనువర్తనాన్ని ఎన్నుకొను" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "వ్యవస్థ ప్రతీక అలంకారం" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "బొమ్మ దస్త్రాలు" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "ఇక్కడి నుండి ప్రతీకను ఎంచుకోండి:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "ఎక్జిక్యూట్ ఫైల్" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "టెర్మినల్‌లో ఎక్జిక్యూట్‌చేయి (_T)" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "ఫైల్ లక్షణాలు" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "సంచయం చూడటంలో దస్త్రం యొక్క ప్రతీక" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "పేరు (_N):" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "స్థలము:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "లక్ష్య దస్త్రం:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "దస్త్ర రకం:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "దీనితో తెరువు (_w):" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "ఈ రకపు ఫైళ్ళను తెరుచుటకు అనువర్తనమును ఎంచుకోండి " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "మొత్తం దస్త్రాల సంఖ్య:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "మొత్తం దస్త్రాల పరిమాణం:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "డిస్కు పై పరిమాణం:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "చివరి మార్పు:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "చివరి వాడుక:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "చివరి అనుమతుల మార్పు:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "సాధారణ (_G)" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "యజమాని(_w):" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "సమూహం(_r):" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "సారాన్ని వీక్షించండి(_V):" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "లక్ష్యం(_h):" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "ఇతర(_E):" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "ప్రత్యేక బిట్లు:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "దస్త్రం/సంచయం యొక్క విషయాలను ఎవరు చదవవచ్చు" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "దస్త్రం/సంచయం యొక్క విషయాలను ఎవరు మార్చవచ్చు" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "ఎవరు దస్త్రమును అమలుచేయగలరు లేదా సంచయంలోకి అడుగు పెట్టగలరు" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "దస్త్రపు అమలు కోసం ప్రత్యేక కేతనాలు" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "సంచయం ప్రాప్యత కోసం ప్రత్యేక కేతనాలు" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "ప్రవేశ నియంత్రణ" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "దాగిన దస్త్రం" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "అనుమతులు (_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "ఏదీకాదు" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "అంటివుండేటిది" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "జీఐడీ అమర్చు" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "అంటివుండేది & జీఐడీ అమర్చు" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "యూఐడీ అమర్చు" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "యూఐడీ & జీఐడీ అమర్చు" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "యజమాని మాత్రమే" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "యజమాని మరియు సమూహం మాత్రమే" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "ఎవరైనా" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "ఎవరూకాదు" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "బైట్లు" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "కిబై" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "మెబై" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "గిబై" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "తేదీని ఎంచుకోండి" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "దిగువన పేర్కొన్న క్యాలెండరు నుండి తేదీని ఎంచుకోండి" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "దస్త్రాలను వెతుకు" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "దస్త్రం పేరు సరళులు (_N):" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "అక్షరాల తరగతి పట్టింపులేకుండా (_v)" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "రెగ్యులర్ ఎక్స్‌ప్రెషన్స్ వాడు (_U)" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "వెతకాల్సిన స్థలములు (_e):" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "ఉప సంచయాలలో కూడా వెతుకు (_S)" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "దాగిన దస్త్రాలను వెతుకు (_h)" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "పేరు/ప్రాంతం (_L)" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "దస్త్ర రకం:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "క్రింది పేర్కొన్న రకపు దస్త్రాల కోసం మాత్రమే వెతుకు:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "పాఠ్య దస్త్రాలు (_x)" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "బొమ్మ దస్త్రాలు (_I)" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "ఆడియో దస్త్రాలు (_A)" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "దృశ్య దస్త్రాలు (_V)" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "పత్రాలు (_D)" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "సంచయాలు (_r)" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "ఇతరాలు (_h):" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "దస్త్ర రకం (_T)" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "దస్త్రంలో ఇవి ఉంటాయి (_s):" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "విషయము (_o)" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "దస్త్ర రకం" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 #, fuzzy msgid "Last Modified Time" msgstr "ఆఖరి సవరణలు:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 #, fuzzy msgid "(None)" msgstr "ఏదీకాదు" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "లక్షణాలు (_P)" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "వెబ్ విహారిణి" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "హైపర్‌లింకులను తెరుచుటకు మీరు ఇష్టపడే వెబ్ విహారిణి వాడబడుతుంది." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "మెయిల్ క్లైంటు" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "ఈ-మెయిల్ చిరునామాల పై నొక్కినపుడు ప్రాధాన్య మెయిల్ క్లైంటు ఈ మెయిళ్ళను సృష్టించుటకు వాడబడుతుంది." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "టెర్మినల్ అనుకరణ" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "కమాండు లైను:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "వ్యవస్థ అనువర్తనాలు" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "ఫైల్ సంబంధితాలు" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "వీరికి:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "సిద్ధంచేస్తోంది..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "లక్ష్య దస్త్రం:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "మిగిలిన సమయం:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "కొన్ని దోషాలు సంభవించినవి:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "ఎక్జిక్యూట్ ఫైల్" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "స్థాపించబడిన అనువర్తనాలు" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "నెట్‌వర్క్" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "చెత్తబుట్ట" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "లఘువులు" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "టెబై" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u బైట్" msgstr[1] "%u బైట్లు" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "కిబై" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "మెబై" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "గిబై" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "టెబై" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "అనురూపించు" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "ఎక్జిక్యూట్ ఫైల్" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "\"%s\" దస్త్రాలను తెరుచుటకు ఒక అనువర్తనాన్ని ఎంచుకోండి" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "స్థాపించబడిన అనువర్తనాలు" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<ఏ ఉప సంచయాలు లేవు>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "నింపుతున్నది..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "రద్దుచేయి (_C)" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave విఫలమైంది." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "దీనితో తెరవండి...(_W)" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "దీనితో తెరవండి (_W)" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "ఇష్టాంశానికి చేర్చు (_A)" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "పేరుమార్చు (_R)" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "కుదించు...(_m)" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "ఇక్కడ సంగ్రహించు (_H)" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "ఇచటకు సంగ్రహించు...(_x)" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "లక్షణాలు (_e)" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "చెత్తబుట్టకు తరలించు (_T)" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "ఫైళ్ళను చెత్తబుట్టకు తరలిస్తోంది" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "బైట్" msgstr[1] "బైట్లు" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "దయచేసి సరైన వాడుకరి పేరును లేదా సంఖ్యాత్మక ఐడిను ఇవ్వండి." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "దయచేసి సరైన సమూహ పేరును లేదా సంఖ్యాత్మక ఐడిను ఇవ్వండి." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "ఈ మార్పులను అన్ని ఫైళ్ళకు మరియు ఉప-సంచయాలకు పునరావృత్తముగా అనువర్తించాలనుకుంటున్నారా?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "నింపుతున్నది..." #: ../src/gtk/fm-file-properties.c:1089 #, fuzzy msgid "_Access content:" msgstr "ప్రవేశ నియంత్రణ" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "వివిధ రకములైన ఫైళ్ళు" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "ఫైల్ రకం:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "బహుళ ఫైళ్ళు" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "పేరు" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "వివరణ" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "పరిమాణం" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "అనుమతులు" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "సవరించబడినది" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "స్థలము" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "ఎక్జిక్యూట్ ఫైల్" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "సంచయం పేరుమార్చు...(_R)" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "సంచయం లక్షణాలు (_e)" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "దయచేసి ఒక సంచయమును ఎంచుకోండి" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "పేరును బట్టి (_N)" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "పరిమాణము బట్టి (_S)" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "దస్త్ర రకము బట్టి (_T)" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "ఫైలు పేరుమార్చు" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "ఒక కొత్త పేరును ఇవ్వండి:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "symlinksను సృష్టిస్తున్నది" #: ../src/gtk/fm-folder-view.c:866 #, fuzzy msgid "New" msgstr "నెట్‌వర్క్" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "%s కు ఒక కొత్త పేరును ఇవ్వండి:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s ను సృష్టిస్తున్నది" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "ఈ పాఠ్యపు ఫైల్ '%s' ఎక్జిక్యూటబుల్ స్క్రిప్టు వలె కనపడుతుంది.\n" "మీరు దానితో ఏమి చేయాలనుకుంటున్నారు?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "ఈ '%s' ఫైల్ ఒక ఎక్జిక్యూటబుల్ ఫైలు. మీరు దీనిని ఎక్జిక్యూట్ చేయాలనుకుంటున్నారా?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "దయచేసి ఒక సంచయమును ఎంచుకోండి" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "దోషం" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "నిర్ధారించు" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "ప్రశ్న" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "దీనిని చేయుటకు వ్యవస్థ నిర్వాహకులు మాత్రమే అనుమతికలిగివున్నారు." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "'%s' దస్త్రమును చెత్తబుట్టకు తరలించాలనుకుంటున్నారా?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "ఎంచుకున్న %d దస్త్రాలన్ని చెత్తబుట్టకు తరలించాలనుకుంటున్నారా?" msgstr[1] "ఎంచుకున్న %d దస్త్రాలను చెత్తబుట్టకు తరలించాలనుకుంటున్నారా?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "ఎంచుకున్న '%s' దస్త్రాలను తొలగించాలనుకుంటున్నారా?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "ఎంచుకున్న ఫైళ్ళను తీసివేయాలనుకుంటున్నారా?" msgstr[1] "ఎంచుకున్న ఫైళ్ళను తీసివేయాలనుకుంటున్నారా?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "ఫైలు పేరుమార్చు" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "దయచేసి ఒక కొత్త పేరును ప్రవేశపెట్టండి:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "మీరు ఖచ్చితంగా చెత్తబుట్టను ఖాళీ చేయాలనుకుంటున్నారా?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "ఫైల్ సంబంధితాలు" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "ఫైలు పేరుమార్చు" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "డెస్క్‍టాప్" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "అనువర్తనాలు" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "దస్త్రవ్యవస్థ రూట్" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "సంపుటమును అధిరోహించు (_M)" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "సంపుటమును అనధిరోహించు (_U)" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "తీసివేయదగిన మాధ్యమాన్ని నెట్టివేయి (_E)" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "సంపుటమును ఫార్మాటుచేయి (_F)" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "ఇష్టాంశము పేరుమార్చు (_R)" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "ఇష్టాంశాల నుండి తొలగించు (_m)" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "ఇష్టాంశమును పైకి తరలించు (_U)" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "ఇష్టాంశమును కిందికి తరలించు (_D)" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "చెత్తబుట్టను ఖాళీచేయి (_E)" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "ఇష్టాంశము పేరుమార్చు" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "ఒక కొత్త పేరును ఇవ్వండి:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "రకం: %s\n" "పరిమాణం: %s\n" "సవరించబడినది: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "రకం: %s\n" "సవరించబడినది: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "ఫైల్ ఆపరేషన్ రద్దుచేయబడింది మరియు అక్కడ కొన్ని దోషాలు ఉన్నాయి." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "రద్దుచేయబడింది" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "ఫైల్ ఆపరేషన్ రద్దుచేయబడింది మరియు అక్కడ కొన్ని దోషాలు ఉన్నాయి." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "పూర్తయింది" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "కొన్ని ఫైళ్ళను చెత్తబుట్టకు తరలించుట వీలుకావడంలేదు ఎందుకంటే మూలాధారమైన ఫైల్ వ్యవస్థలు ఈ ఆపరేషన్‌కు " "సహకరించుటలేదు.\n" "దీనికి బదులుగా వాటిని తొలగించాలనుకుంటున్నారా?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "తిరిగివుంచు (_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "ఫైళ్ళను తరలిస్తోంది" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "ఫైళ్ళను నకలుచేస్తోంది" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "ఫైళ్ళను చెత్తబుట్టకు తరలిస్తోంది" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "ఫైళ్ళను తీసివేస్తోంది" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "ఫైల్ గుణములను మారుస్తోంది" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "తిరిగివుంచుతోంది" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s దస్త్రాలు" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s దస్త్రం:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s దస్త్రాలు:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "స్థలములు (_P)" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "సంచయపు వృక్షం (_D)" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "సుదూరం (_R)" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "స్థలములు" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "సంచయపు వృక్షం" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "నిర్దేశించిన చిరునామా సరైనది కాదు" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "చెత్తబుట్టకు తరలించిన ఫైళ్ళను వాటి పూర్వ స్థానములలో తిరిగివుంచు" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "మూలము మరియు గమ్యస్థానము రెండూ ఒకటే." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "ఒక సంచయమును దాని ఉప సంచయమునకు తరలించుట సాధ్యంకాదు" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "ఒక సంచయమును దాని ఉప సంచయమునకు నకలుచేయుట సాధ్యంకాదు" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "గమ్యస్థానము మూలము యొక్క ఉప సంచయం" #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "ఒక సంచయమును దాని ఉప సంచయమునకు నకలుచేయుట సాధ్యంకాదు" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "ఫైలు పేరుమార్చు" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "ఎక్జిక్యూట్ ఫైల్" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "ఆదేశం (_m):" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "వివరణ (_e):" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "యజమాని (_O):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "పనిముట్లచిట్కా(_T):" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "ఒక అనువర్తనాన్ని ఎన్నుకొను" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "డెస్క్‌టాప్ ప్రవేశం (_D)" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "తిరిగివుంచు (_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "చెత్తబుట్టకు తరలించిన ఫైళ్ళను వాటి పూర్వ స్థానములలో తిరిగివుంచు" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM డిస్కు" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "శూన్య CD-ROM డిస్కు" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R డిస్కు" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "శూన్య CD-R Disc" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW డిస్కు" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "శూన్య CD-RW డిస్కు" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM డిస్కు" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "శూన్య DVD-ROM డిస్కు" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW డిస్కు" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "శూన్య DVD-RW డిస్కు" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM డిస్కు" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "శూన్య DVD-RAM డిస్కు" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R డిస్కు" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "శూన్య DVD+R డిస్కు" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW డిస్కు" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "శూన్య DVD+RW డిస్కు" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL డిస్కు" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "శూన్య DVD+R DL డిస్కు" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL డిస్కు" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "శూన్య DVD+RW DL డిస్కు" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray డిస్కు" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "శూన్య Blu-Ray డిస్కు" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R డిస్కు" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "శూన్య Blu-Ray R Disc" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW డిస్కు" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "శూన్య Blu-Ray RW డిస్కు" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD డిస్కు" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "శూన్య HD DVD డిస్కు" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R డిస్కు" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "శూన్య HD DVD-R డిస్కు" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW డిస్కు" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "శూన్య HD DVD-RW డిస్కు" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO డిస్కు" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "శూన్య MO డిస్కు" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW డిస్కు" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "శూన్య MRW డిస్కు" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W డిస్కు" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "శూన్య MRW/W డిస్కు" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "ఆడియో దస్త్రాలు (_A)" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "శూన్య ఆప్టికల్ డిస్కు" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "ఆప్టికల్ డిస్కు" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "స్థాపించబడిన అనువర్తనము (_I)" #~ msgid "Processing:" #~ msgstr "ప్రోసెసింగ్:" #~ msgid "Progress:" #~ msgstr "ప్రగతి:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "ఫైల్ ఆపరేషన్ పూర్తయింది, కాని అక్కడ కొన్ని దోషాలు ఉన్నాయి." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "symlinksను సృష్టిస్తున్నది" #~ msgid "_Browse" #~ msgstr "అన్వేషించు (_B)" #~ msgid "My Computer" #~ msgstr "నా కంప్యూటర్" #~ msgid "Please select a folder" #~ msgstr "దయచేసి ఒక సంచయమును ఎంచుకోండి" #, fuzzy #~ msgid "Computer" #~ msgstr "నా కంప్యూటర్" #, fuzzy #~ msgid "Network Drives" #~ msgstr "నెట్‌వర్క్" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "టెర్మినల్ ఎమ్యులేటర్‌లో అమలుచేయి (_E)" #~ msgid "Shortcuts" #~ msgstr "లఘువులు" #~ msgid "Mount Point" #~ msgstr "మౌంట్ పాయింట్" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Symlink సృష్టించు" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "ఇచటకు పంపు" #, fuzzy #~ msgid "Blank File" #~ msgstr "శూన్య MO డిస్కు" #~ msgid "_Group:" #~ msgstr "సమూహం (_G):" #~ msgid "Rename" #~ msgstr "పేరుమార్చు" #~ msgid "Make the file executable" #~ msgstr "ఎక్జిక్యూటివ్ ఫైలుగా చేయుము" #~ msgid "Operations that all other users can do" #~ msgstr "ఇతర అందరు వాడుకరులు చేయగలిగిన ఆపరేషన్‌లు" #~ msgid "Operations that the owner of the file can do" #~ msgstr "ఫైలు యొక్క యజమాని మాత్రమే చేయదగిన ఆపరేషన్‌లు" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "ఫైలు యొక్క యజమాని వలె ఒకే సమూహాములో ఉన్న వాడుకరులు చేయగలిగిన ఆపరేషన్‌లు" #~ msgid "Read and Write" #~ msgstr "చదువుట మరియు వ్రాయుట" #~ msgid "Read only" #~ msgstr "చదువుటకు మాత్రమే" #~ msgid "Write only" #~ msgstr "వ్రాయుటకు మాత్రమే" libfm-1.4.0/po/th.po000066400000000000000000001105251475513661000142120ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774907.456185\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/tr.po000066400000000000000000001466641475513661000142410ustar00rootroot00000000000000# Turkish translation of libfm. # Copyright (C) 2010 PCmanFM & Mehmet Gülmenen. # This file is distributed under the same license as the libfm package. # Mehmet Gülmen , 2010 msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-12-13 17:14+0000\n" "Last-Translator: nyucel \n" "Language-Team: tr \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1544721259.662684\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Tercih Edilen Uygulamalar" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Web bağlantısı veya e-posta adresine tıklanıldığında çağrılacak uygulamaları " "seçin" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Kısayol Düzenleyici" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Yeni bir masaüstü girdisi oluştur veya mevcutu değiştir" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Uygulamayı Seç" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Dosyaları seçilen uygulamayla aç" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Kurulu Uygulama" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "Ç_alıştırılacak komut satırı:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "_Gözat..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Uçbirimde çalıştır" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Komut çalıştırmanın ardından terminal penceresini açık tut" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Komut satırında şu özel kodlar kullanılabilir:\n" " %f: Tek dosya adını temsil eder\n" " %F: Birden fazla dosya adını temsil eder\n" " %u: Tek bir dosya URI'sini temsil eder\n" " %U: Birden fazla dosya URI'sini temsil eder" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "Uygulama _adı (isteğe bağlı)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Dosyaları açmak için özel bir komut çalıştır" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Özel Komut Satırı" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "_Seçili uygulamayı bu dosya türü için varsayılan olarak ayarla" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Dosyayı Değiştirmeyi Onayla" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Atla" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Yeniden Adlandır" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "Ü_zerine Yaz" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Bu konumda aynı isimde başka bir dosya bulunuyor.\n" "\n" "Varolan dosyayı değiştirmek istiyor musunuz" # Doesn't this line need some explanation? #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "şu dosyayla?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Dosya adı:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "Bu seçeneği bütün dosyalar için _uygula" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Bir Simge Seç..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "sistem simge teması" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "resim dosyaları" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Şuradan bir simge seç:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Dosyayı Çalıştır" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Uçbirimde _Çalıştır" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Dosya Özellikleri" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Dizin görünümünde dosyanın simgesi" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_İsim:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Konumu:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Hedef dosya:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Dosya türü:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Ş_ununla Aç:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Bu dosya türünü açmak için uygulama seç " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Toplam dosya sayısı:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Dosyaların toplam boyutu:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Diskteki boyutu:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Son değişiklik:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Son erişim:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Son izin değişikliği:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Genel" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Sahibi:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Gr_ubu:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "İçe_riği göster:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "İçeriği _değiştir:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Çalıştır:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Özel bitler:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Dosyanın/dizinin içeriğini kimler okuyabilir" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Dosyanın/dizinin içeriğini kimler değiştirebilir" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Dosyayı kimler çalıştırabilir veya dizine kimler girebilir" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Dosya çalıştırma için özel bayraklar" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Dizin erişimi için özel bayraklar" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Erişim Kontrolü" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Gizli dosya" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "İ_zinler" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Hiçbiri" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Sticky" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Set GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Sticky & set GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Set UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Set UID & GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Sadece sahibi" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Sadece sahibi ve grubu" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Herkes" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Hiçkimse" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Bir Tarih Seçin" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Aşağıdaki takvimden bir tarih seçin" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Dosyaları Ara" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Dosya Adı _Kalıpları:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Desen bir POSIX kabuk desen listesi (ayraç olarak ',') veya POSIX düzenli " "ifadesi olabilir." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "Büyük _küçük harfe duyarlı" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Düzenli _ifade kullan" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Ara_ma Alanları:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "_Alt dizinlerde ara" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_Gizli dosyaları ara" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "İsim/_Konum" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Dosya Türü:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Sadece aşağıdaki dosya türleri için ara:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "_Metin dosyaları" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Resim dosyaları" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Ses dosyaları" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "_Video dosyaları" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Belgeler" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Klasör_ler" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Diğer:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Buraya geçerli herhangi bir tür girilebilir. Her türün sonunda '*' joker " "karakteri kullanılabilir. Birden fazla girdi ';' ile ayrılmalıdır." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "Dosya _Türü" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "Do_sya içeriği:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "İç_erik" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Dosya Boyutu" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "En _fazla:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "En _az:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Son Düzenlenme Zamanı:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Hiç)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_En geç:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "E_n erken:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Özellikler" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Web Tarayıcısı" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Tercih edilen Web Tarayıcısı bağlantılara açmak üzere kullanılacak." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Posta İstemcisi" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Tercih edilen Posta İstemcisi E-posta adreslerine tıkladığınızda posta " "oluşturmak için kullanılacak." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Uçbirim Öykünücüsü" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Komut satırı:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Sistem Uygulamaları" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "İlişkilendirilmiş Dosya Türleri" # Not all languages belong to Indo-European language family. #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Şuraya:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Hazırlanıyor..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Taşınan veri:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Kalan Süre:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Oluşan hatalar:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Boş değer" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Geçersiz seçim" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "İşlem desteklenmiyor" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Geçersiz masaüstü girdi dosyası: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Çalıştırmak üzere '%s' dosyası içerik türü tespit edilemedi" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "%s:// URI'lerini çalıştırmak için öntanımlı bir uygulama ayarlanmamış" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Çalışma dizini '%s' olarak ayarlanamıyor: %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "%s MIME türü için öntanımlı bir uygulama ayarlanmadı" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Aygıtlar" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Ağ" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Çöp Kutusu" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI için kısayol" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: geçersiz argüman" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Libfm yapılandırmasında bir teminal öykünücüsü atanmamış" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Küçük resim uygulamasının geçersiz açıklaması" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u bayt" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI alt yolu '%s' geçersiz olarak çıkış yapılmış karakterler içeriyor" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "<%s> etiketi için yinelenmiş çalıştırıcı" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Karakter referansı içinde bir rakam olması gereken '%-.*s' ayrıştırılamadı " "(örneğin; ê) - rakam çok büyük olabilir" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Karakter referansı noktalı virgül ile bitmemiş; büyük ihtimalle bir özvarlık " "başlatmak istemeksizin ve karakteri kullandınız - ve işaretini & olarak " "kullanabilirsiniz" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Karakter referansı '%-.*s' izin verilen karakteri kodlamıyor" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "Boş girdi '&;' görüldü; geçerli ögeler: & " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Varlık adı '%-.*s' bilinmiyor" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Özvarlık noktalı virgül ile bitmiyor; büyük ihtimalle bir özvarlık başlatmak " "istemeksizin ve karakteri kullandınız - ve işaretini & olarak " "kullanabilirsiniz" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Kapatma etiketinde boşluğa izin verilmiyor" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "'%s' öğesi kapatıldı ama açık öğe yoktu" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "'%s' öğesi kapatılmış, fakat şu an açık öğe '%s'" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Değer niteliği başlangıcında geçersiz '%c' char değeri" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Nitelik değerinin sonunda geçersiz char '%c' değeri, '%c' beklendi" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Belge beklenmedik şekilde sonlandı" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Belge boş veya sadece boşluk karakteri içeriyor" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: XML veri hatası" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Özelleştir" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Uygulama dosyaları" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "\"%s\" dosyalarını açmak için bir uygulama seç" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Kurulu Uygulamalar" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Yükleniyor..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Dizin ağacını kenar çubuğunda göster" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_İptal" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "Buraya K_opyala" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Buraya Taşı" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Buraya Bağlantı Oluştur" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave başarısız." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Aç" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "_Birlikte Aç..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "_Birlikte Aç..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Yolları Ko_pyala" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "G_izle" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "Gös_ter" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "_Yer İmlerine Ekle" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "_Yeniden Adlandır" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Sıkıştır..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "Buraya _Çıkar" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Çıkarılacak _Konum..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Özellikler" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Çöpe _Taşı" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Yer imleriniz zaten bu klasör için bir yer imine sahip." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Resim dosyaları" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "bayt" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "taranıyor... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Lütfen geçerli bir kullanıcı adı ya da sayısal kimliği giriniz." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Lütfen geçerli bir grup adı ya da sayısal kimliği giriniz." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Bu değişiklikleri bütüm dosyalara ve alt dizinlere uygulamak istiyor musunuz?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Dosyayı gizle veya göster" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Bu dosya ismi bir nokta ('.') ile başladığından gizli." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Bu sistemdeki dosyalar, isimleri nokta ('.') ile başlarsa gizlidirler. Gizli " "dosyaların görünürlüğünü değiştirmek için tuşlarına basın." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "taranıyor..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "_Erişim içeriği:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Farklı türlerdeki dosyalar" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Dosya:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Birden çok dosya" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "İsim" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Tanım" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Boyut" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "İzinler" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Sahibi" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Son Değişiklik" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Konum" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Uzantı" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Yeni _Oluştur..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Dizin" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Boş Dosya" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Seçimi Tersine Çevir" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Dosyaları Sırala" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Klasörü Yeniden Adlandır" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "Klasör _Özellikleri" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Gizlileri _Göster" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "Dos_ya ve Dizinleri Karıştır" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "_Büyük Küçük Harfi Önemseme" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "_İsme göre" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "_Düzenlenme zamanına göre" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "_Boyuta göre" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Dosya _Türüne göre" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Yeni oluşturulan dizin için bir isim girin:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Yeni Dizin Oluşturuluyor" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Dosya için bir isim girin:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Oluşturuluyor ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Yeni" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Yeni %s için bir isim girin:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "%s oluşturuluyor" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Oluşturma işleminden sonra dosyayı öntanımlı uygulama ile çalıştır" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Bu metin dosyası '%s' çalıştırılabilir olarak görünüyor.\n" "Dosya ile ne yapmak istiyorsunuz?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "'%s' çalıştırılabilir bir dosya. Çalıştırmak istiyor musunuz?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Dizin belirtilmedi." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Klasör Seçin" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Hata" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Onayla" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Soru" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Bunu sadece sistem yöneticisinin yapmaya yetkisi var." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "'%s' dosyasını çöp kutusuna göndermek istiyor musunuz?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Seçilen %d dosyayı çöp kutusuna göndermek istiyor musunuz?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Seçilen '%s' dosyasını silmek istiyor musunuz?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Seçilen %d dosyayı silmek istiyor musunuz?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Dosyayı Yeniden Adlandır" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Lütfen yeni bir isim girin:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Çöp kutusunu gerçekten boşaltmak istiyor musunuz?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "Ya_pıştır ve Git" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Dizin konum çubuğu" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Ev Dizini" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Masaüstü" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Uygulamalar" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Dosya Sistemi Kök Dizini" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "Hac_mi Bağla" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "Hacmi _Ayır" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Çıkarılabilir Aygıtı Çıkar" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "Birimi B_içimlendir" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Yer İmini Yeniden Adlandı_r" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "Yer İ_mlerinden Kaldır" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "_Yer İmini Yukarı Taşı" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "Yer İmini _Aşağı Taşı" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Çöp Kutusunu _Boşalt" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Kenar çubuğunda ortak yerlerin, aygıtların ve yer imlerinin bir listesini " "gösterir" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Yer İmini Yeniden Adlandır" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Yeni bir isim girin:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Türü: %s\n" "Boyutu: %s\n" "Son değişiklik: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Türü: %s\n" "Son değişiklik: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Dosya işlemi durmadan önce hatalar meydana geldi." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "İptal edildi" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Dosya işlemi bazı hatalar ile tamamlandı." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Tamamlandı" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Bazı dosyalar dosya sistemi bu eylemi desteklemediğinden dolayı çöp kutusuna " "gönderilemiyor.\n" "Bunun yerine kalıcı olarak silmek ister misiniz?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Duraklat" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Devam et" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Taşınıyor" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Kopyalanıyor" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Çöpe taşınıyor" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Siliniyor" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Bağlantı oluşturuluyor" # Not all languages belong to Indo-European language family. #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "Konum:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Dosyalara bağlantılar oluşturuluyor" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Dosya öznitelikleri değiştiriliyor:" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Dosya öznitelikleri değiştiriliyor" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Geri yükleniyor" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "Dosyalar %s" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Dosya işlemi sürüyor..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "Dosya %s:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "Dosyalar %s:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Kapalı" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Yerler" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Dizin Ağacı" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Uzak" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Yerler" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Dizin Ağacı" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Klasör içeriklerinin görünümü" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Gizle %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "_Sola Taşı" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "Sağa _Taşı" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "%s Göster" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Genişliği Unut" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Simge Görünümü" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Sıkı Görünüm" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "_Küçük Resim Görünümü" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Ayrıntılı _Liste Görünümü" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Etkin sekmeyi değiştirir" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Belirtilen '%s' dizini geçersiz" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Hedef dosyaya erişilemiyor" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Tam uyumlu olmayan dosya sisteminde bir bağlantı oluşturulamaz" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Çöpteki '%s' dosyası geri alınamadı: özgün yol bilinmiyor" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Hedef mevcut değil" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Kaynak ve hedef dosyalar aynı." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Dizin kendi alt-dizinine taşınamaz" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Dizin kendi alt-dizinine kopyalanamaz" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Hedef, kaynağın bir alt klasörü" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Dosya kopyalanamıyor '%s': desteklenmiyor" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Görüntü adı belirlemek sadece tek bir dosya için yapılabilir" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Hedef belirlemek sadece tek bir dosya için yapılabilir" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML dosyası '%s' hatası (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML dosyası Applications kökü içermiyor" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "'%s' için XML tanımlaması oluşturulamıyor" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "'%s' menü yolu zaten mevcut" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Menü önbellek hatası" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Geçersiz menü dizini" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Menu öge adı boş olamaz" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Geçersiz menü dizini '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Geçersiz menü ögesi" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "'%s' menü ögesi, uygun girdi dosyasına sahip değil" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Menü dizini için gizlilik durumunu değiştirmek desteklenmiyor" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "'%s' niteliğini ayarlamak desteklenmiyor" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "'%s' niteliği için geçersiz değer" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' bir menü dizini" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' bir menü ögesi değil" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "'%s' girdi dosyası bozuk" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "'%s' menü ögesi oluşturulamıyor" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Menu dizininin adı \".desktop\" ile bitmemeli" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Kök menüsü ile geçersiz işlem" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Geçersiz hedef" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: '%s' dizini menü önbelleğinde bulunamadı" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Ara" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Arama Sonuçları" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Çalıştırılabilir Dosyayı Seçin" # Not all languages belong to Indo-European language family. #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "K_omut:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Uygulama simgesi etkinleştirildiğinde çalıştırılacak komut" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Tanım:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Uygulamanın genel adı" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Çalışma dizini:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Programın çalıştırılacağı çalışma dizini" # Not all languages belong to Indo-European language family. #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Araç ipucu:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Uygulamada gösterilecek araç ipucu" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "_Başlangıç bildirimini kullan" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Masaüstü Girdisi" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Geri al" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Çöpteki dosyaları yerlerine al" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "kaynak dosya adı veya masaüstü no" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "KAYNAK" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "sonuç dosya adı" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "SONUÇ" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM Disk" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Boş CD-ROM Disk" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R Disk" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Boş CD-R Disk" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW Disk" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Boş CD-RW Disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM Disk" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Boş DVD-ROM Disk" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW Disk" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Boş DVD-RW Disk" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM Disk" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Boş DVD-RAM Disk" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R Disk" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Boş DVD+R Disk" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW Disk" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Boş DVD+RW Disk" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL Disk" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Boş DVD+R DL Disk" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL Disk" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Boş DVD+RW DL Disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray Disk" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Boş Blu-Ray Disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R Disk" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Boş Blu-Ray R Disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW Disk" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Boş Blu-Ray RW Disk" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD Disk" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Boş HD DVD Disk" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R Disk" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Boş HD DVD-R Disk" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW Disk" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Boş HD DVD-RW Disk" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO Disk" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Boş MO Disk" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW Disk" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Boş MRW Disk" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W Disk" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Boş MRW/W Disk" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Ses dosyaları" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Boş Optik Disk" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Optik Disk" #~ msgid "Symlinking" #~ msgstr "Sembolik bağlantı oluşturuluyor" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Açılacak Dosya Türü:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "İşlenen Dosya:" #~ msgid "Progress:" #~ msgstr "İlerleme:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Eylem tamamlandı ve bazı hatalar ortaya çıktı." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "Bağlantı Oluşturuluyor" #~ msgid "_Browse" #~ msgstr "_Tara" #~ msgid "My Computer" #~ msgstr "Bilgisayarım" #~ msgid "_Move" #~ msgstr "_Taşı" #~ msgid "_Trash" #~ msgstr "Çö_p" #~ msgid "_Only for this folder" #~ msgstr "_Sadece bu dizin için" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Ayarın genel değil sadece dizin için olmasını istiyorsanız işaretleyin" #~ msgid "Please select a folder" #~ msgstr "Lütfen bir dizin seçin" #~ msgid "Entry for folder path" #~ msgstr "Dizin yolu için girdi" #~ msgid "Computer" #~ msgstr "Bilgisayar" #~ msgid "Network Drives" #~ msgstr "Ağ Sürücüleri" #~ msgid "_Run in terminal emulator" #~ msgstr "_Uçbirimde öykünücüsünde çalıştır" #~ msgid "_Keep terminal window open after run" #~ msgstr "_Uçbirim penceresini çalıştırıldıktan sonra açık tut" #~ msgid "Shortcuts" #~ msgstr "Kısayollar" #~ msgid "Mount Point" #~ msgstr "Bağlama Noktası" #~ msgid "Create _Symlink" #~ msgstr "Bağlantı _Oluştur" #~ msgid "Se_nd To" #~ msgstr "_Gönder" #~ msgid "empty tag" #~ msgstr "boş etiketi" #~ msgid "tag should have exactly one children" #~ msgstr " etiketi, tam olarak bir çocuğa sahip olmalı" #~ msgid "tag may contain only , , or tag" #~ msgstr "" #~ " etiketi sadece , , veya etiketi " #~ "içerebilir" #~ msgid "merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "birleştirilen dosya sadece üst seviye etiketine sahip olabilir, <" #~ "%s> bulundu" #~ msgid "failed to insert tag <%s> from merging file" #~ msgstr "birleştirilen dosyadan <%s> etiketi ekleme başarısız" #~ msgid "invalid tag" #~ msgstr "geçersiz etiketi" #~ msgid "invalid tag" #~ msgstr "geçersiz etiketi" #~ msgid "cannot find path %s in XML definitions" #~ msgstr "XML tanımlamalarında %s yolu bulunamıyor" #~ msgid "category manipulation internal error" #~ msgstr "kategori değiştirme dahili hatası" #~ msgid "Blank File" #~ msgstr "Boş Dosya" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Hata, lxshortcut kurulu değil" #~ msgid "Failed to start lxshortcut" #~ msgstr "lxshortcut başlatılamadı" #~ msgid "_Group:" #~ msgstr "_Grubu:" #~ msgid "Rename" #~ msgstr "Yeniden Adlandır" #~ msgid "Make the file executable" #~ msgstr "Dosya çalıştırılabilir yap" #~ msgid "Operations that all other users can do" #~ msgstr "Tüm kullanıcıların gerçekleştirebileceği eylemler" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Sadece dosya sahibinin gerçekleştirebileceği eylemler" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Dosya sahibi ile aynı grupta yer alanların gerçekleştirebileceği eylemler" #~ msgid "Read and Write" #~ msgstr "Okuma ve Yazma" #~ msgid "Read only" #~ msgstr "Sadece okunabilir" #~ msgid "Write only" #~ msgstr "Sadece yazılabilir" libfm-1.4.0/po/tt_RU.po000066400000000000000000001401221475513661000146300ustar00rootroot00000000000000# Tatar translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Ainur Shakirov , 2011. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language: tt_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774907.955131\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Яратылган кушымталар" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "Сылтамалар" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "Кушымтаны сайлау" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Файлларны ачу өчен сайланган кушымтаны куллану" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "Урнаштырылган кушымта" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "Команда юлында үтәргә:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "_Карау" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 #, fuzzy msgid "_Execute in terminal emulator" msgstr "Терминал эмуляторында үтәү" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Команда юлында кулланучы махсус ачкычлар\n" " %f: Ялгыз файл исемен чагылдыра\n" " %F: Бернича файл исемен чагылдыра\n" " %u: Ялгыз файл юлын чагылдыра\n" " %U: Берничә файл юлын чагылдыра" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Файлларны ачу өчен кулланучы командасын башкарырга" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "Куланнучы команда юлы" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "Бу файл төрен ачу өчен кушымтаны сайлагыз" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "Файл алыштыруны раслау" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Сикерү" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Икенче исем кушу" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Алыштыру" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Бу каталогта мондый исемле файл инде бар.\n" "\n" "Бу файлны алыштырыргамы?" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "бу файл беләнме?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "Файл исеме:" #: ../data/ui/ask-rename.glade.h:10 #, fuzzy msgid "_Apply this option to all existing files" msgstr "Барлык файлларга бу көйләүне куллану" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "Кушымтаны сайлау" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "Система кушымталары" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "Файлларны чүп чиләгенә күчерү" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "Максат:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Файлны җибәрү" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "_Терминалда җибәрү" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Файл сыйфатлары" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "_Хуҗа:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Урын:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "Максат:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "Файл төре:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "... _белән ачу:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Бу файлны ачучы кушымтаны сайлагыз " #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "Файлларның тулаем зурлыгы:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "Файлларның тулаем зурлыгы:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "Дисктагы зурлык:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "Ахыргы үзгәреш:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "Ахыргы керү:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "Ахыргы керү:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Төп" #: ../data/ui/file-prop.glade.h:16 #, fuzzy msgid "O_wner:" msgstr "Хуҗа:" #: ../data/ui/file-prop.glade.h:17 #, fuzzy msgid "G_roup:" msgstr "Төркем:" #: ../data/ui/file-prop.glade.h:18 #, fuzzy msgid "_View content:" msgstr "Почта клиенты" #: ../data/ui/file-prop.glade.h:19 #, fuzzy msgid "C_hange content:" msgstr "Максат:" #: ../data/ui/file-prop.glade.h:20 #, fuzzy msgid "_Execute:" msgstr "Башкалар:" #: ../data/ui/file-prop.glade.h:21 #, fuzzy msgid "Special bits:" msgstr "... _белән ачу:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Керү белән идарә итү" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "Файлларны күчерү" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Керү хокуклары" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Юк" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "кБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 #, fuzzy msgid "Search Files" msgstr "Файл исемем үзгәртү" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "Файл төре:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 #, fuzzy msgid "File Type" msgstr "Файл төре:" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 #, fuzzy msgid "Te_xt files" msgstr "Файлны бетерү" #: ../data/ui/filesearch.glade.h:19 #, fuzzy msgid "_Image files" msgstr "Файлларны чүп чиләгенә күчерү" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "Файл исемем үзгәртү" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 #, fuzzy msgid "File _Type" msgstr "Файл төре:" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "Дисктагы зурлык:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 #, fuzzy msgid "File Size" msgstr "Файл төре:" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 #, fuzzy msgid "Last Modified Time" msgstr "Ахыргы үзгәреш:" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 #, fuzzy msgid "(None)" msgstr "Юк" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 #, fuzzy msgid "_Properties" msgstr "Файл сыйфатлары" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Веб-браузер" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Сылтамаларны ачу өчен яратылган веб-браузер кулланылачак." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "Почта клиенты" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Хат язу өчен электрон почта адресына бассаң, яратылган почта клиенты " "җибәреләчәк." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Терминал эмуляторы" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Команда юлы:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Система кушымталары" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Файл бәйләнешләре" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Монда:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Әзерләү..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Максат:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Вакыт калды:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "Хаталар барлыкка килде:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Файлны җибәрү" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Урнаштырылган кушымталар" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Челтәр" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Чүп чиләге" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "Сылтамалар" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "КиБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МиБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГиБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТиБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Көйләү" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "Файлны җибәрү" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "Файлларны ачу өчен сайланган кушымтаны куллану" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Урнаштырылган кушымталар" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "<Үз эченә алган каталоглар юк>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Йөкләү..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "Гамәлдән чыгарылды" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave хатасы." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 #, fuzzy msgid "Open _With..." msgstr "... белән ачу" #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "... белән ачу" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "Кыстыргычлардан бетерү" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "_Икенче исем кушу" #: ../src/gtk/fm-file-menu.c:163 #, fuzzy msgid "Co_mpress..." msgstr "Кысу..." #: ../src/gtk/fm-file-menu.c:164 #, fuzzy msgid "Extract _Here" msgstr "Монда тартып чыгару" #: ../src/gtk/fm-file-menu.c:165 #, fuzzy msgid "E_xtract To..." msgstr "Монда тартып чыгару..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 #, fuzzy msgid "Prop_erties" msgstr "Файл сыйфатлары" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "Чүп чиләге" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "Файлларны чүп чиләгенә күчерү" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "байт" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Дөрес булган кулланучы исемен яки тиңләштерү санын кертегез." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Дөрес булган төркем исемен яки тиңләштерү санын кертегез." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Эчкә аалынган барлыр файлларга һәм каталогларга кулланыргамы?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Йөкләү..." #: ../src/gtk/fm-file-properties.c:1089 #, fuzzy msgid "_Access content:" msgstr "Керү белән идарә итү" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Төрле файллар" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "Файл төре:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Берничә файл" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Исем" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Тасвирлама" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Зурлык" #: ../src/gtk/fm-folder-model.c:193 #, fuzzy msgid "Permissions" msgstr "_Керү хокуклары" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Үзгәргән" #: ../src/gtk/fm-folder-model.c:196 #, fuzzy msgid "Location" msgstr "Урын:" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "Файлны җибәрү" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "Файл исемем үзгәртү" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "Файл сыйфатлары" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "Каталогны сайлагыз" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 #, fuzzy msgid "By _Name" msgstr "Исем" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 #, fuzzy msgid "By _Size" msgstr "Зурлык" #: ../src/gtk/fm-folder-view.c:222 #, fuzzy msgid "By File _Type" msgstr "Файл төре:" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Файл исемем үзгәртү" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "Яңа исем кушыгыз:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "Символик сылтама өстәү" #: ../src/gtk/fm-folder-view.c:866 #, fuzzy msgid "New" msgstr "Челтәр" #: ../src/gtk/fm-folder-view.c:876 #, fuzzy, c-format msgid "Enter a name for the new %s:" msgstr "Яңа исем кушыгыз:" #: ../src/gtk/fm-folder-view.c:879 #, fuzzy, c-format msgid "Creating %s" msgstr "Символик сылтама өстәү" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "«%s» текст файлы үтәлүче скрипт булуы ихтимал.\n" "Нинди эш корырга телисез?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "«%s» файлы үтәлүче. Җибәрергәме?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Каталогны сайлагыз" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Хата" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Раслау" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Сорау" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Бу эшне үтәү өчен сезгә система администраторы хокуклары кирәк." #: ../src/gtk/fm-gtk-utils.c:924 #, fuzzy, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Сайланган файлларны чүп чиләгенә күчерергәме?" #: ../src/gtk/fm-gtk-utils.c:929 #, fuzzy, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Сайланган файлларны чүп чиләгенә күчерергәме?" #: ../src/gtk/fm-gtk-utils.c:989 #, fuzzy, c-format msgid "Do you want to delete the file '%s'?" msgstr "Сайланган файлларны бетерергәме?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Сайланган файлларны бетерергәме?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Файл исемем үзгәртү" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Яңа исем кушыгыз:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Чүп чиләген чистартыргамы?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Файл бәйләнешләре" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Файл исемем үзгәртү" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Эш өстәле" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Кушымталар" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "Файл төре:" #: ../src/gtk/fm-places-view.c:132 #, fuzzy msgid "_Mount Volume" msgstr "Логик дискны кору" #: ../src/gtk/fm-places-view.c:133 #, fuzzy msgid "_Unmount Volume" msgstr "Логик дискны корудан чыгару" #: ../src/gtk/fm-places-view.c:134 #, fuzzy msgid "_Eject Removable Media" msgstr "Алынмалы дискны чыгару" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "Логик дискны кору" #: ../src/gtk/fm-places-view.c:151 #, fuzzy msgid "_Rename Bookmark Item" msgstr "Кыстыргычның исемен үзгәртү" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "Кыстыргычлардан бетерү" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "Кыстыргычлардан бетерү" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "Кыстыргычлардан бетерү" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 #, fuzzy msgid "_Empty Trash Can" msgstr "Чүп чиләген чистарту" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Кыстыргычның исемен үзгәртү" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Яңа исем кушыгыз:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Төр: %s\n" "Зурлык: %s\n" "Үзгәргән: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Төр: %s\n" "Үзгәргән: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Файл операциясе хаталар аркасында гамәлдән чыгарылды." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Гамәлдән чыгарылды" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "Файл операциясе хаталар аркасында гамәлдән чыгарылды." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Үтәлде" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Кайбер файллар чүп чиләгенә күчерелмәде, чөнки бу эшне файл системасы " "тотмый.\n" "Моннан соң да файлларны бетерергәме?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_Торгызу" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Файлларны күчерү" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Файлларның күчермәләрен алу" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Файлларны чүп чиләгенә күчерү" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Файлны бетерү" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Символик сылтама өстәү" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "Монда:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Символик сылтама өстәү" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Файл аергычларын үзгәртү" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Файл аергычларын үзгәртү" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_Торгызу" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "Файлларны чүп чиләгенә күчерү" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "Файл төре:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "Файл төре:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 #, fuzzy msgid "_Places" msgstr "Урыннар" #: ../src/gtk/fm-side-pane.c:68 #, fuzzy msgid "_Directory Tree" msgstr "Каталоглар агачы" #: ../src/gtk/fm-side-pane.c:69 #, fuzzy msgid "_Remote" msgstr "Челтәр" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Урыннар" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Каталоглар агачы" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "Каталог дөрес күрсәтелмәгән" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Файлларны чүп чиләгеннән торгызу" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Чыганак һәм максат туры килә." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Каталогны үз эченә алган каталогына күчереп булмый" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Каталогны үз эченә алган каталогына күчермә ясап булмый" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Килү ноктасы - чыганакның үз эченә алган каталог" #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "Каталогны үз эченә алган каталогына күчермә ясап булмый" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Файл исемем үзгәртү" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Файлны җибәрү" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "Монда:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "Урын:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "_Хуҗа:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "Монда:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "Кушымтаны сайлау" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Эш өстәле" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Торгызу" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Файлларны чүп чиләгеннән торгызу" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "СD диск" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Буш CD-диск" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R диск" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Буш CD-R диск" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW диск" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Буш CD-RW диск" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM диск" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Буш DVD-ROM диск" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW диск" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Буш DVD-RW диск" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM диск" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Буш DVD-RAM диск" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R диск" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Буш DVD+R диск" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW диск" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Буш DVD+RW диск" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL диск" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Буш DVD+R DL диск" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL диск" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Буш DVD+RW DL диск" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray диск" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Буш Blu-Ray диск" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R диск" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Буш Blu-Ray R диск" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW диск" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Буш Blu-Ray RW диск" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD диск" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Буш HD DVD диск" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R диск" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Буш HD DVD-R диск" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW диск" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Буш HD DVD-RW диск" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO диск" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Буш MO диск" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW диск" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Буш MRW диск" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W диск" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Буш MRW/W диск" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Буш оптикал диск" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Оптикал диск" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Ачыла торган файлның төре:" #~ msgid "Processing:" #~ msgstr "Башкарыла:" #~ msgid "Progress:" #~ msgstr "Башкарылды:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Файл операциясе хаталар белән үтәлде." #~ msgid "_Browse" #~ msgstr "_Карау" #~ msgid "My Computer" #~ msgstr "Минем компьютер" #~ msgid "Please select a folder" #~ msgstr "Каталогны сайлагыз" #, fuzzy #~ msgid "Computer" #~ msgstr "Минем компьютер" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Челтәр" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "Терминал эмуляторында үтәү" #~ msgid "Shortcuts" #~ msgstr "Сылтамалар" #~ msgid "Mount Point" #~ msgstr "Кору ноктасы" #, fuzzy #~ msgid "Create _Symlink" #~ msgstr "Символик сылтама өстәү" #, fuzzy #~ msgid "Se_nd To" #~ msgstr "Тапшыру" #, fuzzy #~ msgid "Blank File" #~ msgstr "Буш MO диск" #~ msgid "_Group:" #~ msgstr "_Төркем:" #~ msgid "Rename" #~ msgstr "Исемне үзгәртү" #~ msgid "Make the file executable" #~ msgstr "Файлны үтәүче итергә" #~ msgid "Operations that all other users can do" #~ msgstr "Башка кулланучыларның хокуклары" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Файл хуҗасының хокуклары" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "Файл хуҗасы кергән төркемнең хокуклары" #~ msgid "Read and Write" #~ msgstr "Уку һәм Язу" #~ msgid "Read only" #~ msgstr "Уку гына" #~ msgid "Write only" #~ msgstr "Язу гына" libfm-1.4.0/po/ug.po000066400000000000000000001521521475513661000142140ustar00rootroot00000000000000# Uyghur translation for libfm. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Gheyret Kenji,2011. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2014-10-14 07:36+0000\n" "Last-Translator: Gheyret Kenji \n" "Language-Team: Uyghur Computer Science Association \n" "Language: ug\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1413272173.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "ئامراق پروگراممىلار" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "تېزلەتمە تەھرىرلىگۈچ" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "پروگرامما تاللاش" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "ھۆججەتلەرنى تاللانغان پروگراممىدا ئېچىش" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "ئورنىتىلغان پروگرامما(_I)" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "ئىجرا قىلىدىغان بۇيرۇق قۇرى(_O):" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "كۆز يۈگۈرت(_B)" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "تېرمىنال تەقلىدلىگۈچتە ئىجرا قىل(_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "بۇ ئالاھىدە كودلار بۇيرۇق قۇرىدا ئىشلىتىلىدۇ:\n" " %f: بىرلا ھۆججەتنى ئىپادىلەيدۇ\n" " %F: بىر قانچە ھۆججەتنى ئىپادىلەيدۇ\n" " %u: ھۆججەتنىڭ بىرلا URI سىنى ئىپادىلەيدۇ\n" " %U: بىر قانچە URI لارنى ئىپادىلەيدۇ" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" "پروگرامما ئاتى(_A) (ئىختىيار؛ مۇناسىۋەتنى ساقلاش ئۈچۈن ئىشلىتىلىدۇ)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "ھۆججەتلەرنى بۇيرۇق قۇرىدا ئىجرا قىلغان پروگراممىدا ئېچىش" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "ئىختىيارىي بۇيرۇق قۇرى(_C)" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "" "بۇ تىپتىكى ھۆججەتنىڭ كۆڭۈلدىكى مەشغۇلاتىغا تاللانغان پروگراممىنى بەلگىلە(_S)" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "ھۆججەتلەرنى ئالماشتۇرۇشنى جەزملەش" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "ئۆتكۈزۈۋەت(_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "ئاتىنى ئۆزگەرت(_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "قاپلا(_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "بۇ يەردە ئوخشاش ئاتتىكى ھۆججەت بار.\n" "\n" "قاپلامسىز؟" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "تۆۋەندىكى ھۆججەت بىلەن؟" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "ھۆججەت ئاتى(_F):" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "بۇ تاللانمىنى بارلىق ھۆججەتكە قوللان(_A)" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "سىنبەلگە تاللاش…" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "سىستېما سىنبەلگە ئۆرنەكلىرى" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "سۈرەت ھۆججەتلىرى" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "سىنبەلگە بۇ يەردىن تاللانسۇن:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "ھۆججەت ئىجرا قىلىش" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "تېرمىنالدا ئىجرا قىل(_T)" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "ھۆججەت خاسلىقى" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "قىسقۇچ كۆرۈنۈشىدىكى ھۆججەتنىڭ سىنبەلگىسى" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "ئاتى(_N)" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "ئورنى:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "نىشان ھۆججەت:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "ھۆججەت تىپى:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "ئاچىدىغان پروگرامما(_W)" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "بۇ تىپتىكى ھۆججەتنى ئاچىدىغان پروگراممىنى تاللاش " #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "ھۆججەتلەرنىڭ جەمئىي چوڭلۇقى:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "ھۆججەتلەرنىڭ جەمئىي چوڭلۇقى:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "دىسكىدىكى چوڭلۇقى:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "ئەڭ ئاخىرقى تۈزىتىلگەن ۋاقتى:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "ئەڭ ئاخىرقى زىيارەت قىلىنغان ۋاقتى:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "ئەڭ ئاخىرقى زىيارەت قىلىنغان ۋاقتى:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "ئادەتتىكى(_G)" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "ئېگىسى(_W):" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "گۇرۇپپىسى(_R):" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "مەزمۇننى كۆرەي(_V):" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr " مەزمۇننى ئۆزگەرت(_C):" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "ئىجرا قىل(_E):" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "ئالاھىدە بىتلار:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "ھۆججەت/مۇندەرىجىنىڭ مەزمۇنىنى كىم ئوقۇيالايدۇ" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "ھۆججەت/مۇندەرىجىنىڭ مەزمۇنىنى كىم ئۆزگەرتەلەيدۇ" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "ھۆججەتنى كىم ئىجرا قىلالايدۇ ياكى مۇندەرىجىگە كىرەلەيدۇ" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "ھۆججەتنى ئىجرا قىلىدىغان ئالاھىدە بەلگىلەر" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "مۇندەرىجىنى زىيارەت قىلىدىغان ئالاھىدە بەلگىلەر" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "زىيارەتنى تىزگىنلەش" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "يوشۇرۇن ھۆججەت" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "ئىمتىيازلار(_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "يوق" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "چاپلىشاڭغۇ" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "بەلگىلەش(GID نى)" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "چاپلىشاڭغۇ ۋە GID نى بەلگىلەش" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy msgid "Set UID" msgstr "بەلگىلەش(UID نى)" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "بەلگىلەش(UID ۋە GID نى)" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy msgid "Only owner" msgstr "ئىگىسىلا" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "ئىگىسى ۋە گۇرۇپپىلا" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "ھەممەيلەن" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "ھېچكىم" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "بايت" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "كىلوبايت" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "مېگابايت" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "گىگابايت" #: ../data/ui/filesearch.glade.h:5 #, fuzzy msgid "Choose Date" msgstr "چېسلا تاللاش" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "چېسلانى تۆۋەندىكى يىلنامىدىن تاللا" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "ھۆججەت ئىزدەش" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "ھۆججەت ئاتى ئەندىزىلىرى(_N):" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "چوڭ كىچىكلىكىگە قارىسۇن(_T)" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "مۇنتىزىم ئىپادە(_R)" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "ئىزدەيدىغان ئورۇنلار(_E)" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "تارماق مۇندەرىجىلەرنىمۇ ئىزدىسۇن(_S)" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "يوشۇرۇن ھۆججەتلەرنى ئىزدىسۇن(_H)" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "ئاتى/ئورنى(_L)" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "ھۆججەت تىپى" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "تۆۋەندىكى تىپتىكى ھۆججەتلەرنىلا ئىزدىسۇن:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "تېكىست ھۆججەتلىرى(_X)" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "سۈرەت ھۆججەتلىرى(_I)" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "ئۈن ھۆججەتلىرى(_A)" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "سىن ھۆججەتلىرى(_V)" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "پۈتۈكلەر(_D)" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "مۇندەرىجە" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "ھۆججەت تىپى(_T)" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "ھۆججەت مەزمۇنى(_S)" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "مەزمۇنى(_O)" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "ھۆججەت چوڭلۇقى" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "بۇنىڭدىن كىچىك(_S):" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "بۇنىڭدىن چوڭ(_B):" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "ئەڭ ئاخىرقى زىيارەت قىلىنغان ۋاقتى" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(يوق)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "بۇنىڭدىن ئىلگىرىكى(_E):" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "بۇنىڭدىن كېيىنكى(_A):" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "خاسلىقلىرى(_P)" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "توركۆرگۈ" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "ئۇلانمىلارنى ئېچىشتا ئىشلىتىدىغان ئامراق توركۆرگۈ." #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "خەت خېرىدارى" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "ئېلخەت ئادرېسىنى چەككەندە ئېلخەت يېزىش ئۈچۈن ئىشلىتىلىدىغان ئامراق خەت " "خېرىدارى" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "تېرمىنال تەقلىدلىگۈچى" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "بۇيرۇق قۇرى:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "سىستېما پروگراممىلىرى" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "ھۆججەت باغلىنىش" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "نىشان:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "تەييارلىق قىلىۋاتىدۇ..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "نىشان ھۆججەت:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "قالغان ۋاقىت:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "ئازراق خاتالىق كۆرۈلدى:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "ھۆججەت ئىجرا قىلىش" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "تاللاشنى تەتۈر قىل(_I)" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "مەشغۇلاتنى قوللىمايدۇ" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "ئىناۋەتسىز ئۈستەلئۈستى كىرگۈ ھۆججىتى: ‹%s›" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "تور" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "ئەخلەتخانا" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "URI نىڭ تېزلەتمىسى" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: ئىناۋەتسىز پارامېتىر" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "ئىناۋەتسىز تىزىملىك مۇندەرىجىسى" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "تېرابايت" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u بايت" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "كىلوبايت" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "مېگابايت" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "گىگابايت" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "تېرابايت" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "ھەرپ نەقىلى چېكىتلىك پەش بىلەن ئاخىرلاشمىغان؛ بەلكىم ئەمەلىي گەۋدە ئىشلەتمەي " "& بەلگىسى ئىشلەتكەن بولۇشىڭىز ئېھتىمالغا بەك يېقىن - بۇ & غا ئۆزگىرىدۇ" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "ھەرپ نەقىلى '%-.*s' يول قويۇلغان كودلاش ئەمەس" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "بوش ئەمەلىي گەۋدە '&;' بايقالدى. ئىناۋەتلىك ئەمەلىي گەۋدە: & " < " "> '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "ئېلېمېنت '%s' يېپىلدى، بىراق ھازىر ئېلېمېنت '%s' ئېچىلغان ئىدى" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "ئۆزلەشتۈرۈش" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "ھۆججەت ئىجرا قىلىش" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "ھۆججەت «%s» نى ئاچىدىغان پروگراممىنى تاللاڭ" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "ئورنىتىلغان پروگراممىلار" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "<تارماق قىسقۇچ يوق>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "ئوقۇۋاتىدۇ..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "ۋاز كەچتى" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave مەغلۇپ بولدى." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "ئاچ(_O)" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "بۇنىڭ بىلەن ئاچ(_W)…" #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "بۇنىڭ بىلەن ئاچ(_W)…" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "خەتكۈچتىن چىقىرىۋەت(_M)" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "ئاتىنى ئۆزگەرت(_R)" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "پرېسلا(_M)…" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "بۇ يەرگە ياي(_H)" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "يايىدىغان ئورۇن(_X)…" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "خاسلىقلار(_E)" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "ئەخلەتخانا" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "سۈرەت ھۆججەتلىرى(_I)" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "بايت" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "ئىناۋەتلىك ئىشلەتكۈچى ئاتى ياكى رەقەملىك كىملىكىنى كىرگۈزۈڭ." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "ئىناۋەتلىك گۇرۇپپا ئاتى ياكى رەقەملىك كىملىكىنى كىرگۈزۈڭ." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "بۇلارنى بارلىق ھۆججەت ۋە تارماق مۇندەرىجىگە چوڭقۇرلاپ قوللىنامسىز؟" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "ئوقۇۋاتىدۇ..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "زىيارەت مەزمۇنى(_A):" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "ئوخشىمىغان تىپتىكى ھۆججەتلەر" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "ھۆججەت تىپى:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "بىر قانچە ھۆججەتلەر" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "ئاتى" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "چۈشەندۈرۈلۈشى" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "چوڭلۇقى" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "ھوقۇقلىرى" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "ئىگىسى" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "ئۆزگەرتىلدى" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "ئورنى" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "يېڭىدىن قۇرۇش…" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "مۇندەرىجە" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "ھۆججەت ئىجرا قىلىش" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "تاللاشنى تەتۈر قىل(_I)" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "ھۆججەتلەرنى تەرتىپلە(_S)" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "ھۆججەت ئاتىنى ئۆزگەرت" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "ھۆججەت خاسلىقى" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "يوشۇرۇننى كۆرسەت(_H)" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "قىسقۇچ بىلەن ھۆججەت ئارىلاش(_F)" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "چوڭ-كىچىك يېزىلىشىغا قارىمىسۇن(_I)" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "ئاتى بويىچە(_N)" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "ئۆزگەرتىلگەن ۋاقتى بويىچە(_M)" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "چوڭلۇقى بويىچە(_S)" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "ھۆججەت تىپى بويىچە(_T)" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "يېڭى قۇرماقچى بولغان قىسقۇچنىڭ ئاتىنى كىرگۈزۈڭ:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "ھۆججەت ئاتىنى ئۆزگەرت" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "يېڭى قۇرماقچى بولغان ھۆججەتنىڭ ئاتىنى كىرگۈزۈڭ:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "يېڭىدىن قۇرۇش…" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "يېڭى" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "يېڭى %s نىڭ ئىسمىنى كىرگۈزۈڭ:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "قۇرۇۋاتقىنى «%s»" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "مەزكۇر تېكىست ھۆججىتى ‹%s› ئىجرا بولىدىغان قوليازما پروگراممىسىدەك قىلىدۇ.\n" "بۇنى قانداق قىلغۇڭىز بار؟" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "بۇ ھۆججەت ‹%s› ئىجرا بولىدىكەن. ئۇنى ئىجرا قىلامسىز؟" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "قىسقۇچلار كۆرسىتىلمىگەن." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "قىسقۇچ تاللاش" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "خاتالىق" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "جەزملە" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "سوئال" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "سىستېما باشقۇرغۇچىسىنىڭلا مۇشۇنداق ئىمتىيازى بار." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "تاللانغان ھۆججەت ‹%s› نى ئەخلەتخانىغا يۆتكەمسىز؟" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "تاللانغان %d ھۆججەتنى ئەخلەتخانىغا يۆتكەمسىز؟" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "ھۆججەت ‹%s› نى ئۆچۈرەمسىز؟" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "تاللانغان ھۆججەت %d نى ئۆچۈرەمسىز؟" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "ھۆججەت ئاتىنى ئۆزگەرت" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "يېڭى ئاتى:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "ئەخلەتخانىنى قۇرۇقدامسىز؟" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "ھۆججەت باغلىنىش" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "ھۆججەت ئاتىنى ئۆزگەرت" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "ئۈستەلئۈستى" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "پروگراممىلار" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "ھۆججەت تىپى(_T)" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "دىسكىنى ئېگەرلە(_M)" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "دىسكا ئېگەرسىزلە(_U)" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "يۆتكىلىشچان ۋاسىتىنى چىقار(_E)" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "دىسكىنى ئېگەرلە(_M)" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "خەتكۈش تۈرىنىڭ ئاتىنى ئۆزگەرت(_R)" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "خەتكۈچتىن چىقىرىۋەت(_M)" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "خەتكۈچتىن چىقىرىۋەت(_M)" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "خەتكۈچتىن چىقىرىۋەت(_M)" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "ئەخلەتخانىنى تازىلا(_E)" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "خەتكۈش تۈرىنىڭ ئاتىنى ئۆزگەرتىش" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "يېڭى ئاتىنى:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "تىپى: %s\n" "چوڭلۇقى: %s\n" "تۈزىتىلگەن ۋاقىت: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "تىپى: %s\n" "تۈزىتىلگەن ۋاقىت: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "ھۆججەت مەشغۇلاتى تاماملاندى، بىراق خاتالىق كۆرۈلدى." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "ۋاز كەچتى" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "ھۆججەت مەشغۇلاتى تاماملاندى، بىراق خاتالىق كۆرۈلدى." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "تاماملاندى" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "ھۆججەت سىستېمىسى قوللىمىغانلىقى ئۈچۈن بىر قانچە ھۆججەتلەرنى ئەخلەتخانىغا " "يۆتكىگىلى بولمىدى.\n" "بۇلارنى ئۆچۈرۈۋېتەمسىز؟" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "ئەسلىگە كەلتۈر(_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "، " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "ھۆججەت يۆتكەۋاتىدۇ" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "ھۆججەتلەرنى كۆچۈرۈۋاتىدۇ" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "ھۆججەتلەرنى ئەخلەتخانىغا يۆتكەۋاتىدۇ" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "ھۆججەت ئۆچۈرۈۋاتىدۇ" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "ھۆججەت خاسلىقىنى ئۆزگەرتىۋاتىدۇ" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "ئەسلىگە كەلتۈر(_R)" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s ھۆججەت" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s ھۆججەت:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s ھۆججەت:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "ئېتىك(_O)" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "ئورۇنلار(_P)" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "مۇندەرىجە دەرىخى(_D)" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "يىراق(_R)" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "ئورۇنلار" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "مۇندەرىجە دەرىخى" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "كۆرسىتىلگەن مۇندەرىجە ‹%s› ئىناۋەتسىز" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" "ئەخلەتخانىدىكى ھۆججەت ‹%s› نى ئەسلىدىكى ئورنىغا ئەسلىگە كەلتۈرەلمىدى. " "ئەسلىدىكى ئورنى ئېنىق ئەمەس." #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "مەنبە ۋە نىشان ئوپئوخشاش." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "قىسقۇچنى ئۇنىڭ ئۇچىدىكى تارماق قىسقۇچقا يۆتكىگىلى بولمايدۇ" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "قىسقۇچنى ئۇنىڭ ئۇچىدىكى تارماق قىسقۇچقا كۆچۈرگىلى بولمايدۇ" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "نىشان مەنبەنىڭ تارماق قىسقۇچى ئىكەن" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "ھۆججەت ‹%s› نى كۆچۈرەلمىدى: قوللىمايدۇ" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "تىزىملىك غەملىكى خاتالىقى" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "ئىناۋەتسىز تىزىملىك مۇندەرىجىسى" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "ئىناۋەتسىز تىزىملىك مۇندەرىجىسى ‹%s›" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "ئىناۋەتسىز تىزىملىك مۇندەرىجىسى" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "خاسلىق ‹%s› نى تەڭشەشنى قوللىمايدۇ" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "ئىناۋەتسىز ھۆججەت ئاتى %s" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "‹%s› تىزىملىك مۇندەرىجىسىدۇر" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "‹%s› تىزىملىك ئەزاسى ئەمەس" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, fuzzy, c-format msgid "Cannot create menu item '%s'" msgstr "ئىناۋەتسىز ھۆججەت ئاتى %s" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "ئىزدە" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "ھۆججەت ئىزدەش" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "ھۆججەت ئىجرا قىلىش" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "نىشان:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "ئورنى:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "ئىگىسى(_O):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "نىشان:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "پروگرامما تاللاش" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "ئۈستەلئۈستى" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "ئەسلىگە كەلتۈر(_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "ئەخلەتخانىدىكى ھۆججەتنى ئەسلىدىكى ئورنىغا ئەسلىگە كەلتۈرىدۇ" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM دىسكا" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "بوش CD_ROM دىسكا" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R دىسكا" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "قۇرۇق CD-R دىسكا" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW دىسكا" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "قۇرۇق CD-RW دىسكا" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM دىسكا" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "بوش DVD-ROM دىسكا" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW دىسكا" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "قۇرۇق DVD-RW دىسكا" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM دىسكا" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "قۇرۇق DVD-RAM دىسكا" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R دىسكا" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "قۇرۇق DVD+R دىسكا" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW دىسكا" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "قۇرۇق DVD+RW دىسكا" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R DL دىسكا" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "بوش DVD+R DL دىسكا" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW DL دىسكىسى" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "قۇرۇق DVD+RW DL دىسكا" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "كۆكنۇر دىسكا" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "بوش كۆكنۇر دىسكا" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "كۆكنۇر R دىسكا" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "بوش كۆكنۇر R دىسكا" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "كۆكنۇر RW دىسكا" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "بوش كۆكنۇر RW دىسكا" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD دىسكا" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "بوش HD DVD دىسكا" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R دىسكا" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "بوش HD DVD-R دىسكا" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW دىسكا" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "بوش HD DVD-RW دىسكا" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO دىسكا" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "بوش MO دىسكا" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW دىسكىسى" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "قۇرۇق MRW دىسكا" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W دىسكىسى" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "قۇرۇق MRW/W دىسكا" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "ئۈن ھۆججەتلىرى(_A)" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "قۇرۇق نۇر دىسكا" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "ئوپتىك دىسكا" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "ئاچىدىغان ھۆججەت تىپى:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "بىر تەرەپ قىلىنىۋاتقىنى:" #~ msgid "Progress:" #~ msgstr "ئىجرا:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "ھۆججەت مەشغۇلاتى تاماملاندى، بىراق بىر قانچە خاتالىق كۆرۈلدى." #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "بەلگە ئۇلانما قۇرۇۋاتىدۇ" #~ msgid "_Browse" #~ msgstr "كۆز يۈگۈرت(_B)" #~ msgid "My Computer" #~ msgstr "كومپيۇتېرىم" #~ msgid "_Only for this folder" #~ msgstr "مۇشۇ قىسقۇچقىلا(_O)" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "قىسقۇچنىڭلا تەرتىپلەش تەڭشىكىنى ساقلاش ئەستە تۇتۇش ئۈچۈن تاللاڭ" #~ msgid "Please select a folder" #~ msgstr "قىسقۇچتىن بىرنى تاللاڭ." #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "مۇشۇ قىسقۇچقىلا(_O)" #, fuzzy #~ msgid "Computer" #~ msgstr "كومپيۇتېرىم" #, fuzzy #~ msgid "Network Drives" #~ msgstr "تور" #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "تېرمىنال تەقلىدلىگۈچتە ئىجرا قىل(_E)" #~ msgid "Shortcuts" #~ msgstr "تېزلەتمىلەر" #~ msgid "Mount Point" #~ msgstr "ئېگەرلەش نۇقتىسى" #~ msgid "Create _Symlink" #~ msgstr "بەلگە ئۇلانما قۇر(_S)" #~ msgid "Se_nd To" #~ msgstr "ئەۋەت(_N)" #~ msgid "Blank File" #~ msgstr "قۇرۇق ھۆججەت" #~ msgid "Error, lxshortcut not installed" #~ msgstr "خاتا، lxshortcut ئورنىتىلماپتۇ" #~ msgid "Failed to start lxshortcut" #~ msgstr "مەغلۇپ بولدى(lxshortcut نى قوزغىتىش)" #~ msgid "_Group:" #~ msgstr "گۇرۇپپا(_G):" #~ msgid "Rename" #~ msgstr "ئات ئۆزگەرت" #~ msgid "Make the file executable" #~ msgstr "ھۆججەتنى ئىجرا بولىدىغان قىلىش" #~ msgid "Operations that all other users can do" #~ msgstr "باشقا ئىشلەتكۈچىلەر قىلالايدىغان مەشغۇلاتلار" #~ msgid "Operations that the owner of the file can do" #~ msgstr "ھۆججەت ئىگىسى ئېلىپ بارالايدىغان مەشغۇلاتلار" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "ھۆججەت ئىگىسى بىلەن ئوخشاش گۇرۇپپىدىكىلەر ئېلىپ بارالايدىغان مەشغۇلاتلار" #~ msgid "Read and Write" #~ msgstr "ئوقۇش ۋە يېزىش" #~ msgid "Read only" #~ msgstr "ئوقۇشقىلا بولىدىغان" #~ msgid "Write only" #~ msgstr "يېزىشلا" libfm-1.4.0/po/uk.po000066400000000000000000001672061475513661000142260ustar00rootroot00000000000000# Ukrainian translations for libfm package. # Copyright (C) 2010 # This file is distributed under the same license as the libfm package. # Yarema aka Knedlyk , 2010-2013. # Andriy aka LStranger , 2012-2013. msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2018-04-12 21:29+0000\n" "Last-Translator: Andriy Grytsenko \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 2.8\n" "X-POOTLE-MTIME: 1523568555.237472\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Улюблені програми" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" "Вибір програм, що викликаються по клацанню на Web посилання або поштову " "адресу" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "Редактор ярликів" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "Створення або редагування ярлику програми" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "Вибрати програму" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Використати вибрану програму для відкриття файлів цього типу" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "_Встановлені програми" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "_Командна стрічка для виконання:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "Ви_брати..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "Виконати в _емуляторі терміналу" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "_Залишити вікно терміналу після завершення виконання" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Ці спеціальні коди можна використати в командній стрічці:\n" " %f: означає назву одного файлу\n" " %F: означає назву багатьох файлів\n" " %u: означає URI файлу\n" " %U: означає багато URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "_Назва програми (для збереження асоціації з файлами цього типу)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Виконати власну команду для відкриття файлів" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "_Інша командна стрічка" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "Встановити вибрану програму _як типову дію для файлів цього типу" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "Підтвердити заміщення файлів" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "Пр_опустити" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "Пере_йменувати" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Перезаписати" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Вже існує файл з такою назвою в цьому місці.\n" "\n" "Ви бажаєте замінити існуючий файл" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "наступним файлом?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "_Назва файлу:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Застосувати цю опцію до всіх існуючих файлів" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "Виберіть піктограму..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "системної теми значків" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "файлів зображень" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "Вибрати значок з:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Виконати файл" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Виконати в _емуляторі терміналу" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Властивості файлу" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "Значок файлу, що буде показаний у теці" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "_Назва:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Місцезнаходження:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "Посилається на:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "Тип файлу:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "_Відкривати з:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Виберіть програму для відкриття файлів цього типу " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "Загалом файлів:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "Загальний розмір файлів:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "Розмір на диску:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "Останнє оновлення:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "Останній доступ:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "Остання зміна дозволів:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Загальне" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Власник:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "Гру_па:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "Дивитис_я вміст:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "З_мінювати вміст:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "В_иконувати:" # "Опції" для співпадіння з підказками до цього. #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Особливі опції:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Хто може читати вміст файлу чи теки" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Хто може змінювати вміст файлу чи теки" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Хто може виконувати файл чи заходити до теки" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Особливі опції виконання файлу" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Особливі опції доступу до теки" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Контроль доступу" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "Схований файл" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Дозволи" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Немає" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "Стійкий біт" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Встановити GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Стійкий та встановити GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "Встановити UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Встановити UID та GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "Лише власник" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Лише власник та група" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Будь-хто" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Ніхто" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Байт" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "КБ" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "МБ" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "ГБ" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "Виберіть дату" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Виберіть дату у наступному календарі" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Пошук файлів" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "Шаблон _назви файлу:" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "Шаблон може бути або шаблоном оболонки згідно POSIX (декілька шаблонів мають " "бути розділені комою), або POSIX регулярний вираз." #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Ігнорувати регістр" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "Ви_користовувати регулярний вираз" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "Д_е шукати:" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Шукати у _підтеках" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "Шукати с_ховані файли" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "_Шлях пошуку" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Тип файлу" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "Шукати лише файли наступних типів:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Т_екстові файли" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "Файли зобра_жень" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "_Звукові файли" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Віде_о файли" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "_Документи" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "Тек_и" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "_Інше:" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "Введіть потрібний тип файлу. Шаблон '*' можна застосовувати на кінці типу. " "Декілька значень мають бути розділені ';'." #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Тип файлу" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "_Файл містить:" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "_Вміст" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Розмір файлу" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Менші ніж:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Більші ніж:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Час останньої зміни" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Немає)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "Д_авніші ніж:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Новіші ніж:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "В_ластивості" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Веб-переглядач" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" "Улюблений веб-переглядач, що буде використаний для відкриття гіперпосилань." #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "Поштовий клієнт" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Улюблений поштовий клієнт, що буде використаний для створення електронного " "листа при клацанні на e-mail адрес." #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Емулятор терміналу" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Командна стрічка:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Системні програми" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Асоціації файлів" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "До:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Підготовлюю..." #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "Даних перенесено:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Залишилось часу:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "Сталися такі помилки:" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "Порожнє значення" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "Неприпустимий вибір" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Дія не підтримується" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Зіпсований файл ярлику програми: '%s'" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "Не вдалося визначити тип вмісту файлу '%s' для його виконання" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "Типову програму для завантаження URI %s:// не обрано" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "Не вдалося змінити робочу теку до '%s': %s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "Типову програму для типу MIME %s не обрано" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "Пристрої" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Мережа" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Смітник" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "посилання на URI" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file: помилковий параметр" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "Емулятор терміналу не обрано у конфігурації" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "Опис створювача мініатюр недійсний" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "кБ" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "ТБ" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" msgstr[1] "%u байти" msgstr[2] "%u байт" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "КіБ" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "МіБ" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "ГіБ" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "ТіБ" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "Фрагмент URI '%s' містить неприпустимі екрановані символи" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "Підтримку теґу <%s> вже призначено" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "Помилка аналізу '%-.*s', де має бути число у символьному посиланні " "(наприклад, ê), можливо, число надто велике" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "Посилання на символ не закінчується крапкою з комою, схоже символ '&' було " "використано не для позначення початку предикату – екрануйте його як &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "Посилання на символ \"%-.*s\" не визначає дозволений символ" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" "Виявлено порожній предикат \"&;\"; допустимими предикатами є: & " " "< > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "Назва елементу '%-.*s' невідома" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "Предикат не закінчується крапкою з комою; очевидно, що символ '&' було " "використано не для позначення початку предикату – екрануйте його як &" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "Закриваючий теґ не може містити порожнин" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "Було закрито елемент '%s', але жодного елементу не було відкрито" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "Було закрито елемент \"%s\", але зараз відрито елемент \"%s\"" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "Неприпустимий символ '%c' на початку значення атрибуту" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "Неприпустимий символ '%c' на кінці значення атрибуту, мав бути '%c'" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "Несподіване закінчення документу" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "Документ порожній чи містить лише пропуски" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data: помилка у даних XML" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Налаштувати" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "Виконувані файли" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "Оберіть програму для відкриття файлів \"%s\"" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Встановлені програми" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<Немає підтеки>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Завантажую..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "Показує дерево тек у боковій панелі" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "_Відмінити" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "_Копіювати сюди" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "_Перемістити сюди" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "_Створити посилання" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave не вдалося." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "Ві_дкрити" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "В_ідкрити з..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "В_ідкрити з" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "Копіювати шл_ях(и)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "С_ховати" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "В_ідновити" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "Додати до _закладок" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "Пере_йменувати..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "С_пакувати..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Розпакувати сюди" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Роз_пакувати до..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "Властив_ості" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "Перенести до с_мітника" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "Ви вже маєте цю теку у закладках." #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "Файли зображень" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "байт" msgstr[1] "байти" msgstr[2] "байт" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "сканування... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Введіть дійсну назву користувача або чисельне id." #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Введіть дійсну назву групи або чисельне id." #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "Бажаєте рекурсивно застосувати ці зміни до всіх файлів і підтек?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "Сховати чи відновити файл" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "Цей файл приховано, тому що його назва починається з крапки." #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "Файли у цїй системі є прихованими, якщо їх назви починаються з крапки. " "Натисніть для зміни стану показування прихованих файлів." #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "сканування..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Д_оступ до вмісту:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Файли різних типів" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "Файл:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "Кілька файлів" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Назва" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Опис" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Розмір" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Дозволи" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Власник" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Змінено" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Місцезнаходження" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "Розширення" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "С_творити..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Теку" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "Порожній файл" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "_Інвертувати виділене" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Сортувати файли" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "_Перейменувати теку..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "_Властивості теки" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "Показати при_ховане" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "_Не відображати теки перед файлами" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "Ігнорувати ре_гістр літер" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "За _назвою" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "За _часом зміни" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "За р_озміром" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "За _типом файлу" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Введіть назву новоствореної теки:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "Створення нової теки" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "Введіть назву новоствореного файлу:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "Створення ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Новий" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "Введіть назву нового файлу типу %s:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "Створення %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "_Запустити типову програму для новоствореного файлу" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Цей текстовий файл '%s' схоже є скриптом запуску.\n" "Що Ви бажаєте зробити з ним?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Цей файл '%s' можна запустити. Ви бажаєте запустити його?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Жодної теки не вибрано." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "Вибрати теку" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Помилка" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Підтвердити" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Питання" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Це може зробити тільки системний адміністратор." #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Ви бажаєте перемістити файл '%s' до смітника?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Ви бажаєте перемістити %d обраний файл до смітника?" msgstr[1] "Ви бажаєте перемістити %d обраних файли до смітника?" msgstr[2] "Ви бажаєте перемістити %d обраних файлів до смітника?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "Ви бажаєте видалити файл '%s'?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Ви бажаєте видалити %d обраний файл?" msgstr[1] "Ви бажаєте видалити %d обраних файли?" msgstr[2] "Ви бажаєте видалити %d обраних файлів?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Перейменувати файл" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Вкажіть нову назву:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Ви дійсно бажаєте очистити смітник?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "В_ставити та активувати" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "Панель шляху теки" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "Домашня тека" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Робочий стіл" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Програми" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "Корінь файлової системи" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Змонтувати диск" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Відмонтувати диск" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "В_итягнути зовнішній носій" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "_Форматувати диск" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "_Перейменувати елемент закладки" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "_Видалити з закладок" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "Підняти _закладку вище" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "_Опустити закладку нижче" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "_Очистити смітник" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" "Показує перелік загальних місць, пристроїв та закладок у боковій панелі" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Перейменувати елемент закладки" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Вкажіть нову назву:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Тип: %s\n" "Розмір: %s\n" "Змінено: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Тип: %s\n" "Змінено: %s" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "Доки операцію не було припинено, сталися помилки." #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Відмінено" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "Операцію завершено, але сталися помилки." #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Закінчено" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Деякі файли не можна перенести в смітник, тому що поточна файлова система не " "підтримує цю операцію.\n" "Ви бажаєте замість цього видалити їх?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "_Призупинити" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "_Продовжити" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "Переміщення" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "Копіювання" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "Переміщення у смітник" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "Видалення" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "Створення посилання" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "В:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "Створення посилань до файлів" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "Зміна атрибутів" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "Зміна атрибутів файлів" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "Відновлення" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s файлів" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "Виконання файлової операції..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s файлу:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s файлів:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Сховати" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Місця" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Дерево тек" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "_Віддалене" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Місця" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Дерево тек" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "Показує вміст теки" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "_Сховати %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "Пересунути _ліворуч" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "_Пересунути праворуч" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "Показати %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "_Не пам'ятати ширину" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "_Вигляд значками" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "_Компактний вигляд" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "Вигляд мініа_тюрами" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "Детальний вигляд _списком" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "Змінює активну вкладку" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "Вказана тека '%s' не є дійсна" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "Нема доступу до файлу призначення" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "Неможливо створювати посилання на віртуальних файлових системах" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Неможливо відновити файл '%s': невідомий початковий шлях" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "Призначення не існує" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Вихідна тека і тека призначення однакові." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Не можна переміщувати теку в її підтеку" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Не можна копіювати теку в її підтеку" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Тека призначення є підтекою вихідної теки" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "Неможливо зкопіювати файл '%s': не підтримується" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "Можна встановлювати ім'я лише для єдиного файлу" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "Можна встановлювати посилання лише для єдиного файлу" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "Помилка у XML файлі '%s' (%d:%d): " #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML файл не містить кореню програм" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "Не вдалося створити XML визначення для '%s'" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "Шлях меню '%s' вже існує" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Помилка кешу меню" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Невідома тека меню" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "Назва пункту меню не може бути порожньою" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "Невідома тека меню '%s'" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "Невідомий пункт меню" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "Пункт меню '%s' не має відповідного файлу" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "Зміна статусу 'схований' не підтримується для теки меню" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "Встановлення атрибуту '%s' не підтримується" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "Погане значення для атрибуту '%s'" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "'%s' є текою меню" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "'%s' не є пунктом меню" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "Файл відповідний до '%s' зіпсовано" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "Не вдається створити пункт меню '%s'" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "Назва теки меню не може закінчуватися на \".desktop\"" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "Неприпустима операція з коренем меню" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "Призначення недійсне" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor: теку '%s' не знайдено у кешу меню" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Пошук" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "Результати пошуку" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "Виберіть виконуваний файл" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "_Команда:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "Команда до виконання при активації значку програми" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "_Опис:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "Загальне ім'я для програми" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "_Робоча тека:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "Робоча тека для запуску програми" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "_Підказка:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "Підказка, що її показувати на програмі" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "Використовувати пов_ідомлення про запуск" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "_Ярлик програми" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Відновити" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Відновити перенесені файли в смітнику до початкового стану" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "назва вхідного файлу або id ярлику" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "ЯРЛИК" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "назва вихідного файлу" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "ЯРЛИК" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Диск CD-ROM" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Чистий диск CD-ROM" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Диск CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Чистий диск CD-R" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Диск CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Чистий диск CD-RW" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Диск DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Чистий диск DVD-ROM" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Диск DVD-RW" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Чистий диск DVD-RW" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Диск DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Чистий диск DVD-RAM" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Диск DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Чистий диск DVD+R" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Диск DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Чистий диск DVD+RW" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Диск DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Чистий диск DVD+R DL" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Диск DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Чистий диск DVD+RW DL" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Чистий диск Blu-Ray" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Диск Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Чистий диск Blu-Ray R" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Диск Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Чистий диск Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Диск HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Чистий диск HD DVD" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Диск HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Чистий диск HD DVD-R" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Диск HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Чистий диск HD DVD-RW" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Диск MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Чистий диск MO" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Диск MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Чистий диск MRW" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Диск MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Чистий диск MRW/W" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "_Звукові файли" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Чистий оптичний диск" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Оптичний диск" #~ msgid "Symlinking" #~ msgstr "Створення посилання до" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Обробляю:" #~ msgid "Progress:" #~ msgstr "Поступ:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "" #~ "Операцію над файлом закінчено, але при цьому сталося кілька помилок." #~ msgid "_Rename Folder" #~ msgstr "_Перейменувати теку" #~ msgid "File type to be opened:" #~ msgstr "Тип файлу для відкриття:" #~ msgid "Entry for folder path" #~ msgstr "Місце вводу шляху теки" #~ msgid "_Browse" #~ msgstr "_Переглянути" #~ msgid "My Computer" #~ msgstr "Мій Комп’ютер" #~ msgid "_Move" #~ msgstr "_Перемістити" #~ msgid "_Trash" #~ msgstr "До с_мітнику" #~ msgid "_Only for this folder" #~ msgstr "_Лише для цієї теки" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Запам'ятати сортування для цієї теки без змін у загальних налаштуваннях" #~ msgid "Please select a folder" #~ msgstr "Будь ласка, виберіть теку" #~ msgid "Computer" #~ msgstr "Комп’ютер" #~ msgid "Network Drives" #~ msgstr "Мережеві диски" #~ msgid "_Run in terminal emulator" #~ msgstr "Виконати в _емуляторі терміналу" #~ msgid "_Keep terminal window open after run" #~ msgstr "З_алишити вікно терміналу після завершення" #~ msgid "Shortcuts" #~ msgstr "Ярлики" #~ msgid "Mount Point" #~ msgstr "Точка монтування" #~ msgid "input file" #~ msgstr "вхідний файл" #~ msgid "Empty tag" #~ msgstr "Порожній теґ " #~ msgid "Tag should have exactly one child" #~ msgstr "Теґ має мати один вкладений теґ" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr "" #~ "Теґ може містити лише теґ , , або " #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "" #~ "Файл, що додається, може мати лише теґ верхнім, отримано <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "Не вдалося вставити теґ <%s> з файлу, що додається" #~ msgid "Invalid tag" #~ msgstr "Теґ зіпсовано" #~ msgid "Invalid tag" #~ msgstr "Теґ зіпсовано" #~ msgid "Cannot find path '%s' in XML definitions" #~ msgstr "Шлях '%s' не знайдено у XML визначеннях" #~ msgid "Category manipulation internal error" #~ msgstr "Внутрішня помилка зміни категорій" #~ msgid "Invalid menu item '%s'" #~ msgstr "Недійсний пункт меню '%s'" #~ msgid "Create _Symlink" #~ msgstr "_Створити символьне посилання" #~ msgid "Se_nd To" #~ msgstr "_Надіслати до" #~ msgid "Blank File" #~ msgstr "Порожній файл" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Помилка: lxshortcut не встановлено" #~ msgid "Failed to start lxshortcut" #~ msgstr "Не вдалося запустити lxshortcut" #~ msgid "_Group:" #~ msgstr "_Група:" #~ msgid "Rename" #~ msgstr "_Перейменувати" #~ msgid "Only group" #~ msgstr "Лише група" #~ msgid "Enter:" #~ msgstr "Заходити:" #~ msgid "Make the file executable" #~ msgstr "Зробити файл виконувальним" #~ msgid "Operations that all other users can do" #~ msgstr "Операції, які можуть виконувати всі користувачі" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Операції, які може виконувати тільки власник" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Операції над файлом, які можуть виконувати користувачі з групи власника " #~ "файлу" #~ msgid "Read and Write" #~ msgstr "Читати і записувати" #~ msgid "Read only" #~ msgstr "Тільки читати" #~ msgid "Write only" #~ msgstr "Тільки записувати" #~ msgid "The selection mode" #~ msgstr "Режим вибору" libfm-1.4.0/po/ur.po000066400000000000000000001106201475513661000142210ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: ur\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774908.770800\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/ur_PK.po000066400000000000000000001106231475513661000146160ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: ur_PK\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-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774908.966934\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "" #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 msgid "Sticky" msgstr "" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 msgid "Set UID" msgstr "" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 msgid "Only owner" msgstr "" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "" #: ../data/ui/progress.glade.h:5 msgid "Data transferred:" msgstr "" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "" #: ../src/base/fm-action.c:275 msgid "Empty value" msgstr "" #: ../src/base/fm-action.c:283 msgid "Invalid selection" msgstr "" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "" msgstr[1] "" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "" #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "" #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "" #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "" #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "" #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "" #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "" msgstr[1] "" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr "" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" #: ../src/gtk/fm-progress-dlg.c:344 msgid "Errors occurred before file operation was stopped." msgstr "" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:278 msgid "Audio CD" msgstr "" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "" libfm-1.4.0/po/vi.po000066400000000000000000001403001475513661000142070ustar00rootroot00000000000000# Vietnamese translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: libfm 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LXDE\n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774909.295004\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "Ứng dụng ưa thích" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "" #: ../data/lxshortcut.desktop.in.h:1 #, fuzzy msgid "Shortcut Editor" msgstr "Phím tắt" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "" #: ../data/ui/app-chooser.glade.h:1 #, fuzzy msgid "Choose Application" msgstr "Chọn một ứng dụng" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "Sử dụng ứng dụng đã chọn để mở các tập tin" #: ../data/ui/app-chooser.glade.h:3 #, fuzzy msgid "_Installed Applications" msgstr "Ứng _dụng đã cài đặt" #: ../data/ui/app-chooser.glade.h:4 #, fuzzy msgid "C_ommand line to execute:" msgstr "Dòng lệnh để thực thi:" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 #, fuzzy msgid "_Browse..." msgstr "_Xem" # "Thực thi trong bộ giả lập thiết bị đầu cuối" is so long. #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "_Thực thi trong terminal" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "Những mã đặc biệt có thể được sử dụng trong dòng lệnh:\n" " %f: Đại diện cho một tên tập tin duy nhất\n" " %F:Đại diện cho nhiều tên tập tin\n" " %u: Đại diện cho URI duy nhất của tập tin\n" " %U: Đại diện cho nhiều URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "Thực thi dòng lệnh tùy chọn để mở các tập tin" #: ../data/ui/app-chooser.glade.h:16 #, fuzzy msgid "C_ustom Command Line" msgstr "_Dòng lệnh tùy biến" #: ../data/ui/app-chooser.glade.h:17 #, fuzzy msgid "_Set selected application as default action for this file type" msgstr "" "Thiết _lập ứng dụng đã chọn như ứng dụng mặc định để mở loại tập tin này" #: ../data/ui/ask-rename.glade.h:1 #, fuzzy msgid "Confirm File Replacing" msgstr "Chấp nhận thay thế các tập tin" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "_Bỏ qua" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "_Đổi tên" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "_Ghi đè lên" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "Đã có một tập tin trùng tên trong địa điểm này.\n" "\n" "Bạn có muốn thay thế tập tin đã có không" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "với các tập tin sau đây?" #: ../data/ui/ask-rename.glade.h:9 #, fuzzy msgid "_File name:" msgstr "_Tên tập tin:" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "_Áp dụng tùy chọn này cho tất cả tập tin đã có" #: ../data/ui/choose-icon.ui.h:1 #, fuzzy msgid "Choose An Icon..." msgstr "Chọn một ứng dụng" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 #, fuzzy msgid "system icon theme" msgstr "Ứng dụng hệ thống" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 #, fuzzy msgid "image files" msgstr "_Tập tin ảnh" #: ../data/ui/choose-icon.ui.h:6 #, fuzzy msgid "Choose icon from:" msgstr "_Thay đổi nội dung:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "Thực thi tập tin" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "Thực thi trong _Terminal" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "Chi tiết tập tin" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "" #: ../data/ui/file-prop.glade.h:3 #, fuzzy msgid "_Name:" msgstr "_Sở hữu:" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "Vị trí:" #: ../data/ui/file-prop.glade.h:5 #, fuzzy msgid "Target file:" msgstr "Đích:" #: ../data/ui/file-prop.glade.h:6 #, fuzzy msgid "File type:" msgstr "Loại tập tin:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "Mở với:" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "Lựa chọn ứng dụng để mở loại tập tin này" #: ../data/ui/file-prop.glade.h:9 #, fuzzy msgid "Total count of files:" msgstr "Tổng kích thước của các tập tin:" #: ../data/ui/file-prop.glade.h:10 #, fuzzy msgid "Total size of files:" msgstr "Tổng kích thước của các tập tin:" #: ../data/ui/file-prop.glade.h:11 #, fuzzy msgid "Size on disk:" msgstr "Kích thước trên đĩa:" #: ../data/ui/file-prop.glade.h:12 #, fuzzy msgid "Last modification:" msgstr "Lần sửa đổi gần nhất:" #: ../data/ui/file-prop.glade.h:13 #, fuzzy msgid "Last access:" msgstr "Truy cập gần nhất:" #: ../data/ui/file-prop.glade.h:14 #, fuzzy msgid "Last permissions change:" msgstr "Truy cập gần nhất:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "_Tổng hợp" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "_Sở hữu:" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "_Nhóm:" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "_Xem nội dung:" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "_Thay đổi nội dung:" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "_Thực thi:" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "Những bit đặc biệt:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "Người có thể đọc nội dụng của tập tin/thư mục" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "Người có thể thay đổi nội dung của tập tin/thư mục" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "Người có thể thực thi tập tin hay truy cập thư mục" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "Những cờ đặc biệt cho việc thực thi tập tin" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "Những cờ đặc biệt cho việc truy cập thư mục" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "Kiểm soát truy cập" #: ../data/ui/file-prop.glade.h:28 #, fuzzy msgid "Hidden file" msgstr "Tập tin _video" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "_Quyền" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "Không" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "Ưu tiên" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "Thiết lập GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "Đặt ưu tiên & thiết lập GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy msgid "Set UID" msgstr "Thiết lập UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "Đặt ưu tiên & thiết lập UID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy msgid "Only owner" msgstr "Chỉ chủ sở hữu" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "Chỉ chủ sở hữu và nhóm" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "Bất cứ ai" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "Không ai" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "Bytes" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 #, fuzzy msgid "Choose Date" msgstr "Chọn ngày" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "Chọn ngày từ bộ lịch sau" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "Tìm _kiếm tập tin" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "_Mẫu tên tập tin" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "_Không phân biệt chữ hoa/thường" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "_Sử dụng biểu thức chính quy" #: ../data/ui/filesearch.glade.h:12 #, fuzzy msgid "Plac_es to Search:" msgstr "Nơi tìm kiếm" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "Tìm trong thự _mục con" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "_Tìm tập tin ẩn" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "_Tên/Địa điểm" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "Kiểu tập tin" #: ../data/ui/filesearch.glade.h:17 #, fuzzy msgid "Only search for files of following types:" msgstr "Chỉ tìm những tập tin thuộc kiểu sau" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "Tập tin _văn bản" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "_Tập tin ảnh" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "Tập tin _audio" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "Tập tin _video" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "Tài _liệu" #: ../data/ui/filesearch.glade.h:23 #, fuzzy msgid "Folde_rs" msgstr "Thư mục" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "_Kiểu tập tin" #: ../data/ui/filesearch.glade.h:27 #, fuzzy msgid "File Contain_s:" msgstr "Tập tin chứa" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "Nội dung" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "Kích thước tập tin" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "_Nhỏ hơn:" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "_Lớn hơn:" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "Lần sửa đổi gần nhất" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(Không)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "_Trước:" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "_Sau:" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "_Thuộc tính" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "Trình duyệt Web" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "Trình duyệt Web ưa thích khi bạn sử dụng để mở các liên kết" #: ../data/ui/preferred-apps.glade.h:4 #, fuzzy msgid "Mail Client" msgstr "Ứng dụng thư" #: ../data/ui/preferred-apps.glade.h:5 #, fuzzy msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "" "Ứng dụng thư ưa thích sẽ được sử dụng khi bạn bấm vào những địa chỉ email" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "Thiết bị đầu cuối Emulator" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "Dòng lệnh:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "Ứng dụng hệ thống" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "Liên kết tập tin" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "Đến:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "Đang chuẩn bị..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "Đích:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "Thời gian còn lại:" #: ../data/ui/progress.glade.h:7 #, fuzzy msgid "Errors occurred:" msgstr "Một số lỗi xảy ra:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "Thực thi tập tin" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "Đảo _lựa chọn" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "Hoạt động không được hỗ trợ" #: ../src/base/fm-file-launcher.c:88 #, fuzzy, c-format msgid "Invalid desktop entry file: '%s'" msgstr "Tên tập tin %s không hợp lệ" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "Mạng" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "Thùng rác" #: ../src/base/fm-mime-type.c:89 #, fuzzy msgid "shortcut to URI" msgstr "Phím tắt" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "" #: ../src/base/fm-thumbnailer.c:285 #, fuzzy msgid "Invalid description of thumbnailer application" msgstr "Thư mục trình đơn không hợp lệ" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u byte" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "Tùy chỉnh" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "Thực thi tập tin" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, fuzzy, c-format msgid "Select an application to open \"%s\" files" msgstr "Sử dụng ứng dụng đã chọn để mở các tập tin" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "Ứng dụng đã cài đặt" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "Đang nạp..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "" #: ../src/gtk/fm-dnd-dest.c:413 #, fuzzy msgid "_Cancel" msgstr "Hủy" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave thất bại." #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "_Mở" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "Mở _bởi..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "Mở _bởi..." #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "" #: ../src/gtk/fm-file-menu.c:161 #, fuzzy msgid "_Add to Bookmarks" msgstr "Loại _bỏ khỏi đánh dấu" #: ../src/gtk/fm-file-menu.c:162 #, fuzzy msgid "_Rename..." msgstr "_Đổi tên" #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "_Nén" #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "_Giải nén ở đây" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "Giải _nén tại..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "_Thuộc tính" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 #, fuzzy msgid "Move to _Trash" msgstr "Thùng rác" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "" #: ../src/gtk/fm-file-properties.c:369 #, fuzzy msgid "Image files" msgstr "_Tập tin ảnh" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "byte" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "Vui lòng điền tên người dùng hay số id hợp lệ" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "Vui lòng điền tên nhóm hay số id hợp lệ" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "" "Bạn có muốn áp dụng những thay đổi này cho tất cả các tập tin và những thư " "mục con không?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" #: ../src/gtk/fm-file-properties.c:1027 #, fuzzy msgid "scanning..." msgstr "Đang nạp..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "Truy _cập nội dung:" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "Những tập tin khác loại" #: ../src/gtk/fm-file-properties.c:1284 #, fuzzy msgid "File:" msgstr "Loại tập tin:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "Nhiều tập tin" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "Tên" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "Mô tả" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "Kích thước" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "Quyền" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "Sở hữu" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "Đã sửa đổi" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "Vị trí" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "Tạo _mới" #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "Thư mục" #: ../src/gtk/fm-folder-view.c:182 #, fuzzy msgid "Empty File" msgstr "Thực thi tập tin" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "Đảo _lựa chọn" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "_Sắp xếp tập tin" #: ../src/gtk/fm-folder-view.c:196 #, fuzzy msgid "_Rename Folder..." msgstr "Đổi tên tập tin" #: ../src/gtk/fm-folder-view.c:197 #, fuzzy msgid "Folder Prop_erties" msgstr "Chi tiết tập tin" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "_Hiển thị dữ liệu ẩn" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "Trộn lẫn tập tin _và thư mục" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "_Phớt lờ tên chữ hoa/thường" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "Theo _tên" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "Theo _ngày chỉnh sửa" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "Theo _kích thước" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "Theo _loại tập tin" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "Nhập tên cho thư mục mới tạo:" #: ../src/gtk/fm-folder-view.c:846 #, fuzzy msgid "Creating New Folder" msgstr "Đổi tên tập tin" #: ../src/gtk/fm-folder-view.c:859 #, fuzzy msgid "Enter a name for empty file:" msgstr "Nhập tên cho tập tin mới tạo:" #: ../src/gtk/fm-folder-view.c:860 #, fuzzy msgid "Creating ..." msgstr "Tạo mới..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "Mới" #: ../src/gtk/fm-folder-view.c:876 #, fuzzy, c-format msgid "Enter a name for the new %s:" msgstr "Nhập tên cho tập tin mới tạo:" #: ../src/gtk/fm-folder-view.c:879 #, fuzzy, c-format msgid "Creating %s" msgstr "Đang tạo liên kết tượng trưng" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "Tập tin văn bản '%s' này có vẻ là một đoạn mã có thực thi.\n" "Bạn muốn làm gì với nó?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "Tập tin '%s' này có thể thực thi. Bạn có muốn thực thi nó?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "Không có thư mục chỉ định." #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 #, fuzzy msgid "Select Folder" msgstr "Chọn thư mục" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "Lỗi" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "Xác nhận" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "Câu hỏi" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "Chỉ có quản trị hệ thống mới được phép làm điều này." #: ../src/gtk/fm-gtk-utils.c:924 #, fuzzy, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "Bạn có muốn di chuyển tập tin đã chọn đến thùng rác?" #: ../src/gtk/fm-gtk-utils.c:929 #, fuzzy, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "Bạn có muốn di chuyển tập tin đã chọn đến thùng rác?" #: ../src/gtk/fm-gtk-utils.c:989 #, fuzzy, c-format msgid "Do you want to delete the file '%s'?" msgstr "Bạn có muốn xóa các tập tin đã chọn không?" #: ../src/gtk/fm-gtk-utils.c:994 #, fuzzy, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "Bạn có muốn xóa các tập tin đã chọn không?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "Đổi tên tập tin" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "Vui lòng nhập tên mới:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "Bạn có chắc muốn làm sạch thùng rác không?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "" #: ../src/gtk/fm-path-entry.c:734 #, fuzzy msgid "Folder location bar" msgstr "Liên kết tập tin" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 #, fuzzy msgid "Home Folder" msgstr "Đổi tên tập tin" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "Màn hình nền" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "Các ứng dụng" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 #, fuzzy msgid "Filesystem Root" msgstr "_Kiểu tập tin" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "_Kết nối bộ đĩa" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "_Ngắt kết nối bộ đĩa" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "_Loại bỏ thiết bị truyền thông rời" #: ../src/gtk/fm-places-view.c:135 #, fuzzy msgid "_Format Volume" msgstr "_Kết nối bộ đĩa" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "Đổi tên _mục đánh dấu" #: ../src/gtk/fm-places-view.c:152 #, fuzzy msgid "Re_move from Bookmarks" msgstr "Loại _bỏ khỏi đánh dấu" #: ../src/gtk/fm-places-view.c:153 #, fuzzy msgid "Move Bookmark _Up" msgstr "Loại _bỏ khỏi đánh dấu" #: ../src/gtk/fm-places-view.c:154 #, fuzzy msgid "Move Bookmark _Down" msgstr "Loại _bỏ khỏi đánh dấu" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "Làm _sạch thùng rác" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "Đổi tên mục đánh dấu" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "Nhập tên mới:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ": " #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "Loại: %s\n" "Kích thước: %s\n" "Đã sửa đổi: %s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "Loại: %s\n" "Đã sửa đổi: %s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "Hoạt động của tập tin đã bị hủy và có một số lỗi" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "Hủy" #: ../src/gtk/fm-progress-dlg.c:350 #, fuzzy msgid "The file operation was completed with errors." msgstr "Hoạt động của tập tin đã bị hủy và có một số lỗi" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "Hoàn thành" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "Một số tập tin không thể được chuyển đến thùng rác vì hệ thống tập tin cơ " "bản không hỗ trợ hoạt động này.\n" "Bạn có muốn xóa chúng?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "" #: ../src/gtk/fm-progress-dlg.c:423 #, fuzzy msgid "_Resume" msgstr "_Khôi phục" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr ", " #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 #, fuzzy msgid "Moving" msgstr "Đang di chuyển các tập tin" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 #, fuzzy msgid "Copying" msgstr "Đang sao chép các tập tin" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 #, fuzzy msgid "Trashing" msgstr "Đang chuyển các tập tin vào thùng rác" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 #, fuzzy msgid "Deleting" msgstr "Đang xóa các tập tin" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "Đang tạo liên kết tượng trưng" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "Đến:" #: ../src/gtk/fm-progress-dlg.c:637 #, fuzzy msgid "Creating links to files" msgstr "Đang tạo liên kết tượng trưng" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "Đang thay đổi thuộc tính tập tin" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "Đang thay đổi thuộc tính tập tin" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "_Khôi phục" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "_Tập tin ảnh" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "" #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, fuzzy, c-format msgid "%s file:" msgstr "Loại tập tin:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, fuzzy, c-format msgid "%s files:" msgstr "Loại tập tin:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "_Tắt" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "_Nơi" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "_Cây thư mục" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "Từ _xa" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "Nơi" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "Cây thư mục" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, fuzzy, c-format msgid "The specified directory '%s' is not valid" msgstr "Các thư mục chỉ định không hợp lệ" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "" #: ../src/job/fm-file-ops-job-delete.c:501 #, fuzzy, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "Khôi phục các tập tin đã xóa về lại đường dẫn gốc" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "Nguồn và đích giống nhau." #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "Không thể di chuyển một thư mục vào thư mục con của nó." #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "Không thể sao chép một thư mục vào thư mục con của nó." #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "Đích là một thư mục con của nguồn." #: ../src/job/fm-file-ops-job-xfer.c:391 #, fuzzy, c-format msgid "Cannot copy file '%s': not supported" msgstr "Không thể sao chép một thư mục vào thư mục con của nó." #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "Lỗi cache trình đơn" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "Thư mục trình đơn không hợp lệ" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "" #: ../src/modules/vfs-menu.c:1480 #, fuzzy, c-format msgid "Invalid menu directory '%s'" msgstr "Thư mục trình đơn không hợp lệ" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 #, fuzzy msgid "Invalid menu item" msgstr "Thư mục trình đơn không hợp lệ" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "" #: ../src/modules/vfs-menu.c:1948 #, fuzzy, c-format msgid "Setting attribute '%s' not supported" msgstr "Hoạt động không được hỗ trợ" #: ../src/modules/vfs-menu.c:1958 #, fuzzy, c-format msgid "Invalid value for attribute '%s'" msgstr "Tên tập tin %s không hợp lệ" #: ../src/modules/vfs-menu.c:1995 #, fuzzy, c-format msgid "The '%s' is a menu directory" msgstr "Thư mục trình đơn không hợp lệ" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, fuzzy, c-format msgid "The '%s' isn't a menu item" msgstr "Thư mục trình đơn không hợp lệ" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, fuzzy, c-format msgid "Cannot create menu item '%s'" msgstr "Tên tập tin %s không hợp lệ" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "Tìm kiếm" #: ../src/modules/vfs-search.c:1053 #, fuzzy msgid "Search Results" msgstr "Tìm _kiếm tập tin" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "Thực thi tập tin" #: ../src/modules/gtk-fileprop-x-desktop.c:267 #, fuzzy msgid "Co_mmand:" msgstr "Đến:" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:322 #, fuzzy msgid "D_escription:" msgstr "Vị trí:" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:340 #, fuzzy msgid "_Working directory:" msgstr "_Sở hữu:" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:359 #, fuzzy msgid "_Tooltip:" msgstr "Đến:" #: ../src/modules/gtk-fileprop-x-desktop.c:369 #, fuzzy msgid "Tooltip to show on application" msgstr "Chọn một ứng dụng" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "" #: ../src/modules/gtk-fileprop-x-desktop.c:388 #, fuzzy msgid "_Desktop Entry" msgstr "Màn hình nền" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "_Khôi phục" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "Khôi phục các tập tin đã xóa về lại đường dẫn gốc" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "Đĩa CD-R" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "Đĩa CD-ROM trắng" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "Đĩa CD-R" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "Đĩa CD-R trắng" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "Đĩa CD-RW" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "Đĩa CD-RW trắng" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "Đĩa DVD-ROM" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "Đĩa DVD-ROM trắng" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "Đĩa DVD-R" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "Đĩa DVD-RW trắng" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "Đĩa DVD-RAM" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "Đĩa DVD-RAM trắng" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "Đĩa DVD+R" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "Đĩa DVD+R trắng" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "Đĩa DVD+RW" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "Đĩa DVD+RW trắng" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "Đĩa DVD+R DL" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "Đĩa DVD+R DL trắng" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "Đĩa DVD+RW DL" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "Đĩa DVD+RW DL trắng" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Đĩa Blu-Ray" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "Đĩa Blu-Ray trắng" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Đĩa Blu-Ray R" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "Đĩa Blu-Ray R trắng" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Đĩa Blu-Ray RW" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "Đĩa Blu-Ray RW trắng" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "Đĩa HD DVD" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "Đĩa HD DVD trắng" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "Đĩa HD DVD-R" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "Đĩa HD DVD-R trắng" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "Đĩa HD DVD-RW" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "Đĩa HD DVD-RW trắng" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "Đĩa MO" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "Đĩa MO trắng" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "Đĩa MRW" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "Đĩa MRW trắng" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "Đĩa MRW/W" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "Đĩa MRW/W trắng" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "Tập tin _audio" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "Đĩa quang trắng" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "Đĩa quang" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "Loại tập tin để được mở:" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "Đang thực hiện:" #~ msgid "Progress:" #~ msgstr "Tiến trình:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "Hoạt động của tập tin đã hoàn thành, nhưng có môt số lỗi." #~ msgid "_Browse" #~ msgstr "_Xem" #~ msgid "My Computer" #~ msgstr "Máy tính của tôi" #~ msgid "_Only for this folder" #~ msgstr "_Chỉ cho thư mục này" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "" #~ "Đánh dấu để ghi nhớ sắp xếp theo thiết lập thư mục thay vì thiết lập hệ " #~ "thống" #~ msgid "Please select a folder" #~ msgstr "Vui lòng chọn thư mục" #, fuzzy #~ msgid "Entry for folder path" #~ msgstr "_Chỉ cho thư mục này" #, fuzzy #~ msgid "Computer" #~ msgstr "Máy tính của tôi" #, fuzzy #~ msgid "Network Drives" #~ msgstr "Mạng" # "Thực thi trong bộ giả lập thiết bị đầu cuối" is so long. #, fuzzy #~ msgid "_Run in terminal emulator" #~ msgstr "_Thực thi trong terminal" #~ msgid "Shortcuts" #~ msgstr "Phím tắt" #~ msgid "Mount Point" #~ msgstr "Điểm gắn" #~ msgid "Create _Symlink" #~ msgstr "Tạo liên _kết " #~ msgid "Se_nd To" #~ msgstr "_Gửi tới" #~ msgid "Blank File" #~ msgstr "Tập tin trắng" #~ msgid "Error, lxshortcut not installed" #~ msgstr "Lỗi, lxshortcut chưa được cài đặt" #~ msgid "Failed to start lxshortcut" #~ msgstr "Không thể khởi động lxshortcut" #~ msgid "_Group:" #~ msgstr "_Nhóm:" #~ msgid "Rename" #~ msgstr "Đổi tên" #~ msgid "Make the file executable" #~ msgstr "Làm tập tin có thể được thực thi" #~ msgid "Operations that all other users can do" #~ msgstr "Những hoạt động mà người dùng khác có thể thực hiện" #~ msgid "Operations that the owner of the file can do" #~ msgstr "Những hoạt động mà người sở hữu tập tin có thể thực hiện" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "" #~ "Những hoạt động mà người dùng trong cùng nhóm là chủ sở hữu tập tin có " #~ "thể thực hiện" #~ msgid "Read and Write" #~ msgstr "Đọc và viết" #~ msgid "Read only" #~ msgstr "Chỉ đọc" #~ msgid "Write only" #~ msgstr "Chỉ viết" libfm-1.4.0/po/zh_CN.po000066400000000000000000001432331475513661000146020ustar00rootroot00000000000000# Chinese (China) translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-08-17 01:28+0000\n" "Last-Translator: Anonymous Pootle User\n" "Language-Team: LANGUAGE \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1439774909.510133\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "优先使用的应用程序" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "选择当点击网络链接或邮件地址时调用的应用程序" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "快捷方式编辑器" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "新建或修改现有的桌面项" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "选择应用程序" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "使用选择的应用程序打开文件" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "已安装的应用程序(_I)" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "要执行的命令行(_O):" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "浏览(_B)..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "在终端模拟器中执行(_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "在命令执行后继续开着终端(_K)" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "以下特殊代码可以在终端中使用:\n" " %f:代表单个文件名\n" " %F:代表多个文件名\n" " %u:代表单个文件 URI\n" " %U:代表多个 URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "应用程序名称(可选,设置以保持关联)(_A)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "执行自定义的命令打开文件" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "自定义命令行(_U)" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "将选择的应用程序作为对这种文件类型的默认操作(_S)" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "确认文件替换" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "跳过(_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "重命名(_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "覆盖(_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "该位置已经存在一个同名的文件。\n" "\n" "您是否想替换现有的文件" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "针对以下文件?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "文件名(_F):" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "将该操作应用于所有存在的文件(_A)" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "选择一个图标..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "系统图标主题" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "图像文件" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "选择图标来源位置:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "执行文件" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "在终端模拟器中执行(_T)" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "文件属性" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "文件夹视图中该文件的图标" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "名称(_N)" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "位置:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "目标文件:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "文件类型:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "打开方式(_W):" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "选择用于打开此类文件的应用程序 " #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "文件总数:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "文件总大小:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "磁盘上的大小:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "上次修改:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "上次访问:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "上次权限更改:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "常规(_G)" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "所有者(_W):" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "组(_R):" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "查看内容(_V):" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "更改内容(_H):" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "执行(_E):" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "特殊位:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "谁可以查看文件/目录的内容" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "谁可以修改文件/目录的内容" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "谁可以执行文件或进入目录" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "文件执行的特殊标志" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "目录访问的特殊标志" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "访问控制" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "隐藏文件" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "权限(_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "无" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy #| msgctxt "" #| "It is a directory access bit - 'sticky' - where only owner can delete a " #| "file from it" #| msgid "Sticky" msgid "Sticky" msgstr "粘住" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "设置 GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "粘住并设置 GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "设置 UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "设置 UID 和 GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "仅所有者" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "仅所有者和组" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "任何人" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "无人" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "字节" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "选择日期" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "从以下日历中选择一个日期" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "搜索文件" #: ../data/ui/filesearch.glade.h:8 msgid "File _Name Patterns:" msgstr "文件名模式(_N):" #: ../data/ui/filesearch.glade.h:9 msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "模式可以是 POSIX shell 模式列表(以“,”分隔),或 POSIX 正则表达式。" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "区分大小写(_V)" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "使用正则表达式(_U)" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "搜索位置(_E):" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "在子目录中搜索(_S)" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "搜索隐藏文件(_H)" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "名称/位置(_L)" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "文件类型" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "只搜索以下类型的文件:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "文本文件(_X)" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "图像文件(_I)" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "音频文件(_A)" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "视频文件(_V)" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "文档(_D)" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "文件夹(_R)" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "其他(_H):" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "可以在此输入任意有效的内容类型。类型的末尾可以带“*”通配符。多种类型可以“;”分" "隔。" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "文件类型(_T)" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "文件中包含(_S):" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "内容(_O)" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "文件大小" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "小于(_S):" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "大于(_B):" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "上次修改时间" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(无)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "早于(_E):" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "晚于(_A):" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "属性(_P)" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "网络浏览器" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "用于打开超链接的优先网络浏览器。" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "邮件客户端" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "优先使用的邮件客户端将会用于您点击电子邮件地址时撰写邮件。" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "终端模拟器" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "命令行:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "系统应用程序" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "文件关联" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "到:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "正在准备..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "目标文件:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "剩余时间:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "出现了错误:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "空文件" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "无效的目标" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "不支持该操作" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "无效的桌面项文件:“ %s”" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "无法确定文件“%s”的内容类型,无法启动它" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "没有设置用于启动 URI %s:// 的默认应用程序" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "无法设置工作目录到 '%s':%s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "没有设置对应于 MIME 类型 %s 的默认应用程序" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "设备" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "网络" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "回收站" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "指向 URI 的快捷方式" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file:参数无效" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "libfm 配置中没有设置终端仿真器" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "缩略图应用程序的描述无效" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u 字节" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI 子路径“%s”中包含无效的转义字符" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "标记 <%s> 的处理程序重复" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "解析“%-.*s”失败,它应该是字符引用中的数字(如 ê) - 可能该数字太大了" #: ../src/extra/fm-xml-file.c:311 #, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "字符引用没有以分号结束;很可能您使用了 & 字符而又不是一个实体 - 将这个 & 变" "为 &" #: ../src/extra/fm-xml-file.c:337 #, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "字符引用“%-.*s”未编码一个被允许的字符" #: ../src/extra/fm-xml-file.c:374 #, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "发现空的实体“&;”;有效的实体为:& " < > '" #: ../src/extra/fm-xml-file.c:381 #, c-format msgid "Entity name '%-.*s' is not known" msgstr "未知的实体名“%-.*s”" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "实体没有以分号结束;很可能您使用了 & 字符而又不是一个实体 - 将这个 & 变为 " "&" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "闭合标记中不允许有空格" #: ../src/extra/fm-xml-file.c:604 #, c-format msgid "Element '%s' was closed but no element was opened" msgstr "元素“%s”已结束但没有元素打开" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "元素“%s”已结束,但当前打开的元素是“%s”" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "属性值开头有无效字符“%c”" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "属性值末尾有无效字符“%c”,应为“%c”" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "文档意外终止" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "文档为空或仅含空白字符" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data:XML 数据错误" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "自定义" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 msgid "Executable files" msgstr "可执行文件" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "选择打开“%s”使用的应用程序" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "已安装的应用程序" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 msgid "" msgstr "<无子文件夹>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "正在加载..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "在侧栏中显示目录树" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "取消(_C)" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "复制到这里(_O)" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "移到这里(_M)" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "链接到这里(_L)" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave 失败。" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "打开(_O)" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "打开方式(_W)..." #: ../src/gtk/fm-file-menu.c:153 msgid "Open _With" msgstr "打开方式(_W)" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "复制路径(_T)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "隐藏(_I)" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "取消隐藏(_I)" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "添加到书签(_A)" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "重命名(_R)..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "压缩(_M)..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "提取到此处(_H)" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "提取到(_X)..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "文件属性(_E)" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "移到回收站(_T)" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "您的书签中已经有了一条对应此文件夹的书签。" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "图像文件" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "字节" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "正在扫描... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "请输入一个有效的用户名或数字标识。" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "请输入一个有效的组名或数字标识。" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "您想递归地将这些操作应用于所有的文件及子文件夹吗?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "隐藏或显示文件" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "该文件是隐藏的,因为它的名字以点(“.”)开头。" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "系统中名字以点(“.”)开头的文件会隐藏。按切换显示隐藏文件。" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "正在扫描..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "访问内容(_A):" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "不同类型的文件" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "文件:" #: ../src/gtk/fm-file-properties.c:1350 msgid "Multiple files" msgstr "多个文件" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "名称" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "描述" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "大小" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "权限" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "所有者" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "修改" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "位置" #: ../src/gtk/fm-folder-model.c:197 msgid "Extension" msgstr "扩展名" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "新建(_N)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "文件夹" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "空文件" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "反选(_I)" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "排序文件(_S)" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "重命名文件夹(_R)..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "文件夹属性(_E)" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "显示隐藏文件(_H)" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 msgid "Mingle _Files and Folders" msgstr "同等对待文件和文件夹(_F)" #: ../src/gtk/fm-folder-view.c:208 msgid "_Ignore Name Case" msgstr "忽略名称大小写(_I)" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "按名称(_N)" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "按修改日期(_M)" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "按大小(_N)" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "按文件类型(_T)" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "输入新创建文件夹的名称:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "创建新文件夹" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "输入空文件的名称:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "正在创建..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "新建" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "输入新 %s 的名称:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "正在创建 %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "创建后对文件运行默认应用程序(_R)" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "“%s”这个文本文件好像是可执行脚本。\n" "您想如何处理它?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "“%s”这个文件是可执行文件。您想执行它吗?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "未指定文件夹。" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "选择文件夹" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "错误" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "确认" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "问题" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "只有系统管理员有权执行此操作。" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "您想将文件“%s”移到回收站吗?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "您想将选择的 %d 个文件移到回收站吗?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "您想删除文件“%s”吗?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "您想删除选择的 %d 个文件吗?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "重命名文件" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "请输入一个新名称:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "您确定想清空回收站吗?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "粘贴并执行(_S)" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "文件夹位置栏" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "主文件夹" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "桌面" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "应用程序" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "文件系统根目录" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "挂载卷(_M)" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "卸载卷(_U)" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "弹出可移动媒质(_E)" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "格式化卷(_F)" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "重命名书签项(_R)" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "从书签中移除(_M)" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "上移书签(_U)" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "下移书签(_D)" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "清空回收站(_E)" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "在侧栏中显示常用位置、设备和书签列表" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "重命名书签项" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "输入新名称:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ":" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "类型:%s\n" "大小:%s\n" "修改时间:%s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "类型:%s\n" "修改时间:%s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "文件操作停止前出现了错误。" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "取消" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "文件操作完成,但出现了一些错误。" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "完成" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "有些文件无法移到回收站,因为所处的文件系统不支持该操作。\n" "您想直接删除它们吗?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "暂停(_P)" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "继续(_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "," #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "正在移动" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "正在复制" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "正在移到回收站" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "正在删除" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 msgid "Creating link" msgstr "正在创建符号链接" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 msgid "In:" msgstr "到:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "创建文件的链接" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 msgid "Changing attributes of" msgstr "正在修改文件属性" #: ../src/gtk/fm-progress-dlg.c:645 msgid "Changing attributes of files" msgstr "正在修改文件属性" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 msgid "Restoring" msgstr "正在还原" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, c-format msgid "%s files" msgstr "%s 个文件" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "正在进行文件操作..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s 个文件:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s 个文件:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "关(_O)" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "位置(_P)" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "目录树(_D)" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "远程(_R)" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "位置" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "目录树" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "文件夹内容视图" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "隐藏 %s (_H)" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "左移(_M)" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "右移(_R)" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "显示 %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "忘记宽度(_F)" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "图标视图(_I)" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "紧缩视图(_C)" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "缩略视图(_T)" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "详细列表视图(_L)" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "更改活动标签" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "指定的目录“%s”无效" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "无法访问目标文件" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "无法在非本地文件系统中创建链接" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "无法还原文件“%s”:原路径未知" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "源位置和目的位置相同。" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "无法将文件夹移动到其子文件夹中" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "无法将文件夹复制到其子文件夹中" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "目标位置是源位置的子文件夹" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "无法复制文件“%s”:不支持" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "只能对单个文件设置显示名" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "只能对单个文件设置目标" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML 文件“%s”错误 (%d:%d):" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML 文件不包含 应用程序 根节点" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "无法为“%s”创建 XML 定义" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "菜单路径“%s”已存在" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "菜单缓存错误" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "无效的菜单目录" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "菜单项名称不能为空" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "无效的菜单目录“%s”" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "无效的菜单项" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "菜单项“%s”不包含正确的项文件" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "不支持更改菜单目录的隐藏状态" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "不支持设置属性“%s”" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "属性“%s”的值无效" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "“%s”是一个菜单目录" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "“%s”不是一个菜单项" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "“%s”项文件损坏" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "无法创建菜单项“%s”" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "菜单目录名不应以“.desktop”结尾" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "对菜单根的操作无效" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "无效的目标" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor:在菜单缓存中未找到文件夹“%s”" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "搜索" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "搜索结果" #: ../src/modules/gtk-fileprop-x-desktop.c:66 msgid "Choose Executable File" msgstr "选择可执行文件" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "命令(_M):" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "在应用程序图标激活时执行的命令" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "描述(_E):" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "应用程序的常规名称" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "工作目录(_W):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "运行程序的工作目录" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "工具提示(_T):" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "在应用程序上显示的工具提示" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "使用启动通知(_U)" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "桌面项(_D)" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "还原(_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "将移到回收站的文件还原到原位置" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "源文件名或桌面标识" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "源" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "结果文件名" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "结果" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM 盘" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "空 CD-ROM 盘" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R 盘" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "空 CD-R 盘" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW 盘" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "空 CD-RW 盘" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM 盘" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "空 DVD-ROM 盘" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW 盘" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "空 DVD-RW 盘" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM 盘" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "空 DVD-RAM 盘" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R 盘" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "空 DVD+R 盘" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW 盘" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "空 DVD+RW 盘" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R 双层盘" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "空 DVD+R 双层盘" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW 双层盘" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "空 DVD+RW 双层盘" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "蓝光光盘" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "空蓝光光盘" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "蓝光只读光盘" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "空蓝光只读光盘" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "蓝光读写光盘" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "空蓝光读写光盘" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD 盘" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "空 HD DVD 盘" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R 盘" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "空 HD DVD-R 盘" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW 盘" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "空 HD DVD-RW 盘" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO 盘" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "空 MO 盘" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW 盘" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "空 MRW 盘" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W 盘" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "空 MRW/W 盘" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "音频文件(_A)" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "空光盘" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "光盘" #~ msgid "Symlinking" #~ msgstr "正在建立符号链接" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "处理:" #~ msgid "Progress:" #~ msgstr "进度:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "文件操作完成,但出现了一些错误。" #~ msgid "Creating Symlinks" #~ msgstr "创建符号链接" #~ msgid "_Rename Folder" #~ msgstr "重命名文件夹(_R)" #~ msgid "File type to be opened:" #~ msgstr "要打开的文件类型:" #~ msgid "_Installed Application" #~ msgstr "已安装的应用程序(_I)" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "将选择的应用程序作为对这种文件类型的默认操作(_S)" #~ msgid "_Browse" #~ msgstr "浏览(_B)" #~ msgid "My Computer" #~ msgstr "我的电脑" #~ msgid "_Move" #~ msgstr "移动(_M)" #~ msgid "_Trash" #~ msgstr "回收站(_T)" #~ msgid "_Only for this folder" #~ msgstr "只对此文件夹(_O)" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "选中以记住针对文件夹的排序设置,而非全局设置" #~ msgid "Please select a folder" #~ msgstr "请选择一个文件夹" #~ msgid "Entry for folder path" #~ msgstr "目录路径项" #~ msgid "Computer" #~ msgstr "计算机" #~ msgid "Network Drives" #~ msgstr "网络驱动器" #~ msgid "_Run in terminal emulator" #~ msgstr "在终端模拟器中运行(_R)" #~ msgid "_Keep terminal window open after run" #~ msgstr "运行后继续开着终端窗口(_K)" #~ msgid "Shortcuts" #~ msgstr "快捷方式" #~ msgid "Mount Point" #~ msgstr "挂载点" #~ msgid "Create _Symlink" #~ msgstr "创建符号链接(_S)" #~ msgid "Se_nd To" #~ msgstr "发送到(_N)" #~ msgid "Empty tag" #~ msgstr "空的 标记" #~ msgid "Tag should have exactly one child" #~ msgstr " 标记只能有一个子元素" #~ msgid "" #~ "Tag may contain only , , or child" #~ msgstr " 标记只能包含 子元素" #~ msgid "Merging file may contain only top level tag, got <%s>" #~ msgstr "合并文件只能包含 顶层标记,但收到 <%s>" #~ msgid "Failed to insert tag <%s> from merging file" #~ msgstr "从合并文件插入标记 <%s> 失败" #~ msgid "Invalid tag" #~ msgstr "无效的 标记" #~ msgid "Invalid tag" #~ msgstr "无效的 标记" #~ msgid "Cannot find path %s in XML definitions" #~ msgstr "在 XML 定义中找不到路径 %s" #~ msgid "Category manipulation internal error" #~ msgstr "类别操作内部错误" #~ msgid "Blank File" #~ msgstr "空文件" #~ msgid "Error, lxshortcut not installed" #~ msgstr "错误,lxshortcut 未安装" #~ msgid "Failed to start lxshortcut" #~ msgstr "无法启动 lxshortcut" #~ msgid "_Group:" #~ msgstr "组(_G):" #~ msgid "Rename" #~ msgstr "重命名" #~ msgid "Make the file executable" #~ msgstr "使文件可执行" #~ msgid "Operations that all other users can do" #~ msgstr "所有其他用户可以进行的操作" #~ msgid "Operations that the owner of the file can do" #~ msgstr "文件的拥有者可以进行的操作" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "与文件拥有者在同一组的用户可以进行的操作" #~ msgid "Read and Write" #~ msgstr "读写" #~ msgid "Read only" #~ msgstr "只读" #~ msgid "Write only" #~ msgstr "只写" libfm-1.4.0/po/zh_TW.po000066400000000000000000001434731475513661000146420ustar00rootroot00000000000000# Chinese (Taiwan) translations for libfm package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: LibFM 1.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-12-03 13:55+0100\n" "PO-Revision-Date: 2015-06-29 10:45+0000\n" "Last-Translator: wwycheuk \n" "Language-Team: zh_TW \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.7\n" "X-POOTLE-MTIME: 1435574709.000000\n" #: ../data/libfm-pref-apps.desktop.in.h:1 ../data/ui/preferred-apps.glade.h:1 msgid "Preferred Applications" msgstr "偏好的應用程式" #: ../data/libfm-pref-apps.desktop.in.h:2 msgid "Select applications called on click on Web link or e-mail address" msgstr "選取當點擊網頁連結或電郵位址時開啟的應用程式" #: ../data/lxshortcut.desktop.in.h:1 msgid "Shortcut Editor" msgstr "捷徑編輯器" #: ../data/lxshortcut.desktop.in.h:2 msgid "Create new or change existing desktop entry" msgstr "建立新的或變更現有的桌面項目" #: ../data/ui/app-chooser.glade.h:1 msgid "Choose Application" msgstr "選擇應用程式" #: ../data/ui/app-chooser.glade.h:2 msgid "Use selected application to open files" msgstr "以選取的應用程式來開啟檔案" #: ../data/ui/app-chooser.glade.h:3 msgid "_Installed Applications" msgstr "已安裝應用程式(_I)" #: ../data/ui/app-chooser.glade.h:4 msgid "C_ommand line to execute:" msgstr "要執行的指令(_O):" #: ../data/ui/app-chooser.glade.h:5 ../src/modules/gtk-fileprop-x-desktop.c:275 msgid "_Browse..." msgstr "瀏覽(_B)..." #. row 1: "Terminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:6 ../src/modules/gtk-fileprop-x-desktop.c:294 msgid "_Execute in terminal emulator" msgstr "在終端機模擬器執行(_E)" #. row 2: "X-KeepTerminal" GtkCheckButton #: ../data/ui/app-chooser.glade.h:7 ../src/modules/gtk-fileprop-x-desktop.c:306 msgid "_Keep terminal window open after command execution" msgstr "執行指令後保持終端機視窗開啟(_K)" #: ../data/ui/app-chooser.glade.h:9 #, no-c-format msgid "" "These special codes can be used in the command line:\n" " %f: Represents a single file name\n" " %F: Represents multiple file names\n" " %u: Represents a single URI of the file\n" " %U: Represents multiple URIs" msgstr "" "這些特殊代號可以在指令列參數使用:\n" " %f:代表單一檔案名稱\n" " %F:代表多個檔案名稱\n" " %u:代表單一檔案 URI\n" " %U:代表多個 URI" #: ../data/ui/app-chooser.glade.h:14 msgid "_Application name (optional, set it to keep association)" msgstr "應用程式名稱(_A) (可有可無,設定來保持關聯)" #: ../data/ui/app-chooser.glade.h:15 msgid "Execute custom command line to open files" msgstr "執行特定的指令列來開啟檔案" #: ../data/ui/app-chooser.glade.h:16 msgid "C_ustom Command Line" msgstr "自訂指令列(_U)" #: ../data/ui/app-chooser.glade.h:17 msgid "_Set selected application as default action for this file type" msgstr "將所選應用程式設定為此類型檔案的預設處理程式(_S)" #: ../data/ui/ask-rename.glade.h:1 msgid "Confirm File Replacing" msgstr "確認取代檔案" #: ../data/ui/ask-rename.glade.h:2 msgid "_Skip" msgstr "略過(_S)" #: ../data/ui/ask-rename.glade.h:3 msgid "_Rename" msgstr "重新命名(_R)" #: ../data/ui/ask-rename.glade.h:4 msgid "_Overwrite" msgstr "覆寫(_O)" #: ../data/ui/ask-rename.glade.h:5 msgid "" "There is already a file with the same name in this location.\n" "\n" "Do you want to replace the existing file" msgstr "" "指定的位置已經有同名檔案。\n" "\n" "要取代已有的檔案嗎?" #: ../data/ui/ask-rename.glade.h:8 msgid "with the following file?" msgstr "以下列檔案?" #: ../data/ui/ask-rename.glade.h:9 msgid "_File name:" msgstr "檔案名稱(_F):" #: ../data/ui/ask-rename.glade.h:10 msgid "_Apply this option to all existing files" msgstr "將此選項套用到所有現有檔案(_A)" #: ../data/ui/choose-icon.ui.h:1 msgid "Choose An Icon..." msgstr "選擇圖示..." #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:3 msgid "system icon theme" msgstr "系統圖示佈景主題" #. genitive case is here: Choose icon from: ... #: ../data/ui/choose-icon.ui.h:5 msgid "image files" msgstr "圖片檔案" #: ../data/ui/choose-icon.ui.h:6 msgid "Choose icon from:" msgstr "選擇圖示來源:" #: ../data/ui/exec-file.glade.h:1 msgid "Execute File" msgstr "執行檔案" #: ../data/ui/exec-file.glade.h:2 msgid "Execute in _Terminal" msgstr "在終端機執行(_T)" #: ../data/ui/file-prop.glade.h:1 msgid "File Properties" msgstr "檔案特性" #: ../data/ui/file-prop.glade.h:2 msgid "Icon of the file in folder view" msgstr "該檔案在「資料夾檢視」的圖示" #: ../data/ui/file-prop.glade.h:3 msgid "_Name:" msgstr "名稱(_N):" #: ../data/ui/file-prop.glade.h:4 msgid "Location:" msgstr "位置:" #: ../data/ui/file-prop.glade.h:5 msgid "Target file:" msgstr "目標檔案:" #: ../data/ui/file-prop.glade.h:6 msgid "File type:" msgstr "檔案類型:" #: ../data/ui/file-prop.glade.h:7 msgid "Open _with:" msgstr "開啟程式(_W):" #: ../data/ui/file-prop.glade.h:8 msgid "Select the application used to open files of this type " msgstr "選取用來開啟這類型檔案的應用程式" #: ../data/ui/file-prop.glade.h:9 msgid "Total count of files:" msgstr "檔案總數:" #: ../data/ui/file-prop.glade.h:10 msgid "Total size of files:" msgstr "檔案大小總計:" #: ../data/ui/file-prop.glade.h:11 msgid "Size on disk:" msgstr "磁碟上的大小:" #: ../data/ui/file-prop.glade.h:12 msgid "Last modification:" msgstr "最後修改:" #: ../data/ui/file-prop.glade.h:13 msgid "Last access:" msgstr "最後存取:" #: ../data/ui/file-prop.glade.h:14 msgid "Last permissions change:" msgstr "最後權限變更:" #: ../data/ui/file-prop.glade.h:15 msgid "_General" msgstr "一般(_G)" #: ../data/ui/file-prop.glade.h:16 msgid "O_wner:" msgstr "擁有者(_W):" #: ../data/ui/file-prop.glade.h:17 msgid "G_roup:" msgstr "群組(_R):" #: ../data/ui/file-prop.glade.h:18 msgid "_View content:" msgstr "檢視內容(_V):" #: ../data/ui/file-prop.glade.h:19 msgid "C_hange content:" msgstr "變更內容(_H):" #: ../data/ui/file-prop.glade.h:20 msgid "_Execute:" msgstr "執行(_E):" #: ../data/ui/file-prop.glade.h:21 msgid "Special bits:" msgstr "特別位元:" #: ../data/ui/file-prop.glade.h:22 msgid "Who can read content of the file/directory" msgstr "誰可讀取檔案或目錄內容" #: ../data/ui/file-prop.glade.h:23 msgid "Who can change content of the file/directory" msgstr "誰可變更檔案或目錄內容" #: ../data/ui/file-prop.glade.h:24 msgid "Who can execute the file or enter the directory" msgstr "誰可執行檔案或進入目錄" #: ../data/ui/file-prop.glade.h:25 msgid "Special flags for file execution" msgstr "執行檔案的特別旗標" #: ../data/ui/file-prop.glade.h:26 msgid "Special flags for directory access" msgstr "存取目錄的特別旗標" #: ../data/ui/file-prop.glade.h:27 msgid "Access Control" msgstr "存取控制" #: ../data/ui/file-prop.glade.h:28 msgid "Hidden file" msgstr "隱藏檔案" #: ../data/ui/file-prop.glade.h:29 msgid "_Permissions" msgstr "權限(_P)" #: ../data/ui/file-prop.glade.h:30 msgid "---" msgstr "---" #: ../data/ui/file-prop.glade.h:31 msgid "None" msgstr "無" #. this is a directory access bit - only owner can delete a file from it #: ../data/ui/file-prop.glade.h:33 #, fuzzy msgid "Sticky" msgstr "駐留(Sticky)" #: ../data/ui/file-prop.glade.h:34 msgid "Set GID" msgstr "設定 GID" #: ../data/ui/file-prop.glade.h:35 msgid "Sticky & set GID" msgstr "駐留(Sticky)及設定 GID" #. this is a file access mode bit - executable files run with permissions of owner #: ../data/ui/file-prop.glade.h:37 #, fuzzy #| msgctxt "this is a file access mode bit, also known as 'suid'" #| msgid "Set UID" msgid "Set UID" msgstr "設定 UID" #: ../data/ui/file-prop.glade.h:38 msgid "Set UID & GID" msgstr "設定 UID 及 GID" #. this is a file access mode - only owner can access the file, for others access is denied #: ../data/ui/file-prop.glade.h:40 #, fuzzy #| msgctxt "" #| "this is a file access mode - only owner can access the file, for others " #| "access is denied" #| msgid "Only owner" msgid "Only owner" msgstr "僅擁有者" #: ../data/ui/file-prop.glade.h:41 msgid "Only owner and group" msgstr "僅擁有者及群組" #: ../data/ui/file-prop.glade.h:42 msgid "Anyone" msgstr "所有人" #: ../data/ui/file-prop.glade.h:43 msgid "Nobody" msgstr "無人" #: ../data/ui/filesearch.glade.h:1 msgid "Bytes" msgstr "位元組" #: ../data/ui/filesearch.glade.h:2 msgid "KB" msgstr "KB" #: ../data/ui/filesearch.glade.h:3 ../src/base/fm-utils.c:143 msgid "MB" msgstr "MB" #: ../data/ui/filesearch.glade.h:4 ../src/base/fm-utils.c:149 msgid "GB" msgstr "GB" #: ../data/ui/filesearch.glade.h:5 msgid "Choose Date" msgstr "選擇日期" #: ../data/ui/filesearch.glade.h:6 msgid "Choose a date from the following calendar" msgstr "在下面月曆選擇日期" #: ../data/ui/filesearch.glade.h:7 msgid "Search Files" msgstr "搜尋檔案" #: ../data/ui/filesearch.glade.h:8 #, fuzzy msgid "File _Name Patterns:" msgstr "檔案名稱式樣(_N):" #: ../data/ui/filesearch.glade.h:9 #, fuzzy msgid "" "Pattern may be either POSIX shell pattern list (with ',' as separator) or " "POSIX regular expression." msgstr "" "式樣可以是 POSIX shell 式樣清單 (以半形逗號 (,) 分隔) 或 POSIX 正規表示式。" #: ../data/ui/filesearch.glade.h:10 msgid "Case insensiti_ve" msgstr "不區分大小寫(_V)" #: ../data/ui/filesearch.glade.h:11 msgid "_Use regular expression" msgstr "使用 regular expression(_U)" #: ../data/ui/filesearch.glade.h:12 msgid "Plac_es to Search:" msgstr "要搜尋地點(_E):" #: ../data/ui/filesearch.glade.h:13 msgid "_Search in sub directories" msgstr "搜尋子目錄(_S)" #: ../data/ui/filesearch.glade.h:14 msgid "Search _hidden files" msgstr "搜尋隱藏檔(_H)" #: ../data/ui/filesearch.glade.h:15 msgid "Name/_Location" msgstr "名稱/地點(_L)" #: ../data/ui/filesearch.glade.h:16 msgid "File Type" msgstr "檔案類型" #: ../data/ui/filesearch.glade.h:17 msgid "Only search for files of following types:" msgstr "只搜尋以下類型檔案:" #: ../data/ui/filesearch.glade.h:18 msgid "Te_xt files" msgstr "文字檔案(_X)" #: ../data/ui/filesearch.glade.h:19 msgid "_Image files" msgstr "圖片檔案(_I)" #: ../data/ui/filesearch.glade.h:20 msgid "_Audio files" msgstr "聲音檔案(_A)" #: ../data/ui/filesearch.glade.h:21 msgid "_Video files" msgstr "視像檔案(_V)" #: ../data/ui/filesearch.glade.h:22 msgid "_Documents" msgstr "文件(_D)" #: ../data/ui/filesearch.glade.h:23 msgid "Folde_rs" msgstr "資料夾(_R)" #: ../data/ui/filesearch.glade.h:24 msgid "Ot_her:" msgstr "其他(_H):" #: ../data/ui/filesearch.glade.h:25 msgid "" "Any valid content type can be entered here. Wildcard '*' is allowed at end " "of the type. Multiple types should be separated with ';'." msgstr "" "可以在此輸入任何有效的內容類型。類型結尾可以使用萬用字元(*)。多種類型可以半形" "分號(;)分隔。" #: ../data/ui/filesearch.glade.h:26 msgid "File _Type" msgstr "檔案類型(_T)" #: ../data/ui/filesearch.glade.h:27 msgid "File Contain_s:" msgstr "檔案包含(_S):" #: ../data/ui/filesearch.glade.h:28 msgid "C_ontent" msgstr "內容(_O)" #: ../data/ui/filesearch.glade.h:29 msgid "File Size" msgstr "檔案大小" #: ../data/ui/filesearch.glade.h:30 msgid "_Smaller than:" msgstr "小於(_S):" #: ../data/ui/filesearch.glade.h:31 msgid "_Bigger than:" msgstr "大於(_B):" #: ../data/ui/filesearch.glade.h:32 msgid "Last Modified Time" msgstr "最後修改時間" #: ../data/ui/filesearch.glade.h:33 ../src/gtk/fm-gtk-file-launcher.c:670 #: ../src/gtk/fm-gtk-file-launcher.c:677 msgid "(None)" msgstr "(無)" #: ../data/ui/filesearch.glade.h:34 msgid "_Earlier than:" msgstr "早於(_E):" #: ../data/ui/filesearch.glade.h:35 msgid "L_ater than:" msgstr "晚於(_A):" #: ../data/ui/filesearch.glade.h:36 msgid "_Properties" msgstr "特性(_P)" #: ../data/ui/preferred-apps.glade.h:2 msgid "Web Browser" msgstr "網頁瀏覽器" #: ../data/ui/preferred-apps.glade.h:3 msgid "The preferred Web Browser will be used to open hyperlinks." msgstr "會用偏好的網頁瀏覽器來開啟超連結" #: ../data/ui/preferred-apps.glade.h:4 msgid "Mail Client" msgstr "郵件用戶端" #: ../data/ui/preferred-apps.glade.h:5 msgid "" "The preferred Mail Client will be used to compose emails when you click on e-" "mail addresses." msgstr "當點擊電子郵件位址時,會用偏好的郵件用戶端軟體來撰寫信件。" #: ../data/ui/preferred-apps.glade.h:6 msgid "Terminal Emulator" msgstr "終端機模擬器" #: ../data/ui/preferred-apps.glade.h:7 msgid "Command line:" msgstr "指令列:" #: ../data/ui/preferred-apps.glade.h:8 msgid "System Applications" msgstr "系統應用程式" #: ../data/ui/preferred-apps.glade.h:9 msgid "File Associations" msgstr "檔案關聯" #. To: ex. Copy file to..., Move file to...etc. #: ../data/ui/progress.glade.h:2 msgid "To:" msgstr "到:" #. Preparing to do some file operation (Copy, Move, Delete...) #: ../data/ui/progress.glade.h:4 msgid "Preparing..." msgstr "準備中..." #: ../data/ui/progress.glade.h:5 #, fuzzy msgid "Data transferred:" msgstr "目標檔案:" #: ../data/ui/progress.glade.h:6 msgid "Time remaining:" msgstr "剩餘時間:" #: ../data/ui/progress.glade.h:7 msgid "Errors occurred:" msgstr "有錯誤發生:" #: ../src/base/fm-action.c:275 #, fuzzy msgid "Empty value" msgstr "空白檔案" #: ../src/base/fm-action.c:283 #, fuzzy msgid "Invalid selection" msgstr "目的地無效" #. ---- GFile implementation ---- #: ../src/base/fm-action.c:811 ../src/job/fm-file-ops-job.c:271 #: ../src/modules/vfs-menu.c:1176 ../src/modules/vfs-search.c:928 msgid "Operation not supported" msgstr "不支援此作業" #: ../src/base/fm-file-launcher.c:88 #, c-format msgid "Invalid desktop entry file: '%s'" msgstr "桌面項目檔案:「%s」無效" #: ../src/base/fm-file-launcher.c:255 ../src/base/fm-file-launcher.c:409 #, c-format msgid "Could not determine content type of file '%s' to launch it" msgstr "無法判斷「%s」檔案的內容類型,故無法開啟" #: ../src/base/fm-file-launcher.c:294 #, c-format msgid "No default application is set to launch URIs %s://" msgstr "未有設定用來開啟 URI %s:// 的預設應用程式" #: ../src/base/fm-file-launcher.c:362 #, c-format msgid "Cannot set working directory to '%s': %s" msgstr "不能將工作目錄切換至「%s」:%s" #: ../src/base/fm-file-launcher.c:456 ../src/base/fm-templates.c:1104 #, c-format msgid "No default application is set for MIME type %s" msgstr "未有為 MIME 類型 %s 設定預設應用程式" #: ../src/base/fm-path.c:179 ../src/gtk/fm-places-model.c:848 #: ../src/gtk/fm-places-model.c:1016 msgid "Devices" msgstr "裝置" #: ../src/base/fm-path.c:185 ../src/gtk/fm-places-model.c:866 #: ../src/gtk/fm-places-model.c:1031 msgid "Network" msgstr "網路" #: ../src/base/fm-path.c:1316 ../src/gtk/fm-places-model.c:898 msgid "Trash Can" msgstr "垃圾桶" #: ../src/base/fm-mime-type.c:89 msgid "shortcut to URI" msgstr "至 URI 的捷徑" #: ../src/base/fm-templates.c:1043 msgid "fm_template_create_file: invalid argument" msgstr "fm_template_create_file:引數無效" #: ../src/base/fm-terminal.c:256 msgid "No terminal emulator is set in libfm config" msgstr "libfm 配置未有設定終端機模擬器" #: ../src/base/fm-thumbnailer.c:285 msgid "Invalid description of thumbnailer application" msgstr "縮圖應用程式的說明無效" #: ../src/base/fm-utils.c:137 msgid "kB" msgstr "kB" #: ../src/base/fm-utils.c:154 msgid "TB" msgstr "TB" #: ../src/base/fm-utils.c:165 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u 位元組" #: ../src/base/fm-utils.c:174 msgid "KiB" msgstr "KiB" #: ../src/base/fm-utils.c:180 msgid "MiB" msgstr "MiB" #: ../src/base/fm-utils.c:186 msgid "GiB" msgstr "GiB" #: ../src/base/fm-utils.c:191 msgid "TiB" msgstr "TiB" #: ../src/base/fm-utils.c:573 #, c-format msgid "The URI subpath '%s' contains invalid escaped characters" msgstr "URI 子路徑「%s」包含的溢出字元無效" #: ../src/extra/fm-xml-file.c:206 #, c-format msgid "Duplicate handler for tag <%s>" msgstr "標記 <%s> 的處理程式重覆" #: ../src/extra/fm-xml-file.c:300 #, c-format msgid "" "Failed to parse '%-.*s', which should have been a digit inside a character " "reference (ê for example) - perhaps the digit is too large" msgstr "" "未能解析「%-.*s」,其應該是字元引用中的數字 (如 ê) - 可能該數字太大了" #: ../src/extra/fm-xml-file.c:311 #, fuzzy, c-format msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity - escape ampersand " "as &" msgstr "" "字元引用未有以分號結束;很可能您使用了 & 字元而又並非想使用實體 - 請將這個 & " "改為 &" #: ../src/extra/fm-xml-file.c:337 #, fuzzy, c-format msgid "Character reference '%-.*s' does not encode a permitted character" msgstr "字元引用「%-.*s」並非可允許編碼的字元" #: ../src/extra/fm-xml-file.c:374 #, fuzzy, c-format msgid "" "Empty entity '&;' seen; valid entities are: & " < > '" msgstr "發現空的實體「&;」;有效的實體為:& " < > '" #: ../src/extra/fm-xml-file.c:381 #, fuzzy, c-format msgid "Entity name '%-.*s' is not known" msgstr "未知的實體名「%-.*s」" #: ../src/extra/fm-xml-file.c:385 #, c-format msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity - escape ampersand as &" msgstr "" "實體並非以分號結尾;很可能您想使用 & 字符但未將它變為實體 ─ 請將 & 轉換為 " "&" #: ../src/extra/fm-xml-file.c:595 msgid "Space isn't allowed in the close tag" msgstr "結束標記不能有空格" #: ../src/extra/fm-xml-file.c:604 #, fuzzy, c-format msgid "Element '%s' was closed but no element was opened" msgstr "元素「%s」已結束但沒有元素開啟" #: ../src/extra/fm-xml-file.c:620 #, c-format msgid "Element '%s' was closed but the currently open element is '%s'" msgstr "元素「%s」已結束,但目前開啟的元素是「%s」" #: ../src/extra/fm-xml-file.c:676 #, c-format msgid "Invalid char '%c' at start of attribute value" msgstr "屬性值開頭有無效字元「%c」" #: ../src/extra/fm-xml-file.c:687 #, c-format msgid "Invalid char '%c' at end of attribute value, expected '%c'" msgstr "屬性值結尾有無效字元「%c」,應為「%c」" #: ../src/extra/fm-xml-file.c:835 msgid "Document ended unexpectedly" msgstr "文件不正常結束" #: ../src/extra/fm-xml-file.c:843 msgid "Document was empty or contained only whitespace" msgstr "文件完全空白或只含有空白字元" #: ../src/extra/fm-xml-file.c:1259 msgid "fm_xml_file_to_data: XML data error" msgstr "fm_xml_file_to_data:XML 資料出錯" #: ../src/gtk/fm-app-chooser-combo-box.c:217 msgid "Customize" msgstr "自訂" #: ../src/gtk/fm-app-chooser-dlg.c:234 #: ../src/modules/gtk-fileprop-x-desktop.c:72 #, fuzzy msgid "Executable files" msgstr "執行檔" #: ../src/gtk/fm-app-chooser-dlg.c:326 #, c-format msgid "Select an application to open \"%s\" files" msgstr "選取用來開啟「%s」檔案的應用程式" #: ../src/gtk/fm-app-menu-view.c:207 msgid "Installed Applications" msgstr "已安裝應用程式" #: ../src/gtk/fm-dir-tree-model.c:421 ../src/gtk/fm-dir-tree-model.c:1213 #, fuzzy msgid "" msgstr "<沒有子資料夾>" #: ../src/gtk/fm-dir-tree-model.c:423 ../src/gtk/fm-dir-tree-model.c:1214 msgid "Loading..." msgstr "載入中..." #: ../src/gtk/fm-dir-tree-view.c:546 ../src/gtk/fm-side-pane.c:647 msgid "Shows tree of directories in sidebar" msgstr "在側欄顯示目錄樹" #: ../src/gtk/fm-dnd-dest.c:413 msgid "_Cancel" msgstr "取消(_C)" #: ../src/gtk/fm-dnd-dest.c:414 msgid "C_opy Here" msgstr "複製到這裡(_O)" #: ../src/gtk/fm-dnd-dest.c:415 msgid "_Move Here" msgstr "移到這裡(_M)" #. Note to translators: Link in not noun but verb here #: ../src/gtk/fm-dnd-dest.c:417 msgid "_Link Here" msgstr "連結到這裡(_L)" #: ../src/gtk/fm-dnd-dest.c:880 msgid "XDirectSave failed." msgstr "XDirectSave 失敗" #: ../src/gtk/fm-file-menu.c:151 msgid "_Open" msgstr "開啟(_O)" #: ../src/gtk/fm-file-menu.c:152 msgid "Open _With..." msgstr "以其他程式開啟(_W)..." #: ../src/gtk/fm-file-menu.c:153 #, fuzzy msgid "Open _With" msgstr "以其他程式開啟(_W):" #: ../src/gtk/fm-file-menu.c:158 msgid "Copy Pa_th(s)" msgstr "複製路徑(_T)" #: ../src/gtk/fm-file-menu.c:159 msgid "H_ide" msgstr "隱藏(_I)" #: ../src/gtk/fm-file-menu.c:160 msgid "Unh_ide" msgstr "取消隱藏(_I)" #: ../src/gtk/fm-file-menu.c:161 msgid "_Add to Bookmarks" msgstr "新增到書籤(_A)" #: ../src/gtk/fm-file-menu.c:162 msgid "_Rename..." msgstr "重新命名(_R)..." #: ../src/gtk/fm-file-menu.c:163 msgid "Co_mpress..." msgstr "壓縮(_M)..." #: ../src/gtk/fm-file-menu.c:164 msgid "Extract _Here" msgstr "解壓縮到此處(_H)" #: ../src/gtk/fm-file-menu.c:165 msgid "E_xtract To..." msgstr "解壓縮到(_X)..." #: ../src/gtk/fm-file-menu.c:166 ../src/gtk/fm-folder-view.c:198 msgid "Prop_erties" msgstr "特性(_E)" #. Note to translators: Trash in not noun but verb here #: ../src/gtk/fm-file-menu.c:272 ../src/gtk/fm-file-menu.c:533 msgid "Move to _Trash" msgstr "丟到垃圾桶(_T)" #: ../src/gtk/fm-file-menu.c:794 msgid "Your bookmarks already have a bookmark for this folder." msgstr "您已有此資料夾的書籤。" #: ../src/gtk/fm-file-properties.c:369 msgid "Image files" msgstr "圖片檔案" #: ../src/gtk/fm-file-properties.c:495 ../src/gtk/fm-file-properties.c:504 msgid "byte" msgid_plural "bytes" msgstr[0] "位元組" #: ../src/gtk/fm-file-properties.c:511 #, c-format msgid "scanning... %d" msgstr "正在掃描... %d" #: ../src/gtk/fm-file-properties.c:589 msgid "Please enter a valid user name or numeric id." msgstr "請輸入有效的使用者名稱或數字ID" #: ../src/gtk/fm-file-properties.c:619 msgid "Please enter a valid group name or numeric id." msgstr "請輸入有效的群組名稱或數字ID" #. FIXME: may special bits and exec flags still be messed up? #: ../src/gtk/fm-file-properties.c:828 msgid "" "Do you want to recursively apply these changes to all files and sub-folders?" msgstr "是否將變更套用到目錄下所有檔案和子目錄?" #: ../src/gtk/fm-file-properties.c:961 msgid "Hide or unhide the file" msgstr "隱藏或取消隱藏檔案" #: ../src/gtk/fm-file-properties.c:966 msgid "This file is hidden because its name starts with a dot ('.')." msgstr "此為隱藏檔,因為其名稱以「點號」(.) 開首。" #: ../src/gtk/fm-file-properties.c:970 msgid "" "Files on this system are hidden if their name starts with a dot ('.'). Hit " " to toggle displaying hidden files." msgstr "" "本系統的檔案若其名稱以「點號」(.) 就表示其為隱藏檔。按 切換是否顯示" "隱藏檔。" #: ../src/gtk/fm-file-properties.c:1027 msgid "scanning..." msgstr "正在掃描..." #: ../src/gtk/fm-file-properties.c:1089 msgid "_Access content:" msgstr "存取內容(_A):" #: ../src/gtk/fm-file-properties.c:1240 msgid "Files of different types" msgstr "多種不同類型的檔案" #: ../src/gtk/fm-file-properties.c:1284 msgid "File:" msgstr "檔案:" #: ../src/gtk/fm-file-properties.c:1350 #, fuzzy msgid "Multiple files" msgstr "多個檔案" #. columns visible to the users #: ../src/gtk/fm-folder-model.c:190 msgid "Name" msgstr "名稱" #: ../src/gtk/fm-folder-model.c:191 msgid "Description" msgstr "描述" #: ../src/gtk/fm-folder-model.c:192 msgid "Size" msgstr "大小" #: ../src/gtk/fm-folder-model.c:193 msgid "Permissions" msgstr "權限" #: ../src/gtk/fm-folder-model.c:194 msgid "Owner" msgstr "擁有者" #: ../src/gtk/fm-folder-model.c:195 msgid "Modified" msgstr "最後修改" #: ../src/gtk/fm-folder-model.c:196 msgid "Location" msgstr "位置" #: ../src/gtk/fm-folder-model.c:197 #, fuzzy msgid "Extension" msgstr "延伸檔名" #: ../src/gtk/fm-folder-view.c:178 msgid "Create _New..." msgstr "建立新的(_N)..." #: ../src/gtk/fm-folder-view.c:179 msgid "Folder" msgstr "資料夾" #: ../src/gtk/fm-folder-view.c:182 msgid "Empty File" msgstr "空白檔案" #: ../src/gtk/fm-folder-view.c:194 msgid "_Invert Selection" msgstr "反向選擇(_I)" #: ../src/gtk/fm-folder-view.c:195 msgid "_Sort Files" msgstr "排序檔案(_S)" #: ../src/gtk/fm-folder-view.c:196 msgid "_Rename Folder..." msgstr "重新命名資料夾(_R)..." #: ../src/gtk/fm-folder-view.c:197 msgid "Folder Prop_erties" msgstr "檔案特性(_E)" #: ../src/gtk/fm-folder-view.c:205 msgid "Show _Hidden" msgstr "顯示隱藏檔案(_H)" #. Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! #: ../src/gtk/fm-folder-view.c:207 #, fuzzy msgid "Mingle _Files and Folders" msgstr "混合檔案與資料夾(_F)" #: ../src/gtk/fm-folder-view.c:208 #, fuzzy msgid "_Ignore Name Case" msgstr "不理會名稱大小寫(_I)" #: ../src/gtk/fm-folder-view.c:219 msgid "By _Name" msgstr "依名稱(_N)" #: ../src/gtk/fm-folder-view.c:220 msgid "By _Modification Time" msgstr "依修改時間(_M)" #: ../src/gtk/fm-folder-view.c:221 msgid "By _Size" msgstr "依大小(_S)" #: ../src/gtk/fm-folder-view.c:222 msgid "By File _Type" msgstr "依檔案類型(_T)" #: ../src/gtk/fm-folder-view.c:845 msgid "Enter a name for the newly created folder:" msgstr "為新建資料夾輸入名稱:" #: ../src/gtk/fm-folder-view.c:846 msgid "Creating New Folder" msgstr "建立新資料夾" #: ../src/gtk/fm-folder-view.c:859 msgid "Enter a name for empty file:" msgstr "為空白檔案輸入名稱:" #: ../src/gtk/fm-folder-view.c:860 msgid "Creating ..." msgstr "正在建立 ..." #: ../src/gtk/fm-folder-view.c:866 msgid "New" msgstr "新增" #: ../src/gtk/fm-folder-view.c:876 #, c-format msgid "Enter a name for the new %s:" msgstr "為新建%s輸入名稱:" #: ../src/gtk/fm-folder-view.c:879 #, c-format msgid "Creating %s" msgstr "正在建立 %s" #: ../src/gtk/fm-folder-view.c:883 msgid "_Run default application on file after creation" msgstr "新建後為該檔案執行預設應用程式(_R)" #: ../src/gtk/fm-gtk-file-launcher.c:144 #, c-format msgid "" "This text file '%s' seems to be an executable script.\n" "What do you want to do with it?" msgstr "" "這個文字檔 '%s' 似乎是可執行的 script。\n" "想要進行什麼操作?" #: ../src/gtk/fm-gtk-file-launcher.c:151 #, c-format msgid "This file '%s' is executable. Do you want to execute it?" msgstr "這個檔案 '%s' 是可執行檔,是否想要執行?" #. show error if no paths are added #: ../src/gtk/fm-gtk-file-launcher.c:736 msgid "No folders are specified." msgstr "未指定資料夾。" #: ../src/gtk/fm-gtk-file-launcher.c:775 ../src/gtk/fm-gtk-utils.c:555 msgid "Select Folder" msgstr "選取資料夾" #. g_message("(!) %s", msg); #: ../src/gtk/fm-gtk-utils.c:71 msgid "Error" msgstr "錯誤" #: ../src/gtk/fm-gtk-utils.c:100 ../src/gtk/fm-gtk-utils.c:131 msgid "Confirm" msgstr "確認" #: ../src/gtk/fm-gtk-utils.c:185 msgid "Question" msgstr "問題" #: ../src/gtk/fm-gtk-utils.c:709 msgid "Only system administrators have the permission to do this." msgstr "只有系統管理員有權限進行這項操作。" #: ../src/gtk/fm-gtk-utils.c:924 #, c-format msgid "Do you want to move the file '%s' to trash can?" msgstr "要將「%s」檔案丟到垃圾桶嗎?" #: ../src/gtk/fm-gtk-utils.c:929 #, c-format msgid "Do you want to move the %d selected file to trash can?" msgid_plural "Do you want to move the %d selected files to trash can?" msgstr[0] "要將選取的 %d 個檔案丟到垃圾桶嗎?" #: ../src/gtk/fm-gtk-utils.c:989 #, c-format msgid "Do you want to delete the file '%s'?" msgstr "真的要刪除已選的「%s」檔案?" #: ../src/gtk/fm-gtk-utils.c:994 #, c-format msgid "Do you want to delete the %d selected file?" msgid_plural "Do you want to delete the %d selected files?" msgstr[0] "真的要刪除已選的 %d 個檔案?" #: ../src/gtk/fm-gtk-utils.c:1093 msgid "Rename File" msgstr "重新命名檔案" #: ../src/gtk/fm-gtk-utils.c:1094 msgid "Please enter a new name:" msgstr "請輸入新名稱:" #: ../src/gtk/fm-gtk-utils.c:1166 msgid "Are you sure you want to empty the trash can?" msgstr "是否確定要清空垃圾桶?" #: ../src/gtk/fm-path-entry.c:675 msgid "Pa_ste and Go" msgstr "貼上並前往(_S)" #: ../src/gtk/fm-path-entry.c:734 msgid "Folder location bar" msgstr "資料夾位置列" #: ../src/gtk/fm-places-model.c:781 ../src/gtk/fm-places-model.c:995 msgid "Home Folder" msgstr "家目錄" #: ../src/gtk/fm-places-model.c:797 ../src/gtk/fm-places-model.c:1003 msgid "Desktop" msgstr "桌面" #: ../src/gtk/fm-places-model.c:815 ../src/gtk/fm-places-model.c:1023 #: ../src/modules/vfs-menu.c:1538 msgid "Applications" msgstr "應用程式" #: ../src/gtk/fm-places-model.c:831 ../src/gtk/fm-places-model.c:1009 msgid "Filesystem Root" msgstr "檔案系統根目錄" #: ../src/gtk/fm-places-view.c:132 msgid "_Mount Volume" msgstr "掛載磁碟(_M)" #: ../src/gtk/fm-places-view.c:133 msgid "_Unmount Volume" msgstr "卸載磁碟(_U)" #: ../src/gtk/fm-places-view.c:134 msgid "_Eject Removable Media" msgstr "退出移除式媒體(_E)" #: ../src/gtk/fm-places-view.c:135 msgid "_Format Volume" msgstr "格式化儲存區(_F)" #: ../src/gtk/fm-places-view.c:151 msgid "_Rename Bookmark Item" msgstr "重新命名書籤項目(_R)" #: ../src/gtk/fm-places-view.c:152 msgid "Re_move from Bookmarks" msgstr "從書籤移除(_M)" #: ../src/gtk/fm-places-view.c:153 msgid "Move Bookmark _Up" msgstr "上移書籤(_U)" #: ../src/gtk/fm-places-view.c:154 msgid "Move Bookmark _Down" msgstr "下移書籤(_D)" #: ../src/gtk/fm-places-view.c:167 ../src/modules/gtk-menu-trash.c:87 #: ../src/modules/gtk-menu-trash.c:114 msgid "_Empty Trash Can" msgstr "清空垃圾桶(_E)" #: ../src/gtk/fm-places-view.c:536 ../src/gtk/fm-side-pane.c:645 msgid "Shows list of common places, devices, and bookmarks in sidebar" msgstr "在側欄顯示常用地點、裝置和書籤清單" #: ../src/gtk/fm-places-view.c:1127 msgid "Rename Bookmark Item" msgstr "重新命名書籤項目" #: ../src/gtk/fm-places-view.c:1128 msgid "Enter a new name:" msgstr "輸入新名稱:" #: ../src/gtk/fm-progress-dlg.c:136 msgid ": " msgstr ":" #: ../src/gtk/fm-progress-dlg.c:214 ../src/gtk/fm-progress-dlg.c:232 #, c-format msgid "" "Type: %s\n" "Size: %s\n" "Modified: %s" msgstr "" "類型:%s\n" "大小:%s\n" "最後修改:%s" #: ../src/gtk/fm-progress-dlg.c:220 ../src/gtk/fm-progress-dlg.c:245 #, c-format msgid "" "Type: %s\n" "Modified: %s" msgstr "" "類型:%s\n" "最後修改:%s" #: ../src/gtk/fm-progress-dlg.c:344 #, fuzzy msgid "Errors occurred before file operation was stopped." msgstr "檔案操作停止前出現了錯誤。" #: ../src/gtk/fm-progress-dlg.c:346 msgid "Cancelled" msgstr "已取消" #: ../src/gtk/fm-progress-dlg.c:350 msgid "The file operation was completed with errors." msgstr "檔案操作完成,但過程中有錯誤發生。" #: ../src/gtk/fm-progress-dlg.c:352 msgid "Finished" msgstr "已完成" #: ../src/gtk/fm-progress-dlg.c:374 msgid "" "Some files cannot be moved to trash can because the underlying file systems " "don't support this operation.\n" "Do you want to delete them instead?" msgstr "" "因為檔案系統不支援,有些檔案無法丟到垃圾桶\n" "是否直接刪除這些檔案?" #: ../src/gtk/fm-progress-dlg.c:415 ../src/gtk/fm-progress-dlg.c:564 msgid "_Pause" msgstr "暫停(_P)" #: ../src/gtk/fm-progress-dlg.c:423 msgid "_Resume" msgstr "恢復(_R)" #: ../src/gtk/fm-progress-dlg.c:598 msgid ", " msgstr "、" #. translators: it is part of "Moving files:" or "Moving xxx.txt" #: ../src/gtk/fm-progress-dlg.c:618 msgid "Moving" msgstr "正在移動" #. translators: it is part of "Copying files:" or "Copying xxx.txt" #: ../src/gtk/fm-progress-dlg.c:622 msgid "Copying" msgstr "正在複製" #. translators: it is part of "Trashing files:" or "Trashing xxx.txt" #: ../src/gtk/fm-progress-dlg.c:626 msgid "Trashing" msgstr "正在丟到垃圾桶" #. translators: it is part of "Deleting files:" or "Deleting xxx.txt" #: ../src/gtk/fm-progress-dlg.c:630 msgid "Deleting" msgstr "正在刪除" #. translators: it is part of "Creating link /path/xxx.txt" #: ../src/gtk/fm-progress-dlg.c:634 #, fuzzy msgid "Creating link" msgstr "建立連結" #. translators: 'In:' string is followed by destination folder path #: ../src/gtk/fm-progress-dlg.c:636 #, fuzzy msgid "In:" msgstr "到:" #: ../src/gtk/fm-progress-dlg.c:637 msgid "Creating links to files" msgstr "正在建立至檔案的連結" #. translators: it is part of "Changing attributes of xxx.txt" #: ../src/gtk/fm-progress-dlg.c:644 #, fuzzy msgid "Changing attributes of" msgstr "變更此檔案的屬性:" #: ../src/gtk/fm-progress-dlg.c:645 #, fuzzy msgid "Changing attributes of files" msgstr "變更檔案屬性" #. translators: it is part of "Restoring files:" or "Restoring xxx.txt" #: ../src/gtk/fm-progress-dlg.c:651 #, fuzzy msgid "Restoring" msgstr "復原" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:661 #, fuzzy, c-format msgid "%s files" msgstr "%s 個檔案" #: ../src/gtk/fm-progress-dlg.c:664 msgid "File operation is in progress..." msgstr "正在進行檔案操作..." #. note to translators: resulting string is such as "Deleting file" #: ../src/gtk/fm-progress-dlg.c:670 #, c-format msgid "%s file:" msgstr "%s 個檔案:" #. note to translators: resulting string is such as "Deleting files" #: ../src/gtk/fm-progress-dlg.c:673 #, c-format msgid "%s files:" msgstr "%s 個檔案:" #: ../src/gtk/fm-side-pane.c:66 msgid "_Off" msgstr "關(_O)" #: ../src/gtk/fm-side-pane.c:67 msgid "_Places" msgstr "地點(_P)" #: ../src/gtk/fm-side-pane.c:68 msgid "_Directory Tree" msgstr "目錄樹(_D)" #: ../src/gtk/fm-side-pane.c:69 msgid "_Remote" msgstr "遠端(_R)" #: ../src/gtk/fm-side-pane.c:428 ../src/gtk/fm-side-pane.c:621 msgid "Places" msgstr "位置" #: ../src/gtk/fm-side-pane.c:438 ../src/gtk/fm-side-pane.c:623 msgid "Directory Tree" msgstr "目錄樹" #: ../src/gtk/fm-standard-view.c:265 msgid "View of folder contents" msgstr "資料來內容檢視" #: ../src/gtk/fm-standard-view.c:830 #, c-format msgid "_Hide %s" msgstr "隱藏(_H) %s" #: ../src/gtk/fm-standard-view.c:838 msgid "_Move Left" msgstr "左移(_M)" #: ../src/gtk/fm-standard-view.c:844 msgid "Move _Right" msgstr "右移(_R)" #: ../src/gtk/fm-standard-view.c:867 #, c-format msgid "Show %s" msgstr "顯示 %s" #: ../src/gtk/fm-standard-view.c:879 msgid "_Forget Width" msgstr "忘記寬度(_F)" #: ../src/gtk/fm-standard-view.c:1876 msgid "_Icon View" msgstr "圖示檢視(_I)" #: ../src/gtk/fm-standard-view.c:1877 msgid "_Compact View" msgstr "簡潔清單檢視(_C)" #: ../src/gtk/fm-standard-view.c:1878 msgid "_Thumbnail View" msgstr "縮圖檢視(_T)" #: ../src/gtk/fm-standard-view.c:1879 msgid "Detailed _List View" msgstr "詳細清單檢視(_L)" #: ../src/gtk/fm-tab-label.c:159 msgid "Changes active tab" msgstr "變更作用中的分頁" #: ../src/job/fm-dir-list-job.c:238 ../src/job/fm-dir-list-job.c:251 #: ../src/job/fm-dir-list-job.c:363 #, c-format msgid "The specified directory '%s' is not valid" msgstr "指定的「%s」目錄無效" #: ../src/job/fm-file-ops-job.c:529 ../src/job/fm-file-ops-job.c:604 msgid "Cannot access destination file" msgstr "不能存取目的地檔案" #: ../src/job/fm-file-ops-job.c:650 msgid "Cannot create a link on non-native filesystem" msgstr "不能在非原生檔案系統建立連結" #: ../src/job/fm-file-ops-job-delete.c:501 #, c-format msgid "Cannot untrash file '%s': original path not known" msgstr "無法將刪除的檔案「%s」還原:不知道原來的路徑" #: ../src/job/fm-file-ops-job-xfer.c:58 msgid "Destination does not exist" msgstr "" #: ../src/job/fm-file-ops-job-xfer.c:63 msgid "Source and destination are the same." msgstr "來源和目的地檔案相同" #: ../src/job/fm-file-ops-job-xfer.c:70 msgid "Cannot move a folder into its sub folder" msgstr "無法將資料夾移動到子資料夾內" #: ../src/job/fm-file-ops-job-xfer.c:72 msgid "Cannot copy a folder into its sub folder" msgstr "無法將資料夾複製到子資料夾內" #: ../src/job/fm-file-ops-job-xfer.c:74 msgid "Destination is a sub folder of source" msgstr "目的地資料夾是來源資料夾的子資料夾" #: ../src/job/fm-file-ops-job-xfer.c:391 #, c-format msgid "Cannot copy file '%s': not supported" msgstr "無法複製「%s」檔案:不支援" #: ../src/job/fm-file-ops-job-change-attr.c:314 #, c-format msgid "Setting display name can be done only for single file" msgstr "只能為單一檔案設定顯示名稱" #: ../src/job/fm-file-ops-job-change-attr.c:317 #, c-format msgid "Setting target can be done only for single file" msgstr "只能為單一檔案設定目標" #: ../src/modules/vfs-menu.c:299 #, c-format msgid "XML file '%s' error (%d:%d): " msgstr "XML 檔案「%s」出錯 (%d:%d):" #: ../src/modules/vfs-menu.c:309 msgid "XML file doesn't contain Applications root" msgstr "XML 檔案未包含應用程式根節點" #: ../src/modules/vfs-menu.c:384 ../src/modules/vfs-menu.c:464 #: ../src/modules/vfs-menu.c:568 ../src/modules/vfs-menu.c:682 #, c-format msgid "Cannot create XML definition for '%s'" msgstr "不能為「%s」建立 XML 定義" #: ../src/modules/vfs-menu.c:449 ../src/modules/vfs-menu.c:2634 #, c-format msgid "Menu path '%s' already exists" msgstr "選單路徑「%s」已經存在" #: ../src/modules/vfs-menu.c:1102 ../src/modules/vfs-menu.c:1407 #: ../src/modules/vfs-menu.c:1493 msgid "Menu cache error" msgstr "選單快取出錯" #: ../src/modules/vfs-menu.c:1367 msgid "Invalid menu directory" msgstr "選單目錄無效" #: ../src/modules/vfs-menu.c:1430 ../src/modules/vfs-menu.c:1706 msgid "Menu item name cannot be empty" msgstr "選單項目名稱不能是空的。" #: ../src/modules/vfs-menu.c:1480 #, c-format msgid "Invalid menu directory '%s'" msgstr "選單目錄「%s」無效" #: ../src/modules/vfs-menu.c:1623 ../src/modules/vfs-menu.c:1764 msgid "Invalid menu item" msgstr "選單項目無效" #: ../src/modules/vfs-menu.c:1627 ../src/modules/vfs-menu.c:1768 #, c-format msgid "The menu item '%s' doesn't have appropriate entry file" msgstr "選單項目「%s」沒有合適的項目檔案" #: ../src/modules/vfs-menu.c:1790 msgid "Change hidden status isn't supported for menu directory" msgstr "選單目錄不支援變更隱藏狀態" #: ../src/modules/vfs-menu.c:1948 #, c-format msgid "Setting attribute '%s' not supported" msgstr "不支援「%s」屬性" #: ../src/modules/vfs-menu.c:1958 #, c-format msgid "Invalid value for attribute '%s'" msgstr "屬性「%s」的值無效" #: ../src/modules/vfs-menu.c:1995 #, c-format msgid "The '%s' is a menu directory" msgstr "「%s」並非選單目錄" #: ../src/modules/vfs-menu.c:1998 ../src/modules/vfs-menu.c:2627 #, c-format msgid "The '%s' isn't a menu item" msgstr "「%s」並非選單項目" #: ../src/modules/vfs-menu.c:2022 #, c-format msgid "The '%s' entry file is broken" msgstr "「%s」項目檔已損毀" #: ../src/modules/vfs-menu.c:2308 ../src/modules/vfs-menu.c:2397 #, c-format msgid "Cannot create menu item '%s'" msgstr "無法建立選單項目「%s」" #: ../src/modules/vfs-menu.c:2542 msgid "Name of menu directory should not end with \".desktop\"" msgstr "選單目錄的名稱不能以 \".desktop\" 結尾" #: ../src/modules/vfs-menu.c:2587 msgid "Invalid operation with menu root" msgstr "對選單頂層的操作無效" #: ../src/modules/vfs-menu.c:2676 msgid "Invalid destination" msgstr "目的地無效" #: ../src/modules/vfs-menu.c:2952 #, c-format msgid "FmMenuVFileMonitor: folder '%s' not found in menu cache" msgstr "FmMenuVFileMonitor:選單快取中找不到「%s」資料夾" #. FIXME: need name to be converted to UTF-8? #: ../src/modules/vfs-search.c:991 msgid "Search" msgstr "搜尋" #: ../src/modules/vfs-search.c:1053 msgid "Search Results" msgstr "搜尋結果" #: ../src/modules/gtk-fileprop-x-desktop.c:66 #, fuzzy msgid "Choose Executable File" msgstr "選擇執行檔" #: ../src/modules/gtk-fileprop-x-desktop.c:267 msgid "Co_mmand:" msgstr "指令(_M):" #: ../src/modules/gtk-fileprop-x-desktop.c:288 msgid "Command to execute when the application icon is activated" msgstr "啟動應用程式圖示時執行的指令" #: ../src/modules/gtk-fileprop-x-desktop.c:322 msgid "D_escription:" msgstr "說明(_E):" #: ../src/modules/gtk-fileprop-x-desktop.c:332 msgid "Generic name of the application" msgstr "應用程式通用名稱" #: ../src/modules/gtk-fileprop-x-desktop.c:340 msgid "_Working directory:" msgstr "工作目錄(_W):" #: ../src/modules/gtk-fileprop-x-desktop.c:351 msgid "The working directory to run the program in" msgstr "用來執行程式的工作目錄" #: ../src/modules/gtk-fileprop-x-desktop.c:359 msgid "_Tooltip:" msgstr "工具提示(_T):" #: ../src/modules/gtk-fileprop-x-desktop.c:369 msgid "Tooltip to show on application" msgstr "在應用程式顯示的工具提示" #. TODO: handle "TryExec" field ? #. row 7: "StartupNotify" GtkCheckButton #: ../src/modules/gtk-fileprop-x-desktop.c:375 msgid "_Use startup notification" msgstr "使用啟動通知(_U)" #: ../src/modules/gtk-fileprop-x-desktop.c:388 msgid "_Desktop Entry" msgstr "桌面項目(_D)" #: ../src/modules/gtk-menu-trash.c:74 msgid "_Restore" msgstr "復原(_R)" #: ../src/modules/gtk-menu-trash.c:75 msgid "Restore trashed files to original paths" msgstr "將刪除的檔案還原到原來位置" #: ../src/tools/lxshortcut.c:42 msgid "source file name or desktop id" msgstr "來源檔案名稱或桌面ID" #: ../src/tools/lxshortcut.c:42 msgid "SOURCE" msgstr "來源" #: ../src/tools/lxshortcut.c:43 msgid "result file name" msgstr "結果檔案名稱" #: ../src/tools/lxshortcut.c:43 msgid "RESULT" msgstr "結果" #. Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank #: ../src/udisks/g-udisks-device.c:41 msgid "CD-ROM Disc" msgstr "CD-ROM 光碟" #: ../src/udisks/g-udisks-device.c:41 msgid "Blank CD-ROM Disc" msgstr "空白 CD-ROM 光碟" #: ../src/udisks/g-udisks-device.c:42 msgid "CD-R Disc" msgstr "CD-R 光碟" #: ../src/udisks/g-udisks-device.c:42 msgid "Blank CD-R Disc" msgstr "空白 CD-R 光碟" #: ../src/udisks/g-udisks-device.c:43 msgid "CD-RW Disc" msgstr "CD-RW 光碟" #: ../src/udisks/g-udisks-device.c:43 msgid "Blank CD-RW Disc" msgstr "空白 CD-RW 光碟" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "DVD-ROM Disc" msgstr "DVD-ROM 光碟" #: ../src/udisks/g-udisks-device.c:44 ../src/udisks/g-udisks-device.c:45 msgid "Blank DVD-ROM Disc" msgstr "空白 DVD-ROM 光碟" #: ../src/udisks/g-udisks-device.c:46 msgid "DVD-RW Disc" msgstr "DVD-RW 光碟" #: ../src/udisks/g-udisks-device.c:46 msgid "Blank DVD-RW Disc" msgstr "空白 DVD-RW 光碟" #: ../src/udisks/g-udisks-device.c:47 msgid "DVD-RAM Disc" msgstr "DVD-RAM 光碟" #: ../src/udisks/g-udisks-device.c:47 msgid "Blank DVD-RAM Disc" msgstr "空白 DVD-RAM 光碟" #: ../src/udisks/g-udisks-device.c:48 msgid "DVD+R Disc" msgstr "DVD+R 光碟" #: ../src/udisks/g-udisks-device.c:48 msgid "Blank DVD+R Disc" msgstr "空白 DVD+R 光碟" #: ../src/udisks/g-udisks-device.c:49 msgid "DVD+RW Disc" msgstr "DVD+RW 光碟" #: ../src/udisks/g-udisks-device.c:49 msgid "Blank DVD+RW Disc" msgstr "空白 DVD+RW 光碟" #: ../src/udisks/g-udisks-device.c:50 msgid "DVD+R DL Disc" msgstr "DVD+R 雙層光碟" #: ../src/udisks/g-udisks-device.c:50 msgid "Blank DVD+R DL Disc" msgstr "空白 DVD+R 雙層光碟" #: ../src/udisks/g-udisks-device.c:51 msgid "DVD+RW DL Disc" msgstr "DVD+RW 雙層光碟" #: ../src/udisks/g-udisks-device.c:51 msgid "Blank DVD+RW DL Disc" msgstr "空白 DVD+RW 雙層光碟" #: ../src/udisks/g-udisks-device.c:52 msgid "Blu-Ray Disc" msgstr "Blu-Ray 光碟" #: ../src/udisks/g-udisks-device.c:52 msgid "Blank Blu-Ray Disc" msgstr "空白 Blu-Ray 光碟" #: ../src/udisks/g-udisks-device.c:53 msgid "Blu-Ray R Disc" msgstr "Blu-Ray R 光碟" #: ../src/udisks/g-udisks-device.c:53 msgid "Blank Blu-Ray R Disc" msgstr "空白 Blu-Ray R 光碟" #: ../src/udisks/g-udisks-device.c:54 msgid "Blu-Ray RW Disc" msgstr "Blu-Ray RW 光碟" #: ../src/udisks/g-udisks-device.c:54 msgid "Blank Blu-Ray RW Disc" msgstr "空白 Blu-Ray RW 光碟" #: ../src/udisks/g-udisks-device.c:55 msgid "HD DVD Disc" msgstr "HD DVD 光碟" #: ../src/udisks/g-udisks-device.c:55 msgid "Blank HD DVD Disc" msgstr "空白 HD DVD 光碟" #: ../src/udisks/g-udisks-device.c:56 msgid "HD DVD-R Disc" msgstr "HD DVD-R 光碟" #: ../src/udisks/g-udisks-device.c:56 msgid "Blank HD DVD-R Disc" msgstr "空白 HD DVD-R 光碟" #: ../src/udisks/g-udisks-device.c:57 msgid "HD DVD-RW Disc" msgstr "HD DVD-RW 光碟" #: ../src/udisks/g-udisks-device.c:57 msgid "Blank HD DVD-RW Disc" msgstr "空白 HD DVD-RW 光碟" #: ../src/udisks/g-udisks-device.c:58 msgid "MO Disc" msgstr "MO 碟" #: ../src/udisks/g-udisks-device.c:58 msgid "Blank MO Disc" msgstr "空白 MO 碟" #: ../src/udisks/g-udisks-device.c:59 msgid "MRW Disc" msgstr "MRW 碟" #: ../src/udisks/g-udisks-device.c:59 msgid "Blank MRW Disc" msgstr "空白 MRW 碟" #: ../src/udisks/g-udisks-device.c:60 msgid "MRW/W Disc" msgstr "MRW/W 碟" #: ../src/udisks/g-udisks-device.c:60 msgid "Blank MRW/W Disc" msgstr "空白 MRW/W 碟" #: ../src/udisks/g-udisks-device.c:278 #, fuzzy #| msgid "_Audio files" msgid "Audio CD" msgstr "聲音檔案(_A)" #: ../src/udisks/g-udisks-device.c:299 msgid "Blank Optical Disc" msgstr "空白光碟" #: ../src/udisks/g-udisks-device.c:301 msgid "Optical Disc" msgstr "光碟" #~ msgid "*" #~ msgstr "*" #~ msgid "Processing:" #~ msgstr "正在處理:" #~ msgid "Progress:" #~ msgstr "進度:" #~ msgid "The file operation is finished, but there are some errors." #~ msgstr "檔案操作已完成,但過程中有錯誤發生。" #, fuzzy #~ msgid "Creating Symlinks" #~ msgstr "建立符號連結" #~ msgid "_Rename Folder" #~ msgstr "重新命名資料來(_R)" #, fuzzy #~ msgid "File type to be opened:" #~ msgstr "要開啟的檔案類型:" #~ msgid "_Installed Application" #~ msgstr "已安裝應用程式(_I)" #~ msgid "_Set selected application as default action of this file type" #~ msgstr "將選取的應用程式設定為這類型檔案的預設處理程式(_S)" #~ msgid "_Browse" #~ msgstr "瀏覽(_B)" #~ msgid "My Computer" #~ msgstr "我的電腦" #~ msgid "_Move" #~ msgstr "移動(_M)" #~ msgid "_Trash" #~ msgstr "垃圾桶(_T)" #~ msgid "_Only for this folder" #~ msgstr "只在此資料夾(_O)" #~ msgid "Check to remember sort as folder setting rather than global one" #~ msgstr "勾選記住資料夾排序設定,而非全域設定" #~ msgid "Please select a folder" #~ msgstr "請選擇資料夾" #~ msgid "Entry for folder path" #~ msgstr "資料夾路徑項目" #~ msgid "Computer" #~ msgstr "電腦" #~ msgid "Network Drives" #~ msgstr "網路磁碟" #~ msgid "_Run in terminal emulator" #~ msgstr "在終端機模擬器執行(_R)" #~ msgid "_Keep terminal window open after run" #~ msgstr "執行後保持終端機視窗開啟(_K)" #~ msgid "Shortcuts" #~ msgstr "捷徑" #~ msgid "Mount Point" #~ msgstr "掛載點" #~ msgid "Create _Symlink" #~ msgstr "建立符號連結(_S)" #~ msgid "Se_nd To" #~ msgstr "傳送到(_N)" #~ msgid "Blank File" #~ msgstr "空白檔案" #~ msgid "Error, lxshortcut not installed" #~ msgstr "錯誤,未安裝 lxshortcut" #~ msgid "Failed to start lxshortcut" #~ msgstr "未能啟動 lxshortcut" #~ msgid "_Group:" #~ msgstr "群組(_G):" #~ msgid "Rename" #~ msgstr "重新命名" #~ msgid "Make the file executable" #~ msgstr "將檔案標示為可執行" #~ msgid "Operations that all other users can do" #~ msgstr "所有使用者都能進行的操作" #~ msgid "Operations that the owner of the file can do" #~ msgstr "檔案擁有者能夠進行的操作" #~ msgid "" #~ "Operations that users in the same group as the owner of the file can do" #~ msgstr "和檔案擁有者同群組的使用者能夠進行的操作" #~ msgid "Read and Write" #~ msgstr "讀和寫" #~ msgid "Read only" #~ msgstr "只能讀取" #~ msgid "Write only" #~ msgstr "只能寫入" #, fuzzy #~ msgid "Selection mode" #~ msgstr "反相選取" #, fuzzy #~ msgid "The selection mode" #~ msgstr "選擇一個資料夾" #~ msgid "_File" #~ msgstr "檔案(_F)" #~ msgid "_New Window" #~ msgstr "開新視窗" #~ msgid "_Close Window" #~ msgstr "關閉視窗(_C)" #~ msgid "_Edit" #~ msgstr "編輯(_E)" #~ msgid "Move To..." #~ msgstr "移動到..." #~ msgid "Copy To..." #~ msgstr "複製到..." #~ msgid "_View" #~ msgstr "檢視(_V)" #~ msgid "_Help" #~ msgstr "說明(_H)" #~ msgid "_Go" #~ msgstr "到(_G)" #~ msgid "Previous Folder" #~ msgstr "上一個資料夾" #~ msgid "Parent Folder" #~ msgstr "上一層資料夾" #~ msgid "Go to parent Folder" #~ msgstr "到上一層資料夾" #~ msgid "_Bookmarks" #~ msgstr "書籤(_B)" #~ msgid "Open in New Window" #~ msgstr "在新視窗中開啟" libfm-1.4.0/src/000077500000000000000000000000001475513661000134045ustar00rootroot00000000000000libfm-1.4.0/src/Makefile.am000066400000000000000000000255501475513661000154470ustar00rootroot00000000000000# for use in libtool -version-info ABI_VERSION=6:0:2 NULL= # current dir needs to be built before tests SUBDIRS= \ $(ACTIONS_SUBDIR) \ . \ $(NULL) if !EXTRALIB_ONLY SUBDIRS += \ modules \ tests \ $(NULL) endif AM_CPPFLAGS = \ -I$(srcdir)/base \ -I$(srcdir)/job \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -Werror-implicit-function-declaration \ $(NULL) glib_compat_SOURCES= \ glib-compat.c \ glib-compat.h \ $(NULL) gtk_compat_SOURCES= \ $(glib_compat_SOURCES) \ gtk-compat.c \ gtk-compat.h \ $(NULL) if ENABLE_UDISKS udisks_SOURCES= \ udisks/fm-udisks.c \ udisks/fm-udisks.h \ udisks/g-udisks-volume-monitor.c \ udisks/g-udisks-volume-monitor.h \ udisks/g-udisks-device.c \ udisks/g-udisks-device.h \ udisks/g-udisks-volume.c \ udisks/g-udisks-volume.h \ udisks/g-udisks-drive.c \ udisks/g-udisks-drive.h \ udisks/g-udisks-mount.c \ udisks/g-udisks-mount.h \ udisks/dbus-utils.c \ udisks/dbus-utils.h \ $(NULL) else udisks_SOURCES= endif base_SOURCES = \ base/fm-action.c \ base/fm-app-info.c \ base/fm-archiver.c \ base/fm-bookmarks.c \ base/fm-config.c \ base/fm-dummy-monitor.c \ base/fm-file.c \ base/fm-file-info.c \ base/fm-file-launcher.c \ base/fm-folder.c \ base/fm-folder-config.c \ base/fm-icon.c \ base/fm-list.c \ base/fm-marshal.c \ base/fm-mime-type.c \ base/fm-module.c \ base/fm-monitor.c \ base/fm-nav-history.c \ base/fm-path.c \ base/fm-templates.c \ base/fm-terminal.c \ base/fm-thumbnail-loader.c \ base/fm-thumbnailer.c \ base/fm-utils.c \ $(NULL) job_SOURCES = \ job/fm-deep-count-job.c \ job/fm-dir-list-job.c \ job/fm-file-info-job.c \ job/fm-file-ops-job.c \ job/fm-file-ops-job-change-attr.c \ job/fm-file-ops-job-delete.c \ job/fm-file-ops-job-xfer.c \ job/fm-job.c \ job/fm-simple-job.c \ $(NULL) libfm_SOURCES = \ fm.c \ $(glib_compat_SOURCES) \ $(base_SOURCES) \ $(job_SOURCES) \ $(udisks_SOURCES) \ $(NULL) libfm_extra_SOURCES = \ extra/fm-xml-file.c \ $(NULL) exo_SOURCES = \ gtk/exo/exo-icon-view.c \ gtk/exo/exo-private.c \ gtk/exo/exo-tree-view.c \ gtk/exo/exo-icon-view.h \ gtk/exo/exo-private.h \ gtk/exo/exo-tree-view.h \ gtk/exo/exo-marshal.c \ gtk/exo/exo-string.c \ gtk/exo/exo-marshal.h \ gtk/exo/exo-string.h \ $(NULL) libfm_gtk_SOURCES = \ fm-gtk.c \ $(gtk_compat_SOURCES) \ $(exo_SOURCES) \ gtk/fm-app-chooser-combo-box.c \ gtk/fm-app-chooser-dlg.c \ gtk/fm-app-menu-view.c \ gtk/fm-cell-renderer-pixbuf.c \ gtk/fm-cell-renderer-text.c \ gtk/fm-clipboard.c \ gtk/fm-dir-tree-model.c \ gtk/fm-dir-tree-view.c \ gtk/fm-dnd-auto-scroll.c \ gtk/fm-dnd-dest.c \ gtk/fm-dnd-src.c \ gtk/fm-file-menu.c \ gtk/fm-file-properties.c \ gtk/fm-folder-model.c \ gtk/fm-folder-view.c \ gtk/fm-gtk-file-launcher.c \ gtk/fm-gtk-utils.c \ gtk/fm-gtk-marshal.c \ gtk/fm-icon-pixbuf.c \ gtk/fm-menu-tool-item.c \ gtk/fm-path-bar.c \ gtk/fm-path-entry.c \ gtk/fm-places-model.c \ gtk/fm-places-view.c \ gtk/fm-progress-dlg.c \ gtk/fm-side-pane.c \ gtk/fm-standard-view.c \ gtk/fm-tab-label.c \ gtk/fm-thumbnail.c \ $(NULL) # we use common include directory for all headers pkgincludedir = $(includedir)/@PACKAGE@-@FMLIBVER@ if EXTRALIB_ONLY pkginclude_HEADERS = $(LIBFM_EXTRA_INCLUDES) else LIBFM_INCLUDES = \ fm.h \ fm-seal.h \ base/fm-action.h \ base/fm-app-info.h \ base/fm-archiver.h \ base/fm-bookmarks.h \ base/fm-config.h \ base/fm-dummy-monitor.h \ base/fm-file.h \ base/fm-file-info.h \ base/fm-file-launcher.h \ base/fm-folder.h \ base/fm-folder-config.h \ base/fm-icon.h \ base/fm-list.h \ base/fm-marshal.h \ base/fm-mime-type.h \ base/fm-module.h \ base/fm-monitor.h \ base/fm-nav-history.h \ base/fm-path.h \ base/fm-templates.h \ base/fm-terminal.h \ base/fm-thumbnail-loader.h \ base/fm-thumbnailer.h \ base/fm-utils.h \ job/fm-deep-count-job.h \ job/fm-dir-list-job.h \ job/fm-file-info-job.h \ job/fm-file-ops-job.h \ job/fm-file-ops-job-change-attr.h \ job/fm-file-ops-job-delete.h \ job/fm-file-ops-job-xfer.h \ job/fm-job.h \ job/fm-simple-job.h \ $(NULL) LIBFM_GTK_INCLUDES = \ fm-gtk.h \ gtk/fm-app-chooser-combo-box.h \ gtk/fm-app-chooser-dlg.h \ gtk/fm-app-menu-view.h \ gtk/fm-cell-renderer-pixbuf.h \ gtk/fm-cell-renderer-text.h \ gtk/fm-clipboard.h \ gtk/fm-dir-tree-model.h \ gtk/fm-dir-tree-view.h \ gtk/fm-dnd-auto-scroll.h \ gtk/fm-dnd-dest.h \ gtk/fm-dnd-src.h \ gtk/fm-file-menu.h \ gtk/fm-file-properties.h \ gtk/fm-folder-model.h \ gtk/fm-folder-view.h \ gtk/fm-gtk-file-launcher.h \ gtk/fm-gtk-marshal.h \ gtk/fm-gtk-utils.h \ gtk/fm-icon-pixbuf.h \ gtk/fm-menu-tool-item.h \ gtk/fm-path-bar.h \ gtk/fm-path-entry.h \ gtk/fm-places-model.h \ gtk/fm-places-view.h \ gtk/fm-progress-dlg.h \ gtk/fm-side-pane.h \ gtk/fm-sortable.h \ gtk/fm-standard-view.h \ gtk/fm-tab-label.h \ gtk/fm-thumbnail.h \ $(NULL) pkginclude_HEADERS = \ $(LIBFM_INCLUDES) \ $(LIBFM_EXTRA_INCLUDES) \ $(LIBFM_GTK_INCLUDES) \ $(NULL) endif LIBFM_EXTRA_INCLUDES = \ fm-extra.h \ fm-version.h \ extra/fm-xml-file.h \ $(NULL) EXTRA_LTLIBRARIES = libfm-gtk.la libfm-gtk3.la if EXTRALIB_ONLY lib_LTLIBRARIES = libfm-extra.la else lib_LTLIBRARIES = libfm-extra.la libfm.la @LIBFM_GTK_LTLIBRARIES@ endif libfm_la_SOURCES = \ $(libfm_SOURCES) \ $(NULL) libfm_la_CFLAGS = \ $(GIO_CFLAGS) \ $(MENU_CACHE_CFLAGS) \ $(DBUS_CFLAGS) \ $(EXIF_CFLAGS) \ -DPACKAGE_DATA_DIR=\""$(datadir)/libfm"\" \ -DPACKAGE_MODULES_DIR=\""$(libdir)/@PACKAGE@/modules"\" \ $(NULL) libfm_la_LIBADD = \ $(GIO_LIBS) \ $(MENU_CACHE_LIBS) \ $(DBUS_LIBS) \ $(EXIF_LIBS) \ $(INTLLIBS) \ $(NULL) libfm_la_LDFLAGS = \ -no-undefined \ -export-symbols-regex ^fm \ -version-info $(ABI_VERSION) \ $(NULL) if HAVE_OLD_ACTIONS LIBFMACTIONS = $(top_builddir)/src/actions/libfmactions.la libfm_la_LIBADD += $(LIBFMACTIONS) libfm_la_DEPENDENCIES_EXTRA = $(LIBFMACTIONS) endif libfm_extra_la_SOURCES = \ $(libfm_extra_SOURCES) \ $(NULL) libfm_extra_la_CFLAGS = \ -I$(srcdir)/extra \ $(GIO_CFLAGS) \ $(NULL) libfm_extra_la_LIBADD = \ $(GIO_LIBS) \ $(INTLLIBS) \ $(NULL) libfm_extra_la_LDFLAGS = \ -no-undefined \ -export-symbols-regex ^fm \ -version-info $(ABI_VERSION) \ $(NULL) libfm_gtk_la_SOURCES = \ $(libfm_gtk_SOURCES) \ $(NULL) libfm_gtk3_la_SOURCES = $(libfm_gtk_la_SOURCES) libfm_gtk_la_CFLAGS = \ -I$(srcdir)/gtk \ -DPACKAGE_UI_DIR=\""$(datadir)/libfm/ui"\" \ -DPACKAGE_THEME_DIR=\""$(datadir)/libfm/images"\" \ $(GTK_CFLAGS) \ $(MENU_CACHE_CFLAGS) \ $(NULL) libfm_gtk3_la_CFLAGS = $(libfm_gtk_la_CFLAGS) libfm_gtk_la_LIBADD = \ $(GTK_LIBS) \ $(MENU_CACHE_LIBS) \ $(INTLLIBS) \ libfm.la \ $(NULL) libfm_gtk3_la_LIBADD = $(libfm_gtk_la_LIBADD) libfm_gtk_la_LDFLAGS = \ -no-undefined \ -export-symbols-regex ^fm \ -version-info $(ABI_VERSION) \ -rpath $(libdir) \ $(NULL) libfm_gtk3_la_LDFLAGS = $(libfm_gtk_la_LDFLAGS) EXTRA_PROGRAMS = libfm-pref-apps lxshortcut if EXTRALIB_ONLY bin_PROGRAMS = else bin_PROGRAMS = @LIBFM_PREF_APPS@ endif libfm_pref_apps_SOURCES = \ $(gtk_compat_SOURCES) \ tools/libfm-pref-apps.c \ $(NULL) libfm_pref_apps_DEPENDENCIES = \ libfm.la \ @LIBFM_GTK_LTLIBRARIES@ \ $(NULL) libfm_pref_apps_CFLAGS = \ -I$(srcdir)/gtk \ $(GTK_CFLAGS) \ $(MENU_CACHE_CFLAGS) \ -DPACKAGE_UI_DIR=\""$(datadir)/libfm/ui"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ $(NULL) libfm_pref_apps_LDADD = \ $(GTK_LIBS) \ $(MENU_CACHE_LIBS) \ $(INTLLIBS) \ libfm.la \ @LIBFM_GTK_LTLIBRARIES@ \ $(NULL) lxshortcut_SOURCES = \ tools/lxshortcut.c \ $(NULL) lxshortcut_DEPENDENCIES = \ libfm.la \ @LIBFM_GTK_LTLIBRARIES@ \ $(NULL) lxshortcut_CFLAGS = \ -I$(srcdir)/gtk \ $(GTK_CFLAGS) \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ $(NULL) lxshortcut_LDADD = \ $(GTK_LIBS) \ $(INTLLIBS) \ libfm.la \ @LIBFM_GTK_LTLIBRARIES@ \ $(NULL) if ENABLE_DEMO bin_PROGRAMS += libfm-demo libfm_demo_SOURCES = \ $(gtk_compat_SOURCES) \ demo/libfm-demo.c \ demo/main-win.c demo/main-win.h \ $(NULL) libfm_demo_DEPENDENCIES = \ libfm.la \ @LIBFM_GTK_LTLIBRARIES@ \ $(NULL) libfm_demo_CFLAGS = \ -I$(srcdir)/gtk \ $(GTK_CFLAGS) \ $(NULL) libfm_demo_LDADD = \ $(GTK_LIBS) \ $(INTLLIBS) \ libfm.la \ libfm-extra.la \ @LIBFM_GTK_LTLIBRARIES@ \ $(NULL) endif if !EXTRALIB_ONLY # GIO module implementing some extension points # This only works for glib < 2.27 # Glib >= 2.27 uses x-scheme-handler. if !HAVE_SCHEME_HANDLER giomodules_LTLIBRARIES = libgiofm.la libgiofm_la_SOURCES= \ $(glib_compat_SOURCES) \ gio/module.c \ gio/fm-app-lookup.c \ gio/fm-app-lookup.h \ $(NULL) libgiofm_la_CFLAGS = \ $(GIO_CFLAGS) \ -DGIO_MODULE_DIR=\"$(giomodulesdir)\" \ -DGVFS_LOCALEDIR=\""$(localedir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DG_DISABLE_DEPRECATED \ $(NULL) libgiofm_la_LDFLAGS = \ -export_dynamic \ -avoid-version \ -module \ -no-undefined \ -export-symbols-regex '^g_io_module_(load|unload|query)' $(NULL) libgiofm_la_LIBADD = \ $(GIO_LIBS) \ $(INTLLIBS) \ $(NULL) endif # GObject marshallers base/fm-marshal.h: base/fm-marshal.list glib-genmarshal --header --prefix=fm_marshal $? > $@.tmp && mv $@.tmp $@ base/fm-marshal.c: base/fm-marshal.list glib-genmarshal --body --prefix=fm_marshal $? > $@.tmp && mv $@.tmp $@ gtk/fm-gtk-marshal.h: gtk/fm-gtk-marshal.list glib-genmarshal --header --prefix=fm_marshal $? > $@.tmp && mv $@.tmp $@ gtk/fm-gtk-marshal.c: gtk/fm-gtk-marshal.list glib-genmarshal --body --prefix=fm_marshal $? > $@.tmp && mv $@.tmp $@ # Workarounds to force the build BUILT_SOURCES= \ base/fm-marshal.h \ base/fm-marshal.c \ gtk/fm-gtk-marshal.h \ gtk/fm-gtk-marshal.c \ $(NULL) # Vala vapi files VAPI_FILES = \ vapi/libfm.vapi \ $(NULL) endif EXTRA_DIST = \ base/fm-marshal.list \ gtk/fm-gtk-marshal.list \ gtk/fm-file-search-ui.c \ gtk/exo/README \ demo/main-win-ui.c \ udisks/gen-binding \ udisks/udisks.h \ udisks/udisks-device.h \ $(VAPI_FILES) \ $(NULL) CLEANFILES = \ base/fm-marshal.h \ base/fm-marshal.c \ gtk/fm-gtk-marshal.h \ gtk/fm-gtk-marshal.c \ $(NULL) # A lib to be loaede with LD_PRELOADS to override GtkFileChooserWidget #lib_LTLIBRARIES=libfm-chooser-hack.la #libfm_chooser_hack_la_SOURCES=libfm-chooser-hack.c #libfm_chooser_hack_la_CFLAGS=$(GTK_CFLAGS) #libfm_chooser_hack_la_LIBADD=$(GMODULE_LIBS) #libfm_chooser_hack_la_LDFLAGS= \ # -no-undefined \ # -export-symbols-regex gtk # do make test only against single directory test: cd tests && $(MAKE) $(AM_MAKEFLAGS) $@ install-data-local: @if test -e "$(DESTDIR)$(includedir)/@PACKAGE@"; then \ echo rm -rf "$(DESTDIR)$(includedir)/@PACKAGE@"; \ rm -rf "$(DESTDIR)$(includedir)/@PACKAGE@"; \ fi test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @LN_S@ @PACKAGE@-@FMLIBVER@ "$(DESTDIR)$(includedir)/@PACKAGE@" uninstall-local: @if test -L "$(DESTDIR)$(includedir)/@PACKAGE@"; then \ echo rm -f "$(DESTDIR)$(includedir)/@PACKAGE@"; \ rm -f "$(DESTDIR)$(includedir)/@PACKAGE@"; \ fi -rmdir "$(DESTDIR)$(libfmincludedir)" libfm-1.4.0/src/actions/000077500000000000000000000000001475513661000150445ustar00rootroot00000000000000libfm-1.4.0/src/actions/Makefile.am000066400000000000000000000020021475513661000170720ustar00rootroot00000000000000NULL= AM_CPPFLAGS = \ -I$(srcdir) \ -I$(srcdir)../ \ -I$(srcdir)/../base \ -I$(srcdir)/../actions \ -I$(srcdir)/../job \ -DPACKAGE_DATA_DIR=\""$(datadir)/libfm"\" \ -DPACKAGE_LIB_DIR=\""$(libdir)/libfm"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -Wno-unused-variable \ $(NULL) noinst_LTLIBRARIES = libfmactions.la libfmactions_la_SOURCES = \ action.vala \ condition.vala \ profile.vala \ parameters.vala \ utils.vala \ $(NULL) libfmactions_la_CFLAGS = \ $(GIO_CFLAGS) \ -Werror-implicit-function-declaration \ $(NULL) AM_VALAFLAGS = \ --thread \ --vapidir=$(srcdir)/../vapi \ --pkg gio-2.0 \ --pkg posix \ --pkg libfm \ --vapi $(srcdir)/../vapi/fm-actions.vapi \ --header fm-actions.h \ $(NULL) libfmactionsincludedir = $(includedir)/@PACKAGE@-@FMLIBVER@ libfmactionsinclude_HEADERS = \ fm-actions.h \ $(NULL) libfmactions_la_LDFLAGS = \ $(NULL) libfmactions_la_LIBADD = \ $(GIO_LIBS) \ $(INTLLIBS) \ $(NULL) fm-actions.h: libfmactions_la_vala.stamp libfm-1.4.0/src/actions/action.vala000066400000000000000000000307051475513661000171730ustar00rootroot00000000000000// action.vala // // Copyright 2011 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. // // namespace Fm { private string? desktop_env; // current desktop environment private bool actions_loaded = false; // all actions are loaded? private HashTable all_actions = null; // cache all loaded actions public enum FileActionType { NONE, ACTION, MENU } public class FileActionObject : Object { public FileActionObject() { } public FileActionObject.from_key_file(KeyFile kf) { name = Utils.key_file_get_locale_string(kf, "Desktop Entry", "Name"); tooltip = Utils.key_file_get_locale_string(kf, "Desktop Entry", "Tooltip"); icon = Utils.key_file_get_locale_string(kf, "Desktop Entry", "Icon"); desc = Utils.key_file_get_locale_string(kf, "Desktop Entry", "Description"); enabled = Utils.key_file_get_bool(kf, "Desktop Entry", "Enabled", true); hidden = Utils.key_file_get_bool(kf, "Desktop Entry", "Hidden", false); suggested_shortcut = Utils.key_file_get_string(kf, "Desktop Entry", "SuggestedShortcut"); condition = new FileActionCondition(kf, "Desktop Entry"); } public FileActionType type; public string id; public string? name; public string? tooltip; public string? icon; public string? desc; public bool enabled; public bool hidden; public string? suggested_shortcut; public FileActionCondition condition; // values cached during menu generation public bool has_parent; } public enum FileActionTarget { NONE, CONTEXT = 1, LOCATION = 1 << 1, TOOLBAR = 1 << 2 } public class FileAction : FileActionObject { public FileAction(string desktop_id) { var kf = new KeyFile(); id = desktop_id; try { kf.load_from_file(desktop_id, 0); this.from_keyfile(kf); } catch(KeyFileError err) { } catch(GLib.FileError err) { } } public FileAction.from_keyfile(KeyFile kf) { this.from_key_file(kf); // chain up base constructor type = FileActionType.ACTION; if(Utils.key_file_get_bool(kf, "Desktop Entry", "TargetContext", true)) target |= FileActionTarget.CONTEXT; if(Utils.key_file_get_bool(kf, "Desktop Entry", "TargetLocation")) target |= FileActionTarget.LOCATION; if(Utils.key_file_get_bool(kf, "Desktop Entry", "TargetToolbar")) target |= FileActionTarget.TOOLBAR; toolbar_label = Utils.key_file_get_locale_string(kf, "Desktop Entry", "ToolbarLabel"); string[] profile_names = Utils.key_file_get_string_list(kf, "Desktop Entry", "Profiles"); if(profile_names != null) { foreach(string profile_name in profile_names) { // stdout.printf("%s", profile); profiles.prepend(new FileActionProfile(kf, profile_name.strip())); } profiles.reverse(); } } public bool match(List files, out unowned FileActionProfile matched_profile) { matched_profile = null; // stdout.printf("FileAction.match: %s\n", id); if(hidden || !enabled) return false; if(!condition.match(files)) return false; foreach(unowned FileActionProfile profile in profiles) { if(profile.match(files)) { matched_profile = profile; // stdout.printf(" profile matched!\n\n"); return true; } } // stdout.printf("\n"); return false; } public FileActionTarget target; public string? toolbar_label; // FIXME: currently we don't support dynamic profiles public List profiles; } public class FileActionMenu : FileActionObject { public FileActionMenu(string desktop_id) { var kf = new KeyFile(); id = desktop_id; try { kf.load_from_file(desktop_id, 0); this.from_keyfile(kf); } catch(KeyFileError err) { } catch(GLib.FileError err) { } } public FileActionMenu.from_keyfile(KeyFile kf) { this.from_key_file(kf); // chain up base constructor type = FileActionType.MENU; items_list = Utils.key_file_get_string_list(kf, "Desktop Entry", "ItemsList"); } public bool match(List files) { // stdout.printf("FileActionMenu.match: %s\n", id); if(hidden || !enabled) return false; if(!condition.match(files)) return false; // stdout.printf("menu matched!: %s\n\n", id); return true; } // called during menu generation public void cache_children(List files, string[] items_list) { foreach(unowned string item_id_prefix in items_list) { if(item_id_prefix[0] == '[' && item_id_prefix[item_id_prefix.length - 1] == ']') { // runtime dynamic item list string output; int exit_status; var command = FileActionParameters.expand(item_id_prefix[1:-1], files); if(Process.spawn_command_line_sync(command, out output, null, out exit_status) && exit_status == 0) { string[] item_ids = output.split(";"); cache_children(files, item_ids); } } else if(item_id_prefix == "SEPARATOR") { // separator item cached_children.append(null); } else { string item_id = @"$item_id_prefix.desktop"; FileActionObject child_action = all_actions.lookup(item_id); if(child_action != null) { child_action.has_parent = true; cached_children.append(child_action); // stdout.printf("add child: %s to menu: %s\n", item_id, id); } } } } public string[]? items_list; // values cached during menu generation public List cached_children; } public class FileActionItem { public static FileActionItem? new_for_action_object(FileActionObject action_obj, List files) { FileActionItem item = null; if(action_obj.type == FileActionType.MENU) { var menu = (FileActionMenu)action_obj; if(menu.match(files)) { item = new FileActionItem.from_menu(menu, files); // eliminate empty menus if(item.children == null) item = null; } } else { // handle profiles here var action = (FileAction)action_obj; unowned FileActionProfile profile; if(action.match(files, out profile)) { item = new FileActionItem.from_action(action, profile, files); } } return item; } public FileActionItem.from_action(FileAction action, FileActionProfile profile, List files) { this(action, files); this.profile = profile; } public FileActionItem.from_menu(FileActionMenu menu, List files) { this(menu, files); foreach(FileActionObject action_obj in menu.cached_children) { if(action_obj == null) { // separator children.append(null); } else { // action item or menu FileActionItem subitem = new_for_action_object(action_obj, files); if(subitem != null) children.append(subitem); } } } private FileActionItem(FileActionObject action, List files) { this.action = action; name = FileActionParameters.expand(action.name, files, true); desc = FileActionParameters.expand(action.desc, files, true); icon = FileActionParameters.expand(action.icon, files, false); } public unowned string? get_name() { return name; } public unowned string? get_desc() { return desc; } public unowned string? get_icon() { return icon; } public unowned string get_id() { return action.id; } public FileActionTarget get_target() { if(action.type == FileActionType.ACTION) return ((FileAction)action).target; return FileActionTarget.NONE; } public bool is_menu() { return (action.type == FileActionType.MENU); } public bool is_action() { return (action.type == FileActionType.ACTION); } public bool launch(AppLaunchContext ctx, List files, out string? output) { if(action.type == FileActionType.ACTION) { if(profile != null) { profile.launch(ctx, files, out output); } return true; } return false; } public unowned List? get_sub_items() { if(action != null && action.type == FileActionType.MENU) return children; return null; } public string? name; public string? desc; public string? icon; public FileActionObject action; public unowned FileActionProfile profile; // only used by action item public List? children; // only used by menu } private void load_actions_from_dir(string dirname, string? id_prefix) { try { // stdout.printf("loading from: %s\n", dirname); var dir = Dir.open(dirname); if(dir != null) { weak string? name; var kf = new KeyFile(); for(;;) { name = dir.read_name(); if(name == null) break; // found a file in file-manager/actions dir, get its full path var full_path = GLib.Path.build_filename(dirname, name); // stdout.printf("\nfound %s\n", full_path); // see if it's a sub dir if(FileUtils.test(full_path, FileTest.IS_DIR)) { // load sub dirs recursively load_actions_from_dir(full_path, id_prefix != null ? @"$id_prefix-$name" : name); } else if (name.has_suffix(".desktop")) { string id = id_prefix != null ? @"$id_prefix-$name" : name; // ensure that it's not already in the cache if(all_actions.lookup(id) == null) { if(kf.load_from_file(full_path, 0)) { string? type = Utils.key_file_get_string(kf, "Desktop Entry", "Type"); FileActionObject action = null; if(type == null || type == "Action") { action = new FileAction.from_keyfile(kf); // stdout.printf("load action: %s\n", id); } else if(type == "Menu") { action = new FileActionMenu.from_keyfile(kf); // stdout.printf("load menu: %s\n", id); } else { continue; } action.id = id; all_actions.insert(id, action); // add the id/action pair to hash table // stdout.printf("add to cache %s\n", id); } } else { // stdout.printf("cache found for action: %s\n", id); } } } } } catch(GLib.FileError err) { } } public List? get_actions_for_files(List files) { if(!actions_loaded) load_all_actions(); // Iterate over all actions to establish association between parent menu // and children actions, and to find out toplevel ones which are not // attached to any parent menu var action_it = HashTableIter(all_actions); FileActionObject action_obj = null; while(action_it.next(null, out action_obj)) { // stdout.printf("id = %s\n", action_obj.id); if(action_obj.type == FileActionType.MENU) { // this is a menu FileActionMenu menu = (FileActionMenu)action_obj; // stdout.printf("menu: %s\n", menu.name); // associate child items with menus menu.cache_children(files, menu.items_list); } } // Output the menus var items = new List(); action_it = HashTableIter(all_actions); action_obj = null; while(action_it.next(null, out action_obj)) { // only output toplevel items here if(action_obj.has_parent == false) { // this is a toplevel item FileActionItem item = FileActionItem.new_for_action_object(action_obj, files); if(item != null) items.append(item); } } // cleanup temporary data cached during menu generation action_it = HashTableIter(all_actions); action_obj = null; while(action_it.next(null, out action_obj)) { action_obj.has_parent = false; if(action_obj.type == FileActionType.MENU) { FileActionMenu menu = (FileActionMenu)action_obj; menu.cached_children = null; } } return items; } private void load_all_actions() { all_actions.remove_all(); weak string[] dirs = Environment.get_system_data_dirs(); foreach(weak string dir in dirs) { load_actions_from_dir(GLib.Path.build_filename(dir, "file-manager/actions"), null); } load_actions_from_dir(GLib.Path.build_filename(Environment.get_user_data_dir(), "file-manager/actions"), null); actions_loaded = true; } public void file_actions_set_desktop_env(string env) { desktop_env = env; } } namespace _Fm { public void file_actions_init() { Fm.all_actions = new HashTable(str_hash, str_equal); } public void file_actions_finalize() { Fm.all_actions = null; } } libfm-1.4.0/src/actions/condition.vala000066400000000000000000000370251475513661000177060ustar00rootroot00000000000000// condition.vala // // Copyright 2011 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. // // namespace Fm { // FIXME: we can use getgroups() to get groups of current process // then, call stat() and stat.st_gid to handle capabilities // in this way, we don't have to call euidaccess public enum FileActionCapability { OWNER = 0, READABLE = 1 << 1, WRITABLE = 1 << 2, EXECUTABLE = 1 << 3, LOCAL = 1 << 4 } [Compact] public class FileActionCondition { public FileActionCondition(KeyFile kf, string group) { only_show_in = Utils.key_file_get_string_list(kf, group, "OnlyShowIn"); not_show_in = Utils.key_file_get_string_list(kf, group, "NotShowIn"); try_exec = Utils.key_file_get_string(kf, group, "TryExec"); show_if_registered = Utils.key_file_get_string(kf, group, "ShowIfRegistered"); show_if_true = Utils.key_file_get_string(kf, group, "ShowIfTrue"); show_if_running = Utils.key_file_get_string(kf, group, "ShowIfRunning"); mime_types = Utils.key_file_get_string_list(kf, group, "MimeTypes"); base_names = Utils.key_file_get_string_list(kf, group, "Basenames"); match_case = Utils.key_file_get_bool(kf, group, "Matchcase"); var selection_count_str = Utils.key_file_get_string(kf, group, "SelectionCount"); if(selection_count_str != null) { switch(selection_count_str[0]) { case '<': case '>': case '=': selection_count_cmp = selection_count_str[0]; char tmp = 0; const string s = "%c%d"; selection_count_str.scanf(s, out tmp, out selection_count); break; default: selection_count_cmp = '>'; selection_count = 0; break; } } else { selection_count_cmp = '>'; selection_count = 0; } schemes = Utils.key_file_get_string_list(kf, group, "Schemes"); folders = Utils.key_file_get_string_list(kf, group, "Folders"); var caps = Utils.key_file_get_string_list(kf, group, "Capabilities"); foreach(unowned string cap in caps) { stdin.printf("%s\n", cap); } } #if 0 private bool match_base_name_(List files, string allowed_base_name) { // all files should match the base_name pattern. bool allowed = true; if(allowed_base_name.index_of_char('*') >= 0) { string allowed_base_name_ci; if(!match_case) { allowed_base_name_ci = allowed_base_name.casefold(); // FIXME: is this ok? allowed_base_name = allowed_base_name_ci; } var pattern= new PatternSpec(allowed_base_name); foreach(unowned FileInfo fi in files) { unowned string name = fi.get_name(); if(match_case) { if(!pattern.match_string(name)) { allowed = false; break; } } else { if(!pattern.match_string(name.casefold())) { allowed = false; break; } } } } else { foreach(unowned FileInfo fi in files) { unowned string name = fi.get_name(); if(match_case) { if(allowed_base_name != name) { allowed = false; break; } } else { if(allowed_base_name.collate(name) != 0) { allowed = false; break; } } } } return allowed; } #endif private inline bool match_try_exec(List files) { if(try_exec != null) { // stdout.printf(" TryExec: %s\n", try_exec); var exec_path = Environment.find_program_in_path( FileActionParameters.expand(try_exec, files)); if(!FileUtils.test(exec_path, FileTest.IS_EXECUTABLE)) { return false; } } return true; } private inline bool match_show_if_registered(List files) { if(show_if_registered != null) { // stdout.printf(" ShowIfRegistered: %s\n", show_if_registered); var service = FileActionParameters.expand(show_if_registered, files); // References: // http://people.freedesktop.org/~david/eggdbus-20091014/eggdbus-interface-org.freedesktop.DBus.html#eggdbus-method-org.freedesktop.DBus.NameHasOwner // glib source code: gio/tests/gdbus-names.c try { var con = Bus.get_sync(BusType.SESSION); var result = con.call_sync("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameHasOwner", new Variant("(s)", service), new VariantType("(b)"), DBusCallFlags.NONE, -1); bool name_has_owner; result.get("(b)", out name_has_owner); // stdout.printf("check if service: %s is in use: %d\n", service, (int)name_has_owner); if(!name_has_owner) return false; } catch(IOError err) { return false; } } return true; } private inline bool match_show_if_true(List files) { if(show_if_true != null) { var cmd = FileActionParameters.expand(show_if_true, files); int exit_status; // FIXME: Process.spawn cannot handle shell commands. Use Posix.system() instead. //if(!Process.spawn_command_line_sync(cmd, null, null, out exit_status) // || exit_status != 0) // return false; exit_status = Posix.system(cmd); if(exit_status != 0) return false; } return true; } private inline bool match_show_if_running(List files) { if(show_if_running != null) { var process_name = FileActionParameters.expand(show_if_running, files); var pgrep = Environment.find_program_in_path("pgrep"); bool running = false; // pgrep is not fully portable, but we don't have better options here if(pgrep != null) { int exit_status; if(Process.spawn_command_line_sync(@"$pgrep -x '$process_name'", null, null, out exit_status)) { if(exit_status == 0) running = true; } } if(!running) return false; } return true; } private inline bool match_mime_type(List files, string type, bool negated) { // stdout.printf("match_mime_type: %s, neg: %d\n", type, (int)negated); if(type == "all/all" || type == "*") { return negated ? false : true; } else if(type == "all/allfiles") { // see if all fileinfos are files if(negated) { // all fileinfos should not be files foreach(unowned FileInfo fi in files) { if(!fi.is_dir()) { // at least 1 of the fileinfos is a file. return false; } } } else { // all fileinfos should be files foreach(unowned FileInfo fi in files) { if(fi.is_dir()) { // at least 1 of the fileinfos is a file. return false; } } } } else if(type.has_suffix("/*")) { // check if all are subtypes of allowed_type var prefix = type[0:-1]; if(negated) { // all files should not have the prefix foreach(unowned FileInfo fi in files) { if(fi.get_mime_type().get_type().has_prefix(prefix)) { return false; } } } else { // all files should have the prefix foreach(unowned FileInfo fi in files) { if(!fi.get_mime_type().get_type().has_prefix(prefix)) { return false; } } } } else { if(negated) { // all files should not be of the type foreach(unowned FileInfo fi in files) { if(fi.get_mime_type().get_type() == type) { // if(ContentType.is_a(type, fi.get_mime_type().get_type())) { return false; } } } else { // all files should be of the type foreach(unowned FileInfo fi in files) { // stdout.printf("get_type: %s, type: %s\n", fi.get_mime_type().get_type(), type); if(fi.get_mime_type().get_type() != type) { // if(!ContentType.is_a(type, fi.get_mime_type().get_type())) { return false; } } } } return true; } private inline bool match_mime_types(List files) { if(mime_types != null) { bool allowed = false; // FIXME: this is inefficient, but easier to implement // check if all of the mime_types are allowed foreach(unowned string allowed_type in mime_types) { unowned string type; bool negated; if(allowed_type[0] == '!') { type = (string)((uint8*)allowed_type + 1); negated = true; } else { type = allowed_type; negated = false; } if(negated) { // negated mime_type rules are ANDed bool type_is_allowed = match_mime_type(files, type, negated); if(!type_is_allowed) // so any mismatch is not allowed return false; } else { // other mime_type rules are ORed // matching any one of the mime_type is enough if(!allowed) { // if no rule is matched yet allowed = match_mime_type(files, type, false); } } } return allowed; } return true; } private inline bool match_base_name(List files, string base_name, bool negated) { // see if all files has the base_name // FIXME: this is inefficient, some optimization is needed later PatternSpec pattern; if(match_case) pattern= new PatternSpec(base_name); else pattern= new PatternSpec(base_name.casefold()); // FIXME: is this correct? foreach(unowned FileInfo fi in files) { var name = fi.get_name(); if(match_case) { if(pattern.match_string(name)) { // at least 1 file has the base_name if(negated) return false; } else { // at least 1 file does not has the scheme if(!negated) return false; } } else { if(pattern.match_string(name.casefold())) { // at least 1 file has the base_name if(negated) return false; } else { // at least 1 file does not has the scheme if(!negated) return false; } } } return true; } private inline bool match_base_names(List files) { if(base_names != null) { bool allowed = false; // FIXME: this is inefficient, but easier to implement // check if all of the base_names are allowed foreach(unowned string allowed_name in base_names) { unowned string name; bool negated; if(allowed_name[0] == '!') { name = (string)((uint8*)allowed_name + 1); negated = true; } else { name = allowed_name; negated = false; } if(negated) { // negated base_name rules are ANDed bool name_is_allowed = match_base_name(files, name, negated); if(!name_is_allowed) // so any mismatch is not allowed return false; } else { // other base_name rules are ORed // matching any one of the base_name is enough if(!allowed) { // if no rule is matched yet allowed = match_base_name(files, name, false); } } } return allowed; } return true; } private static bool match_scheme(List files, string scheme, bool negated) { // FIXME: this is inefficient, some optimization is needed later // see if all files has the scheme foreach(unowned FileInfo fi in files) { var uri = fi.get_path().to_uri(); if(Uri.parse_scheme(uri) == scheme) { // at least 1 file has the scheme if(negated) return false; } else { // at least 1 file does not has the scheme if(!negated) return false; } } return true; } private inline bool match_schemes(List files) { if(schemes != null) { bool allowed = false; // FIXME: this is inefficient, but easier to implement // check if all of the schemes are allowed foreach(unowned string allowed_scheme in schemes) { unowned string scheme; bool negated; if(allowed_scheme[0] == '!') { scheme = (string)((uint8*)allowed_scheme + 1); negated = true; } else { scheme = allowed_scheme; negated = false; } if(negated) { // negated scheme rules are ANDed bool scheme_is_allowed = match_scheme(files, scheme, negated); if(!scheme_is_allowed) // so any mismatch is not allowed return false; } else { // other scheme rules are ORed // matching any one of the scheme is enough if(!allowed) { // if no rule is matched yet allowed = match_scheme(files, scheme, false); } } } return allowed; } return true; } private static bool match_folder(List files, string folder, bool negated) { // trailing /* should always be implied. // FIXME: this is inefficient, some optimization is needed later PatternSpec pattern; if(folder.has_suffix("/*")) pattern = new PatternSpec(folder); else pattern = new PatternSpec(@"$folder/*"); foreach(unowned FileInfo fi in files) { var dirname = fi.get_path().get_parent().to_str(); if(pattern.match_string(dirname)) { // at least 1 file is in the folder if(negated) return false; } else { if(!negated) return false; } } return true; } private inline bool match_folders(List files) { if(folders != null) { bool allowed = false; // FIXME: this is inefficient, but easier to implement // check if all of the schemes are allowed foreach(unowned string allowed_folder in folders) { unowned string folder; bool negated; if(allowed_folder[0] == '!') { folder = (string)((uint8*)allowed_folder + 1); negated = true; } else { folder = allowed_folder; negated = false; } if(negated) { // negated folder rules are ANDed bool folder_is_allowed = match_folder(files, folder, negated); if(!folder_is_allowed) // so any mismatch is not allowed return false; } else { // other folder rules are ORed // matching any one of the folder is enough if(!allowed) { // if no rule is matched yet allowed = match_folder(files, folder, false); } } } return allowed; } return true; } private inline bool match_selection_count(List files) { uint n_files = files.length(); switch(selection_count_cmp) { case '<': if(n_files >= selection_count) return false; break; case '=': if(n_files != selection_count) return false; break; case '>': if(n_files <= selection_count) return false; break; } return true; } private inline bool match_capabilities(List files) { // TODO return true; } public bool match(List files) { // all of the condition are combined with AND // So, if any one of the conditions is not matched, we quit. // TODO: OnlyShowIn, NotShowIn if(!match_try_exec(files)) return false; if(!match_mime_types(files)) return false; if(!match_base_names(files)) return false; if(!match_selection_count(files)) return false; if(!match_schemes(files)) return false; if(!match_folders(files)) return false; // TODO: Capabilities // currently, due to limitations of Fm.FileInfo, this cannot // be implemanted correctly. if(!match_capabilities(files)) return false; if(!match_show_if_registered(files)) return false; if(!match_show_if_true(files)) return false; if(!match_show_if_running(files)) return false; return true; } public string[]? only_show_in; public string[]? not_show_in; public string? try_exec; public string? show_if_registered; public string? show_if_true; public string? show_if_running; public string[]? mime_types; public string[]? base_names; public bool match_case; public char selection_count_cmp; public int selection_count; public string[]? schemes; public string[]? folders; public FileActionCapability capabilities; } } libfm-1.4.0/src/actions/parameters.vala000066400000000000000000000167361475513661000200710ustar00rootroot00000000000000// parameters.vala // // Copyright 2011 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. // // namespace Fm { namespace FileActionParameters { public string? expand(string? templ, List files, bool for_display = false, FileInfo? first_file = null) { if(templ == null) return null; var result = new StringBuilder(); var len = templ.length; if(first_file == null) first_file = files.first().data; for(var i = 0; i < len; ++i) { var ch = templ[i]; if(ch == '%') { ++i; ch = templ[i]; switch(ch) { case 'b': // (first) basename if(for_display) result.append(Filename.display_name(first_file.get_name())); else result.append(Shell.quote(first_file.get_name())); break; case 'B': // space-separated list of basenames foreach(unowned FileInfo fi in files) { if(for_display) result.append(Shell.quote(Filename.display_name(fi.get_name()))); else result.append(Shell.quote(fi.get_name())); result.append_c(' '); } if(result.str[result.len-1] == ' ') // remove trailing space result.truncate(result.len-1); break; case 'c': // count of selected items result.append_printf("%u", files.length()); break; case 'd': // (first) base directory // FIXME: should the base dir be a URI? unowned Fm.Path base_dir = first_file.get_path().get_parent(); var str = base_dir.to_str(); if(for_display) str = Filename.display_name(str); result.append(Shell.quote(str)); break; case 'D': // space-separated list of base directory of each selected items foreach(unowned FileInfo fi in files) { unowned Fm.Path base_dir = fi.get_path().get_parent(); var str = base_dir.to_str(); if(for_display) str = Filename.display_name(str); result.append(Shell.quote(str)); result.append_c(' '); } if(result.str[result.len-1] == ' ') // remove trailing space result.truncate(result.len-1); break; case 'f': // (first) file name var filename = first_file.get_path().to_str(); if(for_display) filename = Filename.display_name(filename); result.append(Shell.quote(filename)); break; case 'F': // space-separated list of selected file names foreach(unowned FileInfo fi in files) { var filename = fi.get_path().to_str(); if(for_display) filename = Filename.display_name(filename); result.append(Shell.quote(filename)); result.append_c(' '); } if(result.str[result.len-1] == ' ') // remove trailing space result.truncate(result.len-1); break; case 'h': // hostname of the (first) URI // FIXME: how to support this correctly? // FIXME: currently we pass g_get_host_name() result.append(Environment.get_host_name()); break; case 'm': // mimetype of the (first) selected item unowned FileInfo fi = files.first().data; result.append(fi.get_mime_type().get_type()); break; case 'M': // space-separated list of the mimetypes of the selected items foreach(unowned FileInfo fi in files) { result.append(fi.get_mime_type().get_type()); result.append_c(' '); } break; case 'n': // username of the (first) URI // FIXME: how to support this correctly? result.append(Environment.get_user_name()); break; case 'o': // no-op operator which forces a singular form of execution when specified as first parameter, case 'O': // no-op operator which forces a plural form of execution when specified as first parameter, break; case 'p': // port number of the (first) URI // FIXME: how to support this correctly? // result.append("0"); break; case 's': // scheme of the (first) URI var uri = first_file.get_path().to_uri(); result.append(Uri.parse_scheme(uri)); break; case 'u': // (first) URI result.append(first_file.get_path().to_uri()); break; case 'U': // space-separated list of selected URIs foreach(unowned FileInfo fi in files) { result.append(fi.get_path().to_uri()); result.append_c(' '); } if(result.str[result.len-1] == ' ') // remove trailing space result.truncate(result.len-1); break; case 'w': // (first) basename without the extension unowned string basename = first_file.get_name(); int pos = basename.last_index_of_char('.'); // FIXME: handle non-UTF8 filenames if(pos == -1) result.append(Shell.quote(basename)); else { result.append(Shell.quote(basename[0:pos])); } break; case 'W': // space-separated list of basenames without their extension foreach(unowned FileInfo fi in files) { unowned string basename = fi.get_name(); int pos = basename.last_index_of_char('.'); // FIXME: for_display ? Shell.quote(str) : str); if(pos == -1) result.append(Shell.quote(basename)); else { result.append(Shell.quote(basename[0:pos])); } result.append_c(' '); } if(result.str[result.len-1] == ' ') // remove trailing space result.truncate(result.len-1); break; case 'x': // (first) extension unowned string basename = first_file.get_name(); int pos = basename.last_index_of_char('.'); unowned string ext; if(pos >= 0) ext = (string)((uint8*)basename + pos + 1); else ext = ""; result.append(Shell.quote(ext)); break; case 'X': // space-separated list of extensions foreach(unowned FileInfo fi in files) { unowned string basename = fi.get_name(); int pos = basename.last_index_of_char('.'); unowned string ext; if(pos >= 0) ext = (string)((uint8*)basename + pos + 1); else ext = ""; result.append(Shell.quote(ext)); result.append_c(' '); } if(result.str[result.len-1] == ' ') // remove trailing space result.truncate(result.len-1); break; case '%': // the % character result.append_c('%'); break; case '\0': break; } } else { result.append_c(ch); } } return (owned) result.str; } public bool is_plural(string? exec) { if(exec == null) return false; var result = new StringBuilder(); var len = exec.length; // the first relevent code encountered in Exec parameter // determines whether the command accepts singular or plural forms for(var i = 0; i < len; ++i) { var ch = exec[i]; if(ch == '%') { ++i; ch = exec[i]; switch(ch) { case 'B': case 'D': case 'F': case 'M': case 'O': case 'U': case 'W': case 'X': return true; // plural case 'b': case 'd': case 'f': case 'm': case 'o': case 'u': case 'w': case 'x': return false; // singular default: // irrelevent code, skip break; } } } return false; // singular form by default } } // namespace FileActionParameter } // namespace Fm libfm-1.4.0/src/actions/profile.vala000066400000000000000000000116311475513661000173530ustar00rootroot00000000000000// profile.vala // // Copyright 2011 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. // // namespace Fm { public enum FileActionExecMode { NORMAL, TERMINAL, EMBEDDED, DISPLAY_OUTPUT } [Compact] public class FileActionProfile { public FileActionProfile(KeyFile kf, string profile_name) { id = profile_name; string group_name = @"X-Action-Profile $profile_name"; name = Utils.key_file_get_string(kf, group_name, "Name"); exec = Utils.key_file_get_string(kf, group_name, "Exec"); // stdout.printf("id: %s, Exec: %s\n", id, exec); path = Utils.key_file_get_string(kf, group_name, "Path"); var s = Utils.key_file_get_string(kf, group_name, "ExecutionMode"); if(s == "Normal") exec_mode = FileActionExecMode.NORMAL; else if( s == "Terminal") exec_mode = FileActionExecMode.TERMINAL; else if(s == "Embedded") exec_mode = FileActionExecMode.EMBEDDED; else if( s == "DisplayOutput") exec_mode = FileActionExecMode.DISPLAY_OUTPUT; else exec_mode = FileActionExecMode.NORMAL; startup_notify = Utils.key_file_get_bool(kf, group_name, "StartupNotify"); startup_wm_class = Utils.key_file_get_string(kf, group_name, "StartupWMClass"); exec_as = Utils.key_file_get_string(kf, group_name, "ExecuteAs"); condition = new FileActionCondition(kf, group_name); } private bool launch_once(AppLaunchContext ctx, FileInfo? first_file, List files, out string? output) { if(exec == null) return false; var exec_cmd = FileActionParameters.expand(exec, files, false, first_file); stdout.printf("Profile: %s\nlaunch command: %s\n\n", id, exec_cmd); bool ret = false; if(exec_mode == FileActionExecMode.DISPLAY_OUTPUT) { try{ int exit_status; ret = Process.spawn_command_line_sync(exec_cmd, out output, null, out exit_status); if(ret) ret = (exit_status == 0); } catch(SpawnError err) { } } else { /* AppInfoCreateFlags flags = AppInfoCreateFlags.NONE; if(startup_notify) flags |= AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION; if(exec_mode == FileActionExecMode.TERMINAL || exec_mode == FileActionExecMode.EMBEDDED) flags |= AppInfoCreateFlags.NEEDS_TERMINAL; GLib.AppInfo app = Fm.AppInfo.create_from_commandline(exec, null, flags); stdout.printf("Execute command line: %s\n\n", exec); ret = app.launch(null, ctx); */ // NOTE: we cannot use GAppInfo here since GAppInfo does // command line parsing which involving %u, %f, and other // code defined in desktop entry spec. // This may conflict with DES EMA parameters. // FIXME: so how to handle this cleaner? // Maybe we should leave all %% alone and don't translate // them to %. Then GAppInfo will translate them to %, not // codes specified in DES. try { ret = Process.spawn_command_line_async(exec_cmd); } catch(SpawnError err) { } } return ret; } public bool launch(AppLaunchContext ctx, List files, out string? output) { bool plural_form = FileActionParameters.is_plural(exec); bool ret; if(plural_form) { // plural form command, handle all files at a time ret = launch_once(ctx, files.first().data, files, out output); } else { // singular form command, run once for each file StringBuilder all_output = null; if(output != null) all_output = new StringBuilder(); foreach(unowned FileInfo fi in files) { string one_output; launch_once(ctx, fi, files, out one_output); if(all_output != null && one_output != null) { // FIXME: how to handle multiple output strings properly? all_output.append(one_output); // is it ok to join them all? all_output.append("\n"); } } if(all_output != null && output != null) output = (owned) all_output.str; ret = true; } return ret; } public bool match(List files) { stdout.printf(" match profile: %s\n", id); return condition.match(files); } public string id; public string? name; public string exec; public string? path; public FileActionExecMode exec_mode; public bool startup_notify; public string? startup_wm_class; public string? exec_as; public FileActionCondition condition; } } libfm-1.4.0/src/actions/utils.vala000066400000000000000000000040141475513661000170500ustar00rootroot00000000000000// utils.vala // // Copyright 2011 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. // // namespace Utils { private string key_file_get_string(KeyFile kf, string group, string key, string? def_val=null) { string? val; try { val = kf.get_string(group, key); } catch(KeyFileError err) { val = def_val; } return val; } private string[]? key_file_get_string_list(KeyFile kf, string group, string key, string[]? def_val=null) { string[]? val; try { val = kf.get_string_list(group, key); } catch(KeyFileError err) { val = def_val; } return val; } private string? key_file_get_locale_string(KeyFile kf, string group, string key, string? def_val=null) { string? val; try { val = kf.get_locale_string(group, key); } catch(KeyFileError err) { val = def_val; } return val; } private bool key_file_get_bool(KeyFile kf, string group, string key, bool def_val=false) { bool val; try { val = kf.get_boolean(group, key); } catch(KeyFileError err) { val = def_val; } return val; } #if 0 private int key_file_get_int(KeyFile kf, string group, string key, int def_val=0) { int val; try { val = kf.get_integer(group, key); } catch(KeyFileError err) { val = def_val; } return val; } #endif } libfm-1.4.0/src/base/000077500000000000000000000000001475513661000143165ustar00rootroot00000000000000libfm-1.4.0/src/base/fm-action.c000066400000000000000000002453341475513661000163520ustar00rootroot00000000000000/* * fm-action.c * * Copyright 2014-2021 Andriy Grytsenko (LStranger) * Copyright 2020 Leonardo Citrolo * Copyright 2020 wb9688 * Copyright 2024 Ingo Brückl * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-action * @short_description: Support for DES-EMA extension for menus and actions. * @title: FmAction * * @include: libfm/fm.h * * The FmActionCache object represents a cache for user-defined menus and * actions that can be used in the file manager. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-action.h" #include "fm-terminal.h" #include "glib-compat.h" #include #include #include #include #include typedef struct _FmActionCondition FmActionCondition; typedef struct _FmActionInfo FmActionInfo; typedef struct _FmActionDir FmActionDir; typedef enum { CONDITION_CAPS_OWNER = (1<<0), /* Owner */ CONDITION_CAPS_READABLE = (1<<1), /* Readable */ CONDITION_CAPS_WRITABLE = (1<<2), /* Writable */ CONDITION_CAPS_EXECUTABLE = (1<<3), /* Executable */ CONDITION_CAPS_LOCAL = (1<<4) /* Local */ } FmActionConditionCaps; #define CONDITION_CAPS_SHIFT_NEGATE 5 /* bits to negate */ typedef enum { /* numerics */ CONDITION_TYPE_COUNT = 0x0, /* SelectionCount = */ CONDITION_TYPE_COUNT_LESS, /* SelectionCount < */ CONDITION_TYPE_COUNT_MORE, /* SelectionCount > */ CONDITION_TYPE_CAPS, /* Capabilities */ /* strings */ CONDITION_TYPE_RUN = 0x10, /* ShowIfRunning */ CONDITION_TYPE_TRY_EXEC, /* TryExec */ CONDITION_TYPE_DBUS, /* ShowIfRegistered */ CONDITION_TYPE_OUT_TRUE, /* ShowIfTrue */ /* string lists */ CONDITION_TYPE_MIME = 0x20, /* MimeTypes */ CONDITION_TYPE_BASENAME, /* Basenames with Matchcase=true */ CONDITION_TYPE_NCASE_BASENAME, /* the same with Matchcase=false */ CONDITION_TYPE_SCHEME, /* Schemes */ CONDITION_TYPE_FOLDER, /* Folders */ } FmActionConditionType; #define CONDITION_TYPE_MASK 0xf0 /* see above */ #define CONDITION_TYPE_STRING 0x10 #define CONDITION_TYPE_STRING_LIST 0x20 struct _FmActionCondition { FmActionCondition *next; FmActionConditionType type; union { int num; /* 0x0X */ char *str; /* 0x1X */ char **list; /* 0x2X */ }; }; typedef enum { ACTION_TARGET_CONTEXT = (1 << 0), ACTION_TARGET_LOCATION = (1 << 1), ACTION_TARGET_TOOLBAR = (1 << 2) } FmActionTarget; struct _FmActionInfo { gint n_ref; GSList *profiles; /* list of FmAction, noref */ GFile *dir; /* for monitoring, noref */ char *id; /* file basename */ FmActionCondition *conditions; /* list of FmActionCondition, allocated */ char *name; /* Name field */ char *desc; /* Description field */ char *icon_name; /* Icon field */ char *tooltip; /* Tooltip field */ char *toolbar_label; /* ToolbarLabel field */ char *shortcut; /* SuggestedShortcut field */ FmActionTarget target; gboolean enabled : 1; /* Enabled field */ }; typedef enum { EXEC_MODE_NORMAL, EXEC_MODE_TERMINAL, EXEC_MODE_EMBEDDED, EXEC_MODE_DISPLAY_OUTPUT } FmActionExecMode; struct _FmAction { GObject parent_object; FmActionInfo *info; /* main data, ref */ FmActionCondition *conditions; /* list of FmActionCondition, allocated */ char *exec; /* Exec field */ char *binary; /* only executable name from exec */ char *path; /* Path field */ char *wm_class; /* StartupWMClass field */ char *exec_as; /* ExecuteAs field */ FmActionMenu *menu; /* menu this item was created for, noref */ FmActionExecMode exec_mode; /* ExecutionMode field */ gboolean use_sn : 1; /* StartupNotify field */ gboolean hidden : 1; /* if denied by OnlyShowIn & NotShowIn */ }; struct _FmActionDir { FmActionDir *next; GFile *dir; GFileMonitor *mon; }; struct _FmActionMenu { GObject parent_object; GFile *dir; /* for monitoring, noref */ char *id; /* file basename */ FmActionCondition *conditions; /* list of FmActionCondition, allocated */ char **ids; /* ItemsList field */ char *name; /* Name field */ char *desc; /* Description field */ char *icon_name; /* Icon field */ char *tooltip; /* Tooltip field */ char *shortcut; /* SuggestedShortcut field */ FmActionCache *cache; /* cache this menu belongs to, noref */ GList *children; /* FmAction / FmActionMenu, ref - NULL for cache-only */ FmActionMenu *parent; /* menu this item was created for, noref */ FmFileInfoList *files; /* only for top menu - starting conditions */ FmActionTarget target; gboolean enabled : 1; /* Enabled field */ }; /* references schema: * * FmActionCache * +--> FmActionMenu * +-----+--> FmAction * +--> FmActionInfo */ struct _FmActionCache { GObject parent_object; }; static FmActionDir *cache_dirs; /* list of FmActionDir, allocated */ static GList *cache_actions; /* list of FmAction, ref */ static GList *cache_menus; /* list of FmActionMenu, ref */ static GSList *cache_to_update; /* strings list, allocated, updater_data invalid if NULL */ static FmActionCache **cache_updater_data; /* locked, freed by idle function */ #if GLIB_CHECK_VERSION(2, 32, 0) static GWeakRef singleton; #else static int cache_n_ref = 0; #endif G_LOCK_DEFINE_STATIC(update); /* protects all lists */ /* ---- FmActionInfo manipulations */ static void _fm_action_conditions_free(FmActionCondition *this) { while (this != NULL) { FmActionCondition *next = this->next; if ((this->type & CONDITION_TYPE_MASK) == CONDITION_TYPE_STRING) g_free(this->str); else if ((this->type & CONDITION_TYPE_MASK) == CONDITION_TYPE_STRING_LIST) g_strfreev(this->list); g_slice_free(FmActionCondition, this); this = next; } } /* lock is on, don't do any unref! */ static FmActionInfo *_fm_action_info_ref(FmActionInfo *info, FmAction *action) { g_assert (g_slist_find(info->profiles, action) == NULL); info->profiles = g_slist_append(info->profiles, action); info->n_ref++; return info; } /* lock is on */ static void _fm_action_info_unref(FmActionInfo *info, FmAction *action) { GSList *link = g_slist_find(info->profiles, action); g_return_if_fail(link != NULL); info->profiles = g_slist_delete_link(info->profiles, link); info->n_ref--; if (info->n_ref > 0) return; g_assert(info->profiles == NULL); _fm_action_conditions_free(info->conditions); g_free(info->id); g_free(info->name); g_free(info->desc); g_free(info->icon_name); g_free(info->tooltip); g_free(info->toolbar_label); g_free(info->shortcut); g_slice_free(FmActionInfo, info); } /* ---- Parameters expansion ---- */ static inline FmActionMenu *_get_top_menu(FmActionMenu *menu) { if (menu != NULL) while (menu->parent != NULL) menu = menu->parent; return menu; } static gboolean _expand_params(GString *str, const char *line, FmActionMenu *at, gboolean do_quote, GError **error) { FmActionMenu *menu; FmFileInfoList *files; FmFileInfo *file; GList *head, *l; char *tmp, *c; const char *scheme; char *(*quote_func)(const char *); gsize len; if (line == NULL || line[0] == '\0') { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Empty value")); return FALSE; } menu = _get_top_menu(at); if (menu == NULL) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Invalid selection")); return FALSE; } files = menu->files; if (menu->files == NULL) /* it's valid case if not context menu */ menu->files = fm_file_info_list_new(); head = fm_file_info_list_peek_head_link(menu->files); file = head->data; if (do_quote) quote_func = g_shell_quote; else quote_func = g_strdup; while (*line) { if (*line == '%') switch (*++line) { case '%': g_string_append_c(str, '%'); break; case 'b': tmp = quote_func(fm_file_info_get_name(file)); g_string_append(str, tmp); g_free(tmp); break; case 'B': tmp = quote_func(fm_file_info_get_name(file)); g_string_append(str, tmp); g_free(tmp); for (l = head->next; l != NULL; l = l->next) { g_string_append_c(str, ' '); tmp = quote_func(fm_file_info_get_name(l->data)); g_string_append(str, tmp); g_free(tmp); } break; case 'c': g_string_append_printf(str, "%d", fm_file_info_list_get_length(files)); break; case 'd': if (menu->target == ACTION_TARGET_CONTEXT) tmp = fm_path_to_str(fm_path_get_parent(fm_file_info_get_path(file))); else tmp = fm_path_to_str(fm_file_info_get_path(file)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); break; case 'D': if (menu->target == ACTION_TARGET_CONTEXT) tmp = fm_path_to_str(fm_path_get_parent(fm_file_info_get_path(file))); else tmp = fm_path_to_str(fm_file_info_get_path(file)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); for (l = head->next; l != NULL; l = l->next) { g_string_append_c(str, ' '); tmp = fm_path_to_str(fm_path_get_parent(fm_file_info_get_path(l->data))); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); } break; case 'f': tmp = fm_path_to_str(fm_file_info_get_path(file)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); break; case 'F': tmp = fm_path_to_str(fm_file_info_get_path(file)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); for (l = head->next; l != NULL; l = l->next) { g_string_append_c(str, ' '); tmp = fm_path_to_str(fm_file_info_get_path(l->data)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); } break; case 'h': scheme = fm_path_get_basename(fm_path_get_scheme_path(fm_file_info_get_path(file))); len = strlen(scheme) - 1; /* it's at last '/' now */ tmp = (char *)&scheme[len]; /* implement GNU-only memrchr() */ while (tmp > scheme && *--tmp != '/'); /* it's at host now */ if (*tmp != '/') /* it's not remote path */ break; len -= (tmp - scheme); if (len == 0) break; c = &tmp[len]; while (c > tmp && *--c != '@'); /* skip non-host part */ if (*c == '@') { len -= ((++c) - tmp); if (len == 0) break; tmp = c; } c = memchr(tmp, ':', len); /* discard port part */ if (c != NULL) len = c - tmp; if (len > 0) { c = g_strndup(tmp, len); tmp = quote_func(c); g_free(c); g_string_append(str, tmp); g_free(tmp); } break; case 'm': g_string_append(str, fm_mime_type_get_type(fm_file_info_get_mime_type(file))); break; case 'M': g_string_append(str, fm_mime_type_get_type(fm_file_info_get_mime_type(file))); for (l = head->next; l; l = l->next) { g_string_append_c(str, ' '); g_string_append(str, fm_mime_type_get_type(fm_file_info_get_mime_type(l->data))); } break; case 'n': scheme = fm_path_get_basename(fm_path_get_scheme_path(fm_file_info_get_path(file))); len = strlen(scheme) - 1; /* it's at last '/' now */ tmp = (char *)&scheme[len]; /* implement GNU-only memrchr() */ while (tmp > scheme && *--tmp != '/'); /* it's at host now */ if (*tmp != '/') /* it's not remote path */ break; len -= (tmp - scheme); if (len == 0) break; c = &tmp[len]; while (c > tmp && *--c != '@'); /* skip non-host part */ if (*c == '@') { len = c - tmp; if (len == 0) break; c = memchr(tmp, ':', len); /* URI might contain password? */ if (c != NULL) len = c - tmp; if (len > 0) g_string_append_len(str, tmp, len); } break; case 'o': /* FIXME */ break; case 'O': /* FIXME */ break; case 'p': scheme = fm_path_get_basename(fm_path_get_scheme_path(fm_file_info_get_path(file))); len = strlen(scheme) - 1; /* it's at last '/' now */ tmp = (char *)&scheme[len]; /* implement GNU-only memrchr() */ while (tmp > scheme && *--tmp != '/'); /* it's at host now */ if (*tmp != '/') /* it's not remote path */ break; len -= (tmp - scheme); if (len == 0) break; c = &tmp[len]; while (c > tmp && *--c != '@'); /* skip non-host part */ if (*c == '@') { len -= ((++c) - tmp); if (len == 0) break; tmp = c; } c = memchr(tmp, ':', len); /* find port part */ if (c != NULL && &c[1] < &tmp[len]) g_string_append_len(str, &c[1], (c - tmp) + 1); break; case 's': scheme = fm_path_get_basename(fm_path_get_scheme_path(fm_file_info_get_path(file))); c = strchr(scheme, ':'); if (c == NULL || c == scheme) g_string_append(str, "file"); else g_string_append_len(str, scheme, c - scheme); break; case 'u': tmp = fm_path_to_uri(fm_file_info_get_path(file)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); break; case 'U': tmp = fm_path_to_uri(fm_file_info_get_path(file)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); for (l = head->next; l != NULL; l = l->next) { g_string_append_c(str, ' '); tmp = fm_path_to_uri(fm_file_info_get_path(l->data)); c = quote_func(tmp); g_string_append(str, c); g_free(c); g_free(tmp); } break; case 'w': scheme = fm_file_info_get_name(file); tmp = quote_func(scheme); c = strrchr(tmp, '.'); if (c != NULL) g_string_append_len(str, tmp, c - tmp); else g_string_append(str, tmp); g_free(tmp); break; case 'W': scheme = fm_file_info_get_name(file); tmp = quote_func(scheme); c = strrchr(tmp, '.'); if (c != NULL) g_string_append_len(str, tmp, c - tmp); else g_string_append(str, tmp); g_free(tmp); for (l = head->next; l != NULL; l = l->next) { g_string_append_c(str, ' '); scheme = fm_file_info_get_name(l->data); tmp = quote_func(scheme); c = strrchr(tmp, '.'); if (c != NULL) g_string_append_len(str, tmp, c - tmp); else g_string_append(str, tmp); g_free(tmp); } break; case 'x': scheme = fm_file_info_get_name(file); c = strrchr(scheme, '.'); if (c != NULL) g_string_append(str, &c[1]); break; case 'X': scheme = fm_file_info_get_name(file); c = strrchr(scheme, '.'); if (c != NULL) g_string_append(str, &c[1]); for (l = head->next; l != NULL; l = l->next) { g_string_append_c(str, ' '); scheme = fm_file_info_get_name(l->data); c = strrchr(scheme, '.'); if (c != NULL) g_string_append(str, &c[1]); } break; default: ; /* ignore invalid */ } else g_string_append_c(str, *line); line++; } return TRUE; } /* ---- FmAction class ---- */ static void fm_action_g_app_info_init(GAppInfoIface *iface); G_DEFINE_TYPE_WITH_CODE(FmAction, fm_action, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_APP_INFO, fm_action_g_app_info_init)) static void fm_action_finalize(GObject *object) { FmAction *action = FM_ACTION(object); G_LOCK(update); _fm_action_info_unref(action->info, action); G_UNLOCK(update); _fm_action_conditions_free(action->conditions); g_free(action->exec); g_free(action->binary); g_free(action->path); g_free(action->wm_class); g_free(action->exec_as); g_assert(action->menu == NULL); /* it should've been reset by menu */ G_OBJECT_CLASS(fm_action_parent_class)->finalize(object); } static void fm_action_class_init(FmActionClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = fm_action_finalize; } static void fm_action_init(FmAction *item) { /* nothing */ } /* lock is on */ static FmAction * _fm_action_new(void) { return (FmAction *)g_object_new(FM_TYPE_ACTION, NULL); } static GAppInfo * _fm_action_dup(GAppInfo *appinfo) { FmAction *action = FM_ACTION(appinfo); FmAction *dup = _fm_action_new(); G_LOCK(update); dup->info = _fm_action_info_ref(action->info, dup); G_UNLOCK(update); /* conditions for duplicate should be NULL */ dup->exec = g_strdup(action->exec); dup->binary = g_strdup(action->binary); dup->path = g_strdup(action->path); dup->wm_class = g_strdup(action->wm_class); dup->exec_as = g_strdup(action->exec_as); /* menu for duplicate should be NULL */ dup->exec_mode = action->exec_mode; dup->use_sn = action->use_sn; return (GAppInfo *)dup; } static gboolean _fm_action_equal(GAppInfo *appinfo1, GAppInfo *appinfo2) { return (FM_ACTION(appinfo1)->info == FM_ACTION(appinfo2)->info); } static const char * _fm_action_get_id(GAppInfo *appinfo) { return FM_ACTION(appinfo)->info->id; } static const char * _fm_action_get_name(GAppInfo *appinfo) { // _expand_params(str, action->info->name, action->menu, NULL); return FM_ACTION(appinfo)->info->name; } static const char * _fm_action_get_description(GAppInfo *appinfo) { return FM_ACTION(appinfo)->info->desc; } static const char * _fm_action_get_executable(GAppInfo *appinfo) { return FM_ACTION(appinfo)->binary; } static GIcon * _fm_action_get_icon(GAppInfo *appinfo) { GString *str = g_string_sized_new(64); FmAction *action = FM_ACTION(appinfo); GIcon *icon = NULL; _expand_params(str, action->info->icon_name, action->menu, FALSE, NULL); if (str->len > 0) icon = (GIcon *)fm_icon_from_name(str->str); g_string_free(str, TRUE); return icon; } struct ChildSetup { char *display; char *sn_id; }; static void child_setup(gpointer user_data) { struct ChildSetup* data = (struct ChildSetup*)user_data; if (data->display && !g_getenv("WAYLAND_DISPLAY")) g_setenv("DISPLAY", data->display, TRUE); if (data->sn_id) g_setenv("DESKTOP_STARTUP_ID", data->sn_id, TRUE); } static gboolean _do_launch(FmAction *action, GAppLaunchContext *launch_context, GError **error) { GString *str = g_string_sized_new(64); char** argv; int argc; gboolean ok = FALSE; /* if (action->exec_mode == EXEC_MODE_EMBEDDED && menu->exec_embedded != NULL) { if (_expand_params(str, action->exec, action->menu, error) ok = menu->exec_embedded(str->str, menu->embedded_data); // launch embedded goto finish; } */ if (action->exec_mode != EXEC_MODE_NORMAL) { FmTerminal* term; static FmTerminal xterm_def = { .program = "xterm", .open_arg = "-e" }; /* prepend terminal to the line */ term = fm_terminal_dup_default(NULL); if (!term) /* fallback to xterm if a terminal emulator is not found. */ term = &xterm_def; g_string_assign(str, term->program); g_string_append_c(str, ' '); if (term->custom_args) { g_string_append(str, term->custom_args); g_string_append_c(str, ' '); } if (action->exec_mode == EXEC_MODE_DISPLAY_OUTPUT && term->noclose_arg) g_string_append(str, term->noclose_arg); else if (term->open_arg) g_string_append(str, term->open_arg); g_string_append_c(str, ' '); if (term != &xterm_def) g_object_unref(term); } if (!_expand_params(str, action->exec, action->menu, TRUE, error)) goto finish; if (g_shell_parse_argv(str->str, &argc, &argv, error)) { FmActionMenu *menu; GList *launched_files, *l; struct ChildSetup data; data.display = NULL; data.sn_id = NULL; if (launch_context) { menu = _get_top_menu(action->menu); /* validated by _expand_params */ launched_files = NULL; for (l = fm_file_info_list_peek_head_link(menu->files); l; l = l->next) launched_files = g_list_prepend(launched_files, fm_path_to_gfile(fm_file_info_get_path(l->data))); launched_files = g_list_reverse(launched_files); data.display = g_app_launch_context_get_display(launch_context, G_APP_INFO(action), launched_files); if (action->use_sn) data.sn_id = g_app_launch_context_get_startup_notify_id(launch_context, G_APP_INFO(action), launched_files); g_list_free_full(launched_files, g_object_unref); } g_string_truncate(str, 0); if (action->path) _expand_params(str, action->path, action->menu, FALSE, NULL); if (str->str[0] != '/') _expand_params(str, "%d", action->menu, FALSE, NULL); /* see the spec */ ok = g_spawn_async(str->str, argv, NULL, G_SPAWN_SEARCH_PATH, child_setup, &data, NULL, error); if (!ok) { if (data.sn_id) g_app_launch_context_launch_failed(launch_context, data.sn_id); } g_free(data.sn_id); g_strfreev(argv); } finish: g_string_free(str, TRUE); return ok; } static gboolean _fm_action_launch(GAppInfo *appinfo, GList *files, GAppLaunchContext *launch_context, GError **error) { /* NOTE: we always launch selection not argument */ return _do_launch(FM_ACTION(appinfo), launch_context, error); } static gboolean _fm_action_supports_uris(GAppInfo *appinfo) { const char *exec = FM_ACTION(appinfo)->exec; while (*exec) { if (*exec++ != '%') continue; if (*exec == 'u' || *exec == 'U') return TRUE; exec++; } return FALSE; } static gboolean _fm_action_true(GAppInfo *appinfo) { return TRUE; } static gboolean _fm_action_launch_uris(GAppInfo *appinfo, GList *uris, GAppLaunchContext *launch_context, GError **error) { /* NOTE: we always launch selection not argument */ return _do_launch(FM_ACTION(appinfo), launch_context, error); } static gboolean _fm_action_should_show(GAppInfo *appinfo) { return FM_ACTION(appinfo)->info->enabled; } #define ERROR_UNSUPPORTED(err) g_set_error_literal(err, G_IO_ERROR, \ G_IO_ERROR_NOT_SUPPORTED, _("Operation not supported")) /* For changing associations */ static gboolean _fm_action_return_false_unsupported(GAppInfo *appinfo, const char *content_type, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_action_false(GAppInfo *appinfo) { return FALSE; } static gboolean _fm_action_do_delete(GAppInfo *appinfo) { /* FIXME: TODO */ return FALSE; } static const char * _fm_action_get_commandline(GAppInfo *appinfo) { return FM_ACTION(appinfo)->exec; } #if GLIB_CHECK_VERSION(2, 24, 0) static const char * _fm_action_get_display_name(GAppInfo *appinfo) { // _expand_params(str, action->info->desc, action->menu, NULL); if (FM_ACTION(appinfo)->info->tooltip != NULL) return FM_ACTION(appinfo)->info->tooltip; return _fm_action_get_name(appinfo); } #endif static void fm_action_g_app_info_init(GAppInfoIface *iface) { iface->dup = _fm_action_dup; iface->equal = _fm_action_equal; iface->get_id = _fm_action_get_id; iface->get_name = _fm_action_get_name; iface->get_description = _fm_action_get_description; iface->get_executable = _fm_action_get_executable; iface->get_icon = _fm_action_get_icon; iface->launch = _fm_action_launch; iface->supports_uris = _fm_action_supports_uris; iface->supports_files = _fm_action_true; /* FIXME: is this right? */ iface->launch_uris = _fm_action_launch_uris; iface->should_show = _fm_action_should_show; iface->set_as_default_for_type = _fm_action_return_false_unsupported; iface->set_as_default_for_extension = _fm_action_return_false_unsupported; iface->add_supports_type = _fm_action_return_false_unsupported; iface->can_remove_supports_type = _fm_action_false; iface->remove_supports_type = _fm_action_return_false_unsupported; iface->can_delete = _fm_action_false; iface->do_delete = _fm_action_do_delete; iface->get_commandline = _fm_action_get_commandline; #if GLIB_CHECK_VERSION(2, 24, 0) iface->get_display_name = _fm_action_get_display_name; #endif #if GLIB_CHECK_VERSION(2, 28, 0) iface->set_as_last_used_for_type = _fm_action_return_false_unsupported; #endif } /* ---- FmActionMenu class ---- */ static void _fm_action_menu_free_children(FmActionMenu *menu) { /* recursively free the allocated menu tree */ while (menu->children) { if (menu->children->data == NULL) ; /* separator */ else if (FM_IS_ACTION(menu->children->data)) { FmAction *action = menu->children->data; G_LOCK(update); g_assert(action->menu == menu); action->menu = NULL; G_UNLOCK(update); } else { FmActionMenu *submenu = menu->children->data; g_assert(FM_IS_ACTION_MENU(submenu)); g_assert(submenu->parent == menu); G_LOCK(update); submenu->parent = NULL; G_UNLOCK(update); _fm_action_menu_free_children(submenu); } if (menu->children->data != NULL) g_object_unref(menu->children->data); menu->children = g_list_delete_link(menu->children, menu->children); } } static void fm_action_menu_g_app_info_init(GAppInfoIface *iface); G_DEFINE_TYPE_WITH_CODE(FmActionMenu, fm_action_menu, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_APP_INFO, fm_action_menu_g_app_info_init)) static void fm_action_menu_finalize(GObject *object) { FmActionMenu *menu = FM_ACTION_MENU(object); g_free(menu->id); _fm_action_conditions_free(menu->conditions); g_strfreev(menu->ids); g_free(menu->name); g_free(menu->desc); g_free(menu->icon_name); g_free(menu->tooltip); g_free(menu->shortcut); _fm_action_menu_free_children(menu); g_assert(menu->parent == NULL); /* it should've been reset by parent menu */ if (menu->files != NULL) fm_file_info_list_unref(menu->files); G_OBJECT_CLASS(fm_action_menu_parent_class)->finalize(object); } static void fm_action_menu_class_init(FmActionMenuClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = fm_action_menu_finalize; } static void fm_action_menu_init(FmActionMenu *item) { /* nothing */ } /* lock is on */ static FmActionMenu * _fm_action_menu_new(void) { return (FmActionMenu *)g_object_new(FM_TYPE_ACTION_MENU, NULL); } static GAppInfo * _fm_action_menu_dup(GAppInfo *appinfo) { FmActionMenu *menu = FM_ACTION_MENU(appinfo); FmActionMenu *dup = _fm_action_menu_new(); /* conditions, ids, dir for duplicate should be NULL */ dup->id = g_strdup(menu->id); dup->name = g_strdup(menu->name); dup->desc = g_strdup(menu->desc); dup->icon_name = g_strdup(menu->icon_name); dup->tooltip = g_strdup(menu->tooltip); dup->shortcut = g_strdup(menu->shortcut); /* duplicate isn't in cache nor in any menu tree */ dup->enabled = menu->enabled; return (GAppInfo *)dup; } static gboolean _fm_action_menu_equal(GAppInfo *appinfo1, GAppInfo *appinfo2) { return (g_strcmp0(FM_ACTION_MENU(appinfo1)->id, FM_ACTION_MENU(appinfo2)->id) == 0); } static const char * _fm_action_menu_get_id(GAppInfo *appinfo) { return FM_ACTION_MENU(appinfo)->id; } static const char * _fm_action_menu_get_name(GAppInfo *appinfo) { // _expand_params(str, menu->name, menu, NULL); return FM_ACTION_MENU(appinfo)->name; } static const char * _fm_action_menu_get_description(GAppInfo *appinfo) { return FM_ACTION_MENU(appinfo)->desc; } static const char * _fm_action_menu_get_executable(GAppInfo *appinfo) { return NULL; } static GIcon * _fm_action_menu_get_icon(GAppInfo *appinfo) { GString *str = g_string_sized_new(64); FmActionMenu *menu = FM_ACTION_MENU(appinfo); GIcon *icon = NULL; _expand_params(str, menu->icon_name, menu, FALSE, NULL); if (str->len > 0) icon = (GIcon *)fm_icon_from_name(str->str); g_string_free(str, TRUE); return icon; } static gboolean _fm_action_menu_launch(GAppInfo *appinfo, GList *files, GAppLaunchContext *launch_context, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_action_menu_should_show(GAppInfo *appinfo) { return FM_ACTION_MENU(appinfo)->enabled; } static gboolean _fm_action_menu_do_delete(GAppInfo *appinfo) { /* FIXME: TODO */ return FALSE; } #if GLIB_CHECK_VERSION(2, 24, 0) static const char * _fm_action_menu_get_display_name(GAppInfo *appinfo) { // _expand_params(str, menu->desc, menu, NULL); return FM_ACTION_MENU(appinfo)->tooltip; } #endif static void fm_action_menu_g_app_info_init(GAppInfoIface *iface) { iface->dup = _fm_action_menu_dup; iface->equal = _fm_action_menu_equal; iface->get_id = _fm_action_menu_get_id; iface->get_name = _fm_action_menu_get_name; iface->get_description = _fm_action_menu_get_description; iface->get_executable = _fm_action_menu_get_executable; iface->get_icon = _fm_action_menu_get_icon; iface->launch = _fm_action_menu_launch; iface->supports_uris = _fm_action_false; iface->supports_files = _fm_action_false; iface->launch_uris = _fm_action_menu_launch; iface->should_show = _fm_action_menu_should_show; iface->set_as_default_for_type = _fm_action_return_false_unsupported; iface->set_as_default_for_extension = _fm_action_return_false_unsupported; iface->add_supports_type = _fm_action_return_false_unsupported; iface->can_remove_supports_type = _fm_action_false; iface->remove_supports_type = _fm_action_return_false_unsupported; iface->can_delete = _fm_action_false; iface->do_delete = _fm_action_menu_do_delete; iface->get_commandline = _fm_action_menu_get_executable; #if GLIB_CHECK_VERSION(2, 24, 0) iface->get_display_name = _fm_action_menu_get_display_name; #endif #if GLIB_CHECK_VERSION(2, 28, 0) iface->set_as_last_used_for_type = _fm_action_return_false_unsupported; #endif } /* ---- FmActionCache class ---- */ static void _action_cache_monitor_event(GFileMonitor *mon, GFile *gf, GFile *other, GFileMonitorEvent evt, FmActionCache *cache); G_DEFINE_TYPE(FmActionCache, fm_action_cache, G_TYPE_OBJECT); static void _fm_action_cache_finalize(GObject *object) { FmActionCache *cache = FM_ACTION_CACHE(object); GSList *l_to_update; GList *l_actions, *l_menus; FmActionDir *l_dirs; G_LOCK(update); /* lock it ahead to prevent race condition */ #if !GLIB_CHECK_VERSION(2, 32, 0) if (!g_atomic_int_dec_and_test(&cache_n_ref)) { G_UNLOCK(update); goto finish; } #endif if (cache_to_update != NULL) *cache_updater_data = NULL; /* terminate the updater */ /* updater is finished now, can free everything */ l_to_update = cache_to_update; cache_to_update = NULL; l_actions = cache_actions; cache_actions = NULL; l_menus = cache_menus; cache_menus = NULL; l_dirs = cache_dirs; cache_dirs = NULL; G_UNLOCK(update); g_slist_free_full(l_to_update, g_free); g_list_free_full(l_actions, g_object_unref); g_list_free_full(l_menus, g_object_unref); while (l_dirs != NULL) { FmActionDir *dir = l_dirs; l_dirs = dir->next; g_signal_handlers_disconnect_by_func(dir->mon, _action_cache_monitor_event, cache); g_object_unref(dir->mon); g_object_unref(dir->dir); g_slice_free(FmActionDir, dir); } #if !GLIB_CHECK_VERSION(2, 32, 0) finish: #endif G_OBJECT_CLASS(fm_action_cache_parent_class)->finalize(object); } static void fm_action_cache_class_init(FmActionCacheClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = _fm_action_cache_finalize; } static void fm_action_cache_init(FmActionCache *cache) { /* nothing */ } /* ---- internal API ---- */ static inline FmActionCondition *_add_condition_int(FmActionCondition *clist, FmActionConditionType type, gint val) { FmActionCondition *cond = g_slice_new(FmActionCondition); cond->next = clist; cond->type = type; cond->num = val; return cond; } static inline FmActionCondition *_add_condition_str(FmActionCondition *clist, FmActionConditionType type, gchar *val) { FmActionCondition *cond = g_slice_new(FmActionCondition); cond->next = clist; cond->type = type; cond->str = val; return cond; } static inline FmActionCondition *_add_condition_str_list(FmActionCondition *clist, FmActionConditionType type, gchar **val) { FmActionCondition *cond = g_slice_new(FmActionCondition); cond->next = clist; cond->type = type; cond->list = val; return cond; } /* lock is on, don't do any unref! */ static FmActionCondition *_g_key_file_get_conditions(GKeyFile *kf, const char *group) { FmActionCondition *clist = NULL; char *cval, *c; int ival; char **lval, **x; GError *error; gboolean bval; FmActionConditionType type; /* string lists */ lval = g_key_file_get_string_list(kf, group, "MimeTypes", NULL, NULL); if (lval) clist = _add_condition_str_list(clist, CONDITION_TYPE_MIME, lval); lval = g_key_file_get_string_list(kf, group, "Basenames", NULL, NULL); if (lval) { type = CONDITION_TYPE_BASENAME; error = NULL; bval = g_key_file_get_boolean(kf, group, "Matchcase", &error); if (error) g_error_free(error); else if (!bval) { type = CONDITION_TYPE_NCASE_BASENAME; for (x = lval; x[0] != NULL; x++) { c = x[0]; x[0] = g_utf8_casefold(c, -1); g_free(c); } } clist = _add_condition_str_list(clist, type, lval); } lval = g_key_file_get_string_list(kf, group, "Schemes", NULL, NULL); if (lval) clist = _add_condition_str_list(clist, CONDITION_TYPE_SCHEME, lval); lval = g_key_file_get_string_list(kf, group, "Folders", NULL, NULL); if (lval) { /* add pattern* for each pattern that don't ends with '*' */ ival = g_strv_length(lval); lval = g_renew(char *, lval, ival * 2 + 1); for (x = lval; x[0] != NULL; x++) { c = x[0] + strlen(x[0]); if (c == x[0] || c[-1] != '*') lval[ival++] = g_strconcat(x[0], "/*", NULL); } lval[ival] = NULL; clist = _add_condition_str_list(clist, CONDITION_TYPE_FOLDER, lval); } /* strings */ cval = g_key_file_get_string(kf, group, "ShowIfRunning", NULL); if (cval) clist = _add_condition_str(clist, CONDITION_TYPE_RUN, cval); cval = g_key_file_get_string(kf, group, "TryExec", NULL); if (cval) clist = _add_condition_str(clist, CONDITION_TYPE_TRY_EXEC, cval); cval = g_key_file_get_string(kf, group, "ShowIfRegistered", NULL); if (cval) clist = _add_condition_str(clist, CONDITION_TYPE_DBUS, cval); cval = g_key_file_get_string(kf, group, "ShowIfTrue", NULL); if (cval) clist = _add_condition_str(clist, CONDITION_TYPE_OUT_TRUE, cval); /* integers */ lval = g_key_file_get_string_list(kf, group, "Capabilities", NULL, NULL); if (lval) { ival = 0; for (x = lval; x[0] != NULL; x++) { if (x[0][0] == '!') { if (strcmp(x[0] + 1, "Owner") == 0) ival |= (CONDITION_CAPS_OWNER << CONDITION_CAPS_SHIFT_NEGATE); else if (strcmp(x[0] + 1, "Readable") == 0) ival |= (CONDITION_CAPS_READABLE << CONDITION_CAPS_SHIFT_NEGATE); else if (strcmp(x[0] + 1, "Writable") == 0) ival |= (CONDITION_CAPS_WRITABLE << CONDITION_CAPS_SHIFT_NEGATE); else if (strcmp(x[0] + 1, "Executable") == 0) ival |= (CONDITION_CAPS_EXECUTABLE << CONDITION_CAPS_SHIFT_NEGATE); else if (strcmp(x[0] + 1, "Local") == 0) ival |= (CONDITION_CAPS_LOCAL << CONDITION_CAPS_SHIFT_NEGATE); } else if (strcmp(x[0], "Owner") == 0) ival |= CONDITION_CAPS_OWNER; else if (strcmp(x[0], "Readable") == 0) ival |= CONDITION_CAPS_READABLE; else if (strcmp(x[0], "Writable") == 0) ival |= CONDITION_CAPS_WRITABLE; else if (strcmp(x[0], "Executable") == 0) ival |= CONDITION_CAPS_EXECUTABLE; else if (strcmp(x[0], "Local") == 0) ival |= CONDITION_CAPS_LOCAL; } if (ival != 0) clist = _add_condition_int(clist, CONDITION_TYPE_CAPS, ival); g_strfreev(lval); } cval = g_key_file_get_string(kf, group, "SelectionCount", NULL); if (cval) { c = cval; if (c[0] == '<') c++, type = CONDITION_TYPE_COUNT_LESS; else if (c[0] == '>') c++, type = CONDITION_TYPE_COUNT_MORE; else if (c[0] == '=') c++, type = CONDITION_TYPE_COUNT; else type = CONDITION_TYPE_COUNT; while (c[0] == ' ') c++; ival = strtoul(c, &c, 10); while (c[0] == ' ') c++; if (c[0] == '\0') clist = _add_condition_int(clist, type, ival); g_free(cval); } return clist; } /* lock is on, don't do any unref! */ static void fm_actions_add_action_from_keyfile(FmActionCache *cache, GKeyFile *kf, GFile *parent, const char *id, const char *name) { FmActionInfo *info; GString *key; char **profiles; char **profile; char *exec, *c; FmAction *action; if (g_key_file_get_boolean(kf, "Desktop Entry", "Hidden", NULL)) /* deleted */ return; info = g_slice_new0(FmActionInfo); key = g_string_sized_new(32); profiles = g_key_file_get_string_list(kf, "Desktop Entry", "Profiles", NULL, NULL); if (profiles) for (profile = profiles; *profile; profile++) { g_string_printf(key, "X-Action-Profile %s", *profile); exec = g_key_file_get_string(kf, key->str, "Exec", NULL); if (exec == NULL) continue; action = _fm_action_new(); action->exec = exec; c = strchr(exec, ' '); if (c == NULL) action->binary = g_strdup(exec); else action->binary = g_strndup(exec, c - exec); action->info = _fm_action_info_ref(info, action); action->path = g_key_file_get_string(kf, key->str, "Path", NULL); action->wm_class = g_key_file_get_string(kf, key->str, "StartupWMClass", NULL); action->exec_as = g_key_file_get_string(kf, key->str, "ExecuteAs", NULL); action->use_sn = g_key_file_get_boolean(kf, key->str, "StartupNotify", NULL); c = g_key_file_get_string(kf, key->str, "ExecutionMode", NULL); if (c != NULL) { if (strcmp(c, "Terminal") == 0) action->exec_mode = EXEC_MODE_TERMINAL; else if (strcmp(c, "Embedded") == 0) action->exec_mode = EXEC_MODE_EMBEDDED; else if (strcmp(c, "DisplayOutput") == 0) action->exec_mode = EXEC_MODE_DISPLAY_OUTPUT; g_free(c); } action->conditions = _g_key_file_get_conditions(kf, key->str); cache_actions = g_list_prepend(cache_actions, action); /* FIXME: check OnlyShowIn and NotShowIn into ->hidden */ } g_strfreev(profiles); g_string_free(key, TRUE); if (info->profiles == NULL) { g_slice_free(FmActionInfo, info); return; } info->dir = parent; info->id = g_strdup(id); info->name = g_strdup(name); info->tooltip = g_key_file_get_locale_string(kf, "Desktop Entry", "Tooltip", NULL, NULL); info->icon_name = g_key_file_get_locale_string(kf, "Desktop Entry", "Icon", NULL, NULL); info->desc = g_key_file_get_locale_string(kf, "Desktop Entry", "Description", NULL, NULL); info->shortcut = g_key_file_get_string(kf, "Desktop Entry", "SuggestedShortcut", NULL); info->enabled = TRUE; /* FIXME: if enabled then check OnlyShowIn and NotShowIn */ if (g_key_file_has_key(kf, "Desktop Entry", "Enabled", NULL)) info->enabled = g_key_file_get_boolean(kf, "Desktop Entry", "Enabled", NULL); info->toolbar_label = g_key_file_get_locale_string(kf, "Desktop Entry", "ToolbarLabel", NULL, NULL); info->conditions = _g_key_file_get_conditions(kf, "Desktop Entry"); info->target = ACTION_TARGET_CONTEXT; if (g_key_file_has_key(kf, "Desktop Entry", "TargetContext", NULL) && !g_key_file_get_boolean(kf, "Desktop Entry", "TargetContext", NULL)) info->target = 0; else info->target = ACTION_TARGET_CONTEXT; if (g_key_file_get_boolean(kf, "Desktop Entry", "TargetLocation", NULL)) info->target |= ACTION_TARGET_LOCATION; if (g_key_file_get_boolean(kf, "Desktop Entry", "TargetToolbar", NULL)) info->target |= ACTION_TARGET_TOOLBAR; } /* lock is on, don't do any unref! */ static void fm_actions_add_menu_from_keyfile(FmActionCache *cache, GKeyFile *kf, GFile *parent, const char *id, const char *name) { FmActionMenu *menu; char **ids; int i; if (g_key_file_get_boolean(kf, "Desktop Entry", "Hidden", NULL)) /* deleted */ return; ids = g_key_file_get_string_list(kf, "Desktop Entry", "ItemsList", NULL, NULL); if (ids == NULL || ids[0] == NULL) { g_strfreev(ids); return; } menu = _fm_action_menu_new(); menu->ids = ids; /* arggh! crazy Windows style "no-extension"! */ for (i = 0; ids[i] != NULL; i++) { char *orig = ids[i]; if (strcmp(orig, "SEPARATOR") == 0) ids[i] = g_strdup(""); else ids[i] = g_strconcat(orig, ".desktop", NULL); g_free(orig); } menu->cache = cache; menu->dir = parent; menu->id = g_strdup(id); menu->name = g_strdup(name); menu->tooltip = g_key_file_get_locale_string(kf, "Desktop Entry", "Tooltip", NULL, NULL); menu->icon_name = g_key_file_get_locale_string(kf, "Desktop Entry", "Icon", NULL, NULL); menu->desc = g_key_file_get_locale_string(kf, "Desktop Entry", "Description", NULL, NULL); menu->shortcut = g_key_file_get_string(kf, "Desktop Entry", "SuggestedShortcut", NULL); menu->enabled = TRUE; if (g_key_file_has_key(kf, "Desktop Entry", "Enabled", NULL)) menu->enabled = g_key_file_get_boolean(kf, "Desktop Entry", "Enabled", NULL); /* FIXME: if enabled then check OnlyShowIn and NotShowIn */ menu->conditions = _g_key_file_get_conditions(kf, "Desktop Entry"); cache_menus = g_list_prepend(cache_menus, menu); } /* lock is on, don't do any unref! */ static void fm_actions_add_for_keyfile(FmActionCache *cache, GKeyFile *kf, GFile *parent, const char *id) { char *name = g_key_file_get_locale_string(kf, "Desktop Entry", "Name", NULL, NULL); if (name != NULL) { char *type = g_key_file_get_string(kf, "Desktop Entry", "Type", NULL); if (type != NULL && strcmp(type, "Menu") == 0) fm_actions_add_menu_from_keyfile(cache, kf, parent, id, name); else fm_actions_add_action_from_keyfile(cache, kf, parent, id, name); g_free(type); g_free(name); } } /* lock is on, don't do any unref! */ /* caller should free id */ static gboolean fm_action_file_may_update(FmActionCache *cache, const char *file, GFile **gfp, char **idp, GList **to_drop) { GFile *gf, *parent; FmActionDir *dir, *test; char *id; GList *l; FmAction *action; FmActionMenu *menu; /* find parent GFile in the cache */ gf = g_file_new_for_path(file); parent = g_file_get_parent(gf); *idp = id = g_file_get_basename(gf); g_object_unref(gf); for (dir = cache_dirs; dir; dir = dir->next) if (g_file_equal(parent, dir->dir)) break; g_object_unref(parent); if (dir == NULL) /* invalid path */ return FALSE; *gfp = dir->dir; /* check if id already is in the cache - either skip or drop it */ for (l = cache_menus; l; l = l->next) { menu = l->data; if (strcmp(menu->id, id) == 0) break; } if (l != NULL) { for (test = cache_dirs; test != dir; test = test->next) if (test->dir == menu->dir) break; if (test != dir) /* found one earlier, don't replace */ return FALSE; cache_menus = g_list_remove_link(cache_menus, l); /* file should be removed from cache but not unref since lock is on */ *to_drop = g_list_concat(l, *to_drop); return TRUE; } for (l = cache_actions; l; l = l->next) { action = l->data; if (strcmp(action->info->id, id) == 0) break; } if (l == NULL) /* not found, safe to insert new */ return TRUE; for (test = cache_dirs; test != dir; test = test->next) if (test->dir == action->info->dir) break; if (test != dir) /* found one earlier, don't replace */ return FALSE; while (l != NULL) /* remove all actions of this id */ { GList *next = l->next; cache_actions = g_list_remove_link(cache_actions, l); /* file should be removed from cache but not unref since lock is on */ *to_drop = g_list_concat(l, *to_drop); while (next != NULL) /* find next profile of the same id */ if (((FmAction *)next->data)->info == action->info) break; else next = next->next; l = next; } return TRUE; } static void fm_action_cache_ensure_updates(FmActionCache *cache) { GSList *to_update; GList *to_drop; GKeyFile *kf; G_LOCK(update); to_update = cache_to_update; if (to_update != NULL) *cache_updater_data = NULL; /* terminate the updater */ cache_to_update = NULL; G_UNLOCK(update); if (to_update == NULL) return; kf = g_key_file_new(); to_drop = NULL; G_LOCK(update); while (to_update != NULL) { GFile *parent; char *id; if (fm_action_file_may_update(cache, to_update->data, &parent, &id, &to_drop) && g_key_file_load_from_file(kf, to_update->data, G_KEY_FILE_KEEP_TRANSLATIONS, NULL)) /* NOTE: ignoring errors */ fm_actions_add_for_keyfile(cache, kf, parent, id); g_free(to_update->data); g_free(id); to_update = g_slist_delete_link(to_update, to_update); } G_UNLOCK(update); g_key_file_free(kf); g_list_free_full(to_drop, g_object_unref); } /* ---- idle updater ---- */ static gboolean fm_actions_update_idle(gpointer data) { FmActionCache *cache; GKeyFile *kf; GFile *parent; char *id; GList *to_drop; G_LOCK(update); cache = *((FmActionCache **)data); if (cache == NULL || cache_to_update == NULL) { /* terminated */ G_UNLOCK(update); return FALSE; } to_drop = NULL; if (fm_action_file_may_update(cache, cache_to_update->data, &parent, &id, &to_drop)) { kf = g_key_file_new(); if (g_key_file_load_from_file(kf, cache_to_update->data, G_KEY_FILE_KEEP_TRANSLATIONS, NULL)) /* NOTE: ignoring errors */ fm_actions_add_for_keyfile(cache, kf, parent, id); g_key_file_free(kf); } g_free(cache_to_update->data); g_free(id); cache_to_update = g_slist_delete_link(cache_to_update, cache_to_update); if (cache_to_update == NULL) cache = NULL; /* mark it to stop updater */ G_UNLOCK(update); g_list_free_full(to_drop, g_object_unref); return (cache != NULL); } /* lock is on, don't do any unref! */ /* consumes filename */ static void fm_actions_schedule_update(FmActionCache *cache, char *filename) { if (cache_to_update == NULL) /* no updater running now */ { cache_updater_data = g_new(FmActionCache *, 1); *cache_updater_data = cache; g_idle_add_full(G_PRIORITY_LOW, fm_actions_update_idle, cache_updater_data, g_free); } cache_to_update = g_slist_prepend(cache_to_update, filename); } static void _action_cache_monitor_event(GFileMonitor *mon, GFile *gf, GFile *other, GFileMonitorEvent evt, FmActionCache *cache) { FmActionDir *dir; char *basename, *filename; GList *l, *next, *to_drop = NULL; GSList *sl, *sn; FmAction *action; FmActionMenu *menu; /* find dir matching mon */ G_LOCK(update); for (dir = cache_dirs; dir; dir = dir->next) if (dir->mon == mon) break; G_UNLOCK(update); g_return_if_fail(dir != NULL); if (g_file_equal(gf, dir->dir)) /* it's event on folder itself, ignoring */ return; switch (evt) { case G_FILE_MONITOR_EVENT_CHANGED: case G_FILE_MONITOR_EVENT_CREATED: filename = g_file_get_path(gf); if (!filename || !g_str_has_suffix(filename, ".desktop")) /* ignore non-desktop files */ g_free(filename); else { /* just schedule update */ G_LOCK(update); fm_actions_schedule_update(cache, filename); G_UNLOCK(update); } break; case G_FILE_MONITOR_EVENT_DELETED: basename = g_file_get_basename(gf); filename = g_file_get_path(gf); G_LOCK(update); /* remove file from cache */ for (l = cache_actions; l; l = l->next) { action = l->data; if (action->info->dir == dir->dir && strcmp(action->info->id, basename) == 0) break; } if (l != NULL) { while (l != NULL) { next = l->next; cache_actions = g_list_remove_link(cache_actions, l); to_drop = g_list_concat(l, to_drop); while (next != NULL) if (((FmAction *)next->data)->info == action->info) break; else next = next->next; l = next; } } else for (l = cache_menus; l; l = l->next) { menu = l->data; if (menu->dir == dir->dir && strcmp(menu->id, basename) == 0) { cache_menus = g_list_remove_link(cache_menus, l); to_drop = g_list_concat(l, to_drop); break; } } /* remove from queue if it's there */ if (filename) for (sl = cache_to_update; sl; sl = sn) { sn = sl->next; if (strcmp(sl->data, filename) == 0) { g_free(sl->data); cache_to_update = g_slist_delete_link(cache_to_update, sl); } } G_UNLOCK(update); g_list_free_full(to_drop, g_object_unref); g_free(basename); g_free(filename); break; #if GLIB_CHECK_VERSION(2, 24, 0) case G_FILE_MONITOR_EVENT_MOVED: #endif case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: case G_FILE_MONITOR_EVENT_PRE_UNMOUNT: case G_FILE_MONITOR_EVENT_UNMOUNTED: /* ignore those */ break; } } /* lock is on, don't do any unref! */ /* prepends path to monitoring list */ static void fm_action_cache_add_directory(FmActionCache *cache, const char *path) { FmActionDir *fmdir; GDir *dir; const char *name; dir = g_dir_open(path, 0, NULL); if (dir == NULL) /* unobtainable */ return; while ((name = g_dir_read_name(dir)) != NULL) { if (g_str_has_suffix(name, ".desktop")) /* ignore non-desktop files */ fm_actions_schedule_update(cache, g_build_filename(path, name, NULL)); } g_dir_close(dir); fmdir = g_slice_new(FmActionDir); fmdir->next = cache_dirs; cache_dirs = fmdir; fmdir->dir = g_file_new_for_path(path); fmdir->mon = g_file_monitor_directory(fmdir->dir, G_FILE_MONITOR_NONE, NULL, NULL); g_signal_connect(fmdir->mon, "changed", G_CALLBACK(_action_cache_monitor_event), cache); } /* ---- matching conditions (arggh!) ---- */ static gboolean _matches_cond(FmFileInfoList *files, FmFileInfo *location, FmActionCondition *cond, FmActionMenu *root) { GList *flist = NULL, *l; char **x, *tst, *s; const char *c; GString *str; GPatternSpec *pattern; gsize len; int num; gboolean match = TRUE, found, match_num; if (files != NULL) flist = fm_file_info_list_peek_head_link(files); num = g_list_length(flist); match_num = (num > 0); /* default */ for ( ; match && cond; cond = cond->next) { found = TRUE; switch (cond->type) { case CONDITION_TYPE_COUNT: if (num != cond->num) match = FALSE; match_num = TRUE; break; case CONDITION_TYPE_COUNT_LESS: if (num >= cond->num) match = FALSE; match_num = TRUE; break; case CONDITION_TYPE_COUNT_MORE: if (num <= cond->num) match = FALSE; match_num = TRUE; break; case CONDITION_TYPE_CAPS: /* Capabilities */ /* sanity check */ if ((cond->num & (CONDITION_CAPS_OWNER | (CONDITION_CAPS_OWNER << CONDITION_CAPS_SHIFT_NEGATE))) == (CONDITION_CAPS_OWNER | (CONDITION_CAPS_OWNER << CONDITION_CAPS_SHIFT_NEGATE)) || (cond->num & (CONDITION_CAPS_READABLE | (CONDITION_CAPS_READABLE << CONDITION_CAPS_SHIFT_NEGATE))) == (CONDITION_CAPS_READABLE | (CONDITION_CAPS_READABLE << CONDITION_CAPS_SHIFT_NEGATE)) || (cond->num & (CONDITION_CAPS_WRITABLE | (CONDITION_CAPS_WRITABLE << CONDITION_CAPS_SHIFT_NEGATE))) == (CONDITION_CAPS_WRITABLE | (CONDITION_CAPS_WRITABLE << CONDITION_CAPS_SHIFT_NEGATE)) || (cond->num & (CONDITION_CAPS_EXECUTABLE | (CONDITION_CAPS_EXECUTABLE << CONDITION_CAPS_SHIFT_NEGATE))) == (CONDITION_CAPS_EXECUTABLE | (CONDITION_CAPS_EXECUTABLE << CONDITION_CAPS_SHIFT_NEGATE)) || (cond->num & (CONDITION_CAPS_LOCAL | (CONDITION_CAPS_LOCAL << CONDITION_CAPS_SHIFT_NEGATE))) == (CONDITION_CAPS_LOCAL | (CONDITION_CAPS_LOCAL << CONDITION_CAPS_SHIFT_NEGATE))) match = FALSE; if (!match) break; if (cond->num & (CONDITION_CAPS_LOCAL | (CONDITION_CAPS_LOCAL << CONDITION_CAPS_SHIFT_NEGATE))) { match = fm_file_info_is_native(location); for (l = flist; match && l != NULL; l = l->next) if (!fm_file_info_is_native(l->data)) match = FALSE; if ((cond->num & CONDITION_CAPS_LOCAL) == 0) match = !match; if (!match) break; } if (cond->num & (CONDITION_CAPS_READABLE | (CONDITION_CAPS_READABLE << CONDITION_CAPS_SHIFT_NEGATE))) { for (l = flist; match && l != NULL; l = l->next) if (!fm_file_info_is_accessible(l->data)) match = FALSE; if ((cond->num & CONDITION_CAPS_READABLE) == 0) match = !match; if (!match) break; } if (cond->num & (CONDITION_CAPS_WRITABLE | (CONDITION_CAPS_WRITABLE << CONDITION_CAPS_SHIFT_NEGATE))) { match = fm_file_info_is_writable_directory(location); /* FIXME */ //for (l == flist; match && l != NULL; l = l->next) // if (!fm_file_info_is_writable(l->data)) // match = FALSE; if (!match) break; } if (cond->num & (CONDITION_CAPS_EXECUTABLE | (CONDITION_CAPS_EXECUTABLE << CONDITION_CAPS_SHIFT_NEGATE))) { /* FIXME */ } if (cond->num & (CONDITION_CAPS_OWNER | (CONDITION_CAPS_OWNER << CONDITION_CAPS_SHIFT_NEGATE))) { uid_t uid = geteuid(); for (l = flist; match && l != NULL; l = l->next) if (fm_file_info_get_uid(l->data) != uid) match = FALSE; if ((cond->num & CONDITION_CAPS_OWNER) == 0) match = !match; } break; case CONDITION_TYPE_RUN: /* ShowIfRunning */ // FIXME: this is insane condition as it will require to scan whole /proc // _expand_params(str, cond->str, root, NULL); break; case CONDITION_TYPE_TRY_EXEC: /* TryExec */ str = g_string_sized_new(64); _expand_params(str, cond->str, root, TRUE, NULL); s = NULL; match = FALSE; if (!g_path_is_absolute(str->str)) s = g_find_program_in_path(str->str); if (s != NULL) match = g_file_test(s, G_FILE_TEST_IS_EXECUTABLE); g_free(s); g_string_free(str, TRUE); break; case CONDITION_TYPE_DBUS: /* ShowIfRegistered */ #if defined(ENABLE_DBUS) && GLIB_CHECK_VERSION(2, 24, 0) str = g_string_size_new(64); _expand_params(str, cond->str, root, TRUE, NULL); /* DBus call is taken from GLib sources: gio/tests/gdbus-names.c */ conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL); result = g_dbus_connection_call_sync(conn, "org.freedesktop.DBus", /* bus name */ "/org/freedesktop/DBus", /* object path */ "org.freedesktop.DBus", /* interface name */ "NameHasOwner", /* method name */ g_variant_new("(s)", str->str), G_VARIANT_TYPE("(b)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL); match = FALSE; if (result != NULL) { g_variant_get(result, "(b)", &match); g_variant_unref(result); } g_string_free(str, TRUE); #endif break; case CONDITION_TYPE_OUT_TRUE: /* ShowIfTrue */ // FIXME: another insane condition to execute a program to test // _expand_params(str, cond->str, root, NULL); break; case CONDITION_TYPE_MIME: /* MimeTypes */ found = FALSE; for (x = cond->list; match && x[0] != NULL; x++) { tst = x[0]; len = strlen(tst); if (len == 1 && tst[0] == '*') found = TRUE; /* always matches */ else if (tst[0] == '!') /* negate condition */ { if (strncmp(&tst[1], "all/", 4) == 0) { if (strcmp(&tst[5], "allfiles") == 0) { for (l = flist; match && l; l = l->next) if (S_ISREG(fm_file_info_get_mode(l->data))) match = FALSE; /* found regular file */ } else /* it's !all/all */ match = FALSE; } else { len--; tst++; if (len >= 3 && tst[len-1] == '*' && tst[len-2] == '/') len -= 2; for (l = flist; match && l; l = l->next) { FmMimeType *mime_type = fm_file_info_get_mime_type(l->data); if (mime_type == NULL) continue; c = fm_mime_type_get_type(mime_type); match = (strncmp(c, tst, len) != 0 || c[len] != tst[len]); } } } else if (!found) { if (strncmp(tst, "all/", 4) == 0) { if (strcmp(&tst[4], "allfiles") == 0) { for (l = flist; l; l = l->next) if (!S_ISREG(fm_file_info_get_mode(l->data))) break; /* not regular file */ found = (flist != NULL && l == NULL); } else /* it's all/all */ found = TRUE; } else { if (len >= 3 && tst[len-1] == '*' && tst[len-2] == '/') len -= 2; for (l = flist; l; l = l->next) { FmMimeType *mime_type = fm_file_info_get_mime_type(l->data); if (mime_type == NULL) continue; c = fm_mime_type_get_type(mime_type); if (strncmp(c, tst, len) != 0 || c[len] != tst[len]) break; /* doesn't match */ } found = (flist != NULL && l == NULL); } } } break; case CONDITION_TYPE_BASENAME: /* Basenames with Matchcase=true */ case CONDITION_TYPE_NCASE_BASENAME: /* the same with Matchcase=false */ found = FALSE; for (x = cond->list; match && x[0] != NULL; x++) { tst = x[0]; if (tst[0] == '*' && tst[1] == '\0') found = TRUE; /* always matches */ else if (tst[0] == '!') /* negate condition */ { pattern = g_pattern_spec_new(&tst[1]); for (l = flist; match && l; l = l->next) { s = (char *)fm_file_info_get_name(l->data); if (cond->type == CONDITION_TYPE_NCASE_BASENAME) s = g_utf8_casefold(s, -1); if (s != NULL && g_pattern_match_string(pattern, s)) match = FALSE; if (cond->type == CONDITION_TYPE_NCASE_BASENAME) g_free(s); } g_pattern_spec_free(pattern); } else if (!found) { pattern = g_pattern_spec_new(tst); for (l = flist; !found && l != NULL; l = l->next) { s = (char*)fm_file_info_get_name(l->data); if (cond->type == CONDITION_TYPE_NCASE_BASENAME) s = g_utf8_casefold(s, -1); if (s == NULL || !g_pattern_match_string(pattern, s)) found = TRUE; /* mark to break cycle */ if (cond->type == CONDITION_TYPE_NCASE_BASENAME) g_free(s); } found = (flist != NULL && !found); /* all match */ g_pattern_spec_free(pattern); } } break; case CONDITION_TYPE_SCHEME: /* Schemes */ found = FALSE; for (x = cond->list; match && x[0] != NULL; x++) { tst = x[0]; if (tst[0] == '*' && tst[1] == '\0') found = TRUE; /* always matches */ else if (tst[0] == '!') /* negate condition */ { pattern = g_pattern_spec_new(&tst[1]); for (l = flist; match && l; l = l->next) { s = (char *)fm_path_get_basename(fm_path_get_scheme_path(l->data)); tst = strchr(s, ':'); if (tst == NULL || tst == s) match = !g_pattern_match_string(pattern, "file"); else { s = g_strndup(s, tst - s); match = !g_pattern_match_string(pattern, s); g_free(s); } } g_pattern_spec_free(pattern); } else if (!found) { pattern = g_pattern_spec_new(tst); for (l = flist; !found && l != NULL; l = l->next) { s = (char *)fm_path_get_basename(fm_path_get_scheme_path(l->data)); tst = strchr(s, ':'); if (tst == NULL || tst == s) found = !g_pattern_match_string(pattern, "file"); else { s = g_strndup(s, tst - s); found = !g_pattern_match_string(pattern, s); g_free(s); } } found = (flist != NULL && l == NULL); /* all match */ g_pattern_spec_free(pattern); } } break; case CONDITION_TYPE_FOLDER: /* Folders */ found = FALSE; /* check location for pattern(s) match */ s = fm_path_to_str(fm_file_info_get_path(location)); for (x = cond->list; match && x[0] != NULL; x++) { tst = x[0]; if (tst[0] == '!') /* negate condition */ match = !g_pattern_match_simple(&tst[1], s); else found = g_pattern_match_simple(tst, s); } g_free(s); break; default: g_warn_if_reached(); } if (match) match = found; } return (match && match_num); } static gboolean _menu_matches(FmActionMenu *menu, FmFileInfo *location, FmFileInfoList *files, FmActionMenu *root) { return _matches_cond(files, location, menu->conditions, root); } static FmAction *_action_matches(FmAction *action, FmFileInfo *location, FmFileInfoList *files, FmActionTarget target, FmActionMenu *root) { FmActionInfo *info = action->info; GSList *l; g_return_val_if_fail(info->profiles != NULL, NULL); if (action != info->profiles->data) /* we scan all profiles at first only */ return NULL; if ((info->target && target) == 0) return NULL; if (!_matches_cond(files, location, info->conditions, root)) return NULL; for (l = info->profiles; l; l = l->next) { action = l->data; if (_matches_cond(files, location, action->conditions, root)) return action; } return NULL; } /* moves elem to root->children after composing */ static void _insert_menu(FmActionMenu *root, GList *elem, GList **menus, GList **actions, GList **zero_level_menus) { FmActionMenu *menu = elem->data, *to_free = NULL; char **ids = menu->ids, **id; GList *l; FmAction *action; /* check if it's already allocated into another menu and create dup instead */ if (menu->parent != NULL) { to_free = menu; elem->data = _fm_action_menu_dup((GAppInfo *)menu); menu = elem->data; } /* find matching ids in menus/actions and move them to menu->children */ if (ids != NULL) for (id = ids; id[0]; id++) { if (id[0][0] == '\0') { /* just prepend a NULL item if separator */ menu->children = g_list_prepend(menu->children, NULL); continue; } /* check in menus list */ for (l = *menus; l; l = l->next) { if (strcmp(id[0], ((FmActionMenu *)l->data)->id) == 0) { /* use _insert_menu() for menus */ *menus = g_list_remove_link(*menus, l); _insert_menu(menu, l, menus, actions, zero_level_menus); break; } } if (l != NULL) /* found in menus */ continue; /* check in actions list */ for (l = *actions; l; l = l->next) { if (strcmp(id[0], ((FmAction *)l->data)->info->id) == 0) { /* move and set parent for action */ *actions = g_list_remove_link(*actions, l); action = l->data; /* check if it's already allocated elsewhere so create a dup */ if (action->menu != NULL) { l->data = _fm_action_dup((GAppInfo *)action); g_object_unref(action); /* drop extra reference */ action = l->data; } action->menu = menu; menu->children = g_list_concat(l, menu->children); break; } } if (l != NULL) /* found in actions */ continue; /* check in resolved zero-level menus list */ for (l = *zero_level_menus; l; l = l->next) { if (strcmp(id[0], ((FmActionMenu *)l->data)->id) == 0) { /* menus in zero_level_menus are ready so just move and reparent */ *zero_level_menus = g_list_remove_link(*zero_level_menus, l); ((FmActionMenu *)l->data)->parent = menu; menu->children = g_list_concat(l, menu->children); break; } } } menu->children = g_list_reverse(menu->children); /* drop extra ref from menu if need */ if (to_free) g_object_unref(to_free); /* do this last to prevent any cycles */ menu->parent = root; root->children = g_list_concat(elem, root->children); } static FmActionMenu *fm_action_get_for_content(FmActionCache *cache, FmFileInfo *location, FmFileInfoList *files, FmActionTarget target) { GList *menus = NULL, *actions = NULL, *l; FmActionMenu *root; FmAction *action; g_return_val_if_fail(FM_IS_ACTION_CACHE(cache), NULL); root = _fm_action_menu_new(); root->enabled = TRUE; root->target = target; if (target == ACTION_TARGET_CONTEXT) root->files = fm_file_info_list_ref(files); else { root->files = fm_file_info_list_new(); fm_file_info_list_push_tail(root->files, location); } fm_action_cache_ensure_updates(cache); G_LOCK(update); /* collect matched menus */ for (l = cache_menus; l; l = l->next) if (_menu_matches(l->data, location, root->files, root)) menus = g_list_prepend(menus, g_object_ref(l->data)); /* collect matched actions */ for (l = cache_actions; l; l = l->next) if ((action = _action_matches(l->data, location, root->files, target, root))) actions = g_list_prepend(actions, g_object_ref(action)); G_UNLOCK(update); actions = g_list_reverse(actions); /* compose menu - add each menu to the root recursively */ while (menus != NULL) { l = menus; menus = g_list_remove_link(menus, l); _insert_menu(root, l, &menus, &actions, &root->children); } /* add leftovers to the root */ if (actions != NULL) { for (l = actions; l; l = l->next) { action = l->data; /* check if it's already allocated elsewhere so create a dup */ if (action->menu != NULL) { l->data = _fm_action_dup((GAppInfo *)action); g_object_unref(action); /* drop extra reference */ action = l->data; } action->menu = root; } root->children = g_list_concat(root->children, actions); } return root; } /* ---- external API ---- */ /** * fm_action_get_for_context * @cache: actions cache * @location: path to current directory * @files: list of files for context menu * * Checks for files in @cache that mets conditions and returns the list. * Returned menu should be freed using g_object_unref(). Note that every * g_app_info_launch*() call on any of items found in the menu will be * always done against @files and arguments of such call will be always * ignored, therefore you should never launch any items found in the menu * after you free it or otherwise your call will fail. * * Returns: (transfer full): list of found actions. * * Since: 1.3.0 */ FmActionMenu *fm_action_get_for_context(FmActionCache *cache, FmFileInfo *location, FmFileInfoList *files) { if (fm_file_info_list_is_empty(files)) return NULL; return fm_action_get_for_content(cache, location, files, ACTION_TARGET_CONTEXT); } /** * fm_action_get_for_location * @cache: actions cache * @location: path to current directory * * Checks for files in @cache that mets conditions and returns the list. * Only actions that targetted @location are returned. Returned menu should * be freed using g_object_unref(). Note that every g_app_info_launch*() * call on any of items found in the menu will be always done against * @location and arguments of such call will be always ignored. * * Returns: (transfer full): list of found actions. * * Since: 1.3.0 */ FmActionMenu *fm_action_get_for_location(FmActionCache *cache, FmFileInfo *location) { return fm_action_get_for_content(cache, location, NULL, ACTION_TARGET_LOCATION); } /** * fm_action_get_for_toolbar * @cache: actions cache * @location: path to current directory * * Checks for files in @cache that mets conditions and returns the list. * Only actions that target toolbar are returned. Returned menu should * be freed using g_object_unref(). Note that every g_app_info_launch*() * call on any of items found in the menu will be always done against * @location and arguments of such call will be always ignored. * * Returns: (transfer full): list of found actions. * * Since: 1.3.0 */ FmActionMenu *fm_action_get_for_toolbar(FmActionCache *cache, FmFileInfo *location) { return fm_action_get_for_content(cache, location, NULL, ACTION_TARGET_TOOLBAR); } /** * fm_action_menu_get_children * @menu: an action menu * * Returns list of elements that belong to this menu. If an element is * %NULL then element is a separator. Otherwise element may be either * #FmAction or #FmActionMenu. Returned list owned by @menu and should * not be freed by caller. * * Returns: (transfer none) (element-type GAppInfo): list of @menu elements. * * Since: 1.3.0 */ const GList *fm_action_menu_get_children(FmActionMenu *menu) { g_return_val_if_fail(FM_IS_ACTION_MENU(menu), NULL); return menu->children; } /** * fm_action_get_suggested_shortcut * @action: an action * * Returns suggested keyboard shortcut for @action if available. The format * may look like "<Control>a" or "<Shift><Alt>F1". * * Returns: (transfer none): keyboard shortcut string. * * Since: 1.3.0 */ const char *fm_action_get_suggested_shortcut(FmAction *action) { g_return_val_if_fail(FM_IS_ACTION(action), NULL); return action->info->shortcut; } /** * fm_action_get_toolbar_label * @action: an action * * Returns toolbar label for @action or %NULL if not defined. * * Returns: (transfer none): toolbar label. * * Since: 1.3.0 */ const char *fm_action_get_toolbar_label(FmAction *action) { g_return_val_if_fail(FM_IS_ACTION(action), NULL); // _expand_params(str, action->info->toolbar_label, action->menu, NULL); return action->info->toolbar_label; } /** * fm_action_get_startup_wm_class * @action: an action * * Returns startup WM class for @action or %NULL if not defined. * * Returns: (transfer none): startup WM class. * * Since: 1.3.0 */ const char *fm_action_get_startup_wm_class(FmAction *action) { g_return_val_if_fail(FM_IS_ACTION(action), NULL); return action->wm_class; } /* typedef gboolean (*FmActionExecEmbedded)(const char *command, gpointer user_data); gboolean fm_action_cache_set_execution_window(FmActionCache *cache, FmActionExecEmbedded callback, gpointer user_data) */ /** * fm_action_cache_new * * Creates and initializes an #FmActionCache object, or returns a reference * for existing one if it was already created. Newly created cache will be * collected on idle if not requested right away (what is highly unlikely). * * Returns: (transfer full): a cache object. * * Since: 1.3.0 */ FmActionCache *fm_action_cache_new(void) { FmActionCache *cache; const char * const *dirs; char *path; guint i; #if GLIB_CHECK_VERSION(2, 32, 0) G_LOCK(update); /* lock it to prevent creation of two instances */ cache = g_weak_ref_get(&singleton); if (cache != NULL) { G_UNLOCK(update); return cache; } #endif /* Create an instance */ cache = (FmActionCache *)g_object_new(FM_TYPE_ACTION_CACHE, NULL); #if GLIB_CHECK_VERSION(2, 32, 0) g_weak_ref_set(&singleton, cache); #else if (g_atomic_int_exchange_and_add(&cache_n_ref, 1) > 0) return cache; G_LOCK(update); /* wait if disposal of previous is in progress yet */ #endif /* Cleanup before setup */ cache_dirs = NULL; cache_actions = NULL; cache_menus = NULL; cache_to_update = NULL; /* Schedule scan of actions dirs - see fm_action_cache_add_directory() */ dirs = g_get_system_data_dirs(); i = g_strv_length((char **)dirs); while (i-- > 0) { path = g_build_filename(dirs[i], "file-manager/actions", NULL); fm_action_cache_add_directory(cache, path); g_free(path); } path = g_build_filename(g_get_user_data_dir(), "file-manager/actions", NULL); fm_action_cache_add_directory(cache, path); G_UNLOCK(update); g_free(path); /* Return the instance */ return cache; } libfm-1.4.0/src/base/fm-action.h000066400000000000000000000074231475513661000163520ustar00rootroot00000000000000/* * fm-action.h * * Copyright 2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_ACTION_H__ #define __FM_ACTION_H__ 1 #include #include "fm-file-info.h" G_BEGIN_DECLS #define FM_TYPE_ACTION (fm_action_get_type()) #define FM_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_ACTION, FmAction)) #define FM_IS_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ FM_TYPE_ACTION)) #define FM_TYPE_ACTION_MENU (fm_action_menu_get_type()) #define FM_ACTION_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_ACTION_MENU, FmActionMenu)) #define FM_IS_ACTION_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ FM_TYPE_ACTION_MENU)) #define FM_TYPE_ACTION_CACHE (fm_action_cache_get_type()) #define FM_ACTION_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_ACTION_CACHE, FmActionCache)) #define FM_IS_ACTION_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ FM_TYPE_ACTION_CACHE)) typedef struct _FmAction FmAction; typedef struct _FmActionMenu FmActionMenu; typedef struct _FmActionCache FmActionCache; GType fm_action_get_type(void); GType fm_action_menu_get_type(void); GType fm_action_cache_get_type(void); typedef struct _FmActionClass FmActionClass; /** * FmActionClass * @parent: the parent class */ struct _FmActionClass { GObjectClass parent; }; typedef struct _FmActionMenuClass FmActionMenuClass; /** * FmActionMenuClass * @parent: the parent class */ struct _FmActionMenuClass { GObjectClass parent; }; typedef struct _FmActionCacheClass FmActionCacheClass; /** * FmActionCacheClass * @parent: the parent class */ struct _FmActionCacheClass { GObjectClass parent; }; FmActionMenu *fm_action_get_for_context(FmActionCache *cache, FmFileInfo *location, FmFileInfoList *files); FmActionMenu *fm_action_get_for_location(FmActionCache *cache, FmFileInfo *location); FmActionMenu *fm_action_get_for_toolbar(FmActionCache *cache, FmFileInfo *location); const GList *fm_action_menu_get_children(FmActionMenu *menu); const char *fm_action_get_suggested_shortcut(FmAction *action); const char *fm_action_get_toolbar_label(FmAction *action); const char *fm_action_get_startup_wm_class(FmAction *action); /* typedef gboolean (*FmActionExecEmbedded)(const char *command, gpointer user_data); gboolean fm_action_cache_set_execution_window(FmActionCache *cache, FmActionExecEmbedded callback, gpointer user_data); */ FmActionCache *fm_action_cache_new(void); G_END_DECLS #endif libfm-1.4.0/src/base/fm-app-info.c000066400000000000000000000444201475513661000165770ustar00rootroot00000000000000/* * fm-app-info.c * * Copyright 2010 Hong Jen Yee (PCMan) * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2020 wb9688 * Copyright 2024 Ingo Brückl * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-app-info * @short_description: FM application launch handlers * @title: GAppInfo extensions * * @include: libfm/fm.h * */ #include "fm-app-info.h" #include "fm-config.h" #include "fm-utils.h" #include "fm-file.h" #include "fm-terminal.h" #include #include static void append_file_to_cmd(GFile* gf, GString* cmd) { char* file = g_file_get_path(gf); char* quote; if(file == NULL) /* trash:// gvfs is incomplete in resolving it */ { /* we can retrieve real path from GVFS >= 1.13.3 */ if(g_file_has_uri_scheme(gf, "trash")) { GFileInfo *inf; const char *orig_path; inf = g_file_query_info(gf, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, G_FILE_QUERY_INFO_NONE, NULL, NULL); if(inf == NULL) /* failed */ return; orig_path = g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI); if(orig_path != NULL) /* success */ file = g_filename_from_uri(orig_path, NULL, NULL); g_object_unref(inf); } if(file == NULL) return; } quote = g_shell_quote(file); g_string_append(cmd, quote); g_string_append_c(cmd, ' '); g_free(quote); g_free(file); } static void append_uri_to_cmd(GFile* gf, GString* cmd) { char* uri = NULL; if(!g_file_has_uri_scheme(gf, "file")) { /* When gvfs-fuse is in use, try to convert all URIs that are not file:// to * their corresponding FUSE-mounted local paths. GDesktopAppInfo internally does this, too. * With this, non-gtk+ applications can correctly open files in gvfs-mounted remote filesystems. */ char* path = g_file_get_path(gf); if(path) { uri = g_filename_to_uri(path, NULL, NULL); g_free(path); } } if(!uri) { uri = g_file_get_uri(gf); } if(uri) { char* quote = g_shell_quote(uri); g_string_append(cmd, quote); g_string_append_c(cmd, ' '); g_free(quote); g_free(uri); } } static char* expand_exec_macros(GAppInfo* app, const char* full_desktop_path, GKeyFile* kf, GList** gfiles, GList **launching) { GString* cmd; const char* exec = g_app_info_get_commandline(app); const char* p; GFile *file = NULL; GList *fl = NULL; if (exec == NULL) return NULL; cmd = g_string_sized_new(1024); for(p = exec; *p; ++p) { if(*p == '%') { ++p; if(!*p) break; switch(*p) { case 'f': if (file == NULL && *gfiles) { *launching = *gfiles; file = G_FILE((*gfiles)->data); *gfiles = g_list_remove_link(*gfiles, *gfiles); } if (file) append_file_to_cmd(file, cmd); break; case 'F': if (*gfiles) *launching = fl = *gfiles; *gfiles = NULL; g_list_foreach(fl, (GFunc)append_file_to_cmd, cmd); break; case 'u': if (file == NULL && *gfiles) { *launching = *gfiles; file = G_FILE((*gfiles)->data); *gfiles = g_list_remove_link(*gfiles, *gfiles); } if (file) append_uri_to_cmd(file, cmd); break; case 'U': if (*gfiles) *launching = fl = *gfiles; *gfiles = NULL; g_list_foreach(fl, (GFunc)append_uri_to_cmd, cmd); break; case '%': g_string_append_c(cmd, '%'); break; case 'i': if (kf == NULL) break; { char* icon_name = g_key_file_get_locale_string(kf, "Desktop Entry", "Icon", NULL, NULL); if(icon_name) { g_string_append(cmd, "--icon "); g_string_append(cmd, icon_name); g_free(icon_name); } break; } case 'c': { const char* name = g_app_info_get_name(app); if(name) { char *quoted = g_shell_quote(name); g_string_append(cmd, quoted); g_free(quoted); } break; } case 'k': /* append the file path of the desktop file */ if(full_desktop_path) { /* FIXME: how about quoting here? */ char* desktop_location = g_path_get_dirname(full_desktop_path); g_string_append(cmd, desktop_location); g_free(desktop_location); } break; } } else g_string_append_c(cmd, *p); } /* if files are provided but the Exec key doesn't contain %f, %F, %u, or %U */ if(*gfiles && !*launching) { /* treat as %f */ *launching = *gfiles; file = G_FILE((*gfiles)->data); *gfiles = g_list_remove_link(*gfiles, *gfiles); g_string_append_c(cmd, ' '); append_file_to_cmd(file, cmd); } return g_string_free(cmd, FALSE); } struct ChildSetup { char* display; char* sn_id; pid_t pgid; }; static void child_setup(gpointer user_data) { struct ChildSetup* data = (struct ChildSetup*)user_data; if(data->display && !g_getenv("WAYLAND_DISPLAY")) g_setenv ("DISPLAY", data->display, TRUE); if(data->sn_id) g_setenv ("DESKTOP_STARTUP_ID", data->sn_id, TRUE); /* Move child to grandparent group so it will not die with parent */ setpgid(0, data->pgid); } static void child_watch(GPid pid, gint status, gpointer user_data) { /* * Ensure that we don't double fork and break pkexec */ g_spawn_close_pid(pid); } static char* expand_terminal(char* cmd, gboolean keep_open, GError** error) { FmTerminal* term; const char* opts; char* ret; /* if %s is not found, fallback to -e */ static FmTerminal xterm_def = { .program = "xterm", .open_arg = "-e" }; term = fm_terminal_dup_default(NULL); /* bug #3457335: Crash on application start with Terminal=true. */ if(!term) /* fallback to xterm if a terminal emulator is not found. */ { /* FIXME: we should not hard code xterm here. :-( * It's better to prompt the user and let he or she set * his preferred terminal emulator. */ term = &xterm_def; } if(keep_open && term->noclose_arg) opts = term->noclose_arg; else if(term->open_arg) opts = term->open_arg; else opts = ""; if(term->custom_args) ret = g_strdup_printf("%s %s %s %s", term->program, term->custom_args, opts, cmd); else ret = g_strdup_printf("%s %s %s", term->program, opts, cmd); if(term != &xterm_def) g_object_unref(term); return ret; } static gboolean do_launch(GAppInfo* appinfo, const char* full_desktop_path, GKeyFile* kf, GList** inp, GAppLaunchContext* ctx, GError** err) { gboolean ret = FALSE; GList *gfiles = NULL; char* cmd, *path; char** argv; int argc; gboolean use_terminal; GAppInfoCreateFlags flags; GPid pid; cmd = expand_exec_macros(appinfo, full_desktop_path, kf, inp, &gfiles); g_print("%s\n", cmd); if (cmd == NULL || cmd[0] == '\0') { g_free(cmd); /* FIXME: localize the string below in 1.3.0 */ g_set_error_literal(err, G_IO_ERROR, G_IO_ERROR_FAILED, "Desktop entry contains no valid Exec line"); return FALSE; } /* FIXME: do check for TryExec/Exec */ if(G_LIKELY(kf)) use_terminal = g_key_file_get_boolean(kf, "Desktop Entry", "Terminal", NULL); else { flags = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(appinfo), "flags")); use_terminal = (flags & G_APP_INFO_CREATE_NEEDS_TERMINAL) != 0; } if(use_terminal) { /* FIXME: is it right key to mark this option? */ gboolean keep_open = FALSE; char* term_cmd; if(G_LIKELY(kf)) keep_open = g_key_file_get_boolean(kf, "Desktop Entry", "X-KeepTerminal", NULL); term_cmd = expand_terminal(cmd, keep_open, err); g_free(cmd); if(!term_cmd) { g_list_free(gfiles); return FALSE; } cmd = term_cmd; } g_debug("launch command: <%s>", cmd); if(g_shell_parse_argv(cmd, &argc, &argv, err)) { struct ChildSetup data; if(ctx) { gboolean use_sn; if(G_LIKELY(kf) && g_key_file_has_key(kf, "Desktop Entry", "StartupNotify", NULL)) use_sn = g_key_file_get_boolean(kf, "Desktop Entry", "StartupNotify", NULL); else if(fm_config->force_startup_notify) { /* if the app doesn't explicitly ask us not to use sn, * and fm_config->force_startup_notify is TRUE, then * use it by default, unless it's a console app. */ use_sn = !use_terminal; /* we only use sn for GUI apps by default */ /* FIXME: console programs should use sn_id of terminal emulator instead. */ } else use_sn = FALSE; data.display = g_app_launch_context_get_display(ctx, appinfo, gfiles); if(use_sn) data.sn_id = g_app_launch_context_get_startup_notify_id(ctx, appinfo, gfiles); else data.sn_id = NULL; } else { data.display = NULL; data.sn_id = NULL; } g_debug("sn_id = %s", data.sn_id); if(G_LIKELY(kf)) path = g_key_file_get_string(kf, "Desktop Entry", "Path", NULL); else path = NULL; data.pgid = getpgid(getppid()); /* only absolute path is usable, ignore others */ ret = g_spawn_async((path && path[0] == '/') ? path : NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, child_setup, &data, &pid, err); if (ret) /* Ensure that we don't double fork and break pkexec */ g_child_watch_add(pid, child_watch, NULL); else if (data.sn_id) /* Notify launch context about failure */ g_app_launch_context_launch_failed(ctx, data.sn_id); g_free(path); g_free(data.display); g_free(data.sn_id); g_strfreev(argv); } g_free(cmd); g_list_free(gfiles); return ret; } /** * fm_app_info_launch * @appinfo: application info to launch * @files: (element-type GFile): files to use in run substitutions * @launch_context: (allow-none): a launch context * @error: (out) (allow-none): location to store error * * Launches desktop application doing substitutions in application info. * * Returns: %TRUE if application was launched. * * Since: 0.1.15 */ gboolean fm_app_info_launch(GAppInfo *appinfo, GList *files, GAppLaunchContext *launch_context, GError **error) { gboolean supported = FALSE, ret = FALSE; GList *launch_list = g_list_copy(files); if(G_IS_DESKTOP_APP_INFO(appinfo)) { const char *id; #if GLIB_CHECK_VERSION(2,24,0) /* if GDesktopAppInfo knows the filename then let use it */ id = g_desktop_app_info_get_filename(G_DESKTOP_APP_INFO(appinfo)); if(id) /* this is a desktop entry file */ { /* load the desktop entry file to obtain more info */ GKeyFile* kf = g_key_file_new(); supported = g_key_file_load_from_file(kf, id, 0, NULL); if(supported) do { ret = do_launch(appinfo, id, kf, &launch_list, launch_context, error); } while (launch_list && ret); g_key_file_free(kf); id = NULL; } else /* otherwise try application id */ #endif id = g_app_info_get_id(appinfo); if(id) /* this is an installed application */ { /* load the desktop entry file to obtain more info */ GKeyFile* kf = g_key_file_new(); char* rel_path = g_strconcat("applications/", id, NULL); char* full_desktop_path; supported = g_key_file_load_from_data_dirs(kf, rel_path, &full_desktop_path, 0, NULL); g_free(rel_path); if(supported) { do { ret = do_launch(appinfo, full_desktop_path, kf, &launch_list, launch_context, error); } while (launch_list && ret); g_free(full_desktop_path); } g_key_file_free(kf); } else { #if GLIB_CHECK_VERSION(2,24,0) if (!supported) /* it was launched otherwise, see above */ #endif { /* If this is created with fm_app_info_create_from_commandline() */ if(g_object_get_data(G_OBJECT(appinfo), "flags")) { supported = TRUE; do { ret = do_launch(appinfo, NULL, NULL, &launch_list, launch_context, error); } while (launch_list && ret); } } } } else supported = FALSE; g_list_free(launch_list); if(!supported) /* fallback to GAppInfo::launch */ return g_app_info_launch(appinfo, files, launch_context, error); return ret; } /** * fm_app_info_launch_uris * @appinfo: application info to launch * @uris: (element-type char *): URIs to use in run substitutions * @launch_context: (allow-none): a launch context * @error: (out) (allow-none): location to store error * * Launches desktop application doing substitutions in application info. * * Returns: %TRUE if application was launched. * * Since: 0.1.15 */ gboolean fm_app_info_launch_uris(GAppInfo *appinfo, GList *uris, GAppLaunchContext *launch_context, GError **error) { GList* gfiles = NULL; gboolean ret; for(;uris; uris = uris->next) { GFile* gf = fm_file_new_for_uri((char*)uris->data); if(gf) gfiles = g_list_prepend(gfiles, gf); } gfiles = g_list_reverse(gfiles); ret = fm_app_info_launch(appinfo, gfiles, launch_context, error); g_list_foreach(gfiles, (GFunc)g_object_unref, NULL); g_list_free(gfiles); return ret; } /** * fm_app_info_launch_default_for_uri * @uri: the uri to show * @launch_context: (allow-none): a launch context * @error: (out) (allow-none): location to store error * * Utility function that launches the default application * registered to handle the specified uri. Synchronous I/O * is done on the uri to detect the type of the file if * required. * * Returns: %TRUE if application was launched. * * Since: 0.1.15 */ gboolean fm_app_info_launch_default_for_uri(const char *uri, GAppLaunchContext *launch_context, GError **error) { /* FIXME: implement this */ return g_app_info_launch_default_for_uri(uri, launch_context, error); } /** * fm_app_info_create_from_commandline * @commandline: the commandline to use * @application_name: (allow-none): the application name, or %NULL to use @commandline * @flags: flags that can specify details of the created #GAppInfo * @error: (out) (allow-none): location to store error * * Creates a new #GAppInfo from the given information. * * Note that for @commandline, the quoting rules of the Exec key of the * freedesktop.org Desktop * Entry Specification are applied. For example, if the @commandline contains * percent-encoded URIs, the percent-character must be doubled in order to prevent it from * being swallowed by Exec key unquoting. See the specification for exact quoting rules. * * Returns: (transfer full): new #GAppInfo for given command. * * Since: 0.1.15 */ GAppInfo* fm_app_info_create_from_commandline(const char *commandline, const char *application_name, GAppInfoCreateFlags flags, GError **error) { GAppInfo* app = g_app_info_create_from_commandline(commandline, application_name, flags, error); g_object_set_data(G_OBJECT(app), "flags", GUINT_TO_POINTER(flags)); return app; } libfm-1.4.0/src/base/fm-app-info.h000066400000000000000000000035071475513661000166050ustar00rootroot00000000000000/* * fm-app-info.h * * Copyright 2010 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_APP_INFO_H__ #define __FM_APP_INFO_H__ #include G_BEGIN_DECLS gboolean fm_app_info_launch(GAppInfo *appinfo, GList *files, GAppLaunchContext *launch_context, GError **error); gboolean fm_app_info_launch_uris(GAppInfo *appinfo, GList *uris, GAppLaunchContext *launch_context, GError **error); gboolean fm_app_info_launch_default_for_uri(const char *uri, GAppLaunchContext *launch_context, GError **error); GAppInfo* fm_app_info_create_from_commandline(const char *commandline, const char *application_name, GAppInfoCreateFlags flags, GError **error); G_END_DECLS #endif /* __FM_APP_INFO_H__ */ libfm-1.4.0/src/base/fm-archiver.c000066400000000000000000000214721475513661000166730ustar00rootroot00000000000000/* * fm-archiver.c * * Copyright 2010 PCMan * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-archiver * @short_description: Support for packing and unpacking archiver utilities. * @title: FmArchiver * * @include: libfm/fm.h * * The #FmArchiver represents support for utilities which can pack files * into archive and/or extract them. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-config.h" #include "fm-archiver.h" #include "fm-app-info.h" #include "fm-utils.h" #include #include static GList* archivers = NULL; static FmArchiver* default_archiver = NULL; static void fm_archiver_free(FmArchiver* archiver) { g_free(archiver->program); g_free(archiver->create_cmd); g_free(archiver->extract_cmd); g_free(archiver->extract_to_cmd); g_strfreev(archiver->mime_types); g_slice_free(FmArchiver, archiver); } gboolean fm_archiver_is_mime_type_supported(FmArchiver* archiver, const char* type) { char** p; if(G_UNLIKELY(!type)) return FALSE; for(p=archiver->mime_types; *p; ++p) { if(strcmp(*p, type) == 0) return TRUE; } return FALSE; } /* FIXME: error handling */ static gboolean launch_program(FmArchiver* archiver, GAppLaunchContext* ctx, const char* cmd, FmPathList* files, FmPath* dir) { GAppInfo* app; char* _cmd = NULL; const char* dir_place_holder; GKeyFile* dummy; char* tmp; if(dir && (dir_place_holder = strstr(cmd, "%d"))) { char* dir_str; int len; if(strstr(cmd, "%U") || strstr(cmd, "%u")) /* supports URI */ dir_str = fm_path_to_uri(dir); else { GFile* gf = fm_path_to_gfile(dir); /* FIXME: convert dir to fuse-based local path if needed. */ dir_str = g_file_get_path(gf); g_object_unref(gf); } /* replace all % with %% so encoded URI can be handled correctly when parsing Exec key. */ tmp = fm_strdup_replace(dir_str, "%", "%%"); g_free(dir_str); dir_str = tmp; /* quote the path or URI */ tmp = g_shell_quote(dir_str); g_free(dir_str); dir_str = tmp; len = strlen(cmd) - 2 + strlen(dir_str) + 1; _cmd = g_malloc(len); len = (dir_place_holder - cmd); strncpy(_cmd, cmd, len); strcpy(_cmd + len, dir_str); strcat(_cmd, dir_place_holder + 2); g_free(dir_str); cmd = _cmd; } /* create a fake key file to cheat GDesktopAppInfo */ dummy = g_key_file_new(); g_key_file_set_string(dummy, G_KEY_FILE_DESKTOP_GROUP, "Type", "Application"); g_key_file_set_string(dummy, G_KEY_FILE_DESKTOP_GROUP, "Name", archiver->program); /* replace all % with %% so encoded URI can be handled correctly when parsing Exec key. */ g_key_file_set_string(dummy, G_KEY_FILE_DESKTOP_GROUP, "Exec", cmd); app = (GAppInfo*)g_desktop_app_info_new_from_keyfile(dummy); g_key_file_free(dummy); g_debug("cmd = %s", cmd); if(app) { GList* uris = NULL, *l; for(l = fm_path_list_peek_head_link(files); l; l=l->next) { FmPath* path = FM_PATH(l->data); uris = g_list_prepend(uris, fm_path_to_uri(path)); } fm_app_info_launch_uris(app, uris, ctx, NULL); g_list_foreach(uris, (GFunc)g_free, NULL); g_list_free(uris); g_object_unref(app); } g_free(_cmd); return TRUE; } /** * fm_archiver_create_archive * @archiver: the archiver descriptor * @ctx: (allow-none): a launch context * @files: files to pack into archive * * Creates an archive for @files. * * Returns: %FALSE. * * Since: 0.1.9 */ gboolean fm_archiver_create_archive(FmArchiver* archiver, GAppLaunchContext* ctx, FmPathList* files) { if(archiver->create_cmd && files) launch_program(archiver, ctx, archiver->create_cmd, files, NULL); return FALSE; } /** * fm_archiver_extract_archives * @archiver: the archiver descriptor * @ctx: (allow-none): a launch context * @files: archives to unpack * * Extracts files from archives. * * Returns: %FALSE. * * Since: 0.1.9 */ gboolean fm_archiver_extract_archives(FmArchiver* archiver, GAppLaunchContext* ctx, FmPathList* files) { if(archiver->extract_cmd && files) launch_program(archiver, ctx, archiver->extract_cmd, files, NULL); return FALSE; } /** * fm_archiver_extract_archives_to * @archiver: archiver descriptor * @ctx: (allow-none): a launch context * @files: archives to unpack * @dest_dir: directory where files should be extracted to * * Extracts files from archives into @dest_dir. * * Returns: %FALSE. * * Since: 0.1.9 */ gboolean fm_archiver_extract_archives_to(FmArchiver* archiver, GAppLaunchContext* ctx, FmPathList* files, FmPath* dest_dir) { if(archiver->extract_to_cmd && files) launch_program(archiver, ctx, archiver->extract_to_cmd, files, dest_dir); return FALSE; } /** * fm_archiver_get_default * * Retrieves default GUI archiver used by libfm. * * This API is not thread-safe and should be used only in default context. * * Returns: archiver descriptor. * * Since: 0.1.9 */ FmArchiver* fm_archiver_get_default(void) { if(!default_archiver) { GList* l; if(fm_config->archiver) { for(l = archivers; l; l=l->next) { FmArchiver* archiver = (FmArchiver*)l->data; if( g_strcmp0(fm_config->archiver, archiver->program) == 0 ) { default_archiver = archiver; break; } } } else if(archivers) { for(l = archivers; l; l=l->next) { FmArchiver* archiver = (FmArchiver*)l->data; char* tmp = g_find_program_in_path(archiver->program); if( tmp ) { g_free(tmp); default_archiver = archiver; g_free(fm_config->archiver); fm_config->archiver = g_strdup(archiver->program); break; } } } } return default_archiver; } /** * fm_archiver_set_default * @archiver: archiver descriptor * * Sets default GUI archiver used by libfm. * * This API is not thread-safe and should be used only in default context. * * Since: 0.1.9 */ void fm_archiver_set_default(FmArchiver* archiver) { if(archiver) default_archiver = archiver; } /** * fm_archiver_get_all * * Retrieves a list of #FmArchiver of all GUI archivers known to libfm. * * This API is not thread-safe and should be used only in default context. * * Returns: list of archivers. * * Since: 0.1.9 */ const GList* fm_archiver_get_all(void) { return archivers; } void _fm_archiver_init() { GKeyFile *kf = g_key_file_new(); if(g_key_file_load_from_file(kf, PACKAGE_DATA_DIR "/archivers.list", 0, NULL)) { gsize n_archivers; gchar** programs = g_key_file_get_groups(kf, &n_archivers); if(programs) { gsize i; for(i = 0; i < n_archivers; ++i) { FmArchiver* archiver = g_slice_new0(FmArchiver); archiver->program = programs[i]; archiver->create_cmd = g_key_file_get_string(kf, programs[i], "create", NULL); archiver->extract_cmd = g_key_file_get_string(kf, programs[i], "extract", NULL); archiver->extract_to_cmd = g_key_file_get_string(kf, programs[i], "extract_to", NULL); archiver->mime_types = g_key_file_get_string_list(kf, programs[i], "mime_types", NULL, NULL); archivers = g_list_append(archivers, archiver); } g_free(programs); /* strings in the vector are stolen by FmArchiver. */ } } g_key_file_free(kf); } void _fm_archiver_finalize() { g_list_foreach(archivers, (GFunc)fm_archiver_free, NULL); g_list_free(archivers); archivers = NULL; default_archiver = NULL; } libfm-1.4.0/src/base/fm-archiver.h000066400000000000000000000046301475513661000166750ustar00rootroot00000000000000/* * fm-archiver.h * * Copyright 2010 PCMan * * This file is a part of the Libfm library. * * 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 */ /* handles integration between libfm and some well-known GUI archivers, * such as file-roller, xarchiver, and squeeze. */ #ifndef __FM_ARCHIVER_H__ #define __FM_ARCHIVER_H__ #include #include #include "fm-path.h" G_BEGIN_DECLS typedef struct _FmArchiver FmArchiver; /** * FmArchiver: * @program: archiver program * @create_cmd: command to create archive * @extract_cmd: command to extract files from archive * @extract_to_cmd: command to extract files into destined directory * @mime_types: list of archive types the archiver supports */ struct _FmArchiver { char* program; char* create_cmd; char* extract_cmd; char* extract_to_cmd; char** mime_types; }; void _fm_archiver_init(); void _fm_archiver_finalize(); gboolean fm_archiver_is_mime_type_supported(FmArchiver* archiver, const char* type); gboolean fm_archiver_create_archive(FmArchiver* archiver, GAppLaunchContext* ctx, FmPathList* files); gboolean fm_archiver_extract_archives(FmArchiver* archiver, GAppLaunchContext* ctx, FmPathList* files); gboolean fm_archiver_extract_archives_to(FmArchiver* archiver, GAppLaunchContext* ctx, FmPathList* files, FmPath* dest_dir); /* get default GUI archivers used by libfm */ FmArchiver* fm_archiver_get_default(); /* set default GUI archivers used by libfm */ void fm_archiver_set_default(FmArchiver* archiver); /* get a list of FmArchiver* of all GUI archivers known to libfm */ const GList* fm_archiver_get_all(); G_END_DECLS #endif /* __FM_ARCHIVER_H__ */ libfm-1.4.0/src/base/fm-bookmarks.c000066400000000000000000000265361475513661000170660ustar00rootroot00000000000000/* * fm-bookmarks.c * * Copyright 2009 PCMan * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-bookmarks * @short_description: Bookmarks support for libfm. * @title: FmBookmarks * * @include: libfm/fm.h * * The application that uses libfm can use user-wide bookmark list via * class FmBookmarks. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-bookmarks.h" #include #include #include "fm-utils.h" enum { CHANGED, N_SIGNALS }; static FmBookmarks* fm_bookmarks_new (void); static void fm_bookmarks_finalize (GObject *object); static GList* load_bookmarks(GFile *file); G_DEFINE_TYPE(FmBookmarks, fm_bookmarks, G_TYPE_OBJECT); G_LOCK_DEFINE_STATIC(bookmarks); static FmBookmarks* singleton = NULL; static guint signals[N_SIGNALS]; static guint idle_handler = 0; static void fm_bookmarks_class_init(FmBookmarksClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_bookmarks_finalize; /** * FmBookmarks::changed: * @bookmarks: pointer to bookmarks list singleton descriptor * * The "changed" signal is emitted when some bookmark item is * changed, added, or removed. * * Since: 0.1.0 */ signals[CHANGED] = g_signal_new("changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmBookmarksClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 ); } static void fm_bookmarks_finalize(GObject *object) { FmBookmarks *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_BOOKMARKS(object)); self = FM_BOOKMARKS(object); if(idle_handler) { g_source_remove(idle_handler); idle_handler = 0; } g_list_foreach(self->items, (GFunc)fm_bookmark_item_unref, NULL); g_list_free(self->items); g_object_unref(self->mon); g_object_unref(self->file); G_OBJECT_CLASS(fm_bookmarks_parent_class)->finalize(object); } static inline char *get_legacy_bookmarks_file(void) { return g_build_filename(fm_get_home_dir(), ".gtk-bookmarks", NULL); } static inline char *get_new_bookmarks_file(void) { return g_build_filename(g_get_user_config_dir(), "gtk-3.0", "bookmarks", NULL); } static void on_changed( GFileMonitor* mon, GFile* gf, GFile* other, GFileMonitorEvent evt, FmBookmarks* bookmarks ) { G_LOCK(bookmarks); /* reload bookmarks */ g_list_foreach(bookmarks->items, (GFunc)fm_bookmark_item_unref, NULL); g_list_free(bookmarks->items); bookmarks->items = load_bookmarks(bookmarks->file); G_UNLOCK(bookmarks); g_signal_emit(bookmarks, signals[CHANGED], 0); } static FmBookmarkItem* new_item(char* line) { FmBookmarkItem* item = g_slice_new0(FmBookmarkItem); char* sep; sep = strchr(line, '\n'); if(sep) *sep = '\0'; sep = strchr(line, ' '); if(sep) *sep = '\0'; item->path = fm_path_new_for_uri(line); if(sep) item->name = g_strdup(sep+1); else item->name = g_filename_display_name(fm_path_get_basename(item->path)); item->n_ref = 1; return item; } static GList* load_bookmarks(GFile *file) { char *fpath = g_file_get_path(file); FILE* f; char buf[1024]; FmBookmarkItem* item; GList* items = NULL; /* load the file */ f = fopen(fpath, "r"); g_free(fpath); if(f) { while(fgets(buf, 1024, f)) { item = new_item(buf); items = g_list_prepend(items, item); } fclose(f); } items = g_list_reverse(items); return items; } static void fm_bookmarks_init(FmBookmarks *self) { /* trying the XDG-3.0 first and use it if it exists */ char* fpath = get_new_bookmarks_file(); self->file = g_file_new_for_path(fpath); g_free(fpath); self->items = load_bookmarks(self->file); if (!self->items) /* not found, use legacy file */ { g_object_unref(self->file); fpath = get_legacy_bookmarks_file(); self->file = g_file_new_for_path(fpath); g_free(fpath); self->items = load_bookmarks(self->file); } self->mon = g_file_monitor_file(self->file, 0, NULL, NULL); if (self->mon) g_signal_connect(self->mon, "changed", G_CALLBACK(on_changed), self); } static FmBookmarks *fm_bookmarks_new(void) { return g_object_new(FM_BOOKMARKS_TYPE, NULL); } /** * fm_bookmarks_dup * * Returns reference to bookmarks list singleton descriptor. * * This API is not thread-safe and should be used only in default context. * * Return value: (transfer full): a reference to bookmarks list * * Since: 0.1.99 */ FmBookmarks* fm_bookmarks_dup(void) { G_LOCK(bookmarks); if( G_LIKELY(singleton) ) g_object_ref(singleton); else { singleton = fm_bookmarks_new(); g_object_add_weak_pointer(G_OBJECT(singleton), (gpointer*)&singleton); } G_UNLOCK(bookmarks); return singleton; } /** * fm_bookmarks_list_all * @bookmarks: bookmarks list * * Returns list of FmBookmarkItem retrieved from bookmarks list. Returned * list is owned by bookmarks list and should not be freed by caller. * * Return value: (transfer none) (element-type FmBookmarkItem): list of bookmark items * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_bookmarks_get_all() instead. */ const GList* fm_bookmarks_list_all(FmBookmarks* bookmarks) { return bookmarks->items; } /** * fm_bookmark_item_ref * @item: an item * * Increases reference counter on @item. * * Returns: @item. * * Since: 1.0.2 */ FmBookmarkItem* fm_bookmark_item_ref(FmBookmarkItem* item) { g_return_val_if_fail(item != NULL, NULL); g_atomic_int_inc(&item->n_ref); return item; } /** * fm_bookmark_item_unref * @item: item to be freed * * Decreases reference counter on @item and frees data when it reaches 0. * * Since: 1.0.2 */ void fm_bookmark_item_unref(FmBookmarkItem *item) { g_return_if_fail(item != NULL); if(g_atomic_int_dec_and_test(&item->n_ref)) { g_free(item->name); fm_path_unref(item->path); g_slice_free(FmBookmarkItem, item); } } /** * fm_bookmarks_get_all * @bookmarks: bookmarks list * * Returns list of FmBookmarkItem retrieved from bookmarks list. Returned * list should be freed with g_list_free_full(list, fm_bookmark_item_unref). * * Return value: (transfer full) (element-type FmBookmarkItem): list of bookmark items * * Since: 1.0.2 */ GList* fm_bookmarks_get_all(FmBookmarks* bookmarks) { GList *copy = NULL, *l; G_LOCK(bookmarks); for(l = bookmarks->items; l; l = l->next) { fm_bookmark_item_ref(l->data); copy = g_list_prepend(copy, l->data); } copy = g_list_reverse(copy); G_UNLOCK(bookmarks); return copy; } static gboolean save_bookmarks(FmBookmarks* bookmarks) { FmBookmarkItem* item; GList* l; GString* buf; GError *err = NULL; if(g_source_is_destroyed(g_main_current_source())) return FALSE; buf = g_string_sized_new(1024); G_LOCK(bookmarks); for( l=bookmarks->items; l; l=l->next ) { char* uri; item = (FmBookmarkItem*)l->data; uri = fm_path_to_uri(item->path); g_string_append(buf, uri); g_free(uri); g_string_append_c(buf, ' '); g_string_append(buf, item->name); g_string_append_c(buf, '\n'); } idle_handler = 0; G_UNLOCK(bookmarks); if (!g_file_replace_contents(bookmarks->file, buf->str, buf->len, NULL, FALSE, 0, NULL, NULL, &err)) { g_critical("%s", err->message); g_error_free(err); } g_string_free(buf, TRUE); /* we changed bookmarks list, let inform who interested in that */ g_signal_emit(bookmarks, signals[CHANGED], 0); return FALSE; } static void queue_save_bookmarks(FmBookmarks* bookmarks) { if(!idle_handler) idle_handler = g_idle_add((GSourceFunc)save_bookmarks, bookmarks); } /** * fm_bookmarks_insert * @bookmarks: bookmarks list * @path: path requested to add to bookmarks * @name: name new bookmark will be seen in list with * @pos: where to insert a bookmark into list * * Adds a bookmark into bookmark list. Returned structure is managed by * bookmarks list and should not be freed by caller. If you want to save * returned data then call fm_bookmark_item_ref() on it. * * Return value: (transfer none): new created bookmark item * * Since: 0.1.0 */ FmBookmarkItem* fm_bookmarks_insert(FmBookmarks* bookmarks, FmPath* path, const char* name, int pos) { FmBookmarkItem* item = g_slice_new0(FmBookmarkItem); item->path = fm_path_ref(path); item->name = g_strdup(name); item->n_ref = 1; G_LOCK(bookmarks); /* FIXME: disable creation of duplicate bookmark if set in config */ bookmarks->items = g_list_insert(bookmarks->items, item, pos); /* g_debug("insert %s at %d", name, pos); */ queue_save_bookmarks(bookmarks); G_UNLOCK(bookmarks); return item; } /** * fm_bookmarks_remove * @bookmarks: bookmarks list * @item: bookmark item for deletion * * Removes a bookmark from bookmark list. * * Since: 0.1.0 */ void fm_bookmarks_remove(FmBookmarks* bookmarks, FmBookmarkItem* item) { G_LOCK(bookmarks); bookmarks->items = g_list_remove(bookmarks->items, item); fm_bookmark_item_unref(item); queue_save_bookmarks(bookmarks); G_UNLOCK(bookmarks); } /** * fm_bookmarks_rename * @bookmarks: bookmarks list * @item: bookmark item which will be changed * @new_name: new name for bookmark item to be seen in list * * Changes name of existing bookmark item. * * Since: 0.1.0 */ void fm_bookmarks_rename(FmBookmarks* bookmarks, FmBookmarkItem* item, const char* new_name) { G_LOCK(bookmarks); g_free(item->name); item->name = g_strdup(new_name); queue_save_bookmarks(bookmarks); G_UNLOCK(bookmarks); } /** * fm_bookmarks_reorder * @bookmarks: bookmarks list * @item: bookmark item which will be changed * @pos: new position for bookmark item in list * * Changes position of existing bookmark item. * * Since: 0.1.0 */ void fm_bookmarks_reorder(FmBookmarks* bookmarks, FmBookmarkItem* item, int pos) { G_LOCK(bookmarks); bookmarks->items = g_list_remove(bookmarks->items, item); bookmarks->items = g_list_insert(bookmarks->items, item, pos); queue_save_bookmarks(bookmarks); G_UNLOCK(bookmarks); } libfm-1.4.0/src/base/fm-bookmarks.h000066400000000000000000000063421475513661000170640ustar00rootroot00000000000000/* * fm-bookmarks.h * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_BOOKMARKS_H__ #define __FM_BOOKMARKS_H__ #include #include #include "fm-path.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_BOOKMARKS_TYPE (fm_bookmarks_get_type()) #define FM_BOOKMARKS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_BOOKMARKS_TYPE, FmBookmarks)) #define FM_BOOKMARKS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_BOOKMARKS_TYPE, FmBookmarksClass)) #define FM_IS_BOOKMARKS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_BOOKMARKS_TYPE)) #define FM_IS_BOOKMARKS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_BOOKMARKS_TYPE)) typedef struct _FmBookmarks FmBookmarks; typedef struct _FmBookmarksClass FmBookmarksClass; typedef struct _FmBookmarkItem FmBookmarkItem; /** * FmBookmarkItem * @name: display name of bookmark * @path: path to bookmarked directory */ struct _FmBookmarkItem { char* name; FmPath* path; /**/ gpointer _reserved1; int FM_SEAL(n_ref); }; struct _FmBookmarks { GObject parent; /*< private >*/ GFile *FM_SEAL(file); GFileMonitor* FM_SEAL(mon); GList* FM_SEAL(items); gpointer _reserved1; }; /** * FmBookmarksClass * @parent_class: the parent class * @changed: the class closure for #FmBookmarks::changed signal */ struct _FmBookmarksClass { GObjectClass parent_class; void (*changed)(FmBookmarks*); }; GType fm_bookmarks_get_type(void); FmBookmarks* fm_bookmarks_dup(void); #define fm_bookmarks_append(bookmarks, path, name) fm_bookmarks_insert(bookmarks, path, name, -1) FmBookmarkItem* fm_bookmarks_insert(FmBookmarks* bookmarks, FmPath* path, const char* name, int pos); void fm_bookmarks_remove(FmBookmarks* bookmarks, FmBookmarkItem* item); void fm_bookmarks_reorder(FmBookmarks* bookmarks, FmBookmarkItem* item, int pos); void fm_bookmarks_rename(FmBookmarks* bookmarks, FmBookmarkItem* item, const char* new_name); #ifndef FM_DISABLE_DEPRECATED /* list all bookmark items in current bookmarks */ const GList* fm_bookmarks_list_all(FmBookmarks* bookmarks); #endif FmBookmarkItem* fm_bookmark_item_ref(FmBookmarkItem* item); void fm_bookmark_item_unref(FmBookmarkItem *item); GList* fm_bookmarks_get_all(FmBookmarks* bookmarks); G_END_DECLS #endif /* __FM_BOOKMARKS_H__ */ libfm-1.4.0/src/base/fm-config.c000066400000000000000000000517071475513661000163410ustar00rootroot00000000000000/* * fm-config.c * * Copyright 2009 PCMan * Copyright 2009 Juergen Hoetzel * Copyright 2012-2014 Andriy Grytsenko (LStranger) * Copyright 2016 Mamoru TASAKA * Copyright 2024 Ingo Brückl * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-config * @short_description: Configuration file support for applications that use libfm. * @title: FmConfig * * @include: libfm/fm.h * * The #FmConfig represents basic configuration options that are used by * libfm classes and methods. Methods of class #FmConfig allow use either * default file (~/.config/libfm/libfm.conf) or another one to load the * configuration and to save it. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-config.h" #include "fm-utils.h" #include enum { CHANGED, N_SIGNALS }; /* global config object */ FmConfig* fm_config = NULL; static guint signals[N_SIGNALS]; static void fm_config_finalize (GObject *object); G_DEFINE_TYPE(FmConfig, fm_config, G_TYPE_OBJECT); static void fm_config_class_init(FmConfigClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_config_finalize; /** * FmConfig::changed: * @config: configuration that was changed * * The #FmConfig::changed signal is emitted when a config key is changed. * * Since: 0.1.0 */ signals[CHANGED]= g_signal_new("changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST|G_SIGNAL_DETAILED, G_STRUCT_OFFSET(FmConfigClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void _on_cfg_file_changed(GFileMonitor *mon, GFile *gf, GFile *other, GFileMonitorEvent evt, FmConfig *cfg); static inline void _cfg_monitor_free(FmConfig *cfg) { if (cfg->_cfg_mon) { g_signal_handlers_disconnect_by_func(cfg->_cfg_mon, _on_cfg_file_changed, cfg); g_object_unref(cfg->_cfg_mon); cfg->_cfg_mon = NULL; } } static inline void _cfg_monitor_add(FmConfig *cfg, const char *path) { GFile *gf = g_file_new_for_path(path); cfg->_cfg_mon = g_file_monitor_file(gf, G_FILE_MONITOR_NONE, NULL, NULL); g_object_unref(gf); if (cfg->_cfg_mon) g_signal_connect(cfg->_cfg_mon, "changed", G_CALLBACK(_on_cfg_file_changed), cfg); } static void fm_config_finalize(GObject *object) { FmConfig* cfg; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_CONFIG(object)); cfg = (FmConfig*)object; _cfg_monitor_free(cfg); g_free(cfg->_cfg_name); if(cfg->terminal) g_free(cfg->terminal); if(cfg->archiver) g_free(cfg->archiver); g_strfreev(cfg->system_modules_blacklist); g_strfreev(cfg->modules_blacklist); g_strfreev(cfg->modules_whitelist); g_free(cfg->format_cmd); g_free(cfg->list_view_size_units); g_free(cfg->saved_search); G_OBJECT_CLASS(fm_config_parent_class)->finalize(object); } static void fm_config_init(FmConfig *self) { self->single_click = FM_CONFIG_DEFAULT_SINGLE_CLICK; self->middle_click = FM_CONFIG_DEFAULT_MIDDLE_CLICK; self->auto_selection_delay = FM_CONFIG_DEFAULT_AUTO_SELECTION_DELAY; self->use_trash = FM_CONFIG_DEFAULT_USE_TRASH; self->confirm_del = FM_CONFIG_DEFAULT_CONFIRM_DEL; self->confirm_trash = FM_CONFIG_DEFAULT_CONFIRM_TRASH; self->big_icon_size = FM_CONFIG_DEFAULT_BIG_ICON_SIZE; self->small_icon_size = FM_CONFIG_DEFAULT_SMALL_ICON_SIZE; self->pane_icon_size = FM_CONFIG_DEFAULT_PANE_ICON_SIZE; self->thumbnail_size = FM_CONFIG_DEFAULT_THUMBNAIL_SIZE; self->show_thumbnail = FM_CONFIG_DEFAULT_SHOW_THUMBNAIL; self->thumbnail_local = FM_CONFIG_DEFAULT_THUMBNAIL_LOCAL; self->thumbnail_max = FM_CONFIG_DEFAULT_THUMBNAIL_MAX; /* show_internal_volumes defaulted to FALSE */ /* si_unit defaulted to FALSE */ /* terminal and archiver defaulted to NULL */ /* drop_default_action defaulted to 0 */ /* modules_blacklist and modules_whitelist defaulted to NULL */ /* format_cmd defaulted to NULL */ /* list_view_size_units defaulted to NULL */ /* saved_search defaulted to NULL */ self->advanced_mode = FALSE; self->force_startup_notify = FM_CONFIG_DEFAULT_FORCE_S_NOTIFY; self->date_iso_8601 = FM_CONFIG_DEFAULT_DATE_ISO_8601; self->backup_as_hidden = FM_CONFIG_DEFAULT_BACKUP_HIDDEN; self->no_usb_trash = FM_CONFIG_DEFAULT_NO_USB_TRASH; self->no_child_non_expandable = FM_CONFIG_DEFAULT_NO_EXPAND_EMPTY; self->show_full_names = FM_CONFIG_DEFAULT_SHOW_FULL_NAMES; self->shadow_hidden = FM_CONFIG_DEFAULT_SHADOW_HIDDEN; self->only_user_templates = FM_CONFIG_DEFAULT_ONLY_USER_TEMPLATES; self->template_run_app = FM_CONFIG_DEFAULT_TEMPLATE_RUN_APP; self->template_type_once = FM_CONFIG_DEFAULT_TEMPL_TYPE_ONCE; self->defer_content_test = FM_CONFIG_DEFAULT_DEFER_CONTENT_TEST; self->quick_exec = FM_CONFIG_DEFAULT_QUICK_EXEC; self->places_home = FM_CONFIG_DEFAULT_PLACES_HOME; self->places_desktop = FM_CONFIG_DEFAULT_PLACES_DESKTOP; self->places_root = FM_CONFIG_DEFAULT_PLACES_ROOT; self->places_computer = FM_CONFIG_DEFAULT_PLACES_COMPUTER; self->places_trash = FM_CONFIG_DEFAULT_PLACES_TRASH; self->places_applications = FM_CONFIG_DEFAULT_PLACES_APPLICATIONS; self->places_network = FM_CONFIG_DEFAULT_PLACES_NETWORK; self->places_unmounted = FM_CONFIG_DEFAULT_PLACES_UNMOUNTED; self->smart_desktop_autodrop = FM_CONFIG_DEFAULT_SMART_DESKTOP_AUTODROP; } /** * fm_config_new * * Creates a new configuration structure filled with default values. * * Return value: a new #FmConfig object. * * Since: 0.1.0 */ FmConfig *fm_config_new(void) { return (FmConfig*)g_object_new(FM_CONFIG_TYPE, NULL); } static void _on_cfg_file_changed(GFileMonitor *mon, GFile *gf, GFile *other, GFileMonitorEvent evt, FmConfig *cfg) { if (evt == G_FILE_MONITOR_EVENT_DELETED) _cfg_monitor_free(cfg); else fm_config_load_from_file(cfg, cfg->_cfg_name); } /** * fm_config_emit_changed * @cfg: pointer to configuration * @changed_key: what was changed * * Causes the #FmConfig::changed signal to be emitted. * * This API is not thread-safe and should be used only in default context. * * Since: 0.1.0 */ void fm_config_emit_changed(FmConfig* cfg, const char* changed_key) { GQuark detail = changed_key ? g_quark_from_string(changed_key) : 0; g_signal_emit(cfg, signals[CHANGED], detail); } static void _parse_drop_default_action(GKeyFile *kf, gint *action) { char *str = g_key_file_get_string(kf, "config", "drop_default_action", NULL); if (str) { switch (str[0]) { case '0': case '1': case '2': case '3': /* backward compatibility */ *action = (str[0] - '0'); break; case 'a': if (str[1] == 'u') /* 'auto' */ *action = FM_DND_DEST_DROP_AUTO; else if (str[1] == 's') /* 'ask' */ *action = FM_DND_DEST_DROP_ASK; break; case 'c': /* 'copy' */ *action = FM_DND_DEST_DROP_COPY; break; case 'm': /* 'move' */ *action = FM_DND_DEST_DROP_MOVE; default: ; /* ignore invalid values */ } g_free(str); } } /** * fm_config_load_from_key_file * @cfg: pointer to configuration * @kf: a #GKeyFile with configuration keys and values * * Fills configuration @cfg with data from #GKeyFile @kf. * * Since: 0.1.0 */ void fm_config_load_from_key_file(FmConfig* cfg, GKeyFile* kf) { char **strv; fm_key_file_get_bool(kf, "config", "use_trash", &cfg->use_trash); fm_key_file_get_bool(kf, "config", "single_click", &cfg->single_click); fm_key_file_get_bool(kf, "config", "middle_click", &cfg->middle_click); if(cfg->single_click && cfg->middle_click) cfg->middle_click = FALSE; fm_key_file_get_int(kf, "config", "auto_selection_delay", &cfg->auto_selection_delay); fm_key_file_get_bool(kf, "config", "confirm_del", &cfg->confirm_del); fm_key_file_get_bool(kf, "config", "confirm_trash", &cfg->confirm_trash); if(cfg->terminal) g_free(cfg->terminal); cfg->terminal = g_key_file_get_string(kf, "config", "terminal", NULL); if(cfg->archiver) g_free(cfg->archiver); cfg->archiver = g_key_file_get_string(kf, "config", "archiver", NULL); fm_key_file_get_bool(kf, "config", "thumbnail_local", &cfg->thumbnail_local); fm_key_file_get_int(kf, "config", "thumbnail_max", &cfg->thumbnail_max); fm_key_file_get_bool(kf, "config", "advanced_mode", &cfg->advanced_mode); fm_key_file_get_bool(kf, "config", "si_unit", &cfg->si_unit); fm_key_file_get_bool(kf, "config", "force_startup_notify", &cfg->force_startup_notify); fm_key_file_get_bool(kf, "config", "date_iso_8601", &cfg->date_iso_8601); fm_key_file_get_bool(kf, "config", "backup_as_hidden", &cfg->backup_as_hidden); fm_key_file_get_bool(kf, "config", "no_usb_trash", &cfg->no_usb_trash); fm_key_file_get_bool(kf, "config", "no_child_non_expandable", &cfg->no_child_non_expandable); _parse_drop_default_action(kf, &cfg->drop_default_action); fm_key_file_get_bool(kf, "config", "show_full_names", &cfg->show_full_names); fm_key_file_get_bool(kf, "config", "only_user_templates", &cfg->only_user_templates); fm_key_file_get_bool(kf, "config", "template_run_app", &cfg->template_run_app); fm_key_file_get_bool(kf, "config", "template_type_once", &cfg->template_type_once); fm_key_file_get_bool(kf, "config", "defer_content_test", &cfg->defer_content_test); fm_key_file_get_bool(kf, "config", "quick_exec", &cfg->quick_exec); fm_key_file_get_bool(kf, "config", "smart_desktop_autodrop", &cfg->smart_desktop_autodrop); g_free(cfg->format_cmd); cfg->format_cmd = g_key_file_get_string(kf, "config", "format_cmd", NULL); /* append blacklist */ strv = g_key_file_get_string_list(kf, "config", "modules_blacklist", NULL, NULL); fm_strcatv(&cfg->modules_blacklist, strv); g_strfreev(strv); /* replace whitelist */ g_strfreev(cfg->modules_whitelist); cfg->modules_whitelist = g_key_file_get_string_list(kf, "config", "modules_whitelist", NULL, NULL); #ifdef USE_UDISKS fm_key_file_get_bool(kf, "config", "show_internal_volumes", &cfg->show_internal_volumes); #endif fm_key_file_get_int(kf, "ui", "big_icon_size", &cfg->big_icon_size); fm_key_file_get_int(kf, "ui", "small_icon_size", &cfg->small_icon_size); fm_key_file_get_int(kf, "ui", "pane_icon_size", &cfg->pane_icon_size); fm_key_file_get_int(kf, "ui", "thumbnail_size", &cfg->thumbnail_size); fm_key_file_get_bool(kf, "ui", "show_thumbnail", &cfg->show_thumbnail); fm_key_file_get_bool(kf, "ui", "shadow_hidden", &cfg->shadow_hidden); g_free(cfg->list_view_size_units); cfg->list_view_size_units = g_key_file_get_string(kf, "ui", "list_view_size_units", NULL); g_free(cfg->saved_search); cfg->saved_search = g_key_file_get_string(kf, "ui", "saved_search", NULL); fm_key_file_get_bool(kf, "places", "places_home", &cfg->places_home); fm_key_file_get_bool(kf, "places", "places_desktop", &cfg->places_desktop); fm_key_file_get_bool(kf, "places", "places_root", &cfg->places_root); fm_key_file_get_bool(kf, "places", "places_computer", &cfg->places_computer); fm_key_file_get_bool(kf, "places", "places_trash", &cfg->places_trash); fm_key_file_get_bool(kf, "places", "places_applications", &cfg->places_applications); fm_key_file_get_bool(kf, "places", "places_network", &cfg->places_network); fm_key_file_get_bool(kf, "places", "places_unmounted", &cfg->places_unmounted); } /** * fm_config_load_from_file * @cfg: pointer to configuration * @name: (allow-none): file name to load configuration * * Fills configuration @cfg with data from configuration file. The file * @name may be %NULL to load default configuration file. If @name is * full path then that file will be loaded. Otherwise @name will be * searched in system config directories and after that in ~/.config/ * directory and all found files will be loaded, overwriting existing * data in @cfg. * * See also: fm_config_load_from_key_file() * * Since: 0.1.0 */ void fm_config_load_from_file(FmConfig* cfg, const char* name) { const gchar * const *dirs, * const *dir; char *path; char *old_cfg_name; GKeyFile* kf = g_key_file_new(); old_cfg_name = cfg->_cfg_name; g_strfreev(cfg->modules_blacklist); g_strfreev(cfg->system_modules_blacklist); cfg->modules_blacklist = NULL; cfg->system_modules_blacklist = NULL; _cfg_monitor_free(cfg); if(G_LIKELY(!name)) name = "libfm/libfm.conf"; else { if(G_UNLIKELY(g_path_is_absolute(name))) { cfg->_cfg_name = g_strdup(name); if(g_key_file_load_from_file(kf, name, 0, NULL)) { fm_config_load_from_key_file(cfg, kf); _cfg_monitor_add(cfg, name); } goto _out; } } cfg->_cfg_name = g_strdup(name); dirs = g_get_system_config_dirs(); /* bug SF #887: first dir in XDG_CONFIG_DIRS is the most relevant so we shoult process the list in reverse order */ dir = dirs; while (*dir) ++dir; while (dir-- != dirs) { path = g_build_filename(*dir, name, NULL); if(g_key_file_load_from_file(kf, path, 0, NULL)) fm_config_load_from_key_file(cfg, kf); g_free(path); } /* we got all system blacklists, save them and get user's one */ cfg->system_modules_blacklist = cfg->modules_blacklist; cfg->modules_blacklist = NULL; path = g_build_filename(g_get_user_config_dir(), name, NULL); if(g_key_file_load_from_file(kf, path, 0, NULL)) { fm_config_load_from_key_file(cfg, kf); _cfg_monitor_add(cfg, path); } g_free(path); _out: g_key_file_free(kf); g_free(old_cfg_name); g_signal_emit(cfg, signals[CHANGED], 0); /* FIXME: compare and send individual changes instead */ } #define _save_config_bool(_str_,_cfg_,_name_) \ g_string_append(_str_, #_name_); \ g_string_append(_str_, _cfg_->_name_ ? "=1\n" : "=0\n") #define _save_config_int(_str_,_cfg_,_name_) \ g_string_append_printf(_str_, #_name_ "=%d\n", _cfg_->_name_) #define _save_config_string(_str_,_cfg_,_name_) \ if (_cfg_->_name_ != NULL) \ g_string_append_printf(_str_, #_name_ "=%s\n", _cfg_->_name_) #define _save_config_strv(_str_,_cfg_,_name_) do {\ if(_cfg_->_name_ != NULL && _cfg_->_name_[0] != NULL) \ { \ char **list, *c; \ g_string_append(_str_, #_name_ "="); \ for (list = _cfg_->_name_; (c = *list); list++) \ { \ while (*c) \ { \ if (G_UNLIKELY(*c == '\\')) \ g_string_append_c(_str_, '\\'); \ g_string_append_c(_str_, *c++); \ } \ g_string_append_c(_str_, ';'); \ } \ g_string_append_c(_str_, '\n'); \ } \ } while(0) #define _save_drop_action(_str_,_cfg_,_name_) do { \ switch (_cfg_->_name_) \ { \ case FM_DND_DEST_DROP_AUTO: \ g_string_append(_str_, #_name_ "=auto\n"); \ break; \ case FM_DND_DEST_DROP_COPY: \ g_string_append(_str_, #_name_ "=copy\n"); \ break; \ case FM_DND_DEST_DROP_MOVE: \ g_string_append(_str_, #_name_ "=move\n"); \ break; \ case FM_DND_DEST_DROP_ASK: \ g_string_append(_str_, #_name_ "=ask\n"); \ break; \ } \ } while(0) /** * fm_config_save * @cfg: pointer to configuration * @name: (allow-none): file name to save configuration * * Saves configuration into configuration file @name. If @name is %NULL * then configuration will be saved into default configuration file. * Otherwise it will be saved into file @name under directory ~/.config. * * Since: 0.1.0 */ void fm_config_save(FmConfig* cfg, const char* name) { char* path = NULL;; char* dir_path; FILE* f; GString *str; if(!name) name = path = g_build_filename(g_get_user_config_dir(), "libfm/libfm.conf", NULL); else if(!g_path_is_absolute(name)) name = path = g_build_filename(g_get_user_config_dir(), name, NULL); dir_path = g_path_get_dirname(name); if(g_mkdir_with_parents(dir_path, 0700) != -1) { if (cfg->_cfg_mon) g_signal_handlers_block_by_func(cfg->_cfg_mon, _on_cfg_file_changed, cfg); f = fopen(name, "w"); if(f) { str = g_string_new("# Configuration file for the libfm version " PACKAGE_VERSION ".\n" "# Autogenerated file, don't edit, your changes will be overwritten.\n" "\n[config]\n"); _save_config_bool(str, cfg, single_click); _save_config_bool(str, cfg, middle_click); _save_config_bool(str, cfg, use_trash); _save_config_bool(str, cfg, confirm_del); _save_config_bool(str, cfg, confirm_trash); _save_config_bool(str, cfg, advanced_mode); _save_config_bool(str, cfg, si_unit); _save_config_bool(str, cfg, force_startup_notify); _save_config_bool(str, cfg, date_iso_8601); _save_config_bool(str, cfg, backup_as_hidden); _save_config_bool(str, cfg, no_usb_trash); _save_config_bool(str, cfg, no_child_non_expandable); _save_config_bool(str, cfg, show_full_names); _save_config_bool(str, cfg, only_user_templates); _save_config_bool(str, cfg, template_run_app); _save_config_bool(str, cfg, template_type_once); _save_config_int(str, cfg, auto_selection_delay); _save_drop_action(str, cfg, drop_default_action); _save_config_bool(str, cfg, defer_content_test); _save_config_bool(str, cfg, quick_exec); #ifdef USE_UDISKS _save_config_bool(str, cfg, show_internal_volumes); #endif _save_config_string(str, cfg, terminal); _save_config_string(str, cfg, archiver); _save_config_string(str, cfg, format_cmd); _save_config_bool(str, cfg, thumbnail_local); _save_config_int(str, cfg, thumbnail_max); _save_config_strv(str, cfg, modules_blacklist); _save_config_strv(str, cfg, modules_whitelist); _save_config_bool(str, cfg, smart_desktop_autodrop); g_string_append(str, "\n[ui]\n"); _save_config_int(str, cfg, big_icon_size); _save_config_int(str, cfg, small_icon_size); _save_config_int(str, cfg, pane_icon_size); _save_config_int(str, cfg, thumbnail_size); _save_config_bool(str, cfg, show_thumbnail); _save_config_bool(str, cfg, shadow_hidden); if (cfg->list_view_size_units && cfg->list_view_size_units[0]) cfg->list_view_size_units[1] = '\0'; /* leave only 1 char */ _save_config_string(str, cfg, list_view_size_units); _save_config_string(str, cfg, saved_search); g_string_append(str, "\n[places]\n"); _save_config_bool(str, cfg, places_home); _save_config_bool(str, cfg, places_desktop); _save_config_bool(str, cfg, places_root); _save_config_bool(str, cfg, places_computer); _save_config_bool(str, cfg, places_trash); _save_config_bool(str, cfg, places_applications); _save_config_bool(str, cfg, places_network); _save_config_bool(str, cfg, places_unmounted); fwrite(str->str, 1, str->len, f); fclose(f); g_string_free(str, TRUE); } if (cfg->_cfg_mon) g_signal_handlers_unblock_by_func(cfg->_cfg_mon, _on_cfg_file_changed, cfg); } g_free(dir_path); g_free(path); } const char *_fm_config_get_name(FmConfig *cfg) { return cfg->_cfg_name; } libfm-1.4.0/src/base/fm-config.h000066400000000000000000000232741475513661000163440ustar00rootroot00000000000000/* * fm-config.h * * Copyright 2009 PCMan * Copyright 2009 Juergen Hoetzel * Copyright 2012-2014 Andriy Grytsenko (LStranger) * Copyright 2024 Ingo Brückl * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_CONFIG_H__ #define __FM_CONFIG_H__ #include #include G_BEGIN_DECLS #define FM_CONFIG_TYPE (fm_config_get_type()) #define FM_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_CONFIG_TYPE, FmConfig)) #define FM_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_CONFIG_TYPE, FmConfigClass)) #define FM_IS_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_CONFIG_TYPE)) #define FM_IS_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_CONFIG_TYPE)) typedef struct _FmConfig FmConfig; typedef struct _FmConfigClass FmConfigClass; #define FM_CONFIG_DEFAULT_SINGLE_CLICK FALSE #define FM_CONFIG_DEFAULT_MIDDLE_CLICK FALSE #define FM_CONFIG_DEFAULT_USE_TRASH TRUE #define FM_CONFIG_DEFAULT_CONFIRM_DEL TRUE #define FM_CONFIG_DEFAULT_CONFIRM_TRASH TRUE #define FM_CONFIG_DEFAULT_NO_USB_TRASH TRUE #define FM_CONFIG_DEFAULT_BIG_ICON_SIZE 48 #define FM_CONFIG_DEFAULT_SMALL_ICON_SIZE 16 #define FM_CONFIG_DEFAULT_PANE_ICON_SIZE 16 #define FM_CONFIG_DEFAULT_THUMBNAIL_SIZE 128 #define FM_CONFIG_DEFAULT_SHOW_THUMBNAIL TRUE #define FM_CONFIG_DEFAULT_THUMBNAIL_LOCAL TRUE #define FM_CONFIG_DEFAULT_THUMBNAIL_MAX 2048 #define FM_CONFIG_DEFAULT_FORCE_S_NOTIFY TRUE #define FM_CONFIG_DEFAULT_DATE_ISO_8601 FALSE #define FM_CONFIG_DEFAULT_BACKUP_HIDDEN TRUE #define FM_CONFIG_DEFAULT_NO_EXPAND_EMPTY FALSE #define FM_CONFIG_DEFAULT_SHOW_FULL_NAMES FALSE #define FM_CONFIG_DEFAULT_ONLY_USER_TEMPLATES FALSE #define FM_CONFIG_DEFAULT_TEMPLATE_RUN_APP FALSE #define FM_CONFIG_DEFAULT_TEMPL_TYPE_ONCE FALSE #define FM_CONFIG_DEFAULT_SHADOW_HIDDEN FALSE #define FM_CONFIG_DEFAULT_DEFER_CONTENT_TEST FALSE #define FM_CONFIG_DEFAULT_QUICK_EXEC FALSE #define FM_CONFIG_DEFAULT_SMART_DESKTOP_AUTODROP TRUE #define FM_CONFIG_DEFAULT_PLACES_HOME TRUE #define FM_CONFIG_DEFAULT_PLACES_DESKTOP TRUE #define FM_CONFIG_DEFAULT_PLACES_ROOT FALSE #define FM_CONFIG_DEFAULT_PLACES_COMPUTER FALSE #define FM_CONFIG_DEFAULT_PLACES_TRASH TRUE #define FM_CONFIG_DEFAULT_PLACES_APPLICATIONS TRUE #define FM_CONFIG_DEFAULT_PLACES_NETWORK FALSE #define FM_CONFIG_DEFAULT_PLACES_UNMOUNTED TRUE #define FM_CONFIG_DEFAULT_AUTO_SELECTION_DELAY 600 /* this enum is used by FmDndDest but we save it nicely in config so have it here */ /** * FmDndDestDropAction: * @FM_DND_DEST_DROP_AUTO: move if source and destination are on the same file system, copy otherwise * @FM_DND_DEST_DROP_COPY: copy * @FM_DND_DEST_DROP_MOVE: move * @FM_DND_DEST_DROP_ASK: open popup to let user select desired action * * selected behavior when files are dropped on destination widget. */ typedef enum { FM_DND_DEST_DROP_AUTO, FM_DND_DEST_DROP_COPY, FM_DND_DEST_DROP_MOVE, FM_DND_DEST_DROP_ASK } FmDndDestDropAction; /** * FmConfig: * @terminal: command line to launch terminal emulator * @archiver: desktop_id of the archiver used * @big_icon_size: size of big icons * @small_icon_size: size of small icons * @pane_icon_size: size of side pane icons * @thumbnail_size: size of thumbnail icons * @thumbnail_max: show thumbnails only for files not bigger than this, in KB or Kpix * @auto_selection_delay: (since 1.2.0) delay for autoselection in single-click mode, in ms * @drop_default_action: (since 1.2.0) default action on drop (see #FmDndDestDropAction) * @single_click: single click to open file * @middle_click: (since 1.4.0) middle click to open file * @use_trash: delete file to trash can * @confirm_del: ask before deleting files * @confirm_trash: (since 1.2.0) ask before moving files to trash can * @show_thumbnail: show thumbnails * @thumbnail_local: show thumbnails for local files only * @show_internal_volumes: show system internal volumes in side pane. (udisks-only) * @si_unit: use SI prefix for file sizes * @advanced_mode: enable advanced features for experienced user * @force_startup_notify: (since 1.0.1) use startup notify by default * @date_iso_8601: (since 1.4.0) show date in ISO 8601 format instead of current locale format * @backup_as_hidden: (since 1.0.1) treat backup files as hidden * @no_usb_trash: (since 1.0.1) don't create trash folder on removable media * @no_child_non_expandable: (since 1.0.1) hide expanders on empty folder * @show_full_names: (since 1.2.0) always show full names in Icon View mode * @shadow_hidden: (since 1.2.0) show icons of hidden files shadowed in the view * @places_home: (since 1.2.0) show 'Home' item in Places * @places_desktop: (since 1.2.0) show 'Desktop' item in Places * @places_applications: (since 1.2.0) show 'Applications' item in Places * @places_trash: (since 1.2.0) show 'Trash' item in Places * @places_root: (since 1.2.0) show '/' item in Places * @places_computer: (since 1.2.0) show 'My computer' item in Places * @places_network: (since 1.2.0) show 'Network' item in Places * @places_unmounted: (since 1.2.0) show unmounted internal volumes in Places * @only_user_templates: (since 1.2.0) show only user defined templates in 'Create...' menu * @template_run_app: (since 1.2.0) run default application after creation from template * @template_type_once: (since 1.2.0) use only one template of each MIME type * @defer_content_test: (since 1.2.0) defer test for content type on folder loading * @quick_exec: (since 1.2.0) don't ask user for action on executable launch * @modules_blacklist: (since 1.2.0) list of modules (mask in form "type:name") to never load * @modules_whitelist: (since 1.2.0) list of excemptions from @modules_blacklist * @list_view_size_units: (since 1.2.0) file size units in list view: h, k, M, G * @format_cmd: (since 1.2.0) command to format the volume (device will be added) * @smart_desktop_autodrop: (since 1.2.0) enable "smart shortcut" auto-action for ~/Desktop * @saved_search: (since 1.2.0) internal saved data of fm_launch_search_simple() */ struct _FmConfig { /*< private >*/ GObject parent; char *_cfg_name; /*< public >*/ char* terminal; char* archiver; gint big_icon_size; gint small_icon_size; gint pane_icon_size; gint thumbnail_size; gint thumbnail_max; gint auto_selection_delay; gint drop_default_action; gboolean single_click; gboolean use_trash; gboolean confirm_del; gboolean confirm_trash; gboolean show_thumbnail; gboolean thumbnail_local; gboolean show_internal_volumes; gboolean si_unit; gboolean advanced_mode; gboolean force_startup_notify; gboolean backup_as_hidden; gboolean no_usb_trash; gboolean no_child_non_expandable; gboolean show_full_names; gboolean shadow_hidden; gboolean places_home; gboolean places_desktop; gboolean places_applications; gboolean places_trash; gboolean places_root; gboolean places_computer; gboolean places_network; gboolean places_unmounted; gboolean only_user_templates; gboolean template_run_app; gboolean template_type_once; gboolean defer_content_test; gboolean quick_exec; gchar **modules_blacklist; gchar **modules_whitelist; /*< private >*/ gchar **system_modules_blacklist; /* concatenated from system, don't save! */ /*< public >*/ gchar *list_view_size_units; gchar *format_cmd; gboolean smart_desktop_autodrop; gchar *saved_search; union { gboolean date_iso_8601; gpointer _reserved1; /*< private >*/ }; union { gboolean middle_click; gpointer _reserved2; /*< private >*/ }; /*< private >*/ gpointer _reserved3; /* reserved space for updates until next ABI */ gpointer _reserved4; gpointer _reserved5; gpointer _reserved6; gpointer _reserved7; GFileMonitor *_cfg_mon; }; /** * FmConfigClass * @parent_class: the parent class * @changed: the class closure for the #FmConfig::changed signal */ struct _FmConfigClass { GObjectClass parent_class; void (*changed)(FmConfig* cfg); }; /* global config object */ extern FmConfig* fm_config; GType fm_config_get_type (void); FmConfig* fm_config_new (void); void fm_config_load_from_file(FmConfig* cfg, const char* name); void fm_config_load_from_key_file(FmConfig* cfg, GKeyFile* kf); void fm_config_save(FmConfig* cfg, const char* name); void fm_config_emit_changed(FmConfig* cfg, const char* changed_key); /* internal for libfm */ const char *_fm_config_get_name(FmConfig *cfg); G_END_DECLS #endif /* __FM_CONFIG_H__ */ libfm-1.4.0/src/base/fm-dummy-monitor.c000066400000000000000000000044531475513661000177100ustar00rootroot00000000000000/* * fm-dummy-monitor.c * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-dummy-monitor * @short_description: Replacement of #GFileMonitor for virtual filesystems. * @title: FmDummyMonitor * * @include: libfm/fm.h * * The #FmDummyMonitor represents dummy #GFileMonitor variant which does * not monitor any files but can be used as monitor object. */ #include "fm-dummy-monitor.h" //static void fm_dummy_monitor_finalize (GObject *object); G_DEFINE_TYPE(FmDummyMonitor, fm_dummy_monitor, G_TYPE_FILE_MONITOR); static gboolean cancel(GFileMonitor *monitor) { return TRUE; } static void fm_dummy_monitor_class_init(FmDummyMonitorClass *klass) { GFileMonitorClass* fm_class = G_FILE_MONITOR_CLASS(klass); fm_class->cancel = cancel; /* g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_dummy_monitor_finalize; */ } /* static void fm_dummy_monitor_finalize(GObject *object) { FmDummyMonitor *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DUMMY_MONITOR(object)); self = FM_DUMMY_MONITOR(object); G_OBJECT_CLASS(fm_dummy_monitor_parent_class)->finalize(object); } */ static void fm_dummy_monitor_init(FmDummyMonitor *self) { } /** * fm_dummy_monitor_new * * Creates a new dummy #GFileMonitor. * * Returns: a new dummy #GFileMonitor object. */ GFileMonitor *fm_dummy_monitor_new(void) { return (GFileMonitor*)g_object_new(FM_TYPE_DUMMY_MONITOR, NULL); } libfm-1.4.0/src/base/fm-dummy-monitor.h000066400000000000000000000035751475513661000177210ustar00rootroot00000000000000/* * fm-dummy-monitor.h * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_DUMMY_MONITOR_H__ #define __FM_DUMMY_MONITOR_H__ #include G_BEGIN_DECLS #define FM_TYPE_DUMMY_MONITOR (fm_dummy_monitor_get_type()) #define FM_DUMMY_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_DUMMY_MONITOR, FmDummyMonitor)) #define FM_DUMMY_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_DUMMY_MONITOR, FmDummyMonitorClass)) #define FM_IS_DUMMY_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_DUMMY_MONITOR)) #define FM_IS_DUMMY_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_DUMMY_MONITOR)) typedef struct _FmDummyMonitor FmDummyMonitor; typedef struct _FmDummyMonitorClass FmDummyMonitorClass; struct _FmDummyMonitor { GFileMonitor parent; }; struct _FmDummyMonitorClass { /*< private >*/ GFileMonitorClass parent_class; }; GType fm_dummy_monitor_get_type(void); GFileMonitor* fm_dummy_monitor_new(void); G_END_DECLS #endif /* __FM_DUMMY_MONITOR_H__ */ libfm-1.4.0/src/base/fm-file-info.c000066400000000000000000001642121475513661000167400ustar00rootroot00000000000000/* * fm-file-info.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2009 Juergen Hoetzel * Copyright 2017 Tsu Jan * Copyright 2012-2018 Andriy Grytsenko (LStranger) * Copyright 2019 Mahmoud Al-Qudsi * Copyright 2024 Ingo Brückl * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-file-info * @short_description: File information cache for libfm. * @title: FmFileInfo * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm-file-info.h" #include #include #include /* Query group name */ #include /* Query user name */ #include #include #include #include #include #include #include "fm-config.h" #include "fm-utils.h" /* support for libmenu-cache 0.4.x */ #ifndef MENU_CACHE_CHECK_VERSION # ifdef HAVE_MENU_CACHE_DIR_LIST_CHILDREN # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) (_a == 0 && _b < 5) /* < 0.5.0 */ # else # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) 0 /* not even 0.4.0 */ # endif #endif #define COLLATE_USING_DISPLAY_NAME ((char*)-1) static FmIcon* icon_locked_folder = NULL; /* all of the user special dirs are direct child of home directory */ static gboolean special_dirs_all_in_home = TRUE; typedef struct _SpecialDirInfo { const char* path_str; const char* base_name; const char* icon_name; }SpecialDirInfo; /* information of the user special dirs defined by xdg */ static SpecialDirInfo special_dir_info[G_USER_N_DIRECTORIES] = { {NULL, NULL, "user-desktop"}, {NULL, NULL, "folder-documents"}, {NULL, NULL, "folder-download"}, {NULL, NULL, "folder-music"}, {NULL, NULL, "folder-pictures"}, {NULL, NULL, "folder-publicshare"}, {NULL, NULL, "folder-templates"}, {NULL, NULL, "folder-videos"} }; struct _FmFileInfo { FmPath* path; /* path of the file */ mode_t mode; union { const char* fs_id; dev_t dev; }; uid_t uid; gid_t gid; goffset size; time_t mtime; time_t atime; time_t ctime; gulong blksize; goffset blocks; /* FIXME: caching the collate key can greatly speed up sorting. * However, memory usage is greatly increased!. * Is there a better alternative solution? */ char* collate_key; /* used to sort files by name */ char* collate_key_case; /* the same but case-sensitive */ char* disp_size; /* displayed human-readable file size */ char* disp_mtime; /* displayed last modification time */ char* disp_owner; char* disp_group; FmMimeType* mime_type; FmIcon* icon; char* target; /* target of shortcut or mountable. */ gboolean shortcut : 1; /* TRUE if file is shortcut type */ gboolean accessible : 1; /* TRUE if can be read by user */ gboolean hidden : 1; /* TRUE if file is hidden */ gboolean backup : 1; /* TRUE if file is backup */ gboolean name_is_changeable : 1; /* TRUE if name can be changed */ gboolean icon_is_changeable : 1; /* TRUE if icon can be changed */ gboolean hidden_is_changeable : 1; /* TRUE if hidden can be changed */ gboolean fs_is_ro : 1; /* TRUE if host FS is R/O */ /**/ int n_ref; }; struct _FmFileInfoList { FmList list; }; /* intialize the file info system */ void _fm_file_info_init(void) { const char* user_home = fm_get_home_dir(); int home_dir_len = strlen(user_home); int i; icon_locked_folder = fm_icon_from_name("folder-locked"); for(i = 0; i < G_USER_N_DIRECTORIES; ++i) { /* get information of every special dir */ const char* path_str = g_get_user_special_dir(i); const char* base_name = NULL; if(path_str) { /* FIXME: will someone put / at the end of the path? */ base_name = strrchr(path_str, '/'); /* find the last '/' in dir path */ if(base_name) { int prefix_len = (base_name - path_str); /* check if the special dir has home dir prefix */ if(prefix_len != home_dir_len || strncmp(path_str, user_home, home_dir_len)) special_dirs_all_in_home = FALSE; /* not all of the special dirs are in home dir */ ++base_name; /* skip separator */ special_dir_info[i].base_name = base_name; } special_dir_info[i].path_str = path_str; } } } void _fm_file_info_finalize() { g_object_unref(icon_locked_folder); } /** * fm_file_info_new: * * Returns: a new FmFileInfo struct which needs to be freed with * fm_file_info_unref() when it's no more needed. */ FmFileInfo* fm_file_info_new () { FmFileInfo * fi = g_slice_new0(FmFileInfo); fi->n_ref = 1; return fi; } /** * _fm_file_info_set_emblems: * @fi: A FmFileInfo struct * @inf: A GFileInfo object * * Read icon emblems metadata from the "metadata::emblems" attribute of * a GFileInfo object and make the GIcon store in the FmFileInfo a * GEmblemedIcon object if the file has emblems. */ static void _fm_file_info_set_emblems(FmFileInfo* fi, GFileInfo* inf) { char** emblem_names = g_file_info_get_attribute_stringv(inf, "metadata::emblems"); if(emblem_names) { GIcon* gicon = g_emblemed_icon_new(G_ICON(fi->icon), NULL); char** emblem_name; for(emblem_name = emblem_names; *emblem_name; ++emblem_name) { GIcon* emblem_icon = g_themed_icon_new(*emblem_name); GEmblem* emblem = g_emblem_new(emblem_icon); g_object_unref(emblem_icon); g_emblemed_icon_add_emblem(G_EMBLEMED_ICON(gicon), emblem); g_object_unref(emblem); } /* replace the original GIcon with an GEmblemedIcon */ g_object_unref(fi->icon); fi->icon = fm_icon_from_gicon(gicon); g_object_unref(gicon); } } /** * fm_file_info_set_from_native_file: * @fi: A FmFileInfo struct * @path: full path of the file * @err: a GError** to retrive errors * * Get file info of the specified native file and store it in * the FmFileInfo struct. * * Prior to calling this function, the FmPath of FmFileInfo should * have been set with fm_file_info_set_path(). * * Note that this call does I/O and therefore can block. * * Returns: TRUE if no error happens. */ gboolean _fm_file_info_set_from_native_file(FmFileInfo* fi, const char* path, GError** err, gboolean get_fast) { struct stat st; char *dname; g_return_val_if_fail(fi && fi->path, FALSE); if(lstat(path, &st) == 0) { GFile* gfile; GFileInfo* inf; fi->mode = st.st_mode; fi->mtime = st.st_mtime; fi->atime = st.st_atime; fi->ctime = st.st_ctime; fi->size = st.st_size; fi->dev = st.st_dev; fi->uid = st.st_uid; fi->gid = st.st_gid; /* handle symlinks: use target to retrieve its info */ if(S_ISLNK(st.st_mode)) { if (stat(path, &st) < 0) { /* g_debug("invalid symlink: %s", strerror(errno)); */ fi->icon = fm_icon_from_name("dialog-warning"); /* we cannot test broken symlink so skip all tests */ get_fast = TRUE; } fi->target = g_file_read_link(path, NULL); } /* files with . prefix or ~ suffix are regarded as hidden files. * dirs with . prefix are regarded as hidden dirs. */ dname = (char*)fm_path_get_basename(fi->path); fi->hidden = (dname[0] == '.'); fi->backup = (!S_ISDIR(st.st_mode) && g_str_has_suffix(dname, "~")); dname = NULL; if (get_fast && S_ISREG(st.st_mode)) /* do rough estimation */ { /* for non-regular files fm_mime_type_from_native_file() is fast */ if ((st.st_mode & S_IXUSR) == S_IXUSR) /* executable */ fi->mime_type = fm_mime_type_from_name("application/x-executable"); else fi->mime_type = fm_mime_type_from_file_name(fm_path_get_basename(fi->path)); } else { fi->mime_type = fm_mime_type_from_native_file(path, fm_path_get_basename(fi->path), &st); if (G_UNLIKELY(fi->mime_type == NULL)) /* file might be deleted while we test it but we assume mime_type is not NULL */ fi->mime_type = fm_mime_type_from_name("application/octet-stream"); } if (get_fast) /* do rough estimation */ fi->accessible = ((st.st_mode & S_IRUSR) == S_IRUSR); else fi->accessible = (g_access(path, R_OK) == 0); /* special handling for desktop entry files */ if(G_UNLIKELY(!get_fast && fm_file_info_is_desktop_entry(fi))) { GKeyFile* kf = g_key_file_new(); FmIcon* icon = NULL; char* icon_name; char* type; if(g_key_file_load_from_file(kf, path, 0, NULL)) { /* check if type is correct and supported */ type = g_key_file_get_string(kf, "Desktop Entry", "Type", NULL); if(type) { /* g_debug("got desktop entry with type %s", type); */ if(strcmp(type, G_KEY_FILE_DESKTOP_TYPE_LINK) == 0) { char *uri = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_URL, NULL); /* handle Type=Link, those are shortcuts therefore set ->shortcut, ->target, ->mime_type */ if (uri) { FmMimeType *new_mime_type = fm_mime_type_from_file_name(uri); /* g_debug("got type %s for URL %s", fm_mime_type_get_type(new_mime_type), uri); */ if (strcmp(fm_mime_type_get_type(new_mime_type), "application/octet-stream") == 0 || /* actually remote links should never be directories so let treat them as unknown */ (new_mime_type == _fm_mime_type_get_inode_directory() && !g_str_has_prefix(uri, "file:/"))) { /* NOTE: earlier we classified all links to desktop entry as inode/x-shortcut too but that would require a lot of special support therefore we set to inode/x-shortcut only those shortcuts that we fail to determine */ fm_mime_type_unref(new_mime_type); new_mime_type = fm_mime_type_ref(_fm_mime_type_get_inode_x_shortcut()); } fm_mime_type_unref(fi->mime_type); fi->mime_type = new_mime_type; fi->shortcut = TRUE; fi->target = uri; } else { /* otherwise it's error, Link should have URL */ g_free(type); goto _not_desktop_entry; } } /* FIXME: fail if Type isn't Application or Directory */ g_free(type); } else goto _not_desktop_entry; icon_name = g_key_file_get_string(kf, "Desktop Entry", "Icon", NULL); if(icon_name) { icon = fm_icon_from_name(icon_name); g_free(icon_name); } /* Use title of the desktop entry for display */ dname = g_key_file_get_locale_string(kf, "Desktop Entry", "Name", NULL, NULL); /* handle 'Hidden' key to set hidden attribute */ if (!fi->hidden) fi->hidden = g_key_file_get_boolean(kf, "Desktop Entry", "Hidden", NULL); } else { /* otherwise it's error so treat the file as simple text */ _not_desktop_entry: fm_mime_type_unref(fi->mime_type); fi->mime_type = fm_mime_type_from_name("text/plain"); } if(icon) fi->icon = icon; else fi->icon = g_object_ref(fm_mime_type_get_icon(fi->mime_type)); g_key_file_free(kf); } else if(!S_ISDIR(st.st_mode)) ; /* set "locked" icon on unaccesible folder */ else if(!fi->accessible) fi->icon = g_object_ref(icon_locked_folder); else if(!get_fast && S_ISDIR(st.st_mode)) /* special handling for folder icons */ { FmPath* fmpath = fi->path; if(fm_path_equal(fmpath, fm_path_get_home())) /* this file is the home dir */ fi->icon = fm_icon_from_name("user-home"); else { FmPath* parent_path = fm_path_get_parent(fmpath); SpecialDirInfo* si; int i; if(special_dirs_all_in_home) { /* pcman: This is a little trick for optimization. * In most normal cases, all of the special folders are * by default the direct child of user home dir, * If this is the case, we can skip the check if our file * is not in home dir since it's impossible for it to be * a special dir. * Without this trick, we do all the strcmp() calls * for every single file found in the dir, which is expansive. * With this trck, we only do this if we're in the home dir. */ if(fm_path_equal(parent_path, fm_path_get_home())) { /* special dirs are all in home dir and we're in home dir, too */ const char* base_name = fm_path_get_basename(fmpath); for(i = 0; i < G_USER_N_DIRECTORIES; ++i) { si = &special_dir_info[i]; if(si->base_name && strcmp(si->base_name, base_name) == 0) { fi->icon = fm_icon_from_name(si->icon_name); break; } } } /* if all special dirs are in home dir and this file is not, it can't be a special folder */ } else { const char* base_name = fm_path_get_basename(fmpath); for(i = 0; i < G_USER_N_DIRECTORIES; ++i) { si = &special_dir_info[i]; /* compare base name first, and then prefix if needed. */ if(si->base_name && strcmp(si->base_name, base_name) == 0 && strncmp(si->path_str, path, (si->base_name - si->path_str)) == 0) { fi->icon = fm_icon_from_name(si->icon_name); break; } } } } } if(!fi->icon) fi->icon = g_object_ref(fm_mime_type_get_icon(fi->mime_type)); gfile = g_file_new_for_path(path); /* get emblems using gio/gvfs-metadata */ inf = g_file_query_info(gfile, "metadata::emblems,standard::icon", G_FILE_QUERY_INFO_NONE, NULL, NULL); if(inf) { _fm_file_info_set_emblems(fi, inf); g_object_unref(inf); } if (!dname) dname = g_filename_display_basename(path); _fm_path_set_display_name(fi->path, dname); g_free(dname); /* check if directory's file system is read-only, default is FALSE */ fi->fs_is_ro = FALSE; if (S_ISDIR(st.st_mode)) { inf = g_file_query_filesystem_info(gfile, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, NULL, NULL); if (inf) { fi->fs_is_ro = g_file_info_get_attribute_boolean(inf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY); g_object_unref(inf); } } g_object_unref(gfile); } else { g_set_error(err, G_IO_ERROR, g_io_error_from_errno(errno), "%s: %s", path, g_strerror(errno)); return FALSE; } /* name is changeable for native files */ fi->name_is_changeable = TRUE; /* hidden attribute is immutable for native files */ fi->hidden_is_changeable = FALSE; /* we can change icon only for accessible desktop entry */ fi->icon_is_changeable = fm_file_info_is_desktop_entry(fi); /* FIXME: add support for icon change on directories too */ return TRUE; } gboolean fm_file_info_set_from_native_file(FmFileInfo* fi, const char* path, GError** err) { return _fm_file_info_set_from_native_file(fi, path, err, FALSE); } /** * fm_file_info_new_from_native_file * @path: (allow-none): path descriptor * @path_str: full path to the file * @err: (allow-none) (out): pointer to receive error * * Create a new #FmFileInfo for file pointed by @path. Returned data * should be freed with fm_file_info_unref() after usage. * * Returns: (transfer full): new file info or %NULL in case of error. * * Since: 1.2.0 */ FmFileInfo *fm_file_info_new_from_native_file(FmPath *path, const char *path_str, GError **err) { FmFileInfo* fi = fm_file_info_new(); if (path) fi->path = fm_path_ref(path); else fi->path = fm_path_new_for_path(path_str); if (_fm_file_info_set_from_native_file(fi, path_str, err, TRUE)) return fi; fm_file_info_unref(fi); return NULL; } /** * fm_file_info_set_from_gfileinfo: * @fi: A FmFileInfo struct * @inf: a GFileInfo object * * Get file info from the GFileInfo object and store it in * the FmFileInfo struct. * * Deprecated: 1.2.0: Use fm_file_info_set_from_g_file_data() instead. */ void fm_file_info_set_from_gfileinfo(FmFileInfo* fi, GFileInfo* inf) { fm_file_info_set_from_g_file_data(fi, NULL, inf); } /** * fm_file_info_set_from_g_file_data * @fi: a #FmFileInfo struct to update * @gf: (allow-none): a #GFile object to inspect * @inf: a #GFileInfo object to inspect * * Get file info from the #GFile and #GFileInfo objects and sets data in * the #FmFileInfo struct appropriately. * * Since: 1.2.0 */ void fm_file_info_set_from_g_file_data(FmFileInfo *fi, GFile *gf, GFileInfo *inf) { const char *tmp, *uri; GIcon* gicon; GFile *_gf = NULL; GFileAttributeInfoList *list; GFileType type; g_return_if_fail(fi->path); tmp = g_file_info_get_edit_name(inf); if (!tmp || strcmp(tmp, "/") == 0) tmp = g_file_info_get_display_name(inf); _fm_path_set_display_name(fi->path, tmp); fi->size = g_file_info_get_size(inf); tmp = g_file_info_get_content_type(inf); if(tmp) fi->mime_type = fm_mime_type_from_name(tmp); fi->mode = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_MODE); fi->uid = fi->gid = -1; if(g_file_info_has_attribute(inf, G_FILE_ATTRIBUTE_UNIX_UID)) fi->uid = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_UID); if(g_file_info_has_attribute(inf, G_FILE_ATTRIBUTE_UNIX_GID)) fi->gid = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_GID); type = g_file_info_get_file_type(inf); if(0 == fi->mode) /* if UNIX file mode is not available, compose a fake one. */ { switch(type) { case G_FILE_TYPE_REGULAR: fi->mode |= S_IFREG; break; case G_FILE_TYPE_DIRECTORY: fi->mode |= S_IFDIR; break; case G_FILE_TYPE_SYMBOLIC_LINK: fi->mode |= S_IFLNK; break; case G_FILE_TYPE_SHORTCUT: break; case G_FILE_TYPE_MOUNTABLE: break; case G_FILE_TYPE_SPECIAL: if(fi->mode) break; /* if it's a special file but it doesn't have UNIX mode, compose a fake one. */ if(strcmp(tmp, "inode/chardevice")==0) fi->mode |= S_IFCHR; else if(strcmp(tmp, "inode/blockdevice")==0) fi->mode |= S_IFBLK; else if(strcmp(tmp, "inode/fifo")==0) fi->mode |= S_IFIFO; #ifdef S_IFSOCK else if(strcmp(tmp, "inode/socket")==0) fi->mode |= S_IFSOCK; #endif break; case G_FILE_TYPE_UNKNOWN: ; } } if(g_file_info_has_attribute(inf, G_FILE_ATTRIBUTE_ACCESS_CAN_READ)) fi->accessible = g_file_info_get_attribute_boolean(inf, G_FILE_ATTRIBUTE_ACCESS_CAN_READ); else /* assume it's accessible */ fi->accessible = TRUE; /* special handling for symlinks */ if (g_file_info_get_is_symlink(inf)) { fi->mode &= ~S_IFMT; /* reset type */ fi->mode |= S_IFLNK; /* set type to symlink */ goto _file_is_symlink; } switch(type) { case G_FILE_TYPE_SHORTCUT: fi->shortcut = TRUE; case G_FILE_TYPE_MOUNTABLE: uri = g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI); if(uri) { if(g_str_has_prefix(uri, "file:///")) fi->target = g_filename_from_uri(uri, NULL, NULL); else fi->target = g_strdup(uri); if(!fi->mime_type) fi->mime_type = fm_mime_type_from_file_name(fi->target); } /* if the mime-type is not determined or is unknown */ if(G_UNLIKELY(!fi->mime_type || g_content_type_is_unknown(fm_mime_type_get_type(fi->mime_type)))) { /* FIXME: is this appropriate? */ if(type == G_FILE_TYPE_SHORTCUT) fi->mime_type = fm_mime_type_ref(_fm_mime_type_get_inode_x_shortcut()); else fi->mime_type = fm_mime_type_ref(_fm_mime_type_get_inode_mount_point()); } break; case G_FILE_TYPE_DIRECTORY: if(!fi->mime_type) fi->mime_type = fm_mime_type_ref(_fm_mime_type_get_inode_directory()); fi->fs_is_ro = FALSE; /* default is R/W */ if (g_file_info_has_attribute(inf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY)) fi->fs_is_ro = g_file_info_get_attribute_boolean(inf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY); break; case G_FILE_TYPE_SYMBOLIC_LINK: _file_is_symlink: uri = g_file_info_get_symlink_target(inf); if(uri) { if(g_str_has_prefix(uri, "file:///")) fi->target = g_filename_from_uri(uri, NULL, NULL); else fi->target = g_strdup(uri); if(!fi->mime_type) fi->mime_type = fm_mime_type_from_file_name(fi->target); } /* continue with absent mime type */ default: /* G_FILE_TYPE_UNKNOWN G_FILE_TYPE_REGULAR G_FILE_TYPE_SPECIAL */ if(G_UNLIKELY(!fi->mime_type)) { uri = g_file_info_get_name(inf); fi->mime_type = fm_mime_type_from_file_name(uri); } } /* try file-specific icon first */ gicon = g_file_info_get_icon(inf); if(gicon) fi->icon = fm_icon_from_gicon(gicon); /* g_object_unref(gicon); this is not needed since * g_file_info_get_icon didn't increase ref_count. * the object returned by g_file_info_get_icon is * owned by GFileInfo. */ /* set "locked" icon on unaccesible folder */ else if(!fi->accessible && type == G_FILE_TYPE_DIRECTORY) fi->icon = g_object_ref(icon_locked_folder); else fi->icon = g_object_ref(fm_mime_type_get_icon(fi->mime_type)); /* if the file has emblems, add them to the icon */ _fm_file_info_set_emblems(fi, inf); if(fm_path_is_native(fi->path)) { fi->dev = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_DEVICE); } else { tmp = g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_ID_FILESYSTEM); fi->fs_id = g_intern_string(tmp); } fi->mtime = g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_TIME_MODIFIED); fi->atime = g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_TIME_ACCESS); fi->ctime = g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_TIME_CHANGED); fi->hidden = g_file_info_get_is_hidden(inf); fi->backup = g_file_info_get_is_backup(inf); fi->name_is_changeable = TRUE; /* GVFS tends to ignore this attribute */ fi->icon_is_changeable = fi->hidden_is_changeable = FALSE; if (g_file_info_has_attribute(inf, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME)) fi->name_is_changeable = g_file_info_get_attribute_boolean(inf, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME); if (G_UNLIKELY(gf == NULL)) gf = _gf = fm_path_to_gfile(fi->path); list = g_file_query_settable_attributes(gf, NULL, NULL); if (G_LIKELY(list)) { if (g_file_attribute_info_list_lookup(list, G_FILE_ATTRIBUTE_STANDARD_ICON)) fi->icon_is_changeable = TRUE; if (g_file_attribute_info_list_lookup(list, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN)) fi->hidden_is_changeable = TRUE; g_file_attribute_info_list_unref(list); } if (G_UNLIKELY(_gf)) g_object_unref(_gf); } /** * fm_file_info_new_from_gfileinfo: * @path: FmPath of a file * @inf: a GFileInfo object * * Create a new FmFileInfo for file pointed by @path based on * information stored in the GFileInfo object. * * Returns: A new FmFileInfo struct which should be freed with * fm_file_info_unref() when no longer needed. * * Deprecated: 1.2.0: Use fm_file_info_new_from_g_file_data() instead. */ FmFileInfo* fm_file_info_new_from_gfileinfo(FmPath* path, GFileInfo* inf) { GFile *gf = fm_path_to_gfile(path); FmFileInfo *fi; fi = fm_file_info_new_from_g_file_data(gf, inf, path); g_object_unref(gf); return fi; } /** * fm_file_info_new_from_g_file_data * @gf: a #GFile of a file * @inf: a #GFileInfo object * @path: (allow-none): a #FmPath of a file * * Creates a new #FmFileInfo for file pointed by @path and @gf based on * information stored in the @inf. Returned data should be freed with * fm_file_info_unref() when no longer needed. * * Returns: (transfer full): a new #FmFileInfo struct. * * Since: 1.2.0 */ FmFileInfo* fm_file_info_new_from_g_file_data(GFile *gf, GFileInfo *inf, FmPath *path) { FmFileInfo* fi = fm_file_info_new(); if (path) fi->path = fm_path_ref(path); else fi->path = fm_path_new_for_gfile(gf); fm_file_info_set_from_g_file_data(fi, gf, inf); return fi; } /** * fm_file_info_set_from_menu_cache_item * @fi: a file info to update * @item: a menu cache item * * Deprecated: 1.2.0: */ void fm_file_info_set_from_menu_cache_item(FmFileInfo* fi, MenuCacheItem* item) { const char* icon_name; icon_name = menu_cache_item_get_icon(item); _fm_path_set_display_name(fi->path, menu_cache_item_get_name(item)); if(icon_name) { fi->icon = fm_icon_from_name(icon_name); } if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) { fi->mode = S_IFDIR; fi->mime_type = fm_mime_type_ref(_fm_mime_type_get_inode_directory()); #if MENU_CACHE_CHECK_VERSION(0, 5, 0) fi->hidden = !menu_cache_dir_is_visible(MENU_CACHE_DIR(item)); #endif } else if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { fi->target = menu_cache_item_get_file_path(item); fi->mime_type = fm_mime_type_ref(_fm_mime_type_get_application_x_desktop()); fi->hidden = !menu_cache_app_get_is_visible(MENU_CACHE_APP(item), (guint32)-1); fi->hidden_is_changeable = TRUE; fi->shortcut = TRUE; } else /* nothing to set if separator */ return; fi->accessible = TRUE; fi->name_is_changeable = TRUE; fi->icon_is_changeable = TRUE; } /** * fm_file_info_new_from_menu_cache_item * @path: a file path * @item: a menu cache item * * Creates a new #FmFileInfo for a file by @path and fills it with info * from a menu cache @item. Returned data should be freed with * fm_file_info_unref() when no longer needed. * * Returns: (transfer full): a new #FmFileInfo struct. * * Since: 0.1.1 */ FmFileInfo* fm_file_info_new_from_menu_cache_item(FmPath* path, MenuCacheItem* item) { FmFileInfo* fi = fm_file_info_new(); fi->path = fm_path_ref(path); fm_file_info_set_from_menu_cache_item(fi, item); return fi; } static void fm_file_info_clear(FmFileInfo* fi) { if(fi->collate_key) { if(fi->collate_key != COLLATE_USING_DISPLAY_NAME) g_free(fi->collate_key); fi->collate_key = NULL; } if(fi->collate_key_case) { if(fi->collate_key_case != COLLATE_USING_DISPLAY_NAME) g_free(fi->collate_key_case); fi->collate_key_case = NULL; } if(G_LIKELY(fi->path)) { fm_path_unref(fi->path); fi->path = NULL; } if(G_LIKELY(fi->disp_size)) { g_free(fi->disp_size); fi->disp_size = NULL; } if(G_UNLIKELY(fi->disp_mtime)) { g_free(fi->disp_mtime); fi->disp_mtime = NULL; } g_free(fi->disp_owner); fi->disp_owner = NULL; g_free(fi->disp_group); fi->disp_group = NULL; if(G_UNLIKELY(fi->target)) { g_free(fi->target); fi->target = NULL; } if(G_LIKELY(fi->mime_type)) { fm_mime_type_unref(fi->mime_type); fi->mime_type = NULL; } if(G_LIKELY(fi->icon)) { g_object_unref(fi->icon); fi->icon = NULL; } } /** * fm_file_info_ref: * @fi: A FmFileInfo struct * * Increase reference count of the FmFileInfo struct. * * Returns: the FmFileInfo struct itself */ FmFileInfo* fm_file_info_ref(FmFileInfo* fi) { g_return_val_if_fail(fi != NULL, NULL); g_atomic_int_inc(&fi->n_ref); return fi; } /** * fm_file_info_unref: * @fi: A FmFileInfo struct * * Decrease reference count of the FmFileInfo struct. * When the last reference to the struct is released, * the FmFileInfo struct is freed. */ void fm_file_info_unref(FmFileInfo* fi) { g_return_if_fail(fi != NULL); /* g_debug("unref file info: %d", fi->n_ref); */ if (g_atomic_int_dec_and_test(&fi->n_ref)) { fm_file_info_clear(fi); g_slice_free(FmFileInfo, fi); } } /** * fm_file_info_update: * @fi: A FmFileInfo struct * @src: another FmFileInfo struct * * This API is not thread-safe and should be used only in default context. * * Update the content of @fi by copying file info * stored in @src to @fi. */ void fm_file_info_update(FmFileInfo* fi, FmFileInfo* src) { FmPath* tmp_path = fm_path_ref(src->path); FmMimeType* tmp_type = fm_mime_type_ref(src->mime_type); FmIcon* tmp_icon = g_object_ref(src->icon); /* NOTE: we need to ref source first. Otherwise, * if path, mime_type, and icon are identical in src * and fi, calling fm_file_info_clear() first on fi * might unref that. */ fm_file_info_clear(fi); fi->path = tmp_path; fi->mime_type = tmp_type; fi->icon = tmp_icon; fi->mode = src->mode; if(fm_path_is_native(fi->path)) fi->dev = src->dev; else fi->fs_id = src->fs_id; fi->uid = src->uid; fi->gid = src->gid; fi->size = src->size; fi->mtime = src->mtime; fi->atime = src->atime; fi->ctime = src->ctime; fi->blksize = src->blksize; fi->blocks = src->blocks; if(src->collate_key == COLLATE_USING_DISPLAY_NAME) fi->collate_key = COLLATE_USING_DISPLAY_NAME; else fi->collate_key = g_strdup(src->collate_key); if(src->collate_key_case == COLLATE_USING_DISPLAY_NAME) fi->collate_key_case = COLLATE_USING_DISPLAY_NAME; else fi->collate_key_case = g_strdup(src->collate_key_case); fi->disp_size = g_strdup(src->disp_size); fi->disp_mtime = g_strdup(src->disp_mtime); fi->disp_owner = g_strdup(src->disp_owner); fi->disp_group = g_strdup(src->disp_group); fi->target = g_strdup(src->target); fi->accessible = src->accessible; fi->hidden = src->hidden; fi->backup = src->backup; fi->name_is_changeable = src->name_is_changeable; fi->icon_is_changeable = src->icon_is_changeable; fi->hidden_is_changeable = src->hidden_is_changeable; fi->shortcut = src->shortcut; fi->fs_is_ro = src->fs_is_ro; } /** * fm_file_info_get_icon: * @fi: A FmFileInfo struct * * Get the icon used to show the file in the file manager. * * This API is not thread-safe and should be used only in default context. * * Returns: a FmIcon struct. The returned FmIcon struct is * owned by FmFileInfo and should not be freed. * If you need to keep it, use g_object_ref() to obtain a * reference. */ FmIcon* fm_file_info_get_icon(FmFileInfo* fi) { return fi->icon; } /** * fm_file_info_get_path: * @fi: A FmFileInfo struct * * Get the path of the file * * Returns: a FmPath struct. The returned FmPath struct is * owned by FmFileInfo and should not be freed. * If you need to keep it, use fm_path_ref() to obtain a * reference. */ FmPath* fm_file_info_get_path(FmFileInfo* fi) { return fi->path; } /** * fm_file_info_get_name: * @fi: A FmFileInfo struct * * Get the base name of the file in filesystem encoding. * * Returns: a const string owned by FmFileInfo which should * not be freed. */ const char* fm_file_info_get_name(FmFileInfo* fi) { return fm_path_get_basename(fi->path); } /** * fm_file_info_get_disp_name: * @fi: A FmFileInfo struct * * Get the display name used to show the file in the file * manager UI. The display name is guaranteed to be UTF-8 * and may be different from the real file name on the * filesystem. * * This API is not thread-safe and should be used only in default context. * * Returns: a const strin owned by FmFileInfo which should * not be freed. */ const char* fm_file_info_get_disp_name(FmFileInfo* fi) { const char *disp_name = _fm_path_get_display_name(fi->path); /* return basename if FmFileInfo is incomplete yet. it is a failure. */ g_return_val_if_fail(disp_name != NULL, fm_path_get_basename(fi->path)); return disp_name; } /** * fm_file_info_set_path: * @fi: A FmFileInfo struct * @path: a FmPath struct * * This API is not thread-safe and should be used only in default context. * * Change the path of the FmFileInfo. */ void fm_file_info_set_path(FmFileInfo* fi, FmPath* path) { if(fi->path) fm_path_unref(fi->path); if(path) fi->path = fm_path_ref(path); else fi->path = NULL; } /** * fm_file_info_set_disp_name: * @fi: A FmFileInfo struct * @name: A UTF-8 display name. (can be NULL). * * Set the display name used to show the file in the * file manager UI. If NULL is passed for @name, * the original display will be freed and the real base name * will be used for display. */ /* if disp name is set to NULL, we use the real filename for display. */ void fm_file_info_set_disp_name(FmFileInfo* fi, const char* name) { _fm_path_set_display_name(fi->path, name); /* reset collate keys */ if(fi->collate_key) { if(fi->collate_key != COLLATE_USING_DISPLAY_NAME) g_free(fi->collate_key); fi->collate_key = NULL; } if(fi->collate_key_case) { if(fi->collate_key_case != COLLATE_USING_DISPLAY_NAME) g_free(fi->collate_key_case); fi->collate_key_case = NULL; } } /** * fm_file_info_set_icon * @fi: a #FmFileInfo * @icon: an icon to update * * Updates the icon used to show the file in the file manager UI. * * Since: 1.2.0 */ void fm_file_info_set_icon(FmFileInfo *fi, GIcon *icon) { FmIcon *fm_icon = fm_icon_from_gicon(icon); if (fi->icon) g_object_unref(fi->icon); fi->icon = fm_icon; } /** * fm_file_info_get_size: * @fi: A FmFileInfo struct * * Returns: the size of the file in bytes. */ goffset fm_file_info_get_size(FmFileInfo* fi) { return fi->size; } /** * fm_file_info_get_disp_size: * @fi: A FmFileInfo struct * * Get the size of the file as a human-readable string. * It's convinient for show the file size to the user. * * This API is not thread-safe and should be used only in default context. * * Returns: a const string owned by FmFileInfo which should * not be freed. (non-NULL) */ const char* fm_file_info_get_disp_size(FmFileInfo* fi) { if (G_UNLIKELY(!fi->disp_size)) { if(S_ISREG(fi->mode)) { char buf[ 64 ]; fm_file_size_to_str2(buf, sizeof(buf), fi->size, fm_config->list_view_size_units ? fm_config->list_view_size_units[0] : 0); fi->disp_size = g_strdup(buf); } } return fi->disp_size; } /** * fm_file_info_get_blocks * @fi: A FmFileInfo struct * * Returns: how many filesystem blocks used by the file. */ goffset fm_file_info_get_blocks(FmFileInfo* fi) { return fi->blocks; } /** * fm_file_info_get_mime_type: * @fi: A FmFileInfo struct * * Get the mime-type of the file. * * This API is not thread-safe and should be used only in default context. * * Returns: a FmMimeType struct owned by FmFileInfo which * should not be freed. * If you need to keep it, use fm_mime_type_ref() to obtain a * reference. */ FmMimeType* fm_file_info_get_mime_type(FmFileInfo* fi) { return fi->mime_type; } /** * fm_file_info_get_mode: * @fi: A FmFileInfo struct * * Get the mode of the file. For detail about the meaning of * mode, see manpage of stat() and the st_mode struct field. * * Returns: mode_t value of the file as defined in POSIX struct stat. */ mode_t fm_file_info_get_mode(FmFileInfo* fi) { return fi->mode; } /** * fm_file_info_get_is_native: * @fi: A FmFileInfo struct * * Check if the file is a native UNIX file. * * Returns: TRUE for native UNIX files, FALSE for * remote filesystems or other URIs, such as * trahs:///, computer:///, ...etc. */ gboolean fm_file_info_is_native(FmFileInfo* fi) { return fm_path_is_native(fi->path); } /** * fm_file_info_get_is_dir: * @fi: A FmFileInfo struct * * Returns: TRUE if the file is a directory. */ gboolean fm_file_info_is_dir(FmFileInfo* fi) { return (S_ISDIR(fi->mode) || (fi->mime_type == _fm_mime_type_get_inode_directory())); } /** * fm_file_info_get_is_symlink: * @fi: A FmFileInfo struct * * Check if the file is a symlink. Note that for symlinks, * all infos stored in FmFileInfo are actually the info of * their targets. * The only two places you can tell that is a symlink are: * 1. fm_file_info_get_is_symlink() * 2. fm_file_info_get_target() which returns the target * of the symlink. * * Returns: TRUE if the file is a symlink */ gboolean fm_file_info_is_symlink(FmFileInfo* fi) { return S_ISLNK(fi->mode) ? TRUE : FALSE; } /** * fm_file_info_get_is_shortcut: * @fi: A FmFileInfo struct * * Returns: TRUE if the file is a shortcut. * For a shortcut, read the value of fm_file_info_get_target() * to get the destination the shortut points to. * An example of shortcut type FmFileInfo is file info of * files in menu://applications/ */ gboolean fm_file_info_is_shortcut(FmFileInfo* fi) { return fi->shortcut; } /** * fm_file_info_is_mountable * @fi: file info to inspect * * Checks if @fi is "inode/mount-point" type. * * Returns: %TRUE if @fi is mountable type. */ gboolean fm_file_info_is_mountable(FmFileInfo* fi) { return fi->mime_type == _fm_mime_type_get_inode_mount_point(); } /** * fm_file_info_get_is_image: * @fi: A FmFileInfo struct * * This API is not thread-safe and should be used only in default context. * * Returns: TRUE if the file is a image file (*.jpg, *.png, ...). */ gboolean fm_file_info_is_image(FmFileInfo* fi) { /* FIXME: We had better use functions of xdg_mime to check this */ if (!strncmp("image/", fm_mime_type_get_type(fi->mime_type), 6)) return TRUE; return FALSE; } /** * fm_file_info_get_is_text: * @fi: A FmFileInfo struct * * This API is not thread-safe and should be used only in default context. * * Returns: TRUE if the file is a plain text file. */ gboolean fm_file_info_is_text(FmFileInfo* fi) { if(g_content_type_is_a(fm_mime_type_get_type(fi->mime_type), "text/plain")) return TRUE; return FALSE; } /** * fm_file_info_get_is_desktop_entry: * @fi: A FmFileInfo struct * * Returns: TRUE if the file is a desktop entry file. */ gboolean fm_file_info_is_desktop_entry(FmFileInfo* fi) { return fi->mime_type == _fm_mime_type_get_application_x_desktop(); } /** * fm_file_info_get_is_unknown_type: * @fi: A FmFileInfo struct * * This API is not thread-safe and should be used only in default context. * * Returns: TRUE if the mime type of the file cannot be * recognized. */ gboolean fm_file_info_is_unknown_type(FmFileInfo* fi) { return g_content_type_is_unknown(fm_mime_type_get_type(fi->mime_type)); } /** * fm_file_info_get_is_executable_type: * @fi: A FmFileInfo struct * * Note that the function only check if the file seems * to be an executable file. It does not check if the * user really has the permission to execute the file or * if the executable bit of the file is set. * To check if a file is really executable by the current * user, you may need to call POSIX access() or euidaccess(). * * This API is not thread-safe and should be used only in default context. * * Returns: TRUE if the file is a kind of executable file, * such as shell script, python script, perl script, or * binary executable file. */ /* full path of the file is required by this function */ gboolean fm_file_info_is_executable_type(FmFileInfo* fi) { const char* type = fm_mime_type_get_type(fi->mime_type); if(strncmp(type, "text/", 5) == 0) { /* g_content_type_can_be_executable reports text files as executables too */ /* We don't execute remote files nor files in trash */ if(fm_path_is_native(fi->path) && (fi->mode & (S_IXOTH|S_IXGRP|S_IXUSR))) { /* it has executable bits so lets check shell-bang */ char *path = fm_path_to_str(fi->path); int fd = open(path, O_RDONLY); g_free(path); if(fd >= 0) { char buf[2]; ssize_t rdlen = read(fd, &buf, 2); close(fd); if(rdlen == 2 && buf[0] == '#' && buf[1] == '!') return TRUE; } } return FALSE; } else if(strcmp(type, "application/x-desktop") == 0) { /* treat desktop entries as executables if they are native and have read permission */ if(fm_path_is_native(fi->path) && (fi->mode & (S_IRUSR|S_IRGRP|S_IROTH))) { if (fi->shortcut && fi->target) { /* handle shortcuts from desktop to menu entries: first check if this is a shortcut to a native file (otherwise it is a link to a file under menu://), then check for entries in /usr/share/applications and such which may be considered as a safe desktop entry path */ FmPath *target = fm_path_new_for_str(fi->target); gboolean is_native = fm_path_is_native(target); fm_path_unref(target); if (is_native) { GFile *target = g_file_new_for_path(fi->target); char *path = g_file_get_path(target); g_object_unref(target); gboolean usr_share = (g_str_has_prefix(path, "/usr/share/") || g_str_has_prefix(path, "/usr/local/share/")); g_free(path); if (!usr_share) return TRUE; } } else return TRUE; } return FALSE; } return g_content_type_can_be_executable(fm_mime_type_get_type(fi->mime_type)); } /** * fm_file_info_is_accessible * @fi: a file info descriptor * * Checks if the user has read access to file or directory @fi. * * Returns: %TRUE if @fi is accessible for user. * * Since: 1.0.1 */ gboolean fm_file_info_is_accessible(FmFileInfo* fi) { return fi->accessible; } /** * fm_file_info_get_is_hidden: * @fi: A FmFileInfo struct * * Files treated as hidden files are filenames with dot prefix * or ~ suffix. * * Returns: TRUE if the file is a hidden file. */ gboolean fm_file_info_is_hidden(FmFileInfo* fi) { return (fi->hidden || /* bug #3416724: backup and hidden files should be distinguishable */ (fm_config->backup_as_hidden && fi->backup)); } /** * fm_file_info_is_backup * @fi: A FmFileInfo struct * * Checks if file is backup. Native files are considered backup if they * have ~ suffix. * * Returns: %TRUE if the file is a backup file. * * Since: 1.2.0 */ gboolean fm_file_info_is_backup(FmFileInfo* fi) { return fi->backup; } /** * fm_file_info_get_can_thumbnail: * @fi: A FmFileInfo struct * * This API is not thread-safe and should be used only in default context. * * Returns: TRUE if the the file manager can try to * generate a thumbnail for the file. */ gboolean fm_file_info_can_thumbnail(FmFileInfo* fi) { /* We cannot use S_ISREG here as this exclude all symlinks */ if( fi->size == 0 || /* don't generate thumbnails for empty files */ !(fi->mode & S_IFREG) || fm_file_info_is_desktop_entry(fi) || fm_file_info_is_unknown_type(fi)) return FALSE; return TRUE; } /** * fm_file_info_get_collate_key: * @fi: A FmFileInfo struct * * Get the collate key used for locale-dependent * filename sorting. The keys of different files * can be compared with strcmp() directly. * * This API is not thread-safe and should be used only in default context. * * Returns: a const string owned by FmFileInfo which should * not be freed. */ const char* fm_file_info_get_collate_key(FmFileInfo* fi) { /* create a collate key on demand, if we don't have one */ if(G_UNLIKELY(!fi->collate_key)) { const char* disp_name = fm_file_info_get_disp_name(fi); char* casefold = g_utf8_casefold(disp_name, -1); char* collate = g_utf8_collate_key_for_filename(casefold, -1); g_free(casefold); if(strcmp(collate, disp_name)) fi->collate_key = collate; else { /* if the collate key is the same as the display name, * then there is no need to save it. * Just use the display name directly. */ fi->collate_key = COLLATE_USING_DISPLAY_NAME; g_free(collate); } } /* if the collate key is the same as the display name, * just return the display name instead. */ if(fi->collate_key == COLLATE_USING_DISPLAY_NAME) return fm_file_info_get_disp_name(fi); return fi->collate_key; } /** * fm_file_info_get_collate_key_nocasefold * @fi: a #FmFileInfo struct * * Get the collate key used for locale-dependent filename sorting but * in case-sensitive manner. The keys of different files can be compared * with strcmp() directly. Returned data are owned by FmFileInfo and * should be not freed by caller. * * This API is not thread-safe and should be used only in default context. * * See also: fm_file_info_get_collate_key(). * * Returns: collate string. * * Since: 1.0.2 */ const char* fm_file_info_get_collate_key_nocasefold(FmFileInfo* fi) { /* create a collate key on demand, if we don't have one */ if(G_UNLIKELY(!fi->collate_key_case)) { const char* disp_name = fm_file_info_get_disp_name(fi); char* collate = g_utf8_collate_key_for_filename(disp_name, -1); if(strcmp(collate, disp_name)) fi->collate_key_case = collate; else { /* if the collate key is the same as the display name, * then there is no need to save it. * Just use the display name directly. */ fi->collate_key_case = COLLATE_USING_DISPLAY_NAME; g_free(collate); } } /* if the collate key is the same as the display name, * just return the display name instead. */ if(fi->collate_key_case == COLLATE_USING_DISPLAY_NAME) return fm_file_info_get_disp_name(fi); return fi->collate_key_case; } /** * fm_file_info_get_target: * @fi: A FmFileInfo struct * * Get the target of a symlink or a shortcut. * * This API is not thread-safe and should be used only in default context. * * Returns: a const string owned by FmFileInfo which should * not be freed. NULL if the file is not a symlink or * shortcut. */ const char* fm_file_info_get_target(FmFileInfo* fi) { return fi->target; } /** * fm_file_info_get_desc: * @fi: A FmFileInfo struct * * Get a human-readable description for the file. * * This API is not thread-safe and should be used only in default context. * * Returns: a const string owned by FmFileInfo which should * not be freed. */ const char* fm_file_info_get_desc(FmFileInfo* fi) { /* FIXME: how to handle descriptions for virtual files without mime-tyoes? */ return fi->mime_type ? fm_mime_type_get_desc(fi->mime_type) : NULL; } /** * fm_file_info_get_disp_mtime: * @fi: A FmFileInfo struct * * Get a human-readable string for showing file modification * time in the UI. * * This API is not thread-safe and should be used only in default context. * * Returns: a const string owned by FmFileInfo which should * not be freed. */ const char* fm_file_info_get_disp_mtime(FmFileInfo* fi) { /* FIXME: This can cause problems if the file really has mtime=0. */ /* We'd better hide mtime for virtual files only. */ if(fi->mtime > 0) { if (!fi->disp_mtime) { char buf[ 128 ]; strftime(buf, sizeof(buf), fm_config->date_iso_8601 ? "%F %R" : "%x %R", localtime(&fi->mtime)); fi->disp_mtime = g_strdup(buf); } } return fi->disp_mtime; } /** * fm_file_info_get_mtime: * @fi: A FmFileInfo struct * * Returns: file modification time. */ time_t fm_file_info_get_mtime(FmFileInfo* fi) { return fi->mtime; } /** * fm_file_info_get_atime * @fi: A FmFileInfo struct * * Returns: file access time. */ time_t fm_file_info_get_atime(FmFileInfo* fi) { return fi->atime; } /** * fm_file_info_get_ctime * @fi: a file info to inspect * * Retrieves time when access right were changed last time for file @fi. * * Returns: file access change time. * * Since: 1.2.0 */ time_t fm_file_info_get_ctime(FmFileInfo *fi) { return fi->ctime; } /** * fm_file_info_get_uid: * @fi: A FmFileInfo struct * * Returns: user id (uid) of the file owner. */ uid_t fm_file_info_get_uid(FmFileInfo* fi) { return fi->uid; } /** * fm_file_info_get_gid: * @fi: A FmFileInfo struct * * Returns: group id (gid) of the file owner. */ gid_t fm_file_info_get_gid(FmFileInfo* fi) { return fi->gid; } /** * fm_file_info_get_fs_id: * @fi: A FmFileInfo struct * * Get the filesystem id string * This is only applicable when the file is on a remote * filesystem. e.g. fm_file_info_is_native() returns FALSE. * * This API is not thread-safe and should be used only in default context. * * Returns: a const string owned by FmFileInfo which should * not be freed. */ const char* fm_file_info_get_fs_id(FmFileInfo* fi) { return fi->fs_id; } /** * fm_file_info_get_dev: * @fi: A FmFileInfo struct * * Get the filesystem device id (POSIX dev_t) * This is only applicable when the file is native. * e.g. fm_file_info_is_native() returns TRUE. * * Returns: device id (POSIX dev_t, st_dev member of * struct stat). */ dev_t fm_file_info_get_dev(FmFileInfo* fi) { return fi->dev; } /** * fm_file_info_can_set_name * @fi: a #FmFileInfo to inspect * * Checks if file system supports name change for @fi. Returned value * %TRUE is just a potential possibility, name still may be unable to * change due to access reasons for example. * * Returns: %TRUE if change is supported for @fi. * * Since: 1.2.0 */ gboolean fm_file_info_can_set_name(FmFileInfo *fi) { return (fi != NULL && fi->name_is_changeable); } /** * fm_file_info_can_set_icon * @fi: a #FmFileInfo to inspect * * Checks if file system supports icon change for @fi. Returned value * %TRUE is just a potential possibility, icon still may be unable to * change due to access reasons for example. * * Returns: %TRUE if change is supported for @fi. * * Since: 1.2.0 */ gboolean fm_file_info_can_set_icon(FmFileInfo *fi) { return (fi != NULL && fi->icon_is_changeable); } /** * fm_file_info_can_set_hidden * @fi: a #FmFileInfo to inspect * * Checks if file system supports "hidden" attribute change for @fi. * Returned value %TRUE is just a potential possibility, the attribute * still may be unable to change due to access reasons for example. * * Returns: %TRUE if change is supported for @fi. * * Since: 1.2.0 */ gboolean fm_file_info_can_set_hidden(FmFileInfo *fi) { return (fi != NULL && fi->hidden_is_changeable); } /** * fm_file_info_is_writable_directory * @fi: a #FmFileInfo to inspect * * Checks if directory @fi lies on writable file system. Returned value * %TRUE is just a potential possibility, it may still not allow write * due to access reasons for example. * * Returns: %TRUE if @fi may be writable. * * Since: 1.2.0 */ gboolean fm_file_info_is_writable_directory(FmFileInfo* fi) { return (!fi->fs_is_ro && fm_file_info_is_dir(fi)); } /** * fm_file_info_get_disp_owner * @fi: file info to inspect * * Retrieves human-readable string value for owner of @fi. Returned value * is either owner login name or numeric string if owner has no entry in * /etc/passwd file. Returned value is owned by @fi and should be not * altered by caller. * * Returns: (transfer none): string value for owner. * * Since: 1.2.0 */ const char *fm_file_info_get_disp_owner(FmFileInfo *fi) { g_return_val_if_fail(fi, NULL); if (!fi->disp_owner) { struct passwd* pw = NULL; struct passwd pwb; char unamebuf[1024]; getpwuid_r(fi->uid, &pwb, unamebuf, sizeof(unamebuf), &pw); if (pw) fi->disp_owner = g_strdup(pw->pw_name); else fi->disp_owner = g_strdup_printf("%u", (guint)fi->uid); } return fi->disp_owner; } /** * fm_file_info_get_disp_group * @fi: file info to inspect * * Retrieves human-readable string value for group of @fi. Returned value * is either group name or numeric string if grop has no entry in the * /etc/group file. Returned value is owned by @fi and should be not * altered by caller. * * Returns: (transfer none): string value for file group. * * Since: 1.2.0 */ const char *fm_file_info_get_disp_group(FmFileInfo *fi) { g_return_val_if_fail(fi, NULL); if (!fi->disp_group) { struct group* grp = NULL; struct group grpb; char unamebuf[1024]; getgrgid_r(fi->gid, &grpb, unamebuf, sizeof(unamebuf), &grp); if (grp) fi->disp_group = g_strdup(grp->gr_name); else fi->disp_group = g_strdup_printf("%u", (guint)fi->gid); } return fi->disp_group; } static FmListFuncs fm_list_funcs = { .item_ref = (gpointer (*)(gpointer))&fm_file_info_ref, .item_unref = (void (*)(gpointer))&fm_file_info_unref }; /** * fm_file_info_list_new * * Creates a new #FmFileInfoList. * * Returns: new #FmFileInfoList object. */ FmFileInfoList* fm_file_info_list_new(void) { return (FmFileInfoList*)fm_list_new(&fm_list_funcs); } /** * fm_file_info_list_is_same_type * @list: a #FmFileInfoList * * Checks if all files in the list are of the same type. * * Returns: %TRUE if all files in the list are of the same type */ gboolean fm_file_info_list_is_same_type(FmFileInfoList* list) { /* FIXME: handle virtual files without mime-types */ if(!fm_list_is_empty((FmList*)list)) { GList* l = fm_list_peek_head_link((FmList*)list); FmFileInfo* fi = (FmFileInfo*)l->data; l = l->next; for(;l;l=l->next) { FmFileInfo* fi2 = (FmFileInfo*)l->data; if(fi->mime_type != fi2->mime_type) return FALSE; } } return TRUE; } /** * fm_file_info_list_is_same_fs * @list: a #FmFileInfoList * * Checks if all files in the list are on the same file system. * * Returns: %TRUE if all files in the list are on the same fs. */ gboolean fm_file_info_list_is_same_fs(FmFileInfoList* list) { if(!fm_list_is_empty((FmList*)list)) { GList* l = fm_list_peek_head_link((FmList*)list); FmFileInfo* fi = (FmFileInfo*)l->data; l = l->next; for(;l;l=l->next) { FmFileInfo* fi2 = (FmFileInfo*)l->data; gboolean is_native = fm_path_is_native(fi->path); if(is_native != fm_path_is_native(fi2->path)) return FALSE; if(is_native) { if(fi->dev != fi2->dev) return FALSE; } else { if(fi->fs_id != fi2->fs_id) return FALSE; } } } return TRUE; } libfm-1.4.0/src/base/fm-file-info.h000066400000000000000000000161301475513661000167400ustar00rootroot00000000000000/* * fm-file-info.h * * Copyright 2009 - 2012 PCMan * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef _FM_FILE_INFO_H_ #define _FM_FILE_INFO_H_ #include #include #include #include #include #include "fm-icon.h" #include "fm-list.h" #include "fm-path.h" #include "fm-mime-type.h" G_BEGIN_DECLS typedef struct _FmFileInfo FmFileInfo; //typedef struct _FmFileInfoList FmFileInfoList; // defined in fm-path.h struct _MenuCacheItem;/* forward declaration for MenuCacheItem */ /* intialize the file info system */ void _fm_file_info_init(); void _fm_file_info_finalize(); FmFileInfo* fm_file_info_new(); #ifndef FM_DISABLE_DEPRECATED FmFileInfo* fm_file_info_new_from_gfileinfo(FmPath* path, GFileInfo* inf); void fm_file_info_set_from_gfileinfo(FmFileInfo* fi, GFileInfo* inf); #endif FmFileInfo *fm_file_info_new_from_g_file_data(GFile *gf, GFileInfo *inf, FmPath *path); void fm_file_info_set_from_g_file_data(FmFileInfo* fi, GFile* gf, GFileInfo* inf); FmFileInfo* fm_file_info_new_from_menu_cache_item(FmPath* path, struct _MenuCacheItem* item); #ifndef FM_DISABLE_DEPRECATED void fm_file_info_set_from_menu_cache_item(FmFileInfo* fi, struct _MenuCacheItem* item); #endif gboolean fm_file_info_set_from_native_file(FmFileInfo* fi, const char* path, GError** err); FmFileInfo *fm_file_info_new_from_native_file(FmPath *path, const char *path_str, GError **err); FmFileInfo* fm_file_info_ref( FmFileInfo* fi ); void fm_file_info_unref( FmFileInfo* fi ); void fm_file_info_update(FmFileInfo* fi, FmFileInfo* src); /** returned FmPath shouldn't be unref by caller */ FmPath* fm_file_info_get_path( FmFileInfo* fi ); const char* fm_file_info_get_name( FmFileInfo* fi ); const char* fm_file_info_get_disp_name( FmFileInfo* fi ); //const char* fm_file_info_get_edit_name(FmFileInfo *fi); void fm_file_info_set_path(FmFileInfo* fi, FmPath* path); void fm_file_info_set_disp_name( FmFileInfo* fi, const char* name ); void fm_file_info_set_icon(FmFileInfo *fi, GIcon *icon); goffset fm_file_info_get_size( FmFileInfo* fi ); const char* fm_file_info_get_disp_size( FmFileInfo* fi ); goffset fm_file_info_get_blocks( FmFileInfo* fi ); mode_t fm_file_info_get_mode( FmFileInfo* fi ); gboolean fm_file_info_is_native(FmFileInfo* fi); FmMimeType* fm_file_info_get_mime_type( FmFileInfo* fi ); gboolean fm_file_info_is_dir( FmFileInfo* fi ); gboolean fm_file_info_is_symlink( FmFileInfo* fi ); gboolean fm_file_info_is_shortcut( FmFileInfo* fi ); gboolean fm_file_info_is_mountable( FmFileInfo* fi ); gboolean fm_file_info_is_image( FmFileInfo* fi ); gboolean fm_file_info_is_text( FmFileInfo* fi ); gboolean fm_file_info_is_desktop_entry( FmFileInfo* fi ); gboolean fm_file_info_is_unknown_type( FmFileInfo* fi ); gboolean fm_file_info_is_hidden(FmFileInfo* fi); gboolean fm_file_info_is_backup(FmFileInfo* fi); /* if the mime-type is executable, such as shell script, python script, ... */ gboolean fm_file_info_is_executable_type( FmFileInfo* fi); gboolean fm_file_info_is_accessible(FmFileInfo* fi); gboolean fm_file_info_is_writable_directory(FmFileInfo* fi); const char* fm_file_info_get_target( FmFileInfo* fi ); const char* fm_file_info_get_collate_key( FmFileInfo* fi ); const char* fm_file_info_get_collate_key_nocasefold(FmFileInfo* fi); const char* fm_file_info_get_desc( FmFileInfo* fi ); const char* fm_file_info_get_disp_mtime( FmFileInfo* fi ); time_t fm_file_info_get_mtime( FmFileInfo* fi ); time_t fm_file_info_get_atime( FmFileInfo* fi ); time_t fm_file_info_get_ctime(FmFileInfo *fi); FmIcon* fm_file_info_get_icon( FmFileInfo* fi ); uid_t fm_file_info_get_uid( FmFileInfo* fi ); const char *fm_file_info_get_disp_owner(FmFileInfo *fi); gid_t fm_file_info_get_gid( FmFileInfo* fi ); const char *fm_file_info_get_disp_group(FmFileInfo *fi); const char* fm_file_info_get_fs_id( FmFileInfo* fi ); dev_t fm_file_info_get_dev( FmFileInfo* fi ); gboolean fm_file_info_can_thumbnail(FmFileInfo* fi); gboolean fm_file_info_can_set_name(FmFileInfo *fi); gboolean fm_file_info_can_set_icon(FmFileInfo *fi); gboolean fm_file_info_can_set_hidden(FmFileInfo *fi); FmFileInfoList* fm_file_info_list_new(); //FmFileInfoList* fm_file_info_list_new_from_glist(); #ifndef __GTK_DOC_IGNORE__ static inline FmFileInfoList* fm_file_info_list_ref(FmFileInfoList* list) { return list ? (FmFileInfoList*)fm_list_ref((FmList*)list) : NULL; } static inline void fm_file_info_list_unref(FmFileInfoList* list) { if(list == NULL) return; fm_list_unref((FmList*)list); } static inline gboolean fm_file_info_list_is_empty(FmFileInfoList* list) { return fm_list_is_empty((FmList*)list); } static inline guint fm_file_info_list_get_length(FmFileInfoList* list) { return fm_list_get_length((FmList*)list); } static inline FmFileInfo* fm_file_info_list_peek_head(FmFileInfoList* list) { return (FmFileInfo*)fm_list_peek_head((FmList*)list); } static inline GList* fm_file_info_list_peek_head_link(FmFileInfoList* list) { return fm_list_peek_head_link((FmList*)list); } static inline void fm_file_info_list_push_tail(FmFileInfoList* list, FmFileInfo* d) { fm_list_push_tail((FmList*)list,d); } static inline void fm_file_info_list_push_tail_link(FmFileInfoList* list, GList* d) { fm_list_push_tail_link((FmList*)list,d); } static inline void fm_file_info_list_push_tail_noref(FmFileInfoList* list, FmFileInfo* d) { fm_list_push_tail_noref((FmList*)list,d); } static inline FmFileInfo* fm_file_info_list_pop_head(FmFileInfoList* list) { return (FmFileInfo*)fm_list_pop_head((FmList*)list); } static inline void fm_file_info_list_delete_link(FmFileInfoList* list, GList* _l) { fm_list_delete_link((FmList*)list,_l); } static inline void fm_file_info_list_delete_link_nounref(FmFileInfoList* list, GList* _l) { fm_list_delete_link_nounref((FmList*)list,_l); } static inline void fm_file_info_list_clear(FmFileInfoList* list) { fm_list_clear((FmList*)list); } #endif /* __GTK_DOC_IGNORE__ */ /* return TRUE if all files in the list are of the same type */ gboolean fm_file_info_list_is_same_type(FmFileInfoList* list); /* return TRUE if all files in the list are on the same fs */ gboolean fm_file_info_list_is_same_fs(FmFileInfoList* list); #define FM_FILE_INFO(ptr) ((FmFileInfo*)ptr) G_END_DECLS #endif libfm-1.4.0/src/base/fm-file-launcher.c000066400000000000000000000505351475513661000176100ustar00rootroot00000000000000/* * fm-file-launcher.c * * Copyright 2009 - 2010 Hong Jen Yee (PCMan) * Copyright 2012 Vadim Ushakov * Copyright 2012-2018 Andriy Grytsenko (LStranger) * Copyright 2017 Tsu Jan * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-file-launcher * @short_description: File launching utilities with callbacks to GUI. * @title: Libfm file launchers * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-file-launcher.h" #include "fm-file-info-job.h" #include "fm-app-info.h" #include "glib-compat.h" #include #include #include #include #include #include /** * fm_launch_desktop_entry * @ctx: (allow-none): a launch context * @file_or_id: a desktop entry to launch * @uris: (element-type char *): files to use in run substitutions * @launcher: #FmFileLauncher with callbacks * @user_data: data supplied for callbacks * * Launches a desktop entry with optional files. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_launch_desktop_entry(GAppLaunchContext* ctx, const char* file_or_id, GList* uris, FmFileLauncher* launcher, gpointer user_data) { gboolean ret = FALSE; GAppInfo* app; gboolean is_absolute_path = g_path_is_absolute(file_or_id); GList* _uris = NULL; GError* err = NULL; /* Let GDesktopAppInfo try first. */ if(is_absolute_path) app = (GAppInfo*)g_desktop_app_info_new_from_filename(file_or_id); else app = (GAppInfo*)g_desktop_app_info_new(file_or_id); /* we handle Type=Link in FmFileInfo so if GIO failed then it cannot be launched in fact */ if(app) { ret = fm_app_info_launch_uris(app, uris, ctx, &err); g_object_unref(app); } else if (launcher->error) g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("Invalid desktop entry file: '%s'"), file_or_id); if(err) { if(launcher->error) launcher->error(ctx, err, NULL, user_data); g_error_free(err); } if(_uris) { g_list_foreach(_uris, (GFunc)g_free, NULL); g_list_free(_uris); } return ret; } typedef struct { GAppLaunchContext* ctx; FmFileLauncher* launcher; gpointer user_data; } QueryErrorData; static FmJobErrorAction on_query_target_info_error(FmJob* job, GError* err, FmJobErrorSeverity severity, QueryErrorData* data) { if(data->launcher->error && !data->launcher->error(data->ctx, err, fm_file_info_job_get_current(FM_FILE_INFO_JOB(job)), data->user_data)) return FM_JOB_RETRY; return FM_JOB_CONTINUE; } static FmFileInfo *_fetch_file_info_for_shortcut(const char *target, GAppLaunchContext* ctx, FmFileLauncher* launcher, gpointer user_data) { FmFileInfoJob *job; QueryErrorData data; FmFileInfo *fi; FmPath *path; job = fm_file_info_job_new(NULL, 0); /* bug #3614794: the shortcut target is a commandline argument */ path = fm_path_new_for_commandline_arg(target); fm_file_info_job_add(job, path); fm_path_unref(path); data.ctx = ctx; data.launcher = launcher; data.user_data = user_data; g_signal_connect(job, "error", G_CALLBACK(on_query_target_info_error), &data); fi = NULL; /* if we do fm_job_run_sync_with_mainloop() then we should unlock GDK threads before main loop but the libfm in GDK independent therefore we cannot use the fm_job_run_sync_with_mainloop() here */ if (fm_job_run_sync(FM_JOB(job))) { FmFileInfo* file_info = fm_file_info_list_peek_head(job->file_infos); if (file_info) { fi = fm_file_info_ref(file_info); } } g_signal_handlers_disconnect_by_func(job, on_query_target_info_error, &data); g_object_unref(job); return fi; } /** * fm_launch_files * @ctx: (allow-none): a launch context * @file_infos: (element-type FmFileInfo): files to launch * @launcher: #FmFileLauncher with callbacks * @user_data: data supplied for callbacks * * Launches files using callbacks in @launcher. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_launch_files(GAppLaunchContext* ctx, GList* file_infos, FmFileLauncher* launcher, gpointer user_data) { GList* l; GHashTable* hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); GList *folders = NULL; FmFileInfo* fi; GList *targets = NULL; GError* err = NULL; GAppInfo* app; const char* type; for(l = file_infos; l; l=l->next) { GList* fis; char *filename, *scheme; const char *target = NULL; fi = (FmFileInfo*)l->data; /* special handling for shortcuts */ if (!fm_file_info_is_symlink(fi)) /* symlinks also has fi->target, but we only handle shortcuts here. */ target = fm_file_info_get_target(fi); if (launcher->open_folder && (fm_file_info_is_dir(fi) || fm_file_info_is_mountable(fi))) { /* special handling for shortcuts */ if(target) { fi = _fetch_file_info_for_shortcut(fm_file_info_get_target(fi), ctx, launcher, user_data); if (fi == NULL) /* error was shown by job already */ continue; targets = g_list_prepend(targets, fi); } folders = g_list_prepend(folders, fi); } else if (fm_file_info_is_desktop_entry(fi)) { _launch_desktop_entry: /* treat desktop entries as executables */ if(fm_file_info_is_executable_type(fi)) { switch(launcher->exec_file(fi, user_data)) { case FM_FILE_LAUNCHER_EXEC_IN_TERMINAL: case FM_FILE_LAUNCHER_EXEC: { if (!target) filename = fm_path_to_str(fm_file_info_get_path(fi)); fm_launch_desktop_entry(ctx, target ? target : filename, NULL, launcher, user_data); if (!target) g_free(filename); continue; } case FM_FILE_LAUNCHER_EXEC_OPEN: break; case FM_FILE_LAUNCHER_EXEC_CANCEL: continue; } } /* make exception for desktop entries under menu */ else if (fm_file_info_is_native(fi) /* an exception */ || fm_path_is_xdg_menu(fm_file_info_get_path(fi))) { if (!target) filename = fm_path_to_str(fm_file_info_get_path(fi)); fm_launch_desktop_entry(ctx, target ? target : filename, NULL, launcher, user_data); if (!target) g_free(filename); continue; } FmMimeType* mime_type = fm_file_info_get_mime_type(fi); if(mime_type && (type = fm_mime_type_get_type(mime_type))) { fis = g_hash_table_lookup(hash, type); fis = g_list_prepend(fis, fi); g_hash_table_insert(hash, (gpointer)type, fis); } else if (launcher->error) { g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("Could not determine content type of file '%s' to launch it"), fm_file_info_get_disp_name(fi)); launcher->error(ctx, err, NULL, user_data); g_clear_error(&err); } } else { FmPath* path = fm_file_info_get_path(fi); FmMimeType* mime_type = NULL; if(fm_path_is_native(path)) { /* special handling for shortcuts */ if (target) { if (fm_file_info_get_mime_type(fi) == _fm_mime_type_get_inode_x_shortcut()) /* if we already know MIME type then use it instead */ { scheme = g_uri_parse_scheme(target); if (scheme) { /* FIXME: this is rough! */ if (strcmp(scheme, "file") != 0 && strcmp(scheme, "trash") != 0 && strcmp(scheme, "network") != 0 && strcmp(scheme, "computer") != 0 && strcmp(scheme, "menu") != 0) { /* we don't support this URI internally, try GIO */ app = g_app_info_get_default_for_uri_scheme(scheme); if (app) { fis = g_list_prepend(NULL, (char *)target); fm_app_info_launch_uris(app, fis, ctx, &err); g_list_free(fis); g_object_unref(app); } else if (launcher->error) g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("No default application is set to launch URIs %s://"), scheme); if (err) { launcher->error(ctx, err, NULL, user_data); g_clear_error(&err); } g_free(scheme); continue; } g_free(scheme); } } else mime_type = fm_file_info_get_mime_type(fi); /* retrieve file info for target otherwise and handle it */ fi = _fetch_file_info_for_shortcut(target, ctx, launcher, user_data); if (fi == NULL) /* error was shown by job already */ continue; targets = g_list_prepend(targets, fi); path = fm_file_info_get_path(fi); /* special handling for desktop entries */ if (fm_file_info_is_desktop_entry(fi)) goto _launch_desktop_entry; } if(fm_file_info_is_executable_type(fi) && !fm_file_info_is_desktop_entry(fi)) { /* if it's an executable file, directly execute it. */ filename = fm_path_to_str(path); /* FIXME: we need to use eaccess/euidaccess here. */ if(g_file_test(filename, G_FILE_TEST_IS_EXECUTABLE)) { if(launcher->exec_file) { FmFileLauncherExecAction act = launcher->exec_file(fi, user_data); GAppInfoCreateFlags flags = 0; switch(act) { case FM_FILE_LAUNCHER_EXEC_IN_TERMINAL: flags |= G_APP_INFO_CREATE_NEEDS_TERMINAL; /* NOTE: no break here */ case FM_FILE_LAUNCHER_EXEC: { /* filename may contain spaces. Fix #3143296 */ char* quoted = g_shell_quote(filename); app = fm_app_info_create_from_commandline(quoted, NULL, flags, NULL); g_free(quoted); if(app) { char* run_path = g_path_get_dirname(filename); char* cwd = NULL; /* bug #3589641: scripts are ran from $HOME. since GIO launcher is kinda ugly - it has no means to set running directory so we do workaround - change directory to it */ if(run_path && strcmp(run_path, ".")) { cwd = g_get_current_dir(); if(chdir(run_path) != 0) { g_free(cwd); cwd = NULL; if (launcher->error) { g_set_error(&err, G_IO_ERROR, g_io_error_from_errno(errno), _("Cannot set working directory to '%s': %s"), run_path, g_strerror(errno)); launcher->error(ctx, err, NULL, user_data); g_clear_error(&err); } } } g_free(run_path); if(!fm_app_info_launch(app, NULL, ctx, &err)) { if(launcher->error) launcher->error(ctx, err, NULL, user_data); g_error_free(err); err = NULL; } if(cwd) /* return back */ { if(chdir(cwd) != 0) g_warning("fm_launch_files(): chdir() failed"); g_free(cwd); } g_object_unref(app); continue; } break; } case FM_FILE_LAUNCHER_EXEC_OPEN: break; case FM_FILE_LAUNCHER_EXEC_CANCEL: continue; } } } g_free(filename); } } if (mime_type == NULL) mime_type = fm_file_info_get_mime_type(fi); if(mime_type && (type = fm_mime_type_get_type(mime_type))) { fis = g_hash_table_lookup(hash, type); fis = g_list_prepend(fis, fi); g_hash_table_insert(hash, (gpointer)type, fis); } else if (launcher->error) { g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("Could not determine content type of file '%s' to launch it"), fm_file_info_get_disp_name(fi)); launcher->error(ctx, err, NULL, user_data); g_clear_error(&err); } } } if(g_hash_table_size(hash) > 0) { GHashTableIter it; GList* fis; g_hash_table_iter_init(&it, hash); while(g_hash_table_iter_next(&it, (void**)&type, (void**)&fis)) { GAppInfo* app = g_app_info_get_default_for_type(type, FALSE); if(!app) { if(launcher->get_app) { FmMimeType* mime_type = fm_file_info_get_mime_type((FmFileInfo*)fis->data); app = launcher->get_app(fis, mime_type, user_data, NULL); } } if(app) { for(l=fis; l; l=l->next) { char* uri; fi = (FmFileInfo*)l->data; /* special handling for shortcuts */ if (fm_file_info_is_shortcut(fi)) uri = g_strdup(fm_file_info_get_target(fi)); else uri = fm_path_to_uri(fm_file_info_get_path(fi)); l->data = uri; } fis = g_list_reverse(fis); fm_app_info_launch_uris(app, fis, ctx, &err); /* free URI strings */ g_list_foreach(fis, (GFunc)g_free, NULL); g_object_unref(app); } else if (launcher->error && !launcher->get_app) /* SF#837: don't show an error window after user pressed 'Cancel' in the selection window, it'll annoy user */ g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("No default application is set for MIME type %s"), type); if (err) { launcher->error(ctx, err, NULL, user_data); g_clear_error(&err); } g_list_free(fis); } } g_hash_table_destroy(hash); if(folders) { folders = g_list_reverse(folders); if(launcher->open_folder) { launcher->open_folder(ctx, folders, user_data, &err); if(err) { if(launcher->error) launcher->error(ctx, err, NULL, user_data); g_error_free(err); err = NULL; } } g_list_free(folders); } g_list_free_full(targets, (GDestroyNotify)fm_file_info_unref); return TRUE; } /** * fm_launch_paths * @ctx: (allow-none): a launch context * @paths: (element-type FmPath): files to launch * @launcher: #FmFileLauncher with callbacks * @user_data: data supplied for callbacks * * Launches files using callbacks in @launcher. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_launch_paths(GAppLaunchContext* ctx, GList* paths, FmFileLauncher* launcher, gpointer user_data) { FmFileInfoJob* job = fm_file_info_job_new(NULL, 0); GList* l; QueryErrorData data; gboolean ret; for(l=paths;l;l=l->next) fm_file_info_job_add(job, (FmPath*)l->data); data.ctx = ctx; data.launcher = launcher; data.user_data = user_data; g_signal_connect(job, "error", G_CALLBACK(on_query_target_info_error), &data); /* if we do fm_job_run_sync_with_mainloop() then we should unlock GDK threads before main loop but the libfm in GDK independent therefore we cannot use the fm_job_run_sync_with_mainloop() here */ ret = fm_job_run_sync(FM_JOB(job)); g_signal_handlers_disconnect_by_func(job, on_query_target_info_error, &data); if(ret) { GList* file_infos = fm_file_info_list_peek_head_link(job->file_infos); if(file_infos) ret = fm_launch_files(ctx, file_infos, launcher, user_data); else ret = FALSE; } g_object_unref(job); return ret; } libfm-1.4.0/src/base/fm-file-launcher.h000066400000000000000000000057631475513661000176200ustar00rootroot00000000000000/* * fm-file-launcher.h * * Copyright 2009 - 2010 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_LAUNCHER_H__ #define __FM_FILE_LAUNCHER_H__ #include #include #include "fm-file-info.h" G_BEGIN_DECLS typedef gboolean (*FmLaunchFolderFunc)(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data, GError** err); /** * FmFileLauncherExecAction: * @FM_FILE_LAUNCHER_EXEC: execute the file * @FM_FILE_LAUNCHER_EXEC_IN_TERMINAL: execute the file in terminal * @FM_FILE_LAUNCHER_EXEC_OPEN: open file with some application * @FM_FILE_LAUNCHER_EXEC_CANCEL: do nothing */ typedef enum { FM_FILE_LAUNCHER_EXEC = 1, FM_FILE_LAUNCHER_EXEC_IN_TERMINAL, FM_FILE_LAUNCHER_EXEC_OPEN, FM_FILE_LAUNCHER_EXEC_CANCEL } FmFileLauncherExecAction; typedef struct _FmFileLauncher FmFileLauncher; /** * FmFileLauncher: * @get_app: callback to get new #GAppInfo * @open_folder: callback to open folders * @exec_file: callback to select file execution mode * @error: callback to show error message; returns TRUE to continue, FALSE to retry * @ask: callback to ask for user interaction; returns choise from btn_labels */ struct _FmFileLauncher { GAppInfo* (*get_app)(GList* file_infos, FmMimeType* mime_type, gpointer user_data, GError** err); /* gboolean (*before_open)(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data); */ FmLaunchFolderFunc open_folder; FmFileLauncherExecAction (*exec_file)(FmFileInfo* file, gpointer user_data); /* returns TRUE to continue, FALSE to retry */ gboolean (*error)(GAppLaunchContext* ctx, GError* err, FmPath* file, gpointer user_data); int (*ask)(const char* msg, char* const* btn_labels, int default_btn, gpointer user_data); /*< private >*/ gpointer _reserved1; }; gboolean fm_launch_files(GAppLaunchContext* ctx, GList* file_infos, FmFileLauncher* launcher, gpointer user_data); gboolean fm_launch_paths(GAppLaunchContext* ctx, GList* paths, FmFileLauncher* launcher, gpointer user_data); gboolean fm_launch_desktop_entry(GAppLaunchContext* ctx, const char* file_or_id, GList* uris, FmFileLauncher* launcher, gpointer user_data); G_END_DECLS #endif libfm-1.4.0/src/base/fm-file.c000066400000000000000000000127241475513661000160070ustar00rootroot00000000000000/* * fm-file.c * * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-file * @short_description: Extensions for GFile interface. * @title: FmFile * * @include: libfm/fm.h * * The #FmFile represents interface to build extensions to GFile which * will handle schemas that are absent in Glib/GVFS - such as "search:". * * To use it the GFile implementation should also implement FmFile vtable * calls. The implementation should be added to list of known schemes via * call to fm_file_add_vfs() then calls such as fm_file_new_for_uri() can * use it. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm-file.h" #include static GHashTable *schemes = NULL; #define FM_FILE_MODULE_MIN_VERSION 1 #define FM_FILE_MODULE_MAX_VERSION 1 G_LOCK_DEFINE_STATIC(vfs); G_DEFINE_INTERFACE(FmFile, fm_file, G_TYPE_FILE) static gboolean fm_file_wants_incremental_false(GFile *unused) { return FALSE; } static void fm_file_default_init(FmFileInterface *iface) { iface->wants_incremental = fm_file_wants_incremental_false; } static inline FmFileInitTable *fm_find_scheme(const char *name) { FmFileInitTable *t; CHECK_MODULES(); G_LOCK(vfs); t = (FmFileInitTable*)g_hash_table_lookup(schemes, name); G_UNLOCK(vfs); return t; } /** * fm_file_add_vfs * @name: scheme to act upon * @init: table of functions * * Adds VFS to list of extensions that will be applied on next call to * fm_file_new_for_uri() or fm_file_new_for_commandline_arg(). The @name * is a schema which will be handled by those calls. * * Since: 1.0.2 */ void fm_file_add_vfs(const char *name, FmFileInitTable *init) { G_LOCK(vfs); if(g_hash_table_lookup(schemes, name) == NULL) g_hash_table_insert(schemes, g_strdup(name), init); G_UNLOCK(vfs); } /** * fm_file_wants_incremental * @file: file to inspect * * Checks if contents of directory @file cannot be retrieved at once so * scanning it may be done in incremental manner for the best results. * * Returns: %TRUE if retrieve of contents of @file will be incremental. * * Since: 1.0.2 */ gboolean fm_file_wants_incremental(GFile* file) { FmFileInterface *iface; g_return_val_if_fail(file != NULL, FALSE); if(!FM_IS_FILE(file)) return FALSE; iface = FM_FILE_GET_IFACE(file); return iface->wants_incremental ? iface->wants_incremental(file) : FALSE; } /** * fm_file_new_for_uri * @uri: a UTF8 string containing a URI * * Constructs a #GFile for a given URI. This operation never fails, * but the returned object might not support any I/O operation if @uri * is malformed or if the uri type is not supported. * * Returns: a new #GFile. * * Since: 1.0.2 */ GFile *fm_file_new_for_uri(const char *uri) { char *scheme; FmFileInitTable *iface; GFile *file = NULL; scheme = g_uri_parse_scheme(uri); if(scheme) { iface = fm_find_scheme(scheme); if(iface && iface->new_for_uri) file = iface->new_for_uri(uri); g_free(scheme); if(file) return file; } return g_file_new_for_uri(uri); } /** * fm_file_new_for_commandline_arg * @arg: a command line string * * Creates a #GFile with the given argument from the command line. * The value of @arg can be either a URI, an absolute path or * a relative path resolved relative to the current working directory. * This operation never fails, but the returned object might not support * any I/O operation if @arg points to a malformed path. * * Returns: a new #GFile. * * Since: 1.0.2 */ GFile *fm_file_new_for_commandline_arg(const char *arg) { char *scheme; FmFileInitTable *iface; GFile *file = NULL; scheme = g_uri_parse_scheme(arg); if(scheme) { iface = fm_find_scheme(scheme); if(iface && iface->new_for_uri) file = iface->new_for_uri(arg); g_free(scheme); if(file) return file; } return g_file_new_for_commandline_arg(arg); } /* TODO: implement fm_file_parse_name() too */ /* modules stuff */ FM_MODULE_DEFINE_TYPE(vfs, FmFileInitTable, 1) static gboolean fm_module_callback_vfs(const char *name, gpointer init, int ver) { /* we don't check version and don't support any other than 1 otherwise we should allocate own copy of FmFileInitTable */ fm_file_add_vfs(name, init); return TRUE; } void _fm_file_init(void) { schemes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); fm_module_register_vfs(); } void _fm_file_finalize(void) { fm_module_unregister_type("vfs"); g_hash_table_destroy(schemes); schemes = NULL; } libfm-1.4.0/src/base/fm-file.h000066400000000000000000000057411475513661000160150ustar00rootroot00000000000000/* * fm-file.h * * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef _FM_FILE_H_ #define _FM_FILE_H_ 1 #include "fm-module.h" #include #include G_BEGIN_DECLS #define FM_TYPE_FILE (fm_file_get_type()) #define FM_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_FILE, FmFile)) #define FM_IS_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_FILE)) #define FM_FILE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj),\ FM_TYPE_FILE, FmFileInterface)) typedef struct _FmFile FmFile; /* Dummy typedef */ typedef struct _FmFileInterface FmFileInterface; /** * FmFileInterface: * @wants_incremental: VTable func, see fm_file_wants_incremental() */ struct _FmFileInterface { /*< private >*/ GTypeInterface g_iface; /*< public >*/ gboolean (*wants_incremental)(GFile* file); /*< private >*/ gpointer _reserved1; gpointer _reserved2; }; typedef struct _FmFileInitTable FmFileInitTable; /** * FmFileInitTable: * @new_for_uri: function to create new #GFile object from URI * * Functions to initialize FmFile instance. * * This structure is used for "vfs" module initialization. The key for * module of this type is scheme name to support. */ struct _FmFileInitTable { /*< public >*/ GFile * (*new_for_uri)(const char *uri); /*< private >*/ gpointer _reserved1; gpointer _reserved2; }; GType fm_file_get_type(void); void fm_file_add_vfs(const char *name, FmFileInitTable *init); /* VTable calls */ gboolean fm_file_wants_incremental(GFile* file); /* Gfile functions replacements */ GFile *fm_file_new_for_uri(const char *uri); GFile *fm_file_new_for_commandline_arg(const char *arg); void _fm_file_init(void); void _fm_file_finalize(void); /* for modules */ #define FM_MODULE_vfs_VERSION 1 extern FmFileInitTable fm_module_init_vfs; G_END_DECLS #endif /* _FM_FILE_H_ */libfm-1.4.0/src/base/fm-folder-config.c000066400000000000000000000326121475513661000176040ustar00rootroot00000000000000/* * fm-folder-config.c * * This file is a part of the LibFM project. * * Copyright 2014 Andriy Grytsenko (LStranger) * * 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 */ /** * SECTION:fm-folder-config * @short_description: Folder specific settings cache. * @title: FmFolderConfig * * @include: libfm/fm.h * * This API represents access to folder-specific configuration settings. * Each setting is a key/value pair. To use it the descriptor should be * opened first, then required operations performed, then closed. Each * opened descriptor holds a lock on the cache so it is not adviced to * keep it somewhere. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-folder-config.h" #include "fm-utils.h" #include struct _FmFolderConfig { GKeyFile *kf; char *group; /* allocated if not in cache */ char *filepath; /* NULL if in cache */ gboolean changed; }; static GKeyFile *fc_cache = NULL; static gboolean fc_cache_changed = FALSE; G_LOCK_DEFINE_STATIC(cache); /** * fm_folder_config_open * @path: path to get config * * Searches for settings in the cache that are specific to @path. Locks * the cache. Returned descriptor can be used for access to settings. * * Returns: (transfer full): new configuration descriptor. * * Since: 1.2.0 */ FmFolderConfig *fm_folder_config_open(FmPath *path) { FmFolderConfig *fc = g_slice_new(FmFolderConfig); FmPath *sub_path; fc->changed = FALSE; /* clear .directory file first */ sub_path = fm_path_new_child(path, ".directory"); fc->filepath = fm_path_to_str(sub_path); fm_path_unref(sub_path); if (g_file_test(fc->filepath, G_FILE_TEST_EXISTS)) { fc->kf = g_key_file_new(); if (g_key_file_load_from_file(fc->kf, fc->filepath, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL) && g_key_file_has_group(fc->kf, "File Manager")) { fc->group = "File Manager"; return fc; } g_key_file_free(fc->kf); } g_free(fc->filepath); fc->filepath = NULL; fc->group = fm_path_to_str(path); G_LOCK(cache); fc->kf = fc_cache; return fc; } /** * fm_folder_config_close * @fc: a configuration descriptor * @error: (out) (allow-none): location to save error * * Unlocks the cache and releases any data related to @fc. * * Returns: %FALSE if any error happened on data save. * * Since: 1.2.0 */ gboolean fm_folder_config_close(FmFolderConfig *fc, GError **error) { gboolean ret = TRUE; if (fc->filepath) { if (fc->changed) { char *out; gsize len; out = g_key_file_to_data(fc->kf, &len, error); if (!out || !g_file_set_contents(fc->filepath, out, len, error)) ret = FALSE; g_free(out); } g_free(fc->filepath); g_key_file_free(fc->kf); } else { g_free(fc->group); G_UNLOCK(cache); if (fc->changed) fc_cache_changed = TRUE; } g_slice_free(FmFolderConfig, fc); return ret; } /** * fm_folder_config_is_empty * @fc: a configuration descriptor * * Checks if there is no data associated with the folder. * * Returns: %TRUE if the folder has no settings. * * Since: 1.2.0 */ gboolean fm_folder_config_is_empty(FmFolderConfig *fc) { return !g_key_file_has_group(fc->kf, fc->group); } /** * fm_folder_config_get_integer * @fc: a configuration descriptor * @key: a key to search * @val: (out): location to save the value * * Returns the value associated with @key as an integer. * * Returns: %TRUE if key was found and parsed succesfully. * * Since: 1.2.0 */ gboolean fm_folder_config_get_integer(FmFolderConfig *fc, const char *key, gint *val) { return fm_key_file_get_int(fc->kf, fc->group, key, val); } /** * fm_folder_config_get_uint64 * @fc: a configuration descriptor * @key: a key to search * @val: (out): location to save the value * * Returns the value associated with @key as an unsigned integer. * * Returns: %TRUE if key was found and value is an unsigned integer. * * Since: 1.2.0 */ gboolean fm_folder_config_get_uint64(FmFolderConfig *fc, const char *key, guint64 *val) { GError *error = NULL; #if GLIB_CHECK_VERSION(2, 26, 0) guint64 ret = g_key_file_get_uint64(fc->kf, fc->group, key, &error); #else gchar *s, *end; guint64 ret; s = g_key_file_get_value(fc->kf, fc->group, key, &error); #endif if (error) { g_error_free(error); return FALSE; } #if !GLIB_CHECK_VERSION(2, 26, 0) ret = g_ascii_strtoull(s, &end, 10); if (*s == '\0' || *end != '\0') { g_free(s); return FALSE; } g_free(s); #endif *val = ret; return TRUE; } /** * fm_folder_config_get_double * @fc: a configuration descriptor * @key: a key to search * @val: (out): location to save the value * * Returns the value associated with @key as a double. * * Returns: %TRUE if key was found and value can be parsed as double. * * Since: 1.2.0 */ gboolean fm_folder_config_get_double(FmFolderConfig *fc, const char *key, gdouble *val) { GError *error = NULL; gdouble ret = g_key_file_get_double(fc->kf, fc->group, key, &error); if (error) { g_error_free(error); return FALSE; } *val = ret; return TRUE; } /** * fm_folder_config_get_boolean * @fc: a configuration descriptor * @key: a key to search * @val: (out): location to save the value * * Returns the value associated with @key as a boolean. * * Returns: %TRUE if key was found and parsed succesfully. * * Since: 1.2.0 */ gboolean fm_folder_config_get_boolean(FmFolderConfig *fc, const char *key, gboolean *val) { return fm_key_file_get_bool(fc->kf, fc->group, key, val); } /** * fm_folder_config_get_string * @fc: a configuration descriptor * @key: a key to search * * Returns the value associated with @key as a string. This function * handles escape sequences like \s. * * Returns: a newly allocated string or %NULL if the specified key cannot be found. * * Since: 1.2.0 */ char *fm_folder_config_get_string(FmFolderConfig *fc, const char *key) { return g_key_file_get_string(fc->kf, fc->group, key, NULL); } /** * fm_folder_config_get_string_list * @fc: a configuration descriptor * @key: a key to search * @length: (out) (allow-none): location for the number of returned strings * * Returns the values associated with @key. If the specified key cannot * be found then returns %NULL. Returned data array should be freed with * g_strfreev() after usage. * * Returns: a %NULL-terminated string array. * * Since: 1.2.0 */ char **fm_folder_config_get_string_list(FmFolderConfig *fc, const char *key, gsize *length) { return g_key_file_get_string_list(fc->kf, fc->group, key, length, NULL); } /** * fm_folder_config_set_integer * @fc: a configuration descriptor * @key: a key to search * @val: data to set * * Associates integer @val with @key for given folder configuration. * * Since: 1.2.0 */ void fm_folder_config_set_integer(FmFolderConfig *fc, const char *key, gint val) { fc->changed = TRUE; g_key_file_set_integer(fc->kf, fc->group, key, val); } /** * fm_folder_config_set_uint64 * @fc: a configuration descriptor * @key: a key to search * @val: data to set * * Associates unsigned integer @val with @key for given folder configuration. * * Since: 1.2.0 */ void fm_folder_config_set_uint64(FmFolderConfig *fc, const char *key, guint64 val) { fc->changed = TRUE; #if GLIB_CHECK_VERSION(2, 26, 0) g_key_file_set_uint64(fc->kf, fc->group, key, val); #else gchar *result = g_strdup_printf("%" G_GUINT64_FORMAT, val); g_key_file_set_value(fc->kf, fc->group, key, result); g_free(result); #endif } /** * fm_folder_config_set_double * @fc: a configuration descriptor * @key: a key to search * @val: data to set * * Associates double @val with @key for given folder configuration. * * Since: 1.2.0 */ void fm_folder_config_set_double(FmFolderConfig *fc, const char *key, gdouble val) { fc->changed = TRUE; g_key_file_set_double(fc->kf, fc->group, key, val); } /** * fm_folder_config_set_boolean * @fc: a configuration descriptor * @key: a key to search * @val: data to set * * Associates boolean @val with @key for given folder configuration. * * Since: 1.2.0 */ void fm_folder_config_set_boolean(FmFolderConfig *fc, const char *key, gboolean val) { fc->changed = TRUE; g_key_file_set_boolean(fc->kf, fc->group, key, val); } /** * fm_folder_config_set_string * @fc: a configuration descriptor * @key: a key to search * @string: data to set * * Associates @string with @key for given folder configuration. This * function handles characters that need escaping, such as newlines. * * Since: 1.2.0 */ void fm_folder_config_set_string(FmFolderConfig *fc, const char *key, const char *string) { fc->changed = TRUE; g_key_file_set_string(fc->kf, fc->group, key, string); } /** * fm_folder_config_set_string_list * @fc: a configuration descriptor * @key: a key to search * @list: a string list to set * @length: number of elements in @list * * Associates NULL-terminated @list with @key for given folder configuration. * * Since: 1.2.0 */ void fm_folder_config_set_string_list(FmFolderConfig *fc, const char *key, const gchar * const list[], gsize length) { fc->changed = TRUE; g_key_file_set_string_list(fc->kf, fc->group, key, list, length); } /** * fm_folder_config_remove_key * @fc: a configuration descriptor * @key: a key to search * * Removes the key and associated data from the cache. * * Since: 1.2.0 */ void fm_folder_config_remove_key(FmFolderConfig *fc, const char *key) { fc->changed = TRUE; g_key_file_remove_key(fc->kf, fc->group, key, NULL); } /** * fm_folder_config_purge * @fc: a configuration descriptor * * Clears all the data for the folder from the configuration. * * Since: 1.2.0 */ void fm_folder_config_purge(FmFolderConfig *fc) { fc->changed = TRUE; g_key_file_remove_group(fc->kf, fc->group, NULL); } /** * fm_folder_config_save_cache * * Saves current data into the cache file. * * Since: 1.2.0 */ void fm_folder_config_save_cache(void) { char *out; char *path, *path2, *path3; GError *error = NULL; gsize len; G_LOCK(cache); /* if per-directory cache was changed since last invocation then save it */ if (fc_cache_changed && (out = g_key_file_to_data(fc_cache, &len, NULL))) { /* FIXME: create dir */ /* create temp file with settings */ path = g_build_filename(g_get_user_config_dir(), "libfm/dir-settings.conf", NULL); path2 = g_build_filename(g_get_user_config_dir(), "libfm/dir-settings.tmp", NULL); path3 = g_build_filename(g_get_user_config_dir(), "libfm/dir-settings.backup", NULL); /* do safe replace now, the file is important enough to be lost */ if (g_file_set_contents(path2, out, len, &error)) { /* backup old cache file */ g_unlink(path3); if (!g_file_test(path, G_FILE_TEST_EXISTS) || g_rename(path, path3) == 0) { /* rename temp file */ if (g_rename(path2, path) == 0) { /* success! remove the old cache file */ g_unlink(path3); /* reset the 'changed' flag */ fc_cache_changed = FALSE; } else g_warning("cannot rename %s to %s: %s", path2, path, g_strerror(errno)); } else g_warning("cannot rename %s to %s: %s", path, path3, g_strerror(errno)); } else { g_warning("cannot save %s: %s", path2, error->message); g_error_free(error); } g_free(path); g_free(path2); g_free(path3); g_free(out); } G_UNLOCK(cache); } void _fm_folder_config_finalize(void) { fm_folder_config_save_cache(); g_key_file_free(fc_cache); fc_cache = NULL; } void _fm_folder_config_init(void) { char *path = g_build_filename(g_get_user_config_dir(), "libfm/dir-settings.conf", NULL); fc_cache = g_key_file_new(); g_key_file_load_from_file(fc_cache, path, 0, NULL); g_free(path); } libfm-1.4.0/src/base/fm-folder-config.h000066400000000000000000000055641475513661000176170ustar00rootroot00000000000000/* * fm-folder-config.h * * This file is a part of the LibFM project. * * Copyright 2013 Andriy Grytsenko (LStranger) * * 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 */ #ifndef __FM_FOLDER_CONFIG_H__ #define __FM_FOLDER_CONFIG_H__ 1 #include #include "fm-path.h" G_BEGIN_DECLS typedef struct _FmFolderConfig FmFolderConfig; FmFolderConfig *fm_folder_config_open(FmPath *path); gboolean fm_folder_config_close(FmFolderConfig *fc, GError **error); gboolean fm_folder_config_is_empty(FmFolderConfig *fc); gboolean fm_folder_config_get_integer(FmFolderConfig *fc, const char *key, gint *val); gboolean fm_folder_config_get_uint64(FmFolderConfig *fc, const char *key, guint64 *val); gboolean fm_folder_config_get_double(FmFolderConfig *fc, const char *key, gdouble *val); gboolean fm_folder_config_get_boolean(FmFolderConfig *fc, const char *key, gboolean *val); char *fm_folder_config_get_string(FmFolderConfig *fc, const char *key); char **fm_folder_config_get_string_list(FmFolderConfig *fc, const char *key, gsize *length); void fm_folder_config_set_integer(FmFolderConfig *fc, const char *key, gint val); void fm_folder_config_set_uint64(FmFolderConfig *fc, const char *key, guint64 val); void fm_folder_config_set_double(FmFolderConfig *fc, const char *key, gdouble val); void fm_folder_config_set_boolean(FmFolderConfig *fc, const char *key, gboolean val); void fm_folder_config_set_string(FmFolderConfig *fc, const char *key, const char *string); void fm_folder_config_set_string_list(FmFolderConfig *fc, const char *key, const gchar * const list[], gsize length); void fm_folder_config_remove_key(FmFolderConfig *fc, const char *key); void fm_folder_config_purge(FmFolderConfig *fc); void fm_folder_config_save_cache(void); void _fm_folder_config_init(void); void _fm_folder_config_finalize(void); G_END_DECLS #endif libfm-1.4.0/src/base/fm-folder.c000066400000000000000000001511141475513661000163400ustar00rootroot00000000000000/* * fm-folder.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2012-2016 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-folder * @short_description: Folder loading and monitoring. * @title: FmFolder * * @include: libfm/fm.h * * The #FmFolder object allows to open and monitor items of some directory * (either local or remote), i.e. files and directories, to have fast access * to their info and to info of the directory itself as well. */ #include "fm-folder.h" #include "fm-monitor.h" #include "fm-marshal.h" #include "fm-dummy-monitor.h" #include "fm-file.h" #include "fm-config.h" #include enum { FILES_ADDED, FILES_REMOVED, FILES_CHANGED, START_LOADING, FINISH_LOADING, UNMOUNT, CHANGED, REMOVED, CONTENT_CHANGED, FS_INFO, ERROR, N_SIGNALS }; struct _FmFolder { GObject parent; /**/ FmPath* dir_path; GFile* gf; GFileMonitor* mon; FmDirListJob* dirlist_job; FmFileInfo* dir_fi; FmFileInfoList* files; /* for file monitor */ guint idle_handler; GSList* files_to_add; GSList* files_to_update; GSList* files_to_del; GSList* pending_jobs; gboolean pending_change_notify; gboolean filesystem_info_pending; gboolean wants_incremental; guint idle_reload_handler; gboolean stop_emission; /* don't set it 1 bit to not lock other bits */ /* filesystem info - set in query thread, read in main */ guint64 fs_total_size; guint64 fs_free_size; GCancellable* fs_size_cancellable; gboolean has_fs_info : 1; gboolean fs_info_not_avail : 1; gboolean defer_content_test : 1; }; static void fm_folder_dispose(GObject *object); static void fm_folder_finalize(GObject *object); static void fm_folder_content_changed(FmFolder* folder); static GList* _fm_folder_get_file_by_path(FmFolder* folder, FmPath *path); G_DEFINE_TYPE(FmFolder, fm_folder, G_TYPE_OBJECT); static guint signals[N_SIGNALS]; static GHashTable* hash = NULL; static int hash_uses = 0; static GVolumeMonitor* volume_monitor = NULL; static void on_mount_added(GVolumeMonitor* vm, GMount* mount, gpointer user_data); static void on_mount_removed(GVolumeMonitor* vm, GMount* mount, gpointer user_data); /* used for on_query_filesystem_info_finished() to lock folder */ G_LOCK_DEFINE_STATIC(query); /* protects hash access */ G_LOCK_DEFINE_STATIC(hash); /* protects access to files_to_add, files_to_update and files_to_del */ G_LOCK_DEFINE_STATIC(lists); static void fm_folder_class_init(FmFolderClass *klass) { GObjectClass *g_object_class; FmFolderClass* folder_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_folder_dispose; g_object_class->finalize = fm_folder_finalize; fm_folder_parent_class = (GObjectClass*)g_type_class_peek(G_TYPE_OBJECT); folder_class = FM_FOLDER_CLASS(klass); folder_class->content_changed = fm_folder_content_changed; /** * FmFolder::files-added: * @folder: the monitored directory * @list: #GList of newly added #FmFileInfo * * The #FmFolder::files-added signal is emitted when there is some * new file created in the directory. * * Since: 0.1.0 */ signals[ FILES_ADDED ] = g_signal_new ( "files-added", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, files_added ), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER ); /** * FmFolder::files-removed: * @folder: the monitored directory * @list: #GList of #FmFileInfo that were deleted * * The #FmFolder::files-removed signal is emitted when some file was * deleted from the directory. * * Since: 0.1.0 */ signals[ FILES_REMOVED ] = g_signal_new ( "files-removed", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, files_removed ), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER ); /** * FmFolder::files-changed: * @folder: the monitored directory * @list: #GList of #FmFileInfo that were changed * * The #FmFolder::files-changed signal is emitted when some file in * the directory was changed. * * Since: 0.1.0 */ signals[ FILES_CHANGED ] = g_signal_new ( "files-changed", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, files_changed ), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER ); /** * FmFolder::start-loading: * @folder: the monitored directory * * The #FmFolder::start-loading signal is emitted when the folder is * about to be reloaded. * * Since: 1.0.0 */ signals[START_LOADING] = g_signal_new ( "start-loading", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET( FmFolderClass, start_loading), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::finish-loading: * @folder: the monitored directory * * The #FmFolder::finish-loading signal is emitted when the content * of the folder is loaded. * This signal may be emitted more than once and can be induced * by calling fm_folder_reload(). * * Since: 1.0.0 */ signals[ FINISH_LOADING ] = g_signal_new ( "finish-loading", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, finish_loading ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::unmount: * @folder: the monitored directory * * The #FmFolder::unmount signal is emitted when the folder was unmounted. * * Since: 0.1.1 */ signals[ UNMOUNT ] = g_signal_new ( "unmount", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, unmount ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::changed: * @folder: the monitored directory * * The #FmFolder::changed signal is emitted when the folder itself * was changed. * * Since: 0.1.16 */ signals[ CHANGED ] = g_signal_new ( "changed", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, changed ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::removed: * @folder: the monitored directory * * The #FmFolder::removed signal is emitted when the folder itself * was deleted. * * Since: 0.1.16 */ signals[ REMOVED ] = g_signal_new ( "removed", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, removed ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::content-changed: * @folder: the monitored directory * * The #FmFolder::content-changed signal is emitted when content * of the folder is changed (some files are added, removed, or changed). * * Since: 0.1.16 */ signals[ CONTENT_CHANGED ] = g_signal_new ( "content-changed", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, content_changed ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::fs-info: * @folder: the monitored directory * * The #FmFolder::fs-info signal is emitted when filesystem * information is available. * * Since: 0.1.16 */ signals[ FS_INFO ] = g_signal_new ( "fs-info", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFolderClass, fs_info ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolder::error: * @folder: the monitored directory * @error: error descriptor * @severity: #FmJobErrorSeverity of the error * * The #FmFolder::error signal is emitted when some error happens. A case * if more than one handler is connected to this signal is ambiguous. * * Return value: #FmJobErrorAction that should be performed on that error. * * Since: 0.1.1 */ signals[ERROR] = g_signal_new( "error", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET ( FmFolderClass, error ), NULL, NULL, #if GLIB_CHECK_VERSION(2,26,0) fm_marshal_UINT__BOXED_UINT, G_TYPE_UINT, 2, G_TYPE_ERROR, G_TYPE_UINT ); #else fm_marshal_INT__POINTER_INT, G_TYPE_INT, 2, G_TYPE_POINTER, G_TYPE_INT ); #endif } static void fm_folder_init(FmFolder *folder) { folder->files = fm_file_info_list_new(); G_LOCK(hash); if (G_UNLIKELY(hash_uses == 0)) { hash = g_hash_table_new((GHashFunc)fm_path_hash, (GEqualFunc)fm_path_equal); volume_monitor = g_volume_monitor_get(); if (G_LIKELY(volume_monitor)) { g_signal_connect(volume_monitor, "mount-added", G_CALLBACK(on_mount_added), NULL); g_signal_connect(volume_monitor, "mount-removed", G_CALLBACK(on_mount_removed), NULL); } } hash_uses++; G_UNLOCK(hash); } static gboolean on_idle_reload(FmFolder* folder) { /* check if folder still exists */ if(g_source_is_destroyed(g_main_current_source())) { /* FIXME: it should be impossible, folder cannot be disposed at this point */ return FALSE; } fm_folder_reload(folder); G_LOCK(query); folder->idle_reload_handler = 0; G_UNLOCK(query); g_object_unref(folder); return FALSE; } static void queue_reload(FmFolder* folder) { G_LOCK(query); if(!folder->idle_reload_handler) folder->idle_reload_handler = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc)on_idle_reload, g_object_ref(folder), NULL); G_UNLOCK(query); } static void on_file_info_job_finished(FmFileInfoJob* job, FmFolder* folder) { GList* l; GSList* files_to_add = NULL; GSList* files_to_update = NULL; if(!fm_job_is_cancelled(FM_JOB(job))) { gboolean need_added = g_signal_has_handler_pending(folder, signals[FILES_ADDED], 0, TRUE); gboolean need_changed = g_signal_has_handler_pending(folder, signals[FILES_CHANGED], 0, TRUE); for(l=fm_file_info_list_peek_head_link(job->file_infos);l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; FmPath* path = fm_file_info_get_path(fi); GList* l2; if (fm_folder_is_valid(folder) && path == fm_file_info_get_path(folder->dir_fi)) /* update for folder itself, also see FIXME below! */ fm_file_info_update(folder->dir_fi, fi); else if ((l2 = _fm_folder_get_file_by_path(folder, path))) /* the file is already in the folder, update */ { FmFileInfo* fi2 = (FmFileInfo*)l2->data; /* FIXME: will fm_file_info_update here cause problems? * the file info might be referenced by others, too. * we're mofifying an object referenced by others. * we should redesign the API, or document this clearly * in future API doc. */ fm_file_info_update(fi2, fi); if(need_changed) files_to_update = g_slist_prepend(files_to_update, fi2); } else { if(need_added) files_to_add = g_slist_prepend(files_to_add, fi); fm_file_info_list_push_tail(folder->files, fi); } } if(files_to_add) { g_signal_emit(folder, signals[FILES_ADDED], 0, files_to_add); g_slist_free(files_to_add); } if(files_to_update) { g_signal_emit(folder, signals[FILES_CHANGED], 0, files_to_update); g_slist_free(files_to_update); } g_signal_emit(folder, signals[CONTENT_CHANGED], 0); } folder->pending_jobs = g_slist_remove(folder->pending_jobs, job); g_object_unref(job); } static gboolean on_idle(FmFolder* folder) { GSList* l; FmFileInfoJob* job = NULL; GSList *files_to_add, *files_to_del, *files_to_update; gboolean stop_emission; /* check if folder still exists */ if(g_source_is_destroyed(g_main_current_source())) { /* it should be impossible, folder cannot be disposed at this point */ return FALSE; } G_LOCK(lists); folder->idle_handler = 0; stop_emission = folder->stop_emission; if (!stop_emission) { files_to_add = folder->files_to_add; folder->files_to_add = NULL; files_to_del = folder->files_to_del; folder->files_to_del = NULL; files_to_update = folder->files_to_update; folder->files_to_update = NULL; } G_UNLOCK(lists); /* if we were asked to block updates let delay it for now */ if (stop_emission) goto _finish; /* g_debug("folder: on_idle() started"); */ if(files_to_update || files_to_add) job = (FmFileInfoJob*)fm_file_info_job_new(NULL, 0); if(files_to_update) { for(l=files_to_update; l; l = l->next) { FmPath *path = l->data; fm_file_info_job_add(job, path); fm_path_unref(path); } g_slist_free(files_to_update); } if(files_to_add) { for(l=files_to_add;l;l=l->next) { FmPath *path = l->data; fm_file_info_job_add(job, path); fm_path_unref(path); } g_slist_free(files_to_add); } if(job) { g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), folder); folder->pending_jobs = g_slist_prepend(folder->pending_jobs, job); if (!fm_job_run_async(FM_JOB(job))) { folder->pending_jobs = g_slist_remove(folder->pending_jobs, job); g_object_unref(job); g_critical("failed to start folder update job"); } /* the job will be freed automatically in on_file_info_job_finished() */ } if(files_to_del) { GSList* ll; for(ll=files_to_del;ll;ll=ll->next) { GList* l= (GList*)ll->data; ll->data = l->data; fm_file_info_list_delete_link_nounref(folder->files, l); } g_signal_emit(folder, signals[FILES_REMOVED], 0, files_to_del); g_slist_foreach(files_to_del, (GFunc)fm_file_info_unref, NULL); g_slist_free(files_to_del); g_signal_emit(folder, signals[CONTENT_CHANGED], 0); } if(folder->pending_change_notify) { g_signal_emit(folder, signals[CHANGED], 0); /* update volume info */ fm_folder_query_filesystem_info(folder); folder->pending_change_notify = FALSE; } G_LOCK(query); if(folder->filesystem_info_pending) { folder->filesystem_info_pending = FALSE; G_UNLOCK(query); g_signal_emit(folder, signals[FS_INFO], 0); } else G_UNLOCK(query); /* g_debug("folder: on_idle() done"); */ _finish: /* release reference borrowed in queue_update() */ g_object_unref(folder); return FALSE; } /* should be called only with G_LOCK(lists) on! */ static inline void queue_update(FmFolder *folder) { if (!folder->idle_handler) /* borrow reference on folder */ folder->idle_handler = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc)on_idle, g_object_ref(folder), NULL); } /* returns TRUE if reference was taken from path */ gboolean _fm_folder_event_file_added(FmFolder *folder, FmPath *path) { gboolean added = TRUE; G_LOCK(lists); /* make sure that the file is not already queued for addition. */ if(!g_slist_find(folder->files_to_add, path)) { GList *l = _fm_folder_get_file_by_path(folder, path); if(!l) /* it's new file */ { /* add the file name to queue for addition. */ folder->files_to_add = g_slist_append(folder->files_to_add, path); } else if(g_slist_find(folder->files_to_update, path)) { /* file already queued for update, don't duplicate */ added = FALSE; } /* if we already have the file in FmFolder, update the existing one instead. */ else { /* bug #3591771: 'ln -fns . test' leave no file visible in folder. If it is queued for deletion then cancel that operation */ folder->files_to_del = g_slist_remove(folder->files_to_del, l); /* update the existing item. */ folder->files_to_update = g_slist_append(folder->files_to_update, path); } } else /* file already queued for adding, don't duplicate */ added = FALSE; if (added) queue_update(folder); G_UNLOCK(lists); return added; } gboolean _fm_folder_event_file_changed(FmFolder *folder, FmPath *path) { gboolean added; G_LOCK(lists); /* make sure that the file is not already queued for changes or * it's already queued for addition. */ if(!g_slist_find(folder->files_to_update, path) && !g_slist_find(folder->files_to_add, path) && _fm_folder_get_file_by_path(folder, path)) /* ensure it is our file */ { folder->files_to_update = g_slist_append(folder->files_to_update, path); added = TRUE; queue_update(folder); } else { added = FALSE; } G_UNLOCK(lists); return added; } void _fm_folder_event_file_deleted(FmFolder *folder, FmPath *path) { GList *l; GSList *sl; G_LOCK(lists); l = _fm_folder_get_file_by_path(folder, path); if(l && !g_slist_find(folder->files_to_del, l) ) folder->files_to_del = g_slist_prepend(folder->files_to_del, l); /* if the file is already queued for addition or update, that operation will be just a waste, therefore cancel it right now */ sl = g_slist_find(folder->files_to_update, path); if(sl) { folder->files_to_update = g_slist_delete_link(folder->files_to_update, sl); } else if((sl = g_slist_find(folder->files_to_add, path))) { folder->files_to_add = g_slist_delete_link(folder->files_to_add, sl); } else path = NULL; queue_update(folder); G_UNLOCK(lists); if (path != NULL) fm_path_unref(path); /* link was freed above so we should unref it */ } static void on_folder_changed(GFileMonitor* mon, GFile* gf, GFile* other, GFileMonitorEvent evt, FmFolder* folder) { FmPath* path; /* const char* names[]={ "G_FILE_MONITOR_EVENT_CHANGED", "G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT", "G_FILE_MONITOR_EVENT_DELETED", "G_FILE_MONITOR_EVENT_CREATED", "G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED", "G_FILE_MONITOR_EVENT_PRE_UNMOUNT", "G_FILE_MONITOR_EVENT_UNMOUNTED" }; */ /* char *name = g_file_get_basename(gf); g_debug("folder: %p, file %s event: %s", folder, name, names[evt]); g_free(name); */ if(g_file_equal(gf, folder->gf)) { /* g_debug("event of the folder itself: %d", evt); */ /* NOTE: g_object_ref() should be used here. * Sometimes the folder will be freed by signal handlers * during emission of the change notifications. */ g_object_ref(folder); switch(evt) { case G_FILE_MONITOR_EVENT_PRE_UNMOUNT: /* g_debug("folder is going to be unmounted"); */ break; case G_FILE_MONITOR_EVENT_UNMOUNTED: g_signal_emit(folder, signals[UNMOUNT], 0); /* g_debug("folder is unmounted"); */ queue_reload(folder); break; case G_FILE_MONITOR_EVENT_DELETED: g_signal_emit(folder, signals[REMOVED], 0); /* g_debug("folder is deleted"); */ break; case G_FILE_MONITOR_EVENT_CREATED: queue_reload(folder); break; case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: case G_FILE_MONITOR_EVENT_CHANGED: folder->pending_change_notify = TRUE; G_LOCK(lists); if (g_slist_find(folder->files_to_update, folder->dir_path) == NULL) { folder->files_to_update = g_slist_append(folder->files_to_update, fm_path_ref(folder->dir_path)); queue_update(folder); } G_UNLOCK(lists); /* g_debug("folder is changed"); */ break; #if GLIB_CHECK_VERSION(2,24,0) case G_FILE_MONITOR_EVENT_MOVED: #endif case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: ; } g_object_unref(folder); return; } path = fm_path_new_for_gfile(gf); /* NOTE: sometimes, for unknown reasons, GFileMonitor gives us the * same event of the same file for multiple times. So we need to * check for duplications ourselves here. */ switch(evt) { case G_FILE_MONITOR_EVENT_CREATED: if (!_fm_folder_event_file_added(folder, path)) fm_path_unref(path); break; case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: case G_FILE_MONITOR_EVENT_CHANGED: if (!_fm_folder_event_file_changed(folder, path)) fm_path_unref(path); break; case G_FILE_MONITOR_EVENT_DELETED: _fm_folder_event_file_deleted(folder, path); fm_path_unref(path); break; default: /* g_debug("folder %p %s event: %s", folder, name, names[evt]); */ fm_path_unref(path); return; } G_LOCK(lists); queue_update(folder); G_UNLOCK(lists); } static void on_dirlist_job_finished(FmDirListJob* job, FmFolder* folder) { GSList* files = NULL; /* actually manually disconnecting from 'finished' signal is not * needed since the signal is only emit once, and later the job * object will be distroyed very soon. */ /* g_signal_handlers_disconnect_by_func(job, on_dirlist_job_finished, folder); */ if(!fm_job_is_cancelled(FM_JOB(job)) && !folder->wants_incremental) { GList* l; for(l = fm_file_info_list_peek_head_link(job->files); l; l=l->next) { FmFileInfo* inf = (FmFileInfo*)l->data; files = g_slist_prepend(files, inf); fm_file_info_list_push_tail(folder->files, inf); } if(G_LIKELY(files)) { GSList *l; G_LOCK(lists); if (folder->defer_content_test && fm_path_is_native(folder->dir_path)) /* we got only basic info on content, schedule update it now */ for (l = files; l; l = l->next) folder->files_to_update = g_slist_prepend(folder->files_to_update, fm_path_ref(fm_file_info_get_path(l->data))); G_UNLOCK(lists); g_signal_emit(folder, signals[FILES_ADDED], 0, files); g_slist_free(files); } if(job->dir_fi) folder->dir_fi = fm_file_info_ref(job->dir_fi); /* Some new files are created while FmDirListJob is loading the folder. */ G_LOCK(lists); if(G_UNLIKELY(folder->files_to_add)) { /* This should be a very rare case. Could this happen? */ GSList* l; for(l = folder->files_to_add; l;) { FmPath *path = l->data; GSList* next = l->next; if(_fm_folder_get_file_by_path(folder, path)) { /* we already have the file. remove it from files_to_add, * and put it in files_to_update instead. * No strdup for name is needed here. We steal * the string from files_to_add.*/ folder->files_to_update = g_slist_prepend(folder->files_to_update, path); folder->files_to_add = g_slist_delete_link(folder->files_to_add, l); } l = next; } } G_UNLOCK(lists); } else if(!folder->dir_fi && job->dir_fi) /* we may need dir_fi for incremental folders too */ folder->dir_fi = fm_file_info_ref(job->dir_fi); g_object_unref(folder->dirlist_job); folder->dirlist_job = NULL; g_object_ref(folder); g_signal_emit(folder, signals[FINISH_LOADING], 0); g_object_unref(folder); } static void on_dirlist_job_files_found(FmDirListJob* job, GSList* files, gpointer user_data) { FmFolder* folder = FM_FOLDER(user_data); GSList* l; for(l = files; l; l = l->next) { FmFileInfo* file = FM_FILE_INFO(l->data); fm_file_info_list_push_tail(folder->files, file); } if (G_UNLIKELY(!folder->dir_fi && job->dir_fi)) /* we may want info while folder is still loading */ folder->dir_fi = fm_file_info_ref(job->dir_fi); g_signal_emit(folder, signals[FILES_ADDED], 0, files); } static FmJobErrorAction on_dirlist_job_error(FmDirListJob* job, GError* err, FmJobErrorSeverity severity, FmFolder* folder) { guint ret; /* it's possible that some signal handlers tries to free the folder * when errors occurs, so let's g_object_ref here. */ g_object_ref(folder); g_signal_emit(folder, signals[ERROR], 0, err, (guint)severity, &ret); g_object_unref(folder); return ret; } static FmFolder* fm_folder_new_internal(FmPath* path, GFile* gf) { FmFolder* folder = (FmFolder*)g_object_new(FM_TYPE_FOLDER, NULL); folder->dir_path = fm_path_ref(path); folder->gf = (GFile*)g_object_ref(gf); folder->wants_incremental = fm_file_wants_incremental(gf); fm_folder_reload(folder); return folder; } /* NB: increases reference on returned object */ static FmFolder* fm_folder_get_internal(FmPath* path, GFile* gf) { FmFolder* folder; /* FIXME: should we provide a generic FmPath cache in fm-path.c * to associate all kinds of data structures with FmPaths? */ G_LOCK(hash); folder = hash ? (FmFolder*)g_hash_table_lookup(hash, path) : NULL; if( G_UNLIKELY(!folder) ) { GFile* _gf = NULL; G_UNLOCK(hash); if(!gf) _gf = gf = fm_path_to_gfile(path); folder = fm_folder_new_internal(path, gf); if(_gf) g_object_unref(_gf); G_LOCK(hash); g_hash_table_insert(hash, folder->dir_path, folder); } else g_object_ref(folder); G_UNLOCK(hash); return folder; } static void free_dirlist_job(FmFolder* folder) { if(folder->wants_incremental) g_signal_handlers_disconnect_by_func(folder->dirlist_job, on_dirlist_job_files_found, folder); g_signal_handlers_disconnect_by_func(folder->dirlist_job, on_dirlist_job_finished, folder); g_signal_handlers_disconnect_by_func(folder->dirlist_job, on_dirlist_job_error, folder); fm_job_cancel(FM_JOB(folder->dirlist_job)); g_object_unref(folder->dirlist_job); folder->dirlist_job = NULL; } static void fm_folder_dispose(GObject *object) { FmFolder *folder; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_FOLDER(object)); /* g_debug("fm_folder_dispose"); */ folder = (FmFolder*)object; if(folder->dirlist_job) free_dirlist_job(folder); if(folder->pending_jobs) { GSList* l; for(l = folder->pending_jobs;l;l=l->next) { FmJob* job = FM_JOB(l->data); g_signal_handlers_disconnect_by_func(job, on_file_info_job_finished, folder); fm_job_cancel(job); g_object_unref(job); } g_slist_free(folder->pending_jobs); folder->pending_jobs = NULL; } if(folder->mon) { g_signal_handlers_disconnect_by_func(folder->mon, on_folder_changed, folder); g_object_unref(folder->mon); folder->mon = NULL; } G_LOCK(query); if(folder->idle_reload_handler) { /* FIXME: it should be impossible, folder should be referenced if handler added */ g_source_remove(folder->idle_reload_handler); folder->idle_reload_handler = 0; } if(folder->fs_size_cancellable) { g_cancellable_cancel(folder->fs_size_cancellable); g_object_unref(folder->fs_size_cancellable); folder->fs_size_cancellable = NULL; } G_UNLOCK(query); G_LOCK(lists); if(folder->idle_handler) { /* FIXME: it should be impossible, folder should be referenced if handler added */ g_source_remove(folder->idle_handler); folder->idle_handler = 0; if(folder->files_to_add) { g_slist_foreach(folder->files_to_add, (GFunc)fm_path_unref, NULL); g_slist_free(folder->files_to_add); folder->files_to_add = NULL; } if(folder->files_to_update) { g_slist_foreach(folder->files_to_update, (GFunc)fm_path_unref, NULL); g_slist_free(folder->files_to_update); folder->files_to_update = NULL; } if(folder->files_to_del) { g_slist_free(folder->files_to_del); folder->files_to_del = NULL; } } G_UNLOCK(lists); /* remove from hash table */ if(folder->dir_path) { G_LOCK(hash); g_hash_table_remove(hash, folder->dir_path); G_UNLOCK(hash); fm_path_unref(folder->dir_path); folder->dir_path = NULL; } if(folder->dir_fi) { fm_file_info_unref(folder->dir_fi); folder->dir_fi = NULL; } if(folder->gf) { g_object_unref(folder->gf); folder->gf = NULL; } if(folder->files) { fm_file_info_list_unref(folder->files); folder->files = NULL; } (* G_OBJECT_CLASS(fm_folder_parent_class)->dispose)(object); } static void fm_folder_finalize(GObject *object) { G_LOCK(hash); hash_uses--; if (G_UNLIKELY(hash_uses == 0)) { g_hash_table_destroy(hash); hash = NULL; if(volume_monitor) { g_signal_handlers_disconnect_by_func(volume_monitor, on_mount_added, NULL); g_signal_handlers_disconnect_by_func(volume_monitor, on_mount_removed, NULL); g_object_unref(volume_monitor); volume_monitor = NULL; } } G_UNLOCK(hash); (* G_OBJECT_CLASS(fm_folder_parent_class)->finalize)(object); } /** * fm_folder_from_gfile * @gf: #GFile file descriptor * * Retrieves a folder corresponding to @gf. Returned data may be freshly * created or already loaded. Caller should call g_object_unref() on the * returned data after usage. * * Before 1.0.0 this call had name fm_folder_get_for_gfile. * * Returns: (transfer full): #FmFolder corresponding to @gf. * * Since: 0.1.1 */ FmFolder* fm_folder_from_gfile(GFile* gf) { FmPath* path = fm_path_new_for_gfile(gf); FmFolder* folder = fm_folder_get_internal(path, gf); fm_path_unref(path); return folder; } /** * fm_folder_from_path_name * @path: POSIX path to the folder * * Retrieves a folder corresponding to @path. Returned data may be freshly * created or already loaded. Caller should call g_object_unref() on the * returned data after usage. * * Before 1.0.0 this call had name fm_folder_get_for_path_name. * * Returns: (transfer full): #FmFolder corresponding to @path. * * Since: 0.1.0 */ FmFolder* fm_folder_from_path_name(const char* path) { /* it is very likely the GFile will be required and since creation of new GFile is much cheaper than fm_path_to_gfile() let make it */ GFile* gf = g_file_new_for_path(path); FmPath* fm_path = fm_path_new_for_path(path); FmFolder* folder = fm_folder_get_internal(fm_path, gf); g_object_unref(gf); fm_path_unref(fm_path); return folder; } /** * fm_folder_from_uri * @uri: URI for the folder * * Retrieves a folder corresponding to @uri. Returned data may be freshly * created or already loaded. Caller should call g_object_unref() on the * returned data after usage. * * Before 1.0.0 this call had name fm_folder_get_for_uri. * * Returns: (transfer full): #FmFolder corresponding to @uri. * * Since: 0.1.0 */ FmFolder* fm_folder_from_uri (const char* uri) { /* it is very likely the GFile will be required and since creation of new GFile is much cheaper than fm_path_to_gfile() let make it */ GFile* gf = fm_file_new_for_uri(uri); FmPath* path = fm_path_new_for_uri(uri); FmFolder* folder = fm_folder_get_internal(path, gf); g_object_unref(gf); fm_path_unref(path); return folder; } /** * fm_folder_reload * @folder: folder to be reloaded * * Causes to retrieve all data for the @folder as if folder was freshly * opened. * * Since: 0.1.1 */ void fm_folder_reload(FmFolder* folder) { GError* err = NULL; /* Tell the world that we're about to reload the folder. * It might be a good idea for users of the folder to disconnect * from the folder temporarily and reconnect to it again after * the folder complete the loading. This might reduce some * unnecessary signal handling and UI updates. */ g_signal_emit(folder, signals[START_LOADING], 0); if(folder->dir_fi) { /* we need to reload folde info. */ fm_file_info_unref(folder->dir_fi); folder->dir_fi = NULL; } /* clear all update-lists now, see SF bug #919 - if update comes before listing job is finished, a duplicate may be created in the folder */ if (folder->idle_handler) { g_source_remove(folder->idle_handler); folder->idle_handler = 0; if (folder->files_to_add) { g_slist_foreach(folder->files_to_add, (GFunc)fm_path_unref, NULL); g_slist_free(folder->files_to_add); folder->files_to_add = NULL; } if (folder->files_to_update) { g_slist_foreach(folder->files_to_update, (GFunc)fm_path_unref, NULL); g_slist_free(folder->files_to_update); folder->files_to_update = NULL; } if (folder->files_to_del) { g_slist_free(folder->files_to_del); folder->files_to_del = NULL; } } /* remove all items and re-run a dir list job. */ GList* l = fm_file_info_list_peek_head_link(folder->files); /* cancel running dir listing job if there is any. */ if(folder->dirlist_job) free_dirlist_job(folder); /* remove all existing files */ if(l) { if(g_signal_has_handler_pending(folder, signals[FILES_REMOVED], 0, TRUE)) { /* need to emit signal of removal */ GSList* files_to_del = NULL; for(;l;l=l->next) files_to_del = g_slist_prepend(files_to_del, (FmFileInfo*)l->data); g_signal_emit(folder, signals[FILES_REMOVED], 0, files_to_del); g_slist_free(files_to_del); } fm_file_info_list_clear(folder->files); /* fm_file_info_unref will be invoked. */ } /* also re-create a new file monitor */ if(folder->mon) { g_signal_handlers_disconnect_by_func(folder->mon, on_folder_changed, folder); g_object_unref(folder->mon); } folder->mon = fm_monitor_directory(folder->gf, &err); if(folder->mon) { g_signal_connect(folder->mon, "changed", G_CALLBACK(on_folder_changed), folder); } else { g_debug("file monitor cannot be created: %s", err->message); g_error_free(err); folder->mon = NULL; } g_signal_emit(folder, signals[CONTENT_CHANGED], 0); /* run a new dir listing job */ folder->defer_content_test = fm_config->defer_content_test; folder->dirlist_job = fm_dir_list_job_new2(folder->dir_path, folder->defer_content_test ? FM_DIR_LIST_JOB_FAST : FM_DIR_LIST_JOB_DETAILED); g_signal_connect(folder->dirlist_job, "finished", G_CALLBACK(on_dirlist_job_finished), folder); if(folder->wants_incremental) g_signal_connect(folder->dirlist_job, "files-found", G_CALLBACK(on_dirlist_job_files_found), folder); fm_dir_list_job_set_incremental(folder->dirlist_job, folder->wants_incremental); g_signal_connect(folder->dirlist_job, "error", G_CALLBACK(on_dirlist_job_error), folder); if (!fm_job_run_async(FM_JOB(folder->dirlist_job))) { folder->dirlist_job = NULL; g_object_unref(folder->dirlist_job); g_critical("failed to start directory listing job for the folder"); } /* also reload filesystem info. * FIXME: is this needed? */ fm_folder_query_filesystem_info(folder); } /** * fm_folder_get_files * @folder: folder to retrieve file list * * Retrieves list of currently known files and subdirectories in the * @folder. Returned list is owned by #FmFolder and should be not modified * by caller. If caller wants to keep a reference to the returned list it * should do fm_file_info_list_ref() on the returned data. * * Before 1.0.0 this call had name fm_folder_get. * * Returns: (transfer none): list of items that @folder currently contains. * * Since: 0.1.1 */ FmFileInfoList* fm_folder_get_files (FmFolder* folder) { return folder->files; } /** * fm_folder_is_empty * @folder: folder to test * * Checks if folder has no files or subdirectories. * * Returns: %TRUE if folder is empty. * * Since: 1.0.0 */ gboolean fm_folder_is_empty(FmFolder* folder) { return fm_file_info_list_is_empty(folder->files); } /** * fm_folder_get_info * @folder: folder to retrieve info * * Retrieves #FmFileInfo data about the folder itself. Returned data is * owned by #FmFolder and should be not modified or freed by caller. * * Returns: (transfer none): info descriptor of the @folder. * * Since: 1.0.0 */ FmFileInfo* fm_folder_get_info(FmFolder* folder) { return folder->dir_fi; } /** * fm_folder_get_path * @folder: folder to retrieve path * * Retrieves path of the folder. Returned data is owned by #FmFolder and * should be not modified or freed by caller. * * Returns: (transfer none): path of the folder. * * Since: 1.0.0 */ FmPath* fm_folder_get_path(FmFolder* folder) { return folder->dir_path; } static GList* _fm_folder_get_file_by_path(FmFolder* folder, FmPath *path) { GList* l = fm_file_info_list_peek_head_link(folder->files); for(;l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; FmPath* lpath = fm_file_info_get_path(fi); if(lpath == path) return l; } return NULL; } /** * fm_folder_get_file_by_name * @folder: folder to search * @name: basename of file in @folder * * Tries to find a file with basename @name in the @folder. Returned data * is owned by #FmFolder and should be not freed by caller. * * Returns: (transfer none): info descriptor of file or %NULL if no file was found. * * Since: 0.1.16 */ FmFileInfo* fm_folder_get_file_by_name(FmFolder* folder, const char* name) { FmPath *path = fm_path_new_child(folder->dir_path, name); GList* l = _fm_folder_get_file_by_path(folder, path); fm_path_unref(path); return l ? (FmFileInfo*)l->data : NULL; } /** * fm_folder_from_path * @path: path descriptor for the folder * * Retrieves a folder corresponding to @path. Returned data may be freshly * created or already loaded. Caller should call g_object_unref() on the * returned data after usage. * * Before 1.0.0 this call had name fm_folder_get. * * Returns: (transfer full): #FmFolder corresponding to @path. * * Since: 0.1.1 */ FmFolder* fm_folder_from_path(FmPath* path) { return fm_folder_get_internal(path, NULL); } /** * fm_folder_is_loaded * @folder: folder to test * * Checks if all data for @folder is completely loaded. * * Before 1.0.0 this call had name fm_folder_get_is_loaded. * * Returns: %TRUE is loading of folder is already completed. * * Since: 0.1.16 */ gboolean fm_folder_is_loaded(FmFolder* folder) { return (folder->dirlist_job == NULL); } /** * fm_folder_is_valid * @folder: folder to test * * Checks if directory described by @folder exists. * * Returns: %TRUE if @folder describes a valid existing directory. * * Since: 1.0.0 */ gboolean fm_folder_is_valid(FmFolder* folder) { return (folder->dir_fi != NULL); } /** * fm_folder_is_incremental * @folder: folder to test * * Checks if a folder is incrementally loaded. * After an FmFolder object is obtained from calling fm_folder_from_path(), * if it's not yet loaded, it begins loading the content of the folder * and emits "start-loading" signal. Most of the time, the info of the * files in the folder becomes available only after the folder is fully * loaded. That means, after the "finish-loading" signal is emitted. * Before the loading is finished, fm_folder_get_files() returns nothing. * You can tell if a folder is still being loaded with fm_folder_is_loaded(). * * However, for some special FmFolder types, such as the ones handling * search:// URIs, we want to access the file infos while the folder is * still being loaded (the search is still ongoing). * The content of the folder grows incrementally and fm_folder_get_files() * returns files currently being loaded even when the folder is not * fully loaded. This is what we called incremental. * fm_folder_is_incremental() tells you if the FmFolder has this feature. * * Returns: %TRUE if @folder is incrementally loaded * * Since: 1.0.2 */ gboolean fm_folder_is_incremental(FmFolder* folder) { return folder->wants_incremental; } /** * fm_folder_get_filesystem_info * @folder: folder to retrieve info * @total_size: pointer to counter of total size of the filesystem * @free_size: pointer to counter of free space on the filesystem * * Retrieves info about total and free space on the filesystem which * contains the @folder. * * Returns: %TRUE if information can be retrieved. * * Since: 0.1.16 */ gboolean fm_folder_get_filesystem_info(FmFolder* folder, guint64* total_size, guint64* free_size) { if(folder->has_fs_info) { *total_size = folder->fs_total_size; *free_size = folder->fs_free_size; return TRUE; } return FALSE; } /* this function is run in GIO thread! */ static void on_query_filesystem_info_finished(GObject *src, GAsyncResult *res, FmFolder* folder) { GFile* gf = G_FILE(src); GError* err = NULL; GFileInfo* inf = g_file_query_filesystem_info_finish(gf, res, &err); if(!inf) { folder->fs_total_size = folder->fs_free_size = 0; folder->has_fs_info = FALSE; folder->fs_info_not_avail = TRUE; /* FIXME: examine unsupported filesystems */ g_error_free(err); goto _out; } if(g_file_info_has_attribute(inf, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE)) { folder->fs_total_size = g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); folder->fs_free_size = g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); folder->has_fs_info = TRUE; } else { folder->fs_total_size = folder->fs_free_size = 0; folder->has_fs_info = FALSE; folder->fs_info_not_avail = TRUE; } g_object_unref(inf); _out: G_LOCK(query); if(folder->fs_size_cancellable) { g_object_unref(folder->fs_size_cancellable); folder->fs_size_cancellable = NULL; } folder->filesystem_info_pending = TRUE; G_UNLOCK(query); /* we have a reference borrowed by async query still */ G_LOCK(lists); queue_update(folder); G_UNLOCK(lists); g_object_unref(folder); } /** * fm_folder_query_filesystem_info * @folder: folder to retrieve info * * Queries to retrieve info about filesystem which contains the @folder if * the filesystem supports such query. * * Since: 0.1.16 */ void fm_folder_query_filesystem_info(FmFolder* folder) { G_LOCK(query); if(!folder->fs_size_cancellable && !folder->fs_info_not_avail) { folder->fs_size_cancellable = g_cancellable_new(); g_file_query_filesystem_info_async(folder->gf, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE"," G_FILE_ATTRIBUTE_FILESYSTEM_FREE, G_PRIORITY_LOW, folder->fs_size_cancellable, (GAsyncReadyCallback)on_query_filesystem_info_finished, g_object_ref(folder)); } G_UNLOCK(query); } /** * fm_folder_find_by_path * @path: path descriptor * * Checks if folder by @path is already in use. * * Returns: (transfer full): found folder or %NULL. * * Since: 1.2.0 */ FmFolder *fm_folder_find_by_path(FmPath *path) { FmFolder *folder; G_LOCK(hash); folder = hash ? (FmFolder*)g_hash_table_lookup(hash, path) : NULL; G_UNLOCK(hash); return folder ? g_object_ref(folder) : NULL; } /** * fm_folder_block_updates * @folder: folder to apply * * Blocks emitting signals for changes in folder, i.e. if some file was * added, changed, or removed in folder after this API, no signal will be * sent until next call to fm_folder_unblock_updates(). * * Since: 1.2.0 */ void fm_folder_block_updates(FmFolder *folder) { /* g_debug("fm_folder_block_updates %p", folder); */ G_LOCK(lists); /* just set the flag */ folder->stop_emission = TRUE; G_UNLOCK(lists); } /** * fm_folder_unblock_updates * @folder: folder to apply * * Unblocks emitting signals for changes in folder. If some changes were * in folder after previous call to fm_folder_block_updates() then these * changes will be sent after this call. * * Since: 1.2.0 */ void fm_folder_unblock_updates(FmFolder *folder) { /* g_debug("fm_folder_unblock_updates %p", folder); */ G_LOCK(lists); folder->stop_emission = FALSE; /* query update now */ queue_update(folder); G_UNLOCK(lists); /* g_debug("fm_folder_unblock_updates OK"); */ } /** * fm_folder_make_directory * @folder: folder to apply * @name: display name for new directory * @error: (allow-none) (out): location to save error * * Creates new directory in given @folder. * * Returns: %TRUE in case of success. * * Since: 1.2.0 */ gboolean fm_folder_make_directory(FmFolder *folder, const char *name, GError **error) { GFile *dir, *gf; FmPath *path; gboolean ok; dir = fm_path_to_gfile(folder->dir_path); gf = g_file_get_child_for_display_name(dir, name, error); g_object_unref(dir); if (gf == NULL) return FALSE; ok = g_file_make_directory(gf, NULL, error); if (ok) { path = fm_path_new_for_gfile(gf); if (!_fm_folder_event_file_added(folder, path)) fm_path_unref(path); } g_object_unref(gf); return ok; } static void fm_folder_content_changed(FmFolder* folder) { if(folder->has_fs_info && !folder->fs_info_not_avail) fm_folder_query_filesystem_info(folder); } /* NOTE: * GFileMonitor has some significant limitations: * 1. Currently it can correctly emit unmounted event for a directory. * 2. After a directory is unmounted, its content changes. * Inotify does not fire events for this so a forced reload is needed. * 3. If a folder is empty, and later a filesystem is mounted to the * folder, its content should reflect the content of the newly mounted * filesystem. However, GFileMonitor and inotify do not emit events * for this case. A forced reload might be needed for this case as well. * 4. Some limitations come from Linux/inotify. If FAM/gamin is used, * the condition may be different. More testing is needed. */ static void on_mount_added(GVolumeMonitor* vm, GMount* mount, gpointer user_data) { /* If a filesystem is mounted over an existing folder, * we need to refresh the content of the folder to reflect * the changes. Besides, we need to create a new GFileMonitor * for the newly-mounted filesystem as the inode already changed. * GFileMonitor cannot detect this kind of changes caused by mounting. * So let's do it ourselves. */ GFile* gfile = g_mount_get_root(mount); /* g_debug("FmFolder::mount_added"); */ if(gfile) { GHashTableIter it; FmPath* path; FmFolder* folder; FmPath* mounted_path = fm_path_new_for_gfile(gfile); g_object_unref(gfile); G_LOCK(hash); g_hash_table_iter_init(&it, hash); while(g_hash_table_iter_next(&it, (gpointer*)&path, (gpointer*)&folder)) { if(path == mounted_path) queue_reload(folder); else if(fm_path_has_prefix(path, mounted_path)) { /* see if currently cached folders are below the mounted path. * Folders below the mounted folder are removed. * FIXME: should we emit "removed" signal for them, or * keep the folders and only reload them? */ /* g_signal_emit(folder, signals[REMOVED], 0); */ queue_reload(folder); } } G_UNLOCK(hash); fm_path_unref(mounted_path); } } static void on_mount_removed(GVolumeMonitor* vm, GMount* mount, gpointer user_data) { /* g_debug("FmFolder::mount_removed"); */ /* NOTE: gvfs does not emit unmount signals for remote folders since * GFileMonitor does not support remote filesystems at all. We do fake * file monitoring with FmDummyMonitor dirty hack. * So here is the side effect, no unmount notifications. * We need to generate the signal ourselves. */ GFile* gfile = g_mount_get_root(mount); if(gfile) { GSList* dummy_monitor_folders = NULL, *l; GHashTableIter it; FmPath* path; FmFolder* folder; FmPath* mounted_path = fm_path_new_for_gfile(gfile); g_object_unref(gfile); G_LOCK(hash); g_hash_table_iter_init(&it, hash); while(g_hash_table_iter_next(&it, (gpointer*)&path, (gpointer*)&folder)) { if(fm_path_has_prefix(path, mounted_path)) { /* see if currently cached folders are below the mounted path. * Folders below the mounted folder are removed. */ if(FM_IS_DUMMY_MONITOR(folder->mon)) dummy_monitor_folders = g_slist_prepend(dummy_monitor_folders, folder); } } G_UNLOCK(hash); fm_path_unref(mounted_path); for(l = dummy_monitor_folders; l; l = l->next) { folder = FM_FOLDER(l->data); g_object_ref(folder); g_signal_emit_by_name(folder->mon, "changed", folder->gf, NULL, G_FILE_MONITOR_EVENT_UNMOUNTED); /* FIXME: should we emit a fake deleted event here? */ /* g_signal_emit_by_name(folder->mon, "changed", folder->gf, NULL, G_FILE_MONITOR_EVENT_DELETED); */ g_object_unref(folder); } g_slist_free(dummy_monitor_folders); } } void _fm_folder_init() { } void _fm_folder_finalize() { } libfm-1.4.0/src/base/fm-folder.h000066400000000000000000000112661475513661000163500ustar00rootroot00000000000000/* * fm-folder.h * * Copyright 2009-2012 PCMan * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FOLDER_H__ #define __FM_FOLDER_H__ #include #include #include "fm-path.h" #include "fm-dir-list-job.h" #include "fm-file-info.h" #include "fm-job.h" #include "fm-file-info-job.h" G_BEGIN_DECLS #define FM_TYPE_FOLDER (fm_folder_get_type()) #define FM_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_FOLDER, FmFolder)) #define FM_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_FOLDER, FmFolderClass)) #define FM_IS_FOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_FOLDER)) #define FM_IS_FOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_FOLDER)) typedef struct _FmFolder FmFolder; typedef struct _FmFolderClass FmFolderClass; /** * FmFolderClass * @parent_class: the parent class * @files_added: the class closure for #FmFolder::files-added signal * @files_removed: the class closure for #FmFolder::files-removed signal * @files_changed: the class closure for #FmFolder::files-changed signal * @start_loading: the class closure for #FmFolder::start-loading signal * @finish_loading: the class closure for #FmFolder::finish-loading signal * @unmount: the class closure for #FmFolder::unmount signal * @changed: the class closure for #FmFolder::changed signal * @removed: the class closure for #FmFolder::removed signal * @content_changed: the class closure for #FmFolder::content-changed signal * @fs_info: the class closure for #FmFolder::fs-info signal * @error: the class closure for #FmFolder::error signal */ struct _FmFolderClass { GObjectClass parent_class; void (*files_added)(FmFolder* dir, GSList* files); void (*files_removed)(FmFolder* dir, GSList* files); void (*files_changed)(FmFolder* dir, GSList* files); void (*start_loading)(FmFolder* dir); void (*finish_loading)(FmFolder* dir); void (*unmount)(FmFolder* dir); void (*changed)(FmFolder* dir); void (*removed)(FmFolder* dir); void (*content_changed)(FmFolder* dir); void (*fs_info)(FmFolder* dir); guint (*error)(FmFolder* dir, GError* err, guint severity); /*< private >*/ gpointer _reserved1; gpointer _reserved2; gpointer _reserved3; gpointer _reserved4; }; GType fm_folder_get_type (void); FmFolder* fm_folder_from_path(FmPath* path); FmFolder* fm_folder_from_gfile(GFile* gf); FmFolder* fm_folder_from_path_name(const char* path); FmFolder* fm_folder_from_uri(const char* uri); FmFolder *fm_folder_find_by_path(FmPath *path); void fm_folder_block_updates(FmFolder *folder); void fm_folder_unblock_updates(FmFolder *folder); FmFileInfo* fm_folder_get_info(FmFolder* folder); FmPath* fm_folder_get_path(FmFolder* folder); FmFileInfoList* fm_folder_get_files (FmFolder* folder); gboolean fm_folder_is_empty(FmFolder* folder); FmFileInfo* fm_folder_get_file_by_name(FmFolder* folder, const char* name); gboolean fm_folder_is_loaded(FmFolder* folder); gboolean fm_folder_is_valid(FmFolder* folder); gboolean fm_folder_is_incremental(FmFolder* folder); void fm_folder_reload(FmFolder* folder); gboolean fm_folder_get_filesystem_info(FmFolder* folder, guint64* total_size, guint64* free_size); void fm_folder_query_filesystem_info(FmFolder* folder); /* internal event handling to workaroung GIO inotify delay */ gboolean _fm_folder_event_file_added(FmFolder *folder, FmPath *path); gboolean _fm_folder_event_file_changed(FmFolder *folder, FmPath *path); void _fm_folder_event_file_deleted(FmFolder *folder, FmPath *path); gboolean fm_folder_make_directory(FmFolder *folder, const char *name, GError **error); void _fm_folder_init(); void _fm_folder_finalize(); G_END_DECLS #endif /* __FM_FOLDER_H__ */ libfm-1.4.0/src/base/fm-icon.c000066400000000000000000000153541475513661000160220ustar00rootroot00000000000000/* * fm-icon.c * * Copyright 2009 Hong Jen Yee (PCMan) * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-icon * @short_description: A simple icons cache. * @title: FmIcon * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm.h" #include static GHashTable* hash = NULL; G_LOCK_DEFINE_STATIC(hash); static GDestroyNotify destroy_func = NULL; void _fm_icon_init() { if(G_UNLIKELY(hash)) return; hash = g_hash_table_new_full(g_icon_hash, (GEqualFunc)g_icon_equal, g_object_unref, NULL); } void _fm_icon_finalize() { g_hash_table_destroy(hash); hash = NULL; } /** * fm_icon_from_gicon * @gicon: a #GIcon object * * Retrives a #FmIcon corresponding to @gicon from cache inserting new * one if there was no such icon there yet. * * Returns: (transfer full): a #FmIcon object. * * Since: 0.1.0 */ FmIcon* fm_icon_from_gicon(GIcon* gicon) { FmIcon* icon; G_LOCK(hash); icon = (FmIcon*)g_hash_table_lookup(hash, gicon); if(G_UNLIKELY(!icon)) { icon = (FmIcon*)g_object_ref(gicon); g_hash_table_insert(hash, gicon, icon); } G_UNLOCK(hash); return g_object_ref(icon); } /** * fm_icon_from_name * @name: a name for icon * * Retrives a #FmIcon corresponding to @name from cache inserting new * one if there was no such icon there yet. * * Returns: (transfer full): a #FmIcon object. * * Since: 0.1.0 */ FmIcon* fm_icon_from_name(const char* name) { if(G_LIKELY(name)) { FmIcon* icon; GIcon* gicon; gchar *dot; if(g_path_is_absolute(name)) { GFile* gicon_file = g_file_new_for_path(name); gicon = g_file_icon_new(gicon_file); g_object_unref(gicon_file); } else if(G_UNLIKELY((dot = strrchr(name, '.')) != NULL && dot > name && (g_ascii_strcasecmp(&dot[1], "png") == 0 || g_ascii_strcasecmp(&dot[1], "svg") == 0 || g_ascii_strcasecmp(&dot[1], "xpm") == 0))) { /* some desktop entries have invalid icon name which contains suffix so let strip the suffix from such invalid name */ dot = g_strndup(name, dot - name); gicon = g_themed_icon_new_with_default_fallbacks(dot); g_free(dot); } else gicon = g_themed_icon_new_with_default_fallbacks(name); if(G_LIKELY(gicon)) { icon = fm_icon_from_gicon(gicon); g_object_unref(gicon); return icon; } } return NULL; } /** * fm_icon_ref * @icon: an existing #FmIcon object * * Increases reference count on @icon. * * Returns: @icon. * * Since: 0.1.0 * * Deprecated: 1.2.0: Use g_object_ref() instead. */ FmIcon* fm_icon_ref(FmIcon* icon) { return g_object_ref(icon); } /** * fm_icon_unref * @icon: a #FmIcon object * * Decreases reference count on @icon. If refernce count went to 0 then * removes @icon from cache. * * Since: 0.1.0 * * Deprecated: 1.2.0: Use g_object_unref() instead. */ void fm_icon_unref(FmIcon* icon) { g_object_unref(icon); } /** * fm_icon_unload_cache * * Flushes cache. * * Since: 0.1.0 */ void fm_icon_unload_cache(void) { G_LOCK(hash); g_hash_table_remove_all(hash); G_UNLOCK(hash); } static void unload_user_data_cache(GIcon* key, FmIcon* icon, gpointer quark) { g_object_set_qdata(G_OBJECT(icon), (guint32)(gulong)quark, NULL); } /** * fm_icon_unload_user_data_cache * * Flushes all user data in cache. * * See also: fm_icon_set_user_data(). * * Since: 0.1.0 * * Deprecated: 1.2.0: Use fm_icon_reset_user_data_cache() instead. */ void fm_icon_unload_user_data_cache(void) { G_LOCK(hash); g_hash_table_foreach(hash, (GHFunc)unload_user_data_cache, (gpointer)(gulong)fm_qdata_id); G_UNLOCK(hash); } /** * fm_icon_reset_user_data_cache * @quark: the associated key for user data * * Flushes all user data by @quark in cache. * * Since: 1.2.0 */ void fm_icon_reset_user_data_cache(GQuark quark) { G_LOCK(hash); g_hash_table_foreach(hash, (GHFunc)unload_user_data_cache, (gpointer)(gulong)quark); G_UNLOCK(hash); } /** * fm_icon_get_user_data * @icon: a #FmIcon object * * Retrieves user data that was set via fm_icon_set_user_data(). * * Returns: user data. * * Since: 0.1.0 * * Deprecated: 1.2.0: Use g_object_get_qdata() instead. */ gpointer fm_icon_get_user_data(FmIcon* icon) { return g_object_get_qdata(G_OBJECT(icon), fm_qdata_id); } /** * fm_icon_set_user_data * @icon: a #FmIcon object * @user_data: data pointer to set * * Sets @user_data to be associated with @icon. * * See also: fm_icon_get_user_data(), fm_icon_unload_user_data_cache(). * * Since: 0.1.0 * * Deprecated: 1.2.0: Use g_object_set_qdata_full() instead. */ void fm_icon_set_user_data(FmIcon* icon, gpointer user_data) { /* this old API meant to replace data not freeing it */ g_object_steal_qdata(G_OBJECT(icon), fm_qdata_id); g_object_set_qdata_full(G_OBJECT(icon), fm_qdata_id, user_data, destroy_func); } /** * fm_icon_set_user_data_destroy * @func: function for user data * * Sets @func to be used by fm_icon_unload_user_data_cache() to destroy * user data that was set by fm_icon_set_user_data(). * * Since: 0.1.0 * * Deprecated: 1.2.0: */ static gboolean reload_user_data_cache(GIcon* key, FmIcon* icon, gpointer unused) { /* reset destroy_func for data -- compatibility */ gpointer user_data = g_object_steal_qdata(G_OBJECT(icon), fm_qdata_id); if (user_data) g_object_set_qdata_full(G_OBJECT(icon), fm_qdata_id, user_data, destroy_func); return TRUE; } void fm_icon_set_user_data_destroy(GDestroyNotify func) { G_LOCK(hash); destroy_func = func; g_hash_table_foreach(hash, (GHFunc)reload_user_data_cache, NULL); G_UNLOCK(hash); } libfm-1.4.0/src/base/fm-icon.h000066400000000000000000000046741475513661000160320ustar00rootroot00000000000000/* * fm-icon.h * * Copyright 2009 Hong Jen Yee (PCMan) * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_ICON_H__ #define __FM_ICON_H__ #include G_BEGIN_DECLS /** * FmIcon: * * Opaque structure used in Libfm icon cache. Before version 1.2.0 it had * own data structure. Since 1.2.0 it is derived from GIcon therefore it * can be used basicly the same way. */ typedef struct _FmIcon FmIcon; /* must be called before using FmIcon */ void _fm_icon_init(); void _fm_icon_finalize(); FmIcon* fm_icon_from_gicon(GIcon* gicon); FmIcon* fm_icon_from_name(const char* name); #ifndef FM_DISABLE_DEPRECATED FmIcon* fm_icon_ref(FmIcon* icon); void fm_icon_unref(FmIcon* icon); /* Those APIs are used by GUI toolkits to cache loaded icon pixmaps * or GdkPixbuf in the FmIcon objects. Fox example, libfm-gtk stores * a list of GdkPixbuf objects in FmIcon::user_data. * It shouldn't be used in other ways by application developers. */ gpointer fm_icon_get_user_data(FmIcon* icon); void fm_icon_set_user_data(FmIcon* icon, gpointer user_data); void fm_icon_set_user_data_destroy(GDestroyNotify func); void fm_icon_unload_user_data_cache(); #endif /** * fm_icon_get_gicon: * @icon: a #FmIcon * * The macro to access GIcon instead of old direct access. * For older versions applications can define it as (icon->gicon) * * Returns: cached #GIcon object. * * Since: 1.2.0 */ #define fm_icon_get_gicon(icon) G_ICON(icon) void fm_icon_reset_user_data_cache(GQuark quark); void fm_icon_unload_cache(); G_END_DECLS #endif /* __FM_ICON_H__ */ libfm-1.4.0/src/base/fm-list.c000066400000000000000000000042271475513661000160420ustar00rootroot00000000000000/* * fm-list.c * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #include "fm-list.h" FmList* fm_list_new(FmListFuncs* funcs) { FmList* list = g_slice_new(FmList); list->funcs = funcs; g_queue_init(&list->list); list->n_ref = 1; return list; } FmList* fm_list_ref(FmList* list) { g_atomic_int_inc(&list->n_ref); return list; } void fm_list_unref(FmList* list) { if(g_atomic_int_dec_and_test(&list->n_ref)) { g_queue_foreach((GQueue*)list, (GFunc)list->funcs->item_unref, NULL); g_queue_clear((GQueue*)list); g_slice_free(FmList, list); } } void fm_list_clear(FmList* list) { g_queue_foreach((GQueue*)list, (GFunc)list->funcs->item_unref, NULL); g_queue_clear((GQueue*)list); } void fm_list_remove(FmList* list, gpointer data) { GList* l = ((GQueue*)list)->head; for(;l; l=l->next) { if(l->data == data) { list->funcs->item_unref(data); break; } } if(l) g_queue_delete_link((GQueue*)data, l); } void fm_list_remove_all(FmList* list, gpointer data) { /* FIXME: the performance can be better... */ GList* l = ((GQueue*)list)->head; for(;l; l=l->next) { if(l->data == data) list->funcs->item_unref(data); } g_queue_remove_all((GQueue*)list, data); } void fm_list_delete_link(FmList *list, GList* l_) { list->funcs->item_unref(l_->data); g_queue_delete_link((GQueue*)list, l_); } libfm-1.4.0/src/base/fm-list.h000066400000000000000000000151241475513661000160450ustar00rootroot00000000000000/* * fm-list.h * A generic list container supporting reference counting. * Copyright 2009 PCMan * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_LIST_H__ #define __FM_LIST_H__ #include G_BEGIN_DECLS typedef struct _FmList FmList; typedef struct _FmListFuncs FmListFuncs; struct _FmList { /*< private >*/ GQueue list; FmListFuncs* funcs; gint n_ref; }; /** * FmListFuncs: * @item_ref: function to increase reference counter on item * @item_unref: function to decrease reference counter on item */ struct _FmListFuncs { gpointer (*item_ref)(gpointer item); void (*item_unref)(gpointer item); }; FmList* fm_list_new(FmListFuncs* funcs); FmList* fm_list_ref(FmList* list); void fm_list_unref(FmList* list); #define FM_LIST(list) ((FmList*)list) /* Since FmList is actually a GQueue with reference counting, * all APIs for GQueue should be usable */ void fm_list_clear(FmList* list); #ifndef __GTK_DOC_IGNORE__ static inline gboolean fm_list_is_empty(FmList* list) { return g_queue_is_empty((GQueue*)list); } static inline guint fm_list_get_length(FmList* list) { return g_queue_get_length((GQueue*)list); } static inline void fm_list_reverse(FmList* list) { g_queue_reverse((GQueue*)list); } static inline void fm_list_foreach(FmList* list, GFunc f, gpointer d) { g_queue_foreach((GQueue*)list,f,d); } static inline GList* fm_list_find(FmList* list, gpointer d) { return g_queue_find((GQueue*)list,d); } static inline GList* fm_list_find_custom(FmList* list, gconstpointer d, GCompareFunc f) { return g_queue_find_custom((GQueue*)list,d,f); } static inline void fm_list_sort(FmList* list, GCompareDataFunc f, gpointer d) { g_queue_sort((GQueue*)list,f,d); } static inline void fm_list_push_head(FmList* list, gpointer d) { g_queue_push_head((GQueue*)list,(list)->funcs->item_ref(d)); } static inline void fm_list_push_tail(FmList* list, gpointer d) { g_queue_push_tail((GQueue*)list,(list)->funcs->item_ref(d)); } static inline void fm_list_push_nth(FmList* list, gpointer d, guint n) { g_queue_push_nth((GQueue*)list,(list)->funcs->item_ref(d),n); } static inline void fm_list_push_head_noref(FmList* list, gpointer d) { g_queue_push_head((GQueue*)list,d); } static inline void fm_list_push_tail_noref(FmList* list, gpointer d) { g_queue_push_tail((GQueue*)list,d); } static inline void fm_list_push_nth_noref(FmList* list, gpointer d, guint n) { g_queue_push_nth((GQueue*)list,d,n); } static inline gpointer fm_list_pop_head(FmList* list) { return g_queue_pop_head((GQueue*)list); } static inline gpointer fm_list_pop_tail(FmList* list) { return g_queue_pop_tail((GQueue*)list); } static inline gpointer fm_list_pop_nth(FmList* list, guint n) { return g_queue_pop_nth((GQueue*)list,n); } static inline gpointer fm_list_peek_head(FmList* list) { return g_queue_peek_head((GQueue*)list); } static inline gpointer fm_list_peek_tail(FmList* list) { return g_queue_peek_tail((GQueue*)list); } static inline gpointer fm_list_peek_nth(FmList* list, guint n) { return g_queue_peek_nth((GQueue*)list,n); } static inline gint fm_list_index(FmList* list, gconstpointer d) { return g_queue_index((GQueue*)list,d); } #endif /* __GTK_DOC_IGNORE__ */ void fm_list_remove(FmList* list, gpointer data); void fm_list_remove_all(FmList* list, gpointer data); #ifndef __GTK_DOC_IGNORE__ static inline void fm_list_insert_before(FmList* list, GList* s, gpointer d) { g_queue_insert_before((GQueue*)list,s,(list)->funcs->item_ref(d)); } static inline void fm_list_insert_after(FmList* list, GList* s, gpointer d) { g_queue_insert_after((GQueue*)list,s,(list)->funcs->item_ref(d)); } static inline void fm_list_insert_sorted(FmList* list, gpointer d, GCompareDataFunc f, gpointer u) { g_queue_insert_sorted((GQueue*)list,(list)->funcs->item_ref(d),f,u); } static inline void fm_list_insert_before_noref(FmList* list, GList* s, gpointer d) { g_queue_insert_before((GQueue*)list,s,d); } static inline void fm_list_insert_after_noref(FmList* list, GList* s, gpointer d) { g_queue_insert_after((GQueue*)list,s,d); } static inline void fm_list_insert_sorted_noref(FmList* list, gpointer d, GCompareDataFunc f, gpointer u) { g_queue_insert_sorted((GQueue*)list,d,f,u); } static inline void fm_list_push_head_link(FmList* list, GList* l_) { g_queue_push_head_link((GQueue*)list,l_); } static inline void fm_list_push_tail_link(FmList* list, GList* l_) { g_queue_push_tail_link((GQueue*)list,l_); } static inline void fm_list_push_nth_link(FmList* list, guint n, GList* l_) { g_queue_push_nth_link((GQueue*)list,n,l_); } static inline GList* fm_list_pop_head_link(FmList* list) { return g_queue_pop_head_link((GQueue*)list); } static inline GList* fm_list_pop_tail_link(FmList* list) { return g_queue_pop_tail_link((GQueue*)list); } static inline GList* fm_list_pop_nth_link(FmList* list, guint n) { return g_queue_pop_nth_link((GQueue*)list,n); } static inline GList* fm_list_peek_head_link(FmList* list) { return g_queue_peek_head_link((GQueue*)list); } static inline GList* fm_list_peek_tail_link(FmList* list) { return g_queue_peek_tail_link((GQueue*)list); } static inline GList* fm_list_peek_nth_link(FmList* list, guint n) { return g_queue_peek_nth_link((GQueue*)list,n); } static inline gint fm_list_link_index(FmList* list, GList* l_) { return g_queue_index((GQueue*)list,l_); } static inline void fm_list_unlink(FmList* list, GList* l_) { g_queue_unlink((GQueue*)list,l_); } static inline void fm_list_delete_link_nounref(FmList* list, GList* l_) { g_queue_delete_link((GQueue*)list,l_); } #endif /* __GTK_DOC_IGNORE__ */ void fm_list_delete_link(FmList* list, GList* l_); G_END_DECLS #endif /* __FM_LIST_H__ */ libfm-1.4.0/src/base/fm-marshal.list000066400000000000000000000001201475513661000172330ustar00rootroot00000000000000INT:POINTER,POINTER INT:POINTER,INT INT:POINTER,POINTER,POINTER UINT:BOXED,UINT libfm-1.4.0/src/base/fm-mime-type.c000066400000000000000000000347361475513661000170050ustar00rootroot00000000000000/* * fm-mime-type.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2009 Juergen Hoetzel * Copyright 2012-2016 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-mime-type * @short_description: Extended MIME types support. * @title: FmMimeType * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-mime-type.h" #include #include #include #include #include #include #ifdef HAVE_MMAP #include #endif G_LOCK_DEFINE_STATIC(thumbnailers); struct _FmMimeType { char* type; /* mime type name */ char* description; /* description of the mime type */ FmIcon* icon; /* thumbnailers installed for the mime-type - locked here not there! */ GList* thumbnailers; /* FmMimeType does "not" own the FmThumbnailer objects */ int n_ref; }; /* FIXME: how can we handle reload of xdg mime? */ static GHashTable *mime_hash = NULL; G_LOCK_DEFINE_STATIC(mime_hash); static FmMimeType* directory_type = NULL; static FmMimeType* mountable_type = NULL; static FmMimeType* shortcut_type = NULL; static FmMimeType* desktop_entry_type = NULL; static FmMimeType* fm_mime_type_new(const char* type_name); void _fm_mime_type_init() { mime_hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, fm_mime_type_unref); /* since those are frequently used, we store them to save hash table lookup. */ directory_type = fm_mime_type_from_name("inode/directory"); mountable_type = fm_mime_type_from_name("inode/mount-point"); desktop_entry_type = fm_mime_type_from_name("application/x-desktop"); /* fake mime-type for shortcuts */ shortcut_type = fm_mime_type_from_name("inode/x-shortcut"); shortcut_type->description = g_strdup(_("shortcut to URI")); } void _fm_mime_type_finalize() { fm_mime_type_unref(directory_type); fm_mime_type_unref(shortcut_type); fm_mime_type_unref(mountable_type); fm_mime_type_unref(desktop_entry_type); g_hash_table_destroy(mime_hash); } /** * fm_mime_type_from_file_name * @ufile_name: file name to guess * * Finds #FmMimeType descriptor guessing type from @ufile_name. * * Before 1.0.0 this API had name fm_mime_type_get_for_file_name. * * Returns: (transfer full): a #FmMimeType object. * * Since: 0.1.0 */ FmMimeType* fm_mime_type_from_file_name(const char* ufile_name) { FmMimeType* mime_type; char * type; gboolean uncertain; /* let skip scheme and host from non-native names */ type = g_strstr_len(ufile_name, -1, "://"); if (type != NULL) ufile_name = strchr(&type[3], '/'); if (ufile_name == NULL) ufile_name = "unknown"; type = g_content_type_guess(ufile_name, NULL, 0, &uncertain); mime_type = fm_mime_type_from_name(type); g_free(type); return mime_type; } /** * fm_mime_type_from_native_file * @file_path: full path to file * @base_name: file basename * @pstat: (allow-none): file atrributes * * Finds #FmMimeType descriptor for provided data. If file does not exist * then returns %NULL. * * Before 1.0.0 this API had name fm_mime_type_get_for_native_file. * * Note that this call does I/O and therefore can block. * * Returns: (transfer full): a #FmMimeType object. * * Since: 0.1.0 */ FmMimeType* fm_mime_type_from_native_file(const char* file_path, const char* base_name, struct stat* pstat) { FmMimeType* mime_type; struct stat st; if(!pstat) { pstat = &st; if(stat(file_path, &st) == -1) return NULL; } if(S_ISREG(pstat->st_mode)) { gboolean uncertain; char* type = g_content_type_guess(base_name, NULL, 0, &uncertain); if(uncertain) { int fd, len; if(pstat->st_size == 0) /* empty file = text file with 0 characters in it. */ { g_free(type); return fm_mime_type_from_name("text/plain"); } fd = open(file_path, O_RDONLY); if(fd >= 0) { /* #3086703 - PCManFM crashes on non existent directories. * http://sourceforge.net/tracker/?func=detail&aid=3086703&group_id=156956&atid=801864 * * NOTE: do not use mmap here. Though we can get little * performance gain, this makes our program more vulnerable * to I/O errors. If the mapped file is truncated by other * processes or I/O errors happen, we may receive SIGBUS. * It's a pity that we cannot use mmap for speed up here. */ /* #ifdef HAVE_MMAP const char* buf; len = pstat->st_size > 4096 ? 4096 : pstat->st_size; buf = (const char*)mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); if(G_LIKELY(buf != MAP_FAILED)) { g_free(type); type = g_content_type_guess(NULL, buf, len, &uncertain); munmap(buf, len); } #else */ char buf[4096]; len = read(fd, buf, MIN(pstat->st_size, 4096)); const char *tmp; char *qtype = type; /* questionable type */ close(fd); type = g_content_type_guess(base_name, (guchar*)buf, len, &uncertain); /* we need more complicated guessing here: file may have some wrong suffix or no suffix at all, and g_content_type_guess() very probably will guess it wrong so let believe it only if it insists on guessed type after testing its content, otherwise discard name completely and analyze just content */ if (g_strcmp0(qtype, type) != 0) { g_free(type); type = g_content_type_guess(NULL, (guchar*)buf, len, &uncertain); } g_free(qtype); /* bug: improperly named desktop entries are detected as text/plain */ if (uncertain && len > 40 && (tmp = memchr(buf, '[', 40)) != NULL && strncmp(tmp, "[Desktop Entry]\n", 16) == 0) { g_free(type); return fm_mime_type_ref(desktop_entry_type); } /* #endif */ } } mime_type = fm_mime_type_from_name(type); g_free(type); return mime_type; } if(S_ISDIR(pstat->st_mode)) return fm_mime_type_ref(directory_type); if (S_ISCHR(pstat->st_mode)) return fm_mime_type_from_name("inode/chardevice"); if (S_ISBLK(pstat->st_mode)) return fm_mime_type_from_name("inode/blockdevice"); if (S_ISFIFO(pstat->st_mode)) return fm_mime_type_from_name("inode/fifo"); if (S_ISLNK(pstat->st_mode)) return fm_mime_type_from_name("inode/symlink"); #ifdef S_ISSOCK if (S_ISSOCK(pstat->st_mode)) return fm_mime_type_from_name("inode/socket"); #endif /* impossible */ g_debug("Invalid stat mode: %d, %s", pstat->st_mode & S_IFMT, base_name); /* FIXME: some files under /proc/self has st_mode = 0, which causes problems. * currently we treat them as files of unknown type. */ return fm_mime_type_from_name("application/octet-stream"); } /** * fm_mime_type_from_name * @type: MIME type name * * Finds #FmMimeType descriptor for @type. * * Before 1.0.0 this API had name fm_mime_type_get_for_type. * * Returns: (transfer full): a #FmMimeType object. * * Since: 0.1.0 */ FmMimeType* fm_mime_type_from_name(const char* type) { FmMimeType * mime_type; G_LOCK(mime_hash); mime_type = g_hash_table_lookup(mime_hash, type); if (!mime_type) { mime_type = fm_mime_type_new(type); g_hash_table_insert(mime_hash, mime_type->type, mime_type); } G_UNLOCK(mime_hash); fm_mime_type_ref(mime_type); return mime_type; } /** * fm_mime_type_new * @type_name: MIME type name * * Creates a new #FmMimeType descriptor for @type. * * Returns: (transfer full): new #FmMimeType object. * * Since: 0.1.0 */ FmMimeType* fm_mime_type_new(const char* type_name) { FmMimeType * mime_type = g_slice_new0(FmMimeType); GIcon* gicon; mime_type->type = g_strdup(type_name); mime_type->n_ref = 1; gicon = g_content_type_get_icon(mime_type->type); if(strcmp(mime_type->type, "inode/directory") == 0) g_themed_icon_prepend_name(G_THEMED_ICON(gicon), "folder"); else if(g_content_type_can_be_executable(mime_type->type)) g_themed_icon_append_name(G_THEMED_ICON(gicon), "application-x-executable"); mime_type->icon = fm_icon_from_gicon(gicon); g_object_unref(gicon); return mime_type; } FmMimeType* _fm_mime_type_get_inode_directory() { return directory_type; } FmMimeType* _fm_mime_type_get_inode_x_shortcut() { return shortcut_type; } FmMimeType* _fm_mime_type_get_inode_mount_point() { return mountable_type; } FmMimeType* _fm_mime_type_get_application_x_desktop() { return desktop_entry_type; } /** * fm_mime_type_ref * @mime_type: a #FmMimeType descriptor * * Increments reference count on @mime_type. * * Returns: @mime_type. * * Since: 0.1.0 */ FmMimeType* fm_mime_type_ref(FmMimeType* mime_type) { g_atomic_int_inc(&mime_type->n_ref); return mime_type; } /** * fm_mime_type_unref * @mime_type_: a #FmMimeType descriptor * * Decrements reference count on @mime_type_. * * Since: 0.1.0 */ void fm_mime_type_unref(gpointer mime_type_) { FmMimeType* mime_type = (FmMimeType*)mime_type_; if (g_atomic_int_dec_and_test(&mime_type->n_ref)) { g_free(mime_type->type); g_free(mime_type->description); if (mime_type->icon) g_object_unref(mime_type->icon); g_assert(mime_type->thumbnailers == NULL); /* Note: we do not own references for FmThumbnailer here. this list should be free already or else it's failure and fm-thumbnailer.c will try to unref this destroyed object */ g_slice_free(FmMimeType, mime_type); } } /** * fm_mime_type_get_icon * @mime_type: a #FmMimeType descriptor * * Retrieves icon associated with @mime_type. Returned data are owned by * @mime_type and should be not freed by caller. * * Returns: icon. * * Since: 0.1.0 */ FmIcon* fm_mime_type_get_icon(FmMimeType* mime_type) { return mime_type->icon; } /** * fm_mime_type_get_type * @mime_type: a #FmMimeType descriptor * * Retrieves MIME type name of @mime_type. Returned data are owned by * @mime_type and should be not freed by caller. * * Returns: MIME type name. * * Since: 0.1.0 */ const char* fm_mime_type_get_type(FmMimeType* mime_type) { return mime_type->type; } /** * fm_mime_type_get_thumbnailers * @mime_type: a #FmMimeType descriptor * * Retrieves list of thumbnailers associated with @mime_type. Returned * data are owned by @mime_type and should be not altered by caller. * * Returns: (element-type gpointer) (transfer none): the list. * * Deprecated: 1.2.0: Use fm_mime_type_get_thumbnailers_list() instead. * * Since: 1.0.0 */ const GList* fm_mime_type_get_thumbnailers(FmMimeType* mime_type) { /* FIXME: need this be thread-safe? */ return mime_type->thumbnailers; } /** * fm_mime_type_get_thumbnailers_list * @mime_type: a #FmMimeType descriptor * * Retrieves list of thumbnailers associated with @mime_type. Returned * data should be freed after usage. * * Returns: (transfer full) (element-type FmThumbnailer): the list. * * Since: 1.2.0 */ GList* fm_mime_type_get_thumbnailers_list(FmMimeType* mime_type) { GList *list = NULL, *l; G_LOCK(thumbnailers); for (l = mime_type->thumbnailers; l; l = l->next) list = g_list_prepend(list, fm_thumbnailer_ref(l->data)); list = g_list_reverse(list); G_UNLOCK(thumbnailers); return list; } /** * fm_mime_type_add_thumbnailer * @mime_type: a #FmMimeType descriptor * @thumbnailer: anonymous thumbnailer pointer * * Adds @thumbnailer to list of thumbnailers associated with @mime_type. * * Since: 1.0.0 */ void fm_mime_type_add_thumbnailer(FmMimeType* mime_type, gpointer thumbnailer) { G_LOCK(thumbnailers); mime_type->thumbnailers = g_list_append(mime_type->thumbnailers, thumbnailer); G_UNLOCK(thumbnailers); } /** * fm_mime_type_remove_thumbnailer * @mime_type: a #FmMimeType descriptor * @thumbnailer: anonymous thumbnailer pointer * * Removes @thumbnailer from list of thumbnailers associated with * @mime_type. * * Since: 1.0.0 */ void fm_mime_type_remove_thumbnailer(FmMimeType* mime_type, gpointer thumbnailer) { G_LOCK(thumbnailers); mime_type->thumbnailers = g_list_remove(mime_type->thumbnailers, thumbnailer); G_UNLOCK(thumbnailers); } /** * fm_mime_type_get_desc * @mime_type: a #FmMimeType descriptor * * Retrieves human-readable description of MIME type. Returned data are * owned by @mime_type and should be not freed by caller. * * Returns: MIME type name. * * Since: 0.1.0 */ const char* fm_mime_type_get_desc(FmMimeType* mime_type) { /* FIXME: is locking needed here or not? */ if (G_UNLIKELY(! mime_type->description)) { mime_type->description = g_content_type_get_description(mime_type->type); /* FIXME: should handle this better */ if (G_UNLIKELY(! mime_type->description || ! *mime_type->description)) mime_type->description = g_content_type_get_description(mime_type->type); } return mime_type->description; } libfm-1.4.0/src/base/fm-mime-type.h000066400000000000000000000052171475513661000170020ustar00rootroot00000000000000/* * fm-mime-type.h * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef _FM_MIME_TYPE_H_ #define _FM_MIME_TYPE_H_ #include #include #include #include "fm-icon.h" #include "fm-thumbnailer.h" G_BEGIN_DECLS typedef struct _FmMimeType FmMimeType; void _fm_mime_type_init(); void _fm_mime_type_finalize(); /* file name used in this API should be encoded in UTF-8 */ FmMimeType* fm_mime_type_from_file_name(const char* ufile_name); FmMimeType* fm_mime_type_from_native_file(const char* file_path, /* Should be on-disk encoding */ const char* base_name, /* Should be in UTF-8 */ struct stat* pstat); /* Can be NULL */ FmMimeType* fm_mime_type_from_name(const char* type); FmMimeType* _fm_mime_type_get_inode_directory(); FmMimeType* _fm_mime_type_get_inode_x_shortcut(); FmMimeType* _fm_mime_type_get_inode_mount_point(); FmMimeType* _fm_mime_type_get_application_x_desktop(); FmMimeType* fm_mime_type_ref(FmMimeType* mime_type); void fm_mime_type_unref(gpointer mime_type_); FmIcon* fm_mime_type_get_icon(FmMimeType* mime_type); /* Get mime-type string */ const char* fm_mime_type_get_type(FmMimeType* mime_type); /* Get human-readable description of mime-type */ const char* fm_mime_type_get_desc(FmMimeType* mime_type); /* Get installed external thumbnailers for the mime-type. * Returns a list of FmThumbnailer. */ #ifndef FM_DISABLE_DEPRECATED const GList* fm_mime_type_get_thumbnailers(FmMimeType* mime_type); #endif GList* fm_mime_type_get_thumbnailers_list(FmMimeType* mime_type); void fm_mime_type_add_thumbnailer(FmMimeType* mime_type, gpointer thumbnailer); void fm_mime_type_remove_thumbnailer(FmMimeType* mime_type, gpointer thumbnailer); G_END_DECLS #endif libfm-1.4.0/src/base/fm-module.c000066400000000000000000000406141475513661000163540ustar00rootroot00000000000000/* * fm-module.c * * This file is a part of the Libfm project. * * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * 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 */ /** * SECTION:fm-module * @short_description: Simple external modules handler. * @title: FmModule * * @include: libfm/fm.h * * This implementation allows applications to use external modules and * select which ones application wants to use (from none to all). * * The naming scheme in examples below is strict. Replace "dummy" part in * them with your real name when you trying to use those examples. Those * strict example names are: * - FM_MODULE_dummy_VERSION * - fm_module_init_dummy * - fm_module_callback_dummy * - fm_module_register_dummy * * To use modules application should make few things. Let say, there is * some FmDummyWidget which wants to use "dummy" type of modules. First * thing application should do is create a header file which all modules * of that type should include: * * Sample of fm-dummy.h * * * #define FM_MODULE_dummy_VERSION 1 * * typedef struct _FmDummyInit { * int (*get_new)(const char *name); * } FmDummyInit; * * extern FmDummyInit fm_module_init_dummy; * ]]> * * The FM_MODULE_dummy_VERSION is a number which should be increased each * time something in FmDummyInit structure is changed. The FmDummyInit * represents an interface to module. It is specific for said module type. * The fm_module_init_dummy usage see below. * * Second thing application should do is to create implementation of the * module handling in your code: * * Sample of fm-dummy-widget.c * get_new("test sample"); * return result; * } * ]]> * * * Third thing application should do is to register module type on the * application start, the same way as application calls fm_init() on the * start: * |[ * fm_module_register_dummy(); * ]| * On application terminate it is adviced to unregister module type by * calling API fm_module_unregister_type() the same way as application * calls fm_finalize() on exit: * |[ * fm_module_unregister_type("dummy"); * ]| * * The module itself will be easy to make. All you should do is to use * FM_DEFINE_MODULE() macro and implement callbacks for the module * interface (see the fm-dummy.h header example above): * * Sample of module dummy/test * * * The fm_module_init_dummy should be exactly the same structure that is * defined in the header file above. * * Note that modules are scanned and loaded only once per application * run for simplicity and reliability reasons (in fact, deletion of a * module that have some code running in another thread may lead to some * unpredictable problems). Therefore if you have any module changed you * have to restart the application before it see your change. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-module.h" #include "fm-config.h" #include "fm-utils.h" #include #include #include "../glib-compat.h" volatile gint fm_modules_loaded = 0; static guint idle_handler = 0; G_LOCK_DEFINE_STATIC(idle_handler); static GSList *m_dirs = NULL; static gboolean _fm_modules_on_idle(gpointer user_data) { /* check if it is destroyed already */ if(g_source_is_destroyed(g_main_current_source())) return FALSE; G_LOCK(idle_handler); idle_handler = 0; G_UNLOCK(idle_handler); fm_modules_load(); return FALSE; } #define FM_MODULE_TYPE (fm_module_get_type()) #define FM_IS_MODULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), FM_MODULE_TYPE)) typedef struct _FmModule FmModule; typedef struct _FmModuleClass FmModuleClass; struct _FmModule { GObject parent; void *handle; }; struct _FmModuleClass { GObjectClass parent_class; }; static GType fm_module_get_type(void); static void fm_module_class_init(FmModuleClass *klass); G_DEFINE_TYPE(FmModule, fm_module, G_TYPE_OBJECT); static void fm_module_finalize(GObject *object) { FmModule *self; g_return_if_fail(FM_IS_MODULE(object)); self = (FmModule*)object; dlclose(self->handle); G_OBJECT_CLASS(fm_module_parent_class)->finalize(object); } static void fm_module_class_init(FmModuleClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_module_finalize; } static void fm_module_init(FmModule *self) { } static FmModule* fm_module_new(void) { return (FmModule*)g_object_new(FM_MODULE_TYPE, NULL); } typedef struct _FmModuleType FmModuleType; struct _FmModuleType { FmModuleType *next; char *type; int minver; int maxver; FmModuleInitCallback cb; GSList *modules; /* members are FmModule */ }; static FmModuleType *modules_types = NULL; /** * fm_module_register_type * @type: module type, unique for the application * @minver: minimum supported module version * @maxver: maximum supported module version * @cb: the callback used to inform about found module * * Registers @type into the modules loader. The modules loader will call * @cb routine when module that supports the @type was found within the * libfm modules directory. The scanning for modules will be done after * some timeout after last call to fm_module_register_type() so this API * should be used at application start before any possible modules usage * may appear. * * Since: 1.2.0 */ void fm_module_register_type(const char *type, int minver, int maxver, FmModuleInitCallback cb) { FmModuleType *mtype; g_return_if_fail(type != NULL && cb != NULL); G_LOCK(idle_handler); if (fm_modules_loaded) /* it's too late... */ goto _finish; for (mtype = modules_types; mtype; mtype = mtype->next) if (strcmp(type, mtype->type) == 0) /* already registered??? */ goto _finish; mtype = g_slice_new(FmModuleType); mtype->next = modules_types; mtype->type = g_strdup(type); mtype->minver = minver; mtype->maxver = maxver; mtype->cb = cb; mtype->modules = NULL; modules_types = mtype; if (idle_handler > 0) g_source_remove(idle_handler); /* if not requested right away then delay loading for 3 seconds */ idle_handler = g_timeout_add_seconds(3, _fm_modules_on_idle, NULL); _finish: G_UNLOCK(idle_handler); } /** * fm_module_unregister_type * @type: module type, unique for the application * * Frees any resources that were allocated previously on the call to * fm_module_register_type() API, including code of the modules. After * this call any usage of data from callbacks will be invalid and the * most possibly lead to crash so it might be called only on finalizing * the application data. * * Since: 1.2.0 */ void fm_module_unregister_type(const char *type) { FmModuleType *mtype, *last; g_return_if_fail(type != NULL); G_LOCK(idle_handler); for (mtype = modules_types, last = NULL; mtype; mtype = mtype->next) if (strcmp(type, mtype->type) == 0) break; else last = mtype; g_assert(mtype != NULL); if (last) last->next = mtype->next; else /* it was first one */ modules_types = mtype->next; if (modules_types == NULL) fm_modules_loaded = 0; /* FIXME: is this correct? */ g_slist_free_full(mtype->modules, g_object_unref); G_UNLOCK(idle_handler); g_free(mtype->type); g_slice_free(FmModuleType, mtype); } static gboolean _name_matches(const char *name, const char *mask, const char *end) { if (mask == end) /* end of pattern should match only to empty string */ return (*name == '\0'); if (*mask == '*') /* try to match any - zero to all */ { mask++; while (1) { /* try to match first, rest of pattern still may match empty string */ /* g_debug("matching %s to %.*s", name, (int)(end-mask), mask); */ if (_name_matches(name, mask, end)) return TRUE; if (*name == '\0') /* no matches so far */ return FALSE; name++; } /* never reached */ } if (*mask == '\\' && mask + 1 < end) /* next char is escaped */ mask++; if (*name != *mask) return FALSE; return _name_matches(name + 1, mask + 1, end); } static gboolean _module_matches(const char *type, const char *name, const char *mask) { const char *delimiter = strchr(mask, ':'); if (delimiter) { /* g_debug("matching type %s to %.*s", type, (int)(delimiter-mask), mask); */ if (!_name_matches(type, mask, delimiter)) return FALSE; mask = delimiter + 1; delimiter = mask + strlen(mask); /* g_debug("matching name %s to %s", name, mask); */ return _name_matches(name, mask, delimiter); } delimiter = mask + strlen(mask); return _name_matches(type, mask, delimiter); } static gboolean _fm_modules_load(gpointer unused) { GDir *dir; const char *file; char **exp_list; const char *name; GString *str; void *handle; gint version; void *ptr; FmModule *module; FmModuleType *mtype; const char *dir_name; GSList *dir_l; g_debug("starting modules initialization"); G_LOCK(idle_handler); dir_name = PACKAGE_MODULES_DIR; dir_l = m_dirs; str = g_string_sized_new(128); do { dir = g_dir_open(dir_name, 0, NULL); if (dir == NULL) { g_warning("modules directory is not accessible"); goto _next_dir; } g_debug("scanning modules directory %s", dir_name); while ((file = g_dir_read_name(dir)) != NULL) { if (!g_str_has_suffix(file, ".so")) /* ignore other files */ continue; g_debug("found module file: %s", file); g_string_printf(str, "%s/%s", dir_name, file); handle = dlopen(str->str, RTLD_NOW); if (handle == NULL) /* broken file */ continue; name = dlsym(handle, "module_name"); if (name == NULL) /* no name found */ continue; module = fm_module_new(); module->handle = handle; for (mtype = modules_types; mtype; mtype = mtype->next) { /* test each file name - whitelist and blacklist */ if (fm_config->system_modules_blacklist || fm_config->modules_blacklist) { exp_list = fm_config->system_modules_blacklist; if (exp_list) for ( ; *exp_list; exp_list++) if (_module_matches(mtype->type, name, *exp_list)) break; if (!exp_list || (!*exp_list && fm_config->modules_blacklist)) for (exp_list = fm_config->modules_blacklist; *exp_list; exp_list++) if (_module_matches(mtype->type, name, *exp_list)) break; if (*exp_list) /* found in blacklist */ { if (!fm_config->modules_whitelist) /* no whitelist */ continue; for (exp_list = fm_config->modules_whitelist; *exp_list; exp_list++) if (_module_matches(mtype->type, name, *exp_list)) break; if (*exp_list == NULL) /* not matches whitelist */ continue; } } /* test version */ g_string_printf(str, "module_%s_version", mtype->type); ptr = dlsym(handle, str->str); if (ptr == NULL) continue; version = *(int *)ptr; if (version < mtype->minver || version > mtype->maxver) /* version mismatched */ continue; /* test interface */ g_string_printf(str, "fm_module_init_%s", mtype->type); ptr = dlsym(handle, str->str); if (ptr == NULL) /* no interface found */ continue; g_debug("found handler %s:%s", mtype->type, name); /* if everything is ok then add to list */ if (mtype->cb(name, ptr, version)) mtype->modules = g_slist_prepend(mtype->modules, g_object_ref(module)); } g_object_unref(module); } g_dir_close(dir); _next_dir: if (dir_l) { dir_name = dir_l->data; dir_l = dir_l->next; continue; } break; } while(1); g_slist_free_full(m_dirs, g_free); m_dirs = NULL; G_UNLOCK(idle_handler); g_string_free(str, TRUE); g_debug("done with modules"); return FALSE; } /** * fm_modules_load * * Forces scanning the libfm modules for existing modules. Any calls to * fm_module_register_type() after this will have no effect. * * Since: 1.2.0 */ void fm_modules_load(void) { if (!g_atomic_int_compare_and_exchange(&fm_modules_loaded, 0, 1)) return; fm_run_in_default_main_context(_fm_modules_load, NULL); } /** * fm_module_is_in_use * @type: module type * @name: (allow-none): module key * * Checks if specified module is found and successfully loaded. * * Returns: %TRUE if module is in use. * * Since: 1.2.0 */ gboolean fm_module_is_in_use(const char *type, const char *name) { FmModuleType *mtype; GSList *l; if (type == NULL) return FALSE; CHECK_MODULES(); for (mtype = modules_types; mtype; mtype = mtype->next) if (strcmp(mtype->type, type) == 0) break; if (!mtype) return FALSE; if (!name) return TRUE; for (l = mtype->modules; l; l = l->next) { FmModule *module = l->data; if (g_strcmp0(name, dlsym(module->handle, "module_name")) == 0) break; } return (l != NULL); } /** * fm_modules_add_directory * @path: absolute path to modules directory * * Adds an application-specific directory @path to be used later for * scanning for modules. The @path should be absolute UNIX path. * * Returns: %TRUE if @path was added successfully. * * Since: 1.2.0 */ gboolean fm_modules_add_directory(const char *path) { GSList *l; gboolean res = FALSE; g_return_val_if_fail(path != NULL && path[0] == '/', FALSE); G_LOCK(idle_handler); if (fm_modules_loaded) /* it's too late... */ goto _finish; for (l = m_dirs; l; l = l->next) if (strcmp(l->data, path) == 0) break; if (l == NULL) m_dirs = g_slist_append(m_dirs, g_strdup(path)); res = TRUE; _finish: G_UNLOCK(idle_handler); return res; } libfm-1.4.0/src/base/fm-module.h000066400000000000000000000067441475513661000163670ustar00rootroot00000000000000/* * fm-module.h * * This file is a part of the Libfm project. * * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * 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 */ #ifndef __FM_MODULE_H__ #define __FM_MODULE_H__ 1 #include #define __FM_MODULE_VERSION__(xx) FM_MODULE_##xx##_VERSION #define __FM_DEFINE_VERSION__(xx) __FM_MODULE_VERSION__(xx) /** * FM_DEFINE_MODULE * @_type_: type of module (e.g. `vfs') * @_name_: module type specific key (e.g. `menu') * * Macro used in module definition. Module should have module specific * structure: if @type is vfs then it should be fm_module_init_vfs. See * specific header file for some `extern' definition. */ #define FM_DEFINE_MODULE(_type_, _name_) \ int module_##_type_##_version = __FM_DEFINE_VERSION__(_type_); \ char module_name[] = #_name_; /** * FmModuleInitCallback * @key: the module name as key value for the type * @init_data: module type specific initialization data * @version: version of loaded module * * This API is used to make callback from the modules loader to the * implementation which uses module so the implementation may do required * checks and add module to own list of supported data. * This callback will be done in default main context. * * Returns: %TRUE if module was accepted by implementation. * * Since: 1.2.0 */ typedef gboolean (*FmModuleInitCallback)(const char *key, gpointer init_data, int version); /** * FM_MODULE_DEFINE_TYPE * @_type_: type of module (e.g. `vfs') * @_struct_: type of struct with module callbacks * @_minver_: minimum version supported * * Macro used in module caller. Callback is ran when matched module is * found, it should return %TRUE on success. */ #define FM_MODULE_DEFINE_TYPE(_type_, _struct_, _minver_) \ static gboolean fm_module_callback_##_type_(const char *, gpointer, int ver); \ \ static inline void fm_module_register_##_type_ (void) { \ fm_module_register_type(#_type_, \ _minver_, __FM_DEFINE_VERSION__(_type_), \ fm_module_callback_##_type_); \ } /* use this whenever extension is about to be used */ #define CHECK_MODULES(...) if(G_UNLIKELY(!fm_modules_loaded)) fm_modules_load() G_BEGIN_DECLS /* adds schedule */ void fm_module_register_type(const char *type, int minver, int maxver, FmModuleInitCallback cb); /* removes schedule */ void fm_module_unregister_type(const char *type); /* forces schedules */ void fm_modules_load(void); /* checks if in use */ gboolean fm_module_is_in_use(const char *type, const char *name); /* add application-dependent path for modules */ gboolean fm_modules_add_directory(const char *path); /* the flag */ extern volatile gint fm_modules_loaded; G_END_DECLS #endif /* __FM_MODULE_H__ */ libfm-1.4.0/src/base/fm-monitor.c000066400000000000000000000131171475513661000165540ustar00rootroot00000000000000/* * fm-file-monitor.c * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-monitor * @short_description: File monitor cache implementation. * @title: GMonitor cache * * @include: libfm/fm.h * * This implementation can help to exclude creation of duplicate monitors * for the same file and also do fast search for created file monitors. */ #include "fm-monitor.h" #include "fm-dummy-monitor.h" #include #define MONITOR_RATE_LIMIT 5000 static GHashTable* hash = NULL; static GHashTable* dummy_hash = NULL; G_LOCK_DEFINE_STATIC(hash); static void on_monitor_destroy(gpointer data, GObject* mon) { GFile* gf = (GFile*)data; G_LOCK(hash); g_hash_table_remove(hash, gf); G_UNLOCK(hash); } static void on_dummy_monitor_destroy(gpointer data, GObject* mon) { GFile* gf = (GFile*)data; G_LOCK(hash); g_hash_table_remove(dummy_hash, gf); G_UNLOCK(hash); } /** * fm_monitor_directory * @gf: file to monitor * @err: (allow-none) (out): location to save error * * Finds a monitor for directory @gf in cache or creates new if there is * no such monitor created yet. * * Returns: (transfer full): a monitor object. * * Since: 0.1.0 */ GFileMonitor* fm_monitor_directory(GFile* gf, GError** err) { GFileMonitor* ret = NULL; G_LOCK(hash); ret = (GFileMonitor*)g_hash_table_lookup(hash, gf); if(!ret && !g_file_is_native(gf)) ret = (GFileMonitor*)g_hash_table_lookup(dummy_hash, gf); if(ret) g_object_ref(ret); else { GError* e = NULL; ret = g_file_monitor_directory(gf, G_FILE_MONITOR_WATCH_MOUNTS, NULL, &e); if(ret) { g_object_weak_ref(G_OBJECT(ret), on_monitor_destroy, gf); g_file_monitor_set_rate_limit(ret, MONITOR_RATE_LIMIT); g_hash_table_insert(hash, g_object_ref(gf), ret); } else { if(e) { if(e->domain == G_IO_ERROR && e->code == G_IO_ERROR_NOT_SUPPORTED) { /* create a fake file monitor */ ret = fm_dummy_monitor_new(); g_error_free(e); g_object_weak_ref(G_OBJECT(ret), on_dummy_monitor_destroy, gf); g_hash_table_insert(dummy_hash, g_object_ref(gf), ret); } else { g_debug("error creating file monitor: %s", e->message); G_UNLOCK(hash); if(err) *err = e; else g_error_free(e); return NULL; } } } } G_UNLOCK(hash); return ret; } void _fm_monitor_init() { hash = g_hash_table_new_full(g_file_hash, (GEqualFunc)g_file_equal, g_object_unref, NULL); dummy_hash = g_hash_table_new_full(g_file_hash, (GEqualFunc)g_file_equal, g_object_unref, NULL); } void _fm_monitor_finalize() { g_hash_table_destroy(hash); g_hash_table_destroy(dummy_hash); hash = NULL; dummy_hash = NULL; } /** * fm_monitor_lookup_monitor * @gf: file to monitor * * Finds a monitor for directory @gf in cache. * * Returns: (transfer full): a monitor object or %NULL. * * Since: 0.1.0 */ GFileMonitor* fm_monitor_lookup_monitor(GFile* gf) { GFileMonitor* ret = NULL; if(G_UNLIKELY(!gf)) return NULL; G_LOCK(hash); ret = (GFileMonitor*)g_hash_table_lookup(hash, gf); if(!ret && !g_file_is_native(gf)) ret = (GFileMonitor*)g_hash_table_lookup(dummy_hash, gf); if(ret) g_object_ref(ret); G_UNLOCK(hash); return ret; } /** * fm_monitor_lookup_dummy_monitor * @gf: file to monitor * * Finds a monitor for not-native file @gf in cache. * * Returns: (transfer full): a monitor object or %NULL. * * Since: 0.1.0 */ GFileMonitor* fm_monitor_lookup_dummy_monitor(GFile* gf) { GFileMonitor* mon; char* scheme; if(G_LIKELY(!gf || g_file_is_native(gf))) return NULL; scheme = g_file_get_uri_scheme(gf); if(scheme) { /* those URI schemes don't need dummy monitor */ if(strcmp(scheme, "trash") == 0 || strcmp(scheme, "computer") == 0 || strcmp(scheme, "network") == 0 || strcmp(scheme, "applications") == 0) { g_free(scheme); return NULL; } g_free(scheme); } G_LOCK(hash); mon = (GFileMonitor*)g_hash_table_lookup(dummy_hash, gf); if(mon) g_object_ref(mon); else { /* create a fake file monitor */ mon = fm_dummy_monitor_new(); g_object_weak_ref(G_OBJECT(mon), on_dummy_monitor_destroy, gf); g_hash_table_insert(dummy_hash, g_object_ref(gf), mon); } G_UNLOCK(hash); return mon; } libfm-1.4.0/src/base/fm-monitor.h000066400000000000000000000024641475513661000165640ustar00rootroot00000000000000/* * fm-file-monitor.h * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_MONITOR_H__ #define __FM_FILE_MONITOR_H__ #include #include G_BEGIN_DECLS GFileMonitor* fm_monitor_directory(GFile* gf, GError** err); void _fm_monitor_init(); void _fm_monitor_finalize(); GFileMonitor* fm_monitor_lookup_monitor(GFile* gf); GFileMonitor* fm_monitor_lookup_dummy_monitor(GFile* gf); G_END_DECLS #endif /* __FM_FILE_MONITOR_H__ */ libfm-1.4.0/src/base/fm-nav-history.c000066400000000000000000000261021475513661000173460ustar00rootroot00000000000000/* * fm-nav-history.c * * Copyright 2009 PCMan * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-nav-history * @short_description: Simple navigation history management. * @title: FmNavHistory * * @include: libfm/fm.h * * The #FmNavHistory object implements history for paths that were * entered in some input bar and allows to add, remove or move items in it. */ #include "fm-nav-history.h" struct _FmNavHistory { GObject parent; GQueue items; GList* cur; gint n_max; guint n_cur; }; struct _FmNavHistoryClass { GObjectClass parent_class; }; static void fm_nav_history_finalize (GObject *object); G_DEFINE_TYPE(FmNavHistory, fm_nav_history, G_TYPE_OBJECT); static void fm_nav_history_class_init(FmNavHistoryClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_nav_history_finalize; } static void fm_nav_history_item_free(FmNavHistoryItem* item) { fm_path_unref(item->path); g_slice_free(FmNavHistoryItem, item); } static void fm_nav_history_finalize(GObject *object) { FmNavHistory *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_NAV_HISTORY(object)); self = FM_NAV_HISTORY(object); g_queue_foreach(&self->items, (GFunc)fm_nav_history_item_free, NULL); g_queue_clear(&self->items); G_OBJECT_CLASS(fm_nav_history_parent_class)->finalize(object); } static void fm_nav_history_init(FmNavHistory *self) { g_queue_init(&self->items); self->n_max = FM_NAV_HISTORY_DEFAULT_SIZE; } /** * fm_nav_history_new * * Creates a new #FmNavHistory object with empty history. * * Returns: a new #FmNavHistory object. * * Since: 0.1.0 */ FmNavHistory *fm_nav_history_new(void) { return g_object_new(FM_NAV_HISTORY_TYPE, NULL); } /** * fm_nav_history_list * @nh: the history * * Retrieves full list of the history as #GList of #FmNavHistoryItem. * The returned #GList belongs to #FmNavHistory and shouldn't be freed. * * Returns: (transfer none) (element-type FmNavHistoryItem): full history. * * Since: 0.1.0 * * Deprecated: 1.0.2: */ const GList* fm_nav_history_list(FmNavHistory* nh) { return nh->items.head; } /** * fm_nav_history_get_cur * @nh: the history * * Retrieves current selected item of the history. The returned item * belongs to #FmNavHistory and shouldn't be freed by caller. * * Returns: (transfer none): current item. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_nav_history_get_nth_path() instead. */ const FmNavHistoryItem* fm_nav_history_get_cur(FmNavHistory* nh) { return nh->cur ? (FmNavHistoryItem*)nh->cur->data : NULL; } /** * fm_nav_history_get_cur_link * @nh: the history * * Retrieves current selected item as #GList element containing * #FmNavHistoryItem. The returned item belongs to #FmNavHistory and * shouldn't be freed by caller. * * Returns: (transfer none) (element-type FmNavHistoryItem): current item. * * Since: 0.1.0 * * Deprecated: 1.0.2: */ const GList* fm_nav_history_get_cur_link(FmNavHistory* nh) { return nh->cur; } /** * fm_nav_history_can_forward * @nh: the history * * Checks if current selected item is the last item in the history. * * Before 1.0.0 this call had name fm_nav_history_get_can_forward. * * Returns: %TRUE if cursor can go forward in history. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_nav_history_get_cur_index() instead. */ gboolean fm_nav_history_can_forward(FmNavHistory* nh) { return nh->n_cur > 0; } /** * fm_nav_history_forward * @nh: the history * @old_scroll_pos: the scroll position to associate with current item * * If there is a previous item in the history then sets @old_scroll_pos * into current item data and marks previous item current. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_nav_history_go_to() instead. */ void fm_nav_history_forward(FmNavHistory* nh, int old_scroll_pos) { if(nh->cur && nh->cur->prev) { FmNavHistoryItem* tmp = (FmNavHistoryItem*)nh->cur->data; if(tmp) /* remember current scroll pos */ tmp->scroll_pos = old_scroll_pos; nh->cur = nh->cur->prev; nh->n_cur--; } } /** * fm_nav_history_can_back * @nh: the history * * Checks if current selected item is the first item in the history. * * Before 1.0.0 this call had name fm_nav_history_get_can_back. * * Returns: %TRUE if cursor can go backward in history. * * Since: 0.1.0 */ gboolean fm_nav_history_can_back(FmNavHistory* nh) { g_return_val_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh), FALSE); return nh->cur ? (nh->cur->next != NULL) : FALSE; } /** * fm_nav_history_back * @nh: the history * @old_scroll_pos: the scroll position to associate with current item * * If there is a next item in the history then sets @old_scroll_pos into * current item data and marks next item current. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_nav_history_go_to() instead. */ void fm_nav_history_back(FmNavHistory* nh, int old_scroll_pos) { if(nh->cur && nh->cur->next) { FmNavHistoryItem* tmp = (FmNavHistoryItem*)nh->cur->data; if(tmp) /* remember current scroll pos */ tmp->scroll_pos = old_scroll_pos; nh->cur = nh->cur->next; nh->n_cur++; } } static inline void cut_history(FmNavHistory* nh, guint num) { while(g_queue_get_length(&nh->items) > num) { FmNavHistoryItem* item = (FmNavHistoryItem*)g_queue_pop_tail(&nh->items); fm_nav_history_item_free(item); } } /** * fm_nav_history_chdir * @nh: the history * @path: new path to add * @old_scroll_pos: the scroll position to associate with current item * * Sets @old_scroll_pos into current item data and then adds new @path * to the beginning of the @nh. * * Since: 0.1.0 */ void fm_nav_history_chdir(FmNavHistory* nh, FmPath* path, gint old_scroll_pos) { FmNavHistoryItem* tmp; g_return_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh)); /* now we're at the top of the queue. */ tmp = nh->cur ? (FmNavHistoryItem*)nh->cur->data : NULL; if(tmp) /* remember current scroll pos */ tmp->scroll_pos = old_scroll_pos; if( !tmp || !fm_path_equal(tmp->path, path) ) /* we're not chdir to the same path */ { /* if we're not at the top of the queue, remove all items beyond us. */ while(nh->n_cur > 0) { tmp = (FmNavHistoryItem*)g_queue_pop_head(&nh->items); if(tmp) fm_nav_history_item_free(tmp); nh->n_cur--; } /* add a new item */ tmp = g_slice_new0(FmNavHistoryItem); tmp->path = fm_path_ref(path); g_queue_push_head(&nh->items, tmp); nh->cur = g_queue_peek_head_link(&nh->items); cut_history(nh, nh->n_max); } } /** * fm_nav_history_jump * @nh: the history * @l: (element-type FmNavHistoryItem): new current item * @old_scroll_pos: the scroll position to associate with current item * * Sets @old_scroll_pos into current item data and then * sets current item of @nh to one from @l. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_nav_history_go_to() instead. */ void fm_nav_history_jump(FmNavHistory* nh, GList* l, int old_scroll_pos) { gint n = g_queue_index(&nh->items, l->data); if(n >= 0) fm_nav_history_go_to(nh, n, old_scroll_pos); } /** * fm_nav_history_clear * @nh: the history * * Removes all items from the history @nh. * * Since: 0.1.0 */ void fm_nav_history_clear(FmNavHistory* nh) { g_return_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh)); g_queue_foreach(&nh->items, (GFunc)fm_nav_history_item_free, NULL); g_queue_clear(&nh->items); nh->cur = NULL; nh->n_cur = 0; } /** * fm_nav_history_set_max * @nh: the history * @num: new size of history * * Sets maximum length of the history @nh to be @num. * * Since: 0.1.0 */ void fm_nav_history_set_max(FmNavHistory* nh, guint num) { g_return_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh)); if(num <= nh->n_cur) { nh->cur = NULL; nh->n_cur = 0; } nh->n_max = num; if(num < 1) num = 1; cut_history(nh, num); } /** * fm_nav_history_get_cur_index * @nh: the history * * Retrieves index of current item in the history @nh. 0 means current * item is at top. * * Returns: index of current item. * * Since: 1.0.2 */ guint fm_nav_history_get_cur_index(FmNavHistory* nh) { g_return_val_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh), 0); return nh->n_cur; } /** * fm_nav_history_get_nth_path * @nh: the history * @n: index of item * * Retrieves path of the item @n in the history @nh. * * Returns: path of the item or %NULL if no such item was found. * * Since: 1.0.2 */ FmPath* fm_nav_history_get_nth_path(FmNavHistory* nh, guint n) { FmNavHistoryItem *item; g_debug("fm_nav_history_get_nth_path %u", n); g_return_val_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh), NULL); if(n == nh->n_cur) item = nh->cur->data; else item = g_queue_peek_nth(&nh->items, n); if(item == NULL) return NULL; return item->path; } /** * fm_nav_history_go_to * @nh: the history * @n: new index * @old_scroll_pos: scroll position of current folder view * * Saves the current scroll position into the history. If item with index * @n exists in the history then sets it as current item. * * Returns: path of selected item or %NULL if no such item was found. * * Since: 1.0.2 */ FmPath* fm_nav_history_go_to(FmNavHistory* nh, guint n, gint old_scroll_pos) { GList *link; g_return_val_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh), NULL); if(nh->cur) ((FmNavHistoryItem*)nh->cur->data)->scroll_pos = old_scroll_pos; if(n == nh->n_cur) return ((FmNavHistoryItem*)nh->cur->data)->path; link = g_queue_peek_nth_link(&nh->items, n); if(link == NULL) return NULL; nh->n_cur = n; nh->cur = link; return ((FmNavHistoryItem*)link->data)->path; } /** * fm_nav_history_get_scroll_pos * @nh: the history * * Retrieves saved scroll position for current item. * * Returns: saved scroll position. * * Since: 1.0.2 */ gint fm_nav_history_get_scroll_pos(FmNavHistory* nh) { g_return_val_if_fail(nh != NULL && FM_IS_NAV_HISTORY(nh), -1); return ((FmNavHistoryItem*)nh->cur->data)->scroll_pos; } libfm-1.4.0/src/base/fm-nav-history.h000066400000000000000000000063571475513661000173650ustar00rootroot00000000000000/* * fm-nav-history.h * * Copyright 2009 PCMan * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_NAV_HISTORY_H__ #define __FM_NAV_HISTORY_H__ #include #include "fm-path.h" G_BEGIN_DECLS /* FIXME: Do we really need GObject for such a simple data structure? */ #define FM_NAV_HISTORY_TYPE (fm_nav_history_get_type()) #define FM_NAV_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_NAV_HISTORY_TYPE, FmNavHistory)) #define FM_NAV_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_NAV_HISTORY_TYPE, FmNavHistoryClass)) #define FM_IS_NAV_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_NAV_HISTORY_TYPE)) #define FM_IS_NAV_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_NAV_HISTORY_TYPE)) typedef struct _FmNavHistory FmNavHistory; typedef struct _FmNavHistoryItem FmNavHistoryItem; typedef struct _FmNavHistoryClass FmNavHistoryClass; /** * FmNavHistoryItem * @path: active path to folder * @scroll_pos: how much folder was scrolled in view */ struct _FmNavHistoryItem { FmPath* path; int scroll_pos; /*< private >*/ int _reserved1; gpointer _reserved2; }; GType fm_nav_history_get_type (void); FmNavHistory* fm_nav_history_new (void); #define FM_NAV_HISTORY_DEFAULT_SIZE 10 #ifndef FM_DISABLE_DEPRECATED /* The returned GList belongs to FmNavHistory and shouldn't be freed. */ const GList* fm_nav_history_list(FmNavHistory* nh); const FmNavHistoryItem* fm_nav_history_get_cur(FmNavHistory* nh); const GList* fm_nav_history_get_cur_link(FmNavHistory* nh); void fm_nav_history_back(FmNavHistory* nh, int old_scroll_pos); gboolean fm_nav_history_can_forward(FmNavHistory* nh); void fm_nav_history_forward(FmNavHistory* nh, int old_scroll_pos); void fm_nav_history_jump(FmNavHistory* nh, GList* l, int old_scroll_pos); #endif guint fm_nav_history_get_cur_index(FmNavHistory* nh); FmPath* fm_nav_history_get_nth_path(FmNavHistory* nh, guint n); FmPath* fm_nav_history_go_to(FmNavHistory* nh, guint n, gint old_scroll_pos); gint fm_nav_history_get_scroll_pos(FmNavHistory* nh); gboolean fm_nav_history_can_back(FmNavHistory* nh); void fm_nav_history_chdir(FmNavHistory* nh, FmPath* path, gint old_scroll_pos); void fm_nav_history_clear(FmNavHistory* nh); void fm_nav_history_set_max(FmNavHistory* nh, guint num); G_END_DECLS #endif /* __FM_NAV_HISTORY_H__ */ libfm-1.4.0/src/base/fm-path.c000066400000000000000000001357101475513661000160250ustar00rootroot00000000000000/* * fm-path.c * * Copyright 2009-2014 PCMan * Copyright 2009 Juergen Hoetzel * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-path * @short_description: Path representation for libfm. * @title: FmPath * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-path.h" #include "fm-file-info.h" #include "fm-file.h" #include "fm-utils.h" #include #include #include #define BASENAME_AS_DISP_NAME ((char *)-1) struct _FmPath { gint n_ref; FmPath* parent; char *disp_name; GSequenceIter *iter; /* iterator in parent, NULL for root path */ GSequence *children; /* children to reuse paths */ guchar flags; /* FmPathFlags flags : 8; */ char name[1]; /* basename: in local encoding if native, uri-escaped otherwise */ }; struct _FmPathList { FmList list; }; static FmPath* root_path = NULL; static const char* home_dir = NULL; static int home_len = 0; static FmPath* home_path = NULL; static FmPath* desktop_path = NULL; static const char* desktop_dir = NULL; static int desktop_len = 0; static FmPath* trash_root_path = NULL; /*defined but not used static FmPath* network_root = NULL;*/ static FmPath* apps_root_path = NULL; static GSList* roots = NULL; /* a lock for access to changeable data: roots list, and members of FmPath struct: disp_name, iter, children */ G_LOCK_DEFINE_STATIC(roots); static FmPath* _fm_path_alloc(FmPath* parent, int name_len, int flags) { FmPath* path; path = (FmPath*)g_malloc(sizeof(FmPath) + name_len); path->n_ref = 1; path->flags = flags; path->parent = parent ? fm_path_ref(parent) : NULL; path->disp_name = NULL; path->children = NULL; path->iter = NULL; return path; } static inline FmPath* _fm_path_new_internal(FmPath* parent, const char* name, int name_len, int flags) { FmPath* path = _fm_path_alloc(parent, name_len, flags); memcpy(path->name, name, name_len); path->name[name_len] = '\0'; if (parent) { G_LOCK(roots); if (parent->children == NULL) parent->children = g_sequence_new(NULL); path->iter = g_sequence_insert_sorted(parent->children, path, (GCompareDataFunc)fm_path_compare, NULL); G_UNLOCK(roots); } return path; } /** * _fm_path_new_uri_root * @uri: the uri in the form scheme://user@host/remaining/path * @len: length of the uri * @remaining: retrive the remaining path * * This function create a root FmpPath element for scheme://user@host/, * and return the remaining part in @remaining. */ static FmPath* _fm_path_new_uri_root(const char* uri, int len, const char** remaining) { FmPath* path; GSList* l; char* buf; const char* uri_end = uri + len; const char* host; const char* host_end; const char *disp_name = NULL; int scheme_len, host_len; int flags; /* A generic URI: scheme://user@host/remaining/path */ if(!g_ascii_isalpha(uri[0])) /* invalid */ goto on_error; for(scheme_len = 1; scheme_len < len && uri[scheme_len] != ':';) /* find the : after scheme */ { char ch = uri[scheme_len]; if(g_ascii_isalnum(ch) || ch == '+' || ch == '-' || ch == '.') /* valid scheme characters */ ++scheme_len; else /* this is not a valid URI */ goto on_error; } if(scheme_len == len) /* there is no : in the URI, it's invalid */ goto on_error; /* now there should be // following :, or no slashes at all, such as mailto:someone@somewhere.net */ host = uri + scheme_len + 1; if(host + 2 < uri_end && host[0] == '/' && host[1] == '/') host += 2; flags = 0; host_len = 0; if(scheme_len == 4 && g_ascii_strncasecmp(uri, "file", 4) == 0 && host[0] == '/') /* handle file:/ or file:///, file://host/ isn't our */ { if(remaining) *remaining = host; return fm_path_ref(root_path); } /* special handling for some known schemes */ else if(scheme_len == 5 && g_ascii_strncasecmp(uri, "trash", 5) == 0) /* trashed files are on local filesystems */ { if(remaining) *remaining = host; return fm_path_ref(trash_root_path); } else if(scheme_len == 8 && g_ascii_strncasecmp(uri, "computer", 8) == 0) { flags |= FM_PATH_IS_VIRTUAL; /* FIXME: deprecated */ host_end = host; disp_name = _("Devices"); } else if(scheme_len == 7 && g_ascii_strncasecmp(uri, "network", 7) == 0) { flags |= FM_PATH_IS_VIRTUAL; /* FIXME: deprecated */ host_end = host; disp_name = _("Network"); } else if(scheme_len == 6 && g_ascii_strncasecmp(uri, "mailto", 6) == 0) { /* is any special handling needed? */ if(remaining) *remaining = uri_end; return _fm_path_new_internal(NULL, uri, len, 0); } else /* it's a normal remote URI */ { /* now we're at username@hostname, the authenticaion part */ host_end = host; while(host_end < uri_end && *host_end != '/') /* find the end of host name */ ++host_end; host_len = (host_end - host); if(scheme_len == 4 && g_ascii_strncasecmp(uri, "menu", 4) == 0) { if(host_len == 0) /* fallback to applications */ { if(remaining) *remaining = uri_end; return fm_path_ref(apps_root_path); } else if(host_len == 12 && strncmp(host, "applications", 12) == 0) { if(remaining) *remaining = host_end; return fm_path_ref(apps_root_path); } flags |= (FM_PATH_IS_VIRTUAL|FM_PATH_IS_XDG_MENU); /* FIXME: deprecated */ } } if(remaining) *remaining = host_end; /* it's reasonable to have double slashes :// for URIs other than mailto: */ len = scheme_len + 3 + host_len + 1; G_LOCK(roots); for(l = roots; l; l = l->next) { path = l->data; if(strncmp(path->name, uri, scheme_len) == 0 && (!host_len || !strncmp(&path->name[scheme_len + 3], host, host_len)) && strcmp(&path->name[len-1], "/") == 0) { fm_path_ref(path); G_UNLOCK(roots); return path; } } path = _fm_path_alloc(NULL, len, flags); roots = g_slist_append(roots, path); G_UNLOCK(roots); buf = path->name; memcpy(buf, uri, scheme_len); /* the scheme */ buf += scheme_len; memcpy(buf, "://", 3); /* :// */ buf += 3; if(host_len > 0) /* host name */ { memcpy(buf, host, host_len); buf += host_len; } buf[0] = '/'; /* the trailing / */ buf[1] = '\0'; if (disp_name) path->disp_name = g_strdup(disp_name); /* no lock required, it's new data */ return path; on_error: /* this is not a valid URI */ if(remaining) *remaining = uri + len; return fm_path_ref(root_path); } /** * fm_path_new_child_len * @parent: (allow-none): a parent path * @basename: (allow-none): basename of a direct child of @parent directory * @name_len: length of @basename * * Creates new #FmPath for child of @parent directory which have name * @basename. The string length of @basename is @name_len. @basename is * in glib filename encoding (can be non-UTF-8) of target filesystem. * If @parent is %NULL then @basename assumed to be root of some file * system. * * Returns: (transfer full): a new #FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ static FmPath* _fm_path_new_child_len(FmPath* parent, const char* basename, int name_len, gboolean dont_escape, gboolean is_query) { FmPath* path; int flags; /* skip empty basename */ if(G_UNLIKELY(!basename || name_len == 0)) return parent ? fm_path_ref(parent) : NULL; if(G_LIKELY(parent)) /* remove slashes if needed. */ { flags = parent->flags; /* inherit flags of parent */ if (!is_query) while(basename[0] == '/') { ++basename; --name_len; } if (!is_query) while(name_len > 0 && basename[name_len-1] == '/') --name_len; /* special case for . and .. */ if(basename[0] == '.') { if(name_len == 1) /* . */ return fm_path_ref(parent); else if(name_len == 2 && basename[1] == '.') /* .. */ return parent->parent ? fm_path_ref(parent->parent) : fm_path_ref(parent); } } else /* this basename is root of the fs (no parent), it can be "/" or something like "ftp://user@host/" */ { /* remove duplicated leading slashes and treat them as one / */ if(G_UNLIKELY(basename[0] == '/')) /* this is a posix path */ return fm_path_ref(root_path); else /* This is something like: trash:///, computer:/// sftp://user@host/ */ return _fm_path_new_uri_root(basename, name_len, NULL); } /* remove tailing slashes */ if (!is_query) while(name_len > 0 && basename[name_len-1] == '/') --name_len; if(name_len == 0) return fm_path_ref(parent); /* create path data first */ if(dont_escape) { path = _fm_path_alloc(parent, name_len, flags); memcpy(path->name, basename, name_len); } else { GString *str = g_string_new_len(basename, name_len); /* remote file names don't come escaped from gvfs; isn't that a bug of gvfs? */ char *escaped = g_uri_escape_string(str->str, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE); /* g_debug("got child %s", escaped); */ name_len = strlen(escaped); path = _fm_path_alloc(parent, name_len, flags); memcpy(path->name, escaped, name_len); g_free(escaped); g_string_free(str, TRUE); } path->name[name_len] = '\0'; G_LOCK(roots); if (parent->children) { GSequenceIter *iter; /* try to reuse existing path */ #if GLIB_CHECK_VERSION(2, 28, 0) iter = g_sequence_lookup(parent->children, path, (GCompareDataFunc)fm_path_compare, NULL); #else iter = g_sequence_search(parent->children, path, (GCompareDataFunc)fm_path_compare, NULL); if (iter) { FmPath *pp = NULL; iter = g_sequence_iter_prev(iter); if (iter) pp = g_sequence_get(iter); if (fm_path_compare(pp, path) != 0) iter = NULL; } #endif if (iter) { /* g_debug("found reusable path '%.*s'", name_len, basename); */ FmPath *np = fm_path_ref(g_sequence_get(iter)); G_UNLOCK(roots); /* we should not unref with lock up */ fm_path_unref(path); /* drop this path and reuse found one */ return np; } else path->iter = g_sequence_insert_sorted(parent->children, path, (GCompareDataFunc)fm_path_compare, NULL); } else { parent->children = g_sequence_new(NULL); path->iter = g_sequence_append(parent->children, path); } G_UNLOCK(roots); return path; } FmPath* fm_path_new_child_len(FmPath* parent, const char* basename, int name_len) { return _fm_path_new_child_len(parent, basename, name_len, parent && fm_path_is_native(parent), FALSE); } /** * fm_path_new_child * @parent: (allow-none): a parent path * @basename: (allow-none): basename of a direct child of @parent directory * * Creates new #FmPath for child of @parent directory which have name * @basename. @basename is in glib filename encoding (can be non-UTF-8) * of target filesystem. * * Returns: (transfer full): a new #FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ FmPath* fm_path_new_child(FmPath* parent, const char* basename) { if(G_LIKELY(basename && *basename)) { int baselen = strlen(basename); return _fm_path_new_child_len(parent, basename, baselen, parent && fm_path_is_native(parent), FALSE); } return G_LIKELY(parent) ? fm_path_ref(parent) : NULL; } /** * fm_path_new_for_gfile * @gf: a GFile object * * This function converts a GFile object to FmPath. * * Returns: a newly created FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ FmPath* fm_path_new_for_gfile(GFile* gf) { FmPath* path; char* str; if( g_file_is_native(gf) ) { str = g_file_get_path(gf); path = fm_path_new_for_path(str); } else { str = g_file_get_uri(gf); path = fm_path_new_for_uri(str); } g_free(str); return path; } /** * fm_path_new_relative * @parent: (allow-none): a parent path * @rel: (allow-none): a path relative to @parent * * Creates new #FmPath which is relative to @parent directory by the * relative path string @rel. @rel is in glib filename encoding (can be * non-UTF-8) if @parent is native and should be escaped URI subpath * otherwise. For example, if @parent is "http://wiki.lxde.org/" and * @rel is "zh/\%E9\%A6\%96\%E9\%A0\%81", the resulting path will be * "http://wiki.lxde.org/zh/\%E9\%A6\%96\%E9\%A0\%81". * * If @parent is NULL, this works the same as fm_path_new_for_str(@rel) * * Returns: (transfer full): a new #FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ FmPath* fm_path_new_relative(FmPath* parent, const char* rel) { FmPath* path; if(G_UNLIKELY(!rel || !*rel)) /* relative path is empty */ return parent ? fm_path_ref(parent) : fm_path_ref(root_path); /* return parent */ /* g_debug("fm_path_new_relative: %s", rel); */ if(G_LIKELY(parent)) { char* sep; /* remove leading slashes */ while(*rel == '/') ++rel; if(!*rel) path = fm_path_ref(parent); else { sep = strchr(rel, '/'); if(sep) { FmPath *new_parent = _fm_path_new_child_len(parent, rel, sep - rel, TRUE, FALSE); path = fm_path_new_relative(new_parent, sep + 1); fm_path_unref(new_parent); } else { path = _fm_path_new_child_len(parent, rel, strlen(rel), TRUE, FALSE); } } } else /* this is actaully a full path */ path = fm_path_new_for_str(rel); return path; } /** * fm_path_new_for_path * @path_name: (allow-none): a POSIX path. * * Returns: a newly created FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ FmPath* fm_path_new_for_path(const char* path_name) { FmPath* path; if(!path_name || !*path_name) return fm_path_ref(root_path); /* some special cases */ if(G_LIKELY(path_name[0] == '/')) { if(G_UNLIKELY(path_name[1] == '\0')) /* pathname is / */ path = fm_path_ref(root_path); else path = fm_path_new_relative(root_path, path_name + 1); } else /* pathname should be absolute path. otherwise its invalid */ path = fm_path_ref(root_path); /* return root */ return path; } /** * fm_path_new_for_uri * @uri: (allow-none): a URI with special characters escaped. * * Creates new #FmPath by given @uri. You have to call * fm_path_unref() when it's no longer needed. * * You can call fm_path_to_uri() to convert a FmPath to a escaped URI * string. * * This function never fail but it may return root path if URI is local * and contains illegal characters in path elements such as '/'. * * Returns: (transfer full): a new #FmPath for the @uri. */ FmPath* fm_path_new_for_uri(const char* uri) { FmPath* path, *root; const char* rel_path; if(!uri || !*uri) return fm_path_ref(root_path); root = _fm_path_new_uri_root(uri, strlen(uri), &rel_path); if(*rel_path) { if(root == root_path) { /* handle file:/// URIs */ char *filename = g_filename_from_uri(uri, NULL, NULL); /* NOTE: g_filename_from_uri() will fail on unescaping '%2F' */ path = fm_path_new_relative(root, filename); g_free(filename); } else if (strchr(rel_path, '?') != NULL) /* it's query not regular URI */ path = _fm_path_new_child_len(root, rel_path+1, strlen(rel_path)-1, TRUE, TRUE); else path = fm_path_new_relative(root, rel_path); fm_path_unref(root); } else path = root; return path; } /* looks for known display_name, returns referenced child */ static FmPath *_lookup_in_children(FmPath *path, const char *display_name) { FmPath *subpath = NULL; G_LOCK(roots); if (path->children != NULL) { GSequenceIter *iter = g_sequence_get_begin_iter(path->children); const char *name; while (!g_sequence_iter_is_end(iter)) { path = (FmPath*)g_sequence_get(iter); name = path->disp_name; if (name) { if (name == BASENAME_AS_DISP_NAME) name = path->name; if (strcmp(display_name, name) == 0) { subpath = fm_path_ref(path); break; } } iter = g_sequence_iter_next(iter); } } G_UNLOCK(roots); return subpath; } /** * fm_path_new_for_display_name * @path_name: an UTF-8 encoded display path name * * The @path_name can either be a POSIX path in UTF-8 encoding, or an * unescaped URI (can contain non-ASCII characters and spaces). Returned * data should be freed with fm_path_unref() when it's no longer needed. * Display name may be fully unrelated to it's path name and built path * may be inexistant. Use FmJob to check and validate its existance. * * Returns: a newly created #FmPath. * * Since: 0.1.14 */ FmPath* fm_path_new_for_display_name(const char* path_name) { FmPath *path; FmPath *cpath; GFile *file = NULL, *child; char *path_copy, *c, *sep; char sep_char; if(!path_name || !*path_name || (path_name[0]=='/' && path_name[1] == '\0') ) return fm_path_ref(root_path); if (path_name[0] != '/') /* it's an URI */ { sep = strchr(path_name, ':'); if (!sep) /* invalid path */ /* FIXME: fail on this */ return fm_path_ref(root_path); /* FIXME: should we test for "C:\path..." too? */ if (sep[1] != '/') /* something like mailto:xx@yy */ return fm_path_new_for_uri(path_name); if (sep[2] != '/') /* malformed URI */ return fm_path_new_for_str(path_name); /* FIXME: handle this? */ path_copy = g_strdup(path_name); c = path_copy + (sep + 3 - path_name); /* set after xx:// */ sep = strchr(c, '/'); if (sep) { if (strchr(sep, '?') != NULL) { /* it is not URI path but rather URI query, pass it "as is" */ path = fm_path_new_for_uri(path_copy); goto _finish; } /* terminate root URI after third slash */ sep++; } /* use c for escaped copy of root path temporarily we use another set of allowed chars, see bug #3599638 */ c = g_uri_escape_string(path_copy, G_URI_RESERVED_CHARS_GENERIC_DELIMITERS G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, FALSE); path = _fm_path_new_uri_root(c, strlen(c), NULL); /* g_debug("** display URI root: %s",path->name); */ g_free(c); c = sep; sep_char = '/'; /* separator for URI is always slash */ } else { path_copy = g_strdup(path_name); path = fm_path_ref(root_path); c = path_copy + 1; sep_char = G_DIR_SEPARATOR; } for ( ; c; c = sep) { sep = strchr(c, sep_char); if (sep) *sep++ = '\0'; /* separate one part of path */ /* g_debug("** next subpath: %s",c); */ if (*c == '\0') /* duplicate '/' */ continue; if (strcmp(c, ".") == 0) /* skip "." */ continue; /* check if we have it already cached */ cpath = _lookup_in_children(path, c); if (cpath) { /* g_debug("** found child: %s => %s",c,cpath->name); */ } else if (strcmp(c, "..") == 0) /* go back one dir */ { if (path->parent == NULL) /* attempt to go below root */ break; cpath = fm_path_ref(path->parent); } else { file = fm_path_to_gfile(path); child = g_file_get_child_for_display_name(file, c, NULL); g_object_unref(file); if (child) /* successfull conversion, use name we got */ { /* char *cc = g_file_get_uri(child); g_debug("** resolved display name: %s => %s",c,cc); g_free(cc); */ c = g_file_get_basename(child); } /* otherwise use basename as fallback */ cpath = fm_path_new_child(path, c); /* g_debug("** adding child: %s",cpath->name); */ if (child) { g_free(c); g_object_unref(child); } } fm_path_unref(path); path = cpath; } _finish: g_free(path_copy); return path; } /** * fm_path_new_for_str * @path_str: (allow-none): a string representing the file path in its native * encoding (can be non-UTF-8). It can either be a native path or an * unescaped URI (can contain non-ASCII characters and spaces). * The function will try to figure out what to do. * * You can call fm_path_to_str() to convert a FmPath back to its string * presentation. * * Returns: a newly created FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ FmPath* fm_path_new_for_str(const char* path_str) { char *escaped; FmPath *path; if(!path_str || !*path_str) return fm_path_ref(root_path); if(path_str[0] == '/') return fm_path_new_for_path(path_str); /* UTF-8 should be allowed, I think. */ escaped = g_uri_escape_string(path_str, G_URI_RESERVED_CHARS_GENERIC_DELIMITERS G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, TRUE); path = fm_path_new_for_uri(escaped); g_free(escaped); return path; } /** * fm_path_new_for_commandline_arg * @arg: a file path passed in command line argv to the program. The @arg * can be a POSIX path in glib filename encoding (can be non-UTTF-8) and * can be a URI with non-ASCII characters escaped, like * http://wiki.lxde.org/zh/\%E9\%A6\%96\%E9\%A0\%81. * * Returns: a newly created FmPath for the path. You have to call * fm_path_unref() when it's no longer needed. */ FmPath* fm_path_new_for_commandline_arg(const char* arg) { if(!arg || !*arg || (arg[0]=='/' && arg[1] == '\0')) return fm_path_ref(root_path); if(arg[0] == '/') return fm_path_new_for_path(arg); return fm_path_new_for_uri(arg); } /** * fm_path_ref * @path: an existing #FmPath * * Increases reference count on @path. * * Returns: @path. */ FmPath* fm_path_ref(FmPath* path) { g_return_val_if_fail(path != NULL, NULL); g_atomic_int_inc(&path->n_ref); return path; } /** * fm_path_unref * @path: an existing #FmPath * * Decreases reference count on @path. When reference count becomes 0 * the @path will be destroyed. */ void fm_path_unref(FmPath* path) { g_return_if_fail(path != NULL); /* g_debug("fm_path_unref: %s, n_ref = %d", fm_path_to_str(path), path->n_ref); */ if(g_atomic_int_dec_and_test(&path->n_ref)) { G_LOCK(roots); if(G_LIKELY(path->parent)) { if (G_LIKELY(path->iter)) g_sequence_remove(path->iter); /* otherwise it's fresh abandoned one, see above */ G_UNLOCK(roots); /* we should not unref with lock up */ fm_path_unref(path->parent); } else { roots = g_slist_remove(roots, path); G_UNLOCK(roots); } /* no further lock required, it is removed from lists */ if (path->disp_name != BASENAME_AS_DISP_NAME) g_free(path->disp_name); if (G_UNLIKELY(path->children)) { g_assert(g_sequence_get_length(path->children) == 0); g_sequence_free(path->children); } g_free(path); } } /** * fm_path_get_parent * @path: a path * * Retrieves path of directory containing @path. * Returned data are owned by @path and should be not freed by caller. * * Returns: (transfer none): path of parent directory or %NULL if @path is root path. * * Since: 0.1.0 */ FmPath* fm_path_get_parent(FmPath* path) { return path->parent; } /** * fm_path_get_scheme_path * @path: a path * * Retrieves a root path for scheme used by @path. If @path is a local * path then returned data are the same as returned with fm_path_get_root(). * Returned data are owned by @path and should be not freed by caller. * * Returns: (transfer none): path of root of @path scheme. * * Since: 1.2.0 */ FmPath* fm_path_get_scheme_path(FmPath* path) { g_return_val_if_fail(path != NULL, NULL); while(path->parent != NULL) path = path->parent; return path; } /** * fm_path_get_basename * @path: a path * * Retrieves basename of @path. * Returned data are owned by @path and should be not freed by caller. * * Returns: basename of path. * * Since: 0.1.0 */ const char* fm_path_get_basename(FmPath* path) { return path->name; } /** * fm_path_get_flags * @path: a path * * Retrieves attributes of @path. * * Returns: attributes of path. * * Since: 0.1.0 */ FmPathFlags fm_path_get_flags(FmPath* path) { return path->flags; } /** * fm_path_has_prefix * @path: a sub path * @prefix: a prefix * * Check if @prefix is a prefix of @path. * For example: /usr/share is the prefix of /usr/share/docs/libfm * but /etc is not. * * Returns: TRUE if @prefix is the prefix of @path. */ gboolean fm_path_has_prefix(FmPath* path, FmPath* prefix) { for(; path; path = path->parent) { if(fm_path_equal(path, prefix)) return TRUE; } return FALSE; } /* recursive internal implem. of fm_path_to_str returns end of current build string */ static gchar* fm_path_to_str_int(FmPath* path, gchar** ret, gint str_len) { gint name_len = strlen(path->name); gchar* pbuf; if (!path->parent) { *ret = g_new0(gchar, str_len + name_len + 1 ); pbuf = *ret; } else { pbuf = fm_path_to_str_int( path->parent, ret, str_len + name_len + 1 ); if (path->parent->parent) /* if parent dir is not root_path */ *pbuf++ = G_DIR_SEPARATOR; } memcpy( pbuf, path->name, name_len ); return pbuf + name_len; } /** * fm_path_to_str * @path: a path * * Creates string representation of @path. It can be either file path in * local encoding or URI with non-ASCII characters escaped (RFC 3986). * Returned data should be freed with g_free() after usage. * * Returns: (transfer full): path string. * * Since: 0.1.0 */ char* fm_path_to_str(FmPath* path) { gchar *ret; fm_path_to_str_int( path, &ret, 0 ); return ret; } /** * fm_path_to_uri * @path: a path * * Creates URI representation of @path. * Returned data should be freed with g_free() after usage. * * Returns: path URI. * * Since: 0.1.0 */ char* fm_path_to_uri(FmPath* path) { char* uri = NULL; char* str = fm_path_to_str(path); if( G_LIKELY(str) ) { if(str[0] == '/') /* absolute path */ uri = g_filename_to_uri(str, NULL, NULL); else /* it's already an URI */ return str; g_free(str); } return uri; } /** * fm_path_display_name * @path: a path * @human_readable: ignored since 1.2.0 * * Creates string representation of @path as displayable UTF-8 string. * The conversion is the most probably unreversible so returned value * should be used only for displaying purposes. The displayable path * may be reliable only if there was already #FmFileInfo retrieved for * the @path, otherwise some estimation will be returned instead, be * careful with this API. * The main purpose for this API is to create displayable path for the * path entry. Applications are encouraged to use g_file_get_parse_name() * instead for any other purposes. * Returned data should be freed with g_free() after usage. * * See also: fm_path_display_basename(), fm_path_to_str(). * * Returns: (transfer full): path string. * * Since: 0.1.0 */ /* FIXME: maybe we can support different encoding for different mount points? */ static char *_fm_path_display_name(FmPath* path, gboolean *is_query) { char* disp; if(G_LIKELY(path->parent)) { char* disp_parent; char* disp_base; if (G_UNLIKELY(*is_query)) /* already detected query */ goto _is_query; else if (fm_path_is_native(path)) { disp_parent = _fm_path_display_name(path->parent, is_query); disp_base = fm_path_display_basename(path); } else if (strchr(path->name, '?') == NULL) { /* URI query not detected yet, check parent beforehand */ disp_parent = _fm_path_display_name(path->parent, is_query); if (G_UNLIKELY(*is_query)) /* parent found that it is a query URI */ goto _is_query2; else disp_base = fm_path_display_basename(path); } else { /* it is not URI path but rather URI query, pass it "as is" */ *is_query = TRUE; _is_query: disp_parent = _fm_path_display_name(path->parent, is_query); _is_query2: disp = g_strjoin(NULL, disp_parent, path->name, NULL); g_free(disp_parent); return disp; } if (fm_path_is_native(path)) disp = g_build_filename( disp_parent, disp_base, NULL); else disp = g_build_path("/", disp_parent, disp_base, NULL); g_free(disp_parent); g_free(disp_base); } else disp = g_uri_unescape_string(path->name, NULL); return disp; } char* fm_path_display_name(FmPath* path, gboolean human_readable) { gboolean is_query = FALSE; return _fm_path_display_name(path, &is_query); } /** * fm_path_display_basename * @path: a path * * Creates displayable basename of @path. If @path is a scheme root path * (i.e. "/", "sftp://", etc.) then returns basename of @path. For other * paths displayable basename may be reliable only if there was already * #FmFileInfo retrieved for the @path, otherwise some estimation will be * done instead, be careful with this API. * Returned data should be freed with g_free() after usage. * * See also: fm_file_info_get_disp_name(). * * Returns: (transfer full): displayable basename of path. * * Since: 0.1.0 */ /* FIXME: maybe we can support different encoding for different mount points? */ char* fm_path_display_basename(FmPath* path) { if(G_UNLIKELY(!path->parent)) /* root_path element */ return g_strdup(path->name); G_LOCK(roots); if (G_LIKELY(path->disp_name == BASENAME_AS_DISP_NAME)) { G_UNLOCK(roots); return g_strdup(path->name); } if (path->disp_name) { char *name = g_strdup(path->disp_name); G_UNLOCK(roots); return name; } G_UNLOCK(roots); if(!fm_path_is_native(path)) return g_uri_unescape_string(path->name, NULL); return g_filename_display_name(path->name); } void _fm_path_set_display_name(FmPath *path, const char *disp_name) { if (!disp_name || !*disp_name) { char *_name = NULL; if(!fm_path_is_native(path)) _name = g_uri_unescape_string(path->name, NULL); else _name = g_filename_display_name(path->name); _fm_path_set_display_name(path, _name); g_free(_name); return; } G_LOCK(roots); if (path->disp_name != BASENAME_AS_DISP_NAME) { /* check if it is set already */ if (g_strcmp0(disp_name, path->disp_name) == 0) { G_UNLOCK(roots); return; } g_free(path->disp_name); } /* g_debug("set display name of %s to %s", path->name, disp_name); */ /* By default we use the real file base name for display. * if the base name is not in UTF-8 encoding, we * need to convert it to UTF-8 for display and save its * UTF-8 version in fi->disp_name */ if (g_strcmp0(disp_name, path->name) == 0) path->disp_name = BASENAME_AS_DISP_NAME; else path->disp_name = g_strdup(disp_name); G_UNLOCK(roots); } /* use this to avoid change from another thread */ static char *_display_name_static_keeper = NULL; /* this API is not thread capable! */ const char *_fm_path_get_display_name(FmPath *path) { G_LOCK(roots); if (path->disp_name == BASENAME_AS_DISP_NAME) { G_UNLOCK(roots); return path->name; } g_free(_display_name_static_keeper); /* use this to keep disp_name after returning from lock because another thread may change it at that time, although _display_name_static_keeper isn't protected by lock so should be protected by general glib lock */ _display_name_static_keeper = g_strdup(path->disp_name); G_UNLOCK(roots); return _display_name_static_keeper; } /** * fm_path_to_gfile * @path: a path * * Creates #GFile representation of @path. * Returned data should be freed with g_object_unref() after usage. * * Returns: (transfer full): a #GFile object. * * Since: 0.1.0 */ GFile* fm_path_to_gfile(FmPath* path) { GFile* gf; char* str; str = fm_path_to_str(path); if(fm_path_is_native(path)) gf = g_file_new_for_path(str); else gf = fm_file_new_for_uri(str); g_free(str); return gf; } /** * fm_path_get_root * * Retrieves #FmPath for root directory. * Returned data are owned by @path and should be not freed by caller. * * Returns: a path. * * Since: 0.1.0 */ FmPath* fm_path_get_root() { return root_path; } /** * fm_path_get_home * * Retrieves #FmPath for home directory. * Returned data are owned by @path and should be not freed by caller. * * Returns: a path. * * Since: 0.1.0 */ FmPath* fm_path_get_home() { return home_path; } /** * fm_path_get_desktop * * Retrieves #FmPath for desktop directory. * Returned data are owned by @path and should be not freed by caller. * * Returns: a path. * * Since: 0.1.0 */ FmPath* fm_path_get_desktop() { return desktop_path; } /** * fm_path_get_trash * * Retrieves #FmPath for Trash can. * Returned data are owned by @path and should be not freed by caller. * * Returns: a path. * * Since: 0.1.0 */ FmPath* fm_path_get_trash() { return trash_root_path; } /** * fm_path_get_apps_menu * * Retrieves #FmPath for menu:// virtual directory. * Returned data are owned by @path and should be not freed by caller. * * Returns: a path. * * Since: 0.1.0 */ FmPath* fm_path_get_apps_menu() { return apps_root_path; } void _fm_path_init() { const char* sep, *name; FmPath* tmp, *parent; /* path object of root_path dir */ root_path = _fm_path_new_internal(NULL, "/", 1, FM_PATH_IS_LOCAL|FM_PATH_IS_NATIVE); home_dir = fm_get_home_dir(); home_len = strlen(home_dir); while(home_dir[home_len - 1] == '/') --home_len; /* build path object for home dir */ name = home_dir + 1; /* skip leading / */ parent = fm_path_ref(root_path); while((sep = strchr(name, '/'))) { int len = (sep - name); if(len > 0) { tmp = _fm_path_new_internal(parent, name, len, FM_PATH_IS_LOCAL|FM_PATH_IS_NATIVE); fm_path_unref(parent); parent = tmp; } name = sep + 1; } home_path = _fm_path_new_internal(parent, name, strlen(name), FM_PATH_IS_LOCAL|FM_PATH_IS_NATIVE); fm_path_unref(parent); desktop_dir = g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP); desktop_len = strlen(desktop_dir); while(desktop_dir[desktop_len - 1] == '/') --desktop_len; /* build path object for desktop_path dir */ if(G_UNLIKELY(strncmp(desktop_dir, home_dir, home_len))) { /* can it be that desktop_dir is outside of home_dir ? */ name = &desktop_dir[1]; parent = fm_path_ref(root_path); } else { name = desktop_dir + home_len; /* skip home_path dir part / */ while (*name == '/') name++; /* skip extra / if any */ if (*name == '\0') name = "Desktop"; /* fallback: never use home_path as desktop_path */ parent = fm_path_ref(home_path); /* preserve ref */ } while((sep = strchr(name, '/'))) { int len = (sep - name); if(len > 0) { tmp = _fm_path_new_internal(parent, name, len, FM_PATH_IS_LOCAL|FM_PATH_IS_NATIVE); fm_path_unref(parent); /* parent is reffed by new child */ parent = tmp; } name = sep + 1; } desktop_path = _fm_path_new_internal(parent, name, strlen(name), FM_PATH_IS_LOCAL|FM_PATH_IS_NATIVE); fm_path_unref(parent); /* we used it already */ /* build path object for trash can */ trash_root_path = _fm_path_new_internal(NULL, "trash:///", 9, FM_PATH_IS_TRASH|FM_PATH_IS_VIRTUAL|FM_PATH_IS_LOCAL); _fm_path_set_display_name(trash_root_path, _("Trash Can")); apps_root_path = _fm_path_new_internal(NULL, "menu://applications/", 20, FM_PATH_IS_VIRTUAL|FM_PATH_IS_XDG_MENU); } void _fm_path_finalize(void) { fm_path_unref(root_path); fm_path_unref(home_path); fm_path_unref(desktop_path); fm_path_unref(trash_root_path); fm_path_unref(apps_root_path); root_path = home_path = desktop_path = trash_root_path = apps_root_path = NULL; } /* For used in hash tables */ /** * fm_path_hash * @path: a path key * * Converts a path to a hash value. * * Returns: a hash value corresponding to the key. * * Since: 0.1.0 */ /* FIXME: is this good enough? */ guint fm_path_hash(FmPath* path) { guint hash = g_str_hash(path->name); if(path->parent) { /* this is learned from g_str_hash() of glib. */ hash = (hash << 5) - hash + '/'; /* this is learned from g_icon_hash() of gio. */ hash ^= fm_path_hash(path->parent); } return hash; } /** * fm_path_equal * @p1: first path * @p2: second path * * Compares two paths and returns %TRUE if they are equal. * * Note that this function is primarily meant as a hash table comparison * function. * * See also: fm_path_compare(). * * Returns: %TRUE if paths are equal. * * Since: 0.1.0 */ /* this is not equal to fm_path_compare()==0 * fm_path_equal is optimized for equality * while fm_path_compare() needs to determine * orders of two items, which is slower. * When you only care about equality, not orders, * use this. */ gboolean fm_path_equal(FmPath* p1, FmPath* p2) { return (p1 == p2); } /* * fm_path_compare * @p1: path 1 * @p2: path 2 * * Compare two paths to determine their orders. * * Note that this function is primarily meant for sorting and therefore * is slow. If you need only know if paths are equal then use * fm_path_equal() instead. * * See also: fm_path_equal(). * * Returns: -1 if @p1 is less than @p2, 0 if they're equal, and +1 if * @p1 is greater than @p2. * * Since: 1.0.2 */ int fm_path_compare(FmPath* p1, FmPath* p2) { int result; if(p1 == p2) return 0; if(!p1) /* if p2 is also NULL then p1==p2 and that is handled above */ return -1; if(!p2) /* case of p1==NULL handled above */ return 1; result = fm_path_compare(p1->parent, p2->parent); if(result == 0) /* if parent paths are equal, compare children */ result = strcmp(p1->name, p2->name); return result; } /** * fm_path_equal_str * @path: a path * @str: a string * @n: length of @string * * Compares path string representation with @string. * * Returns: %TRUE if path and string are equal. * * Since: 0.1.0 */ /* Check if this path contains absolute pathname str*/ gboolean fm_path_equal_str(FmPath *path, const gchar *str, int n) { const gchar *last_part; if(G_UNLIKELY(!path)) return FALSE; /* default compare str len */ if (n == -1) n = strlen( str ); /* end of recursion */ if ((path->parent == NULL) && g_str_equal ( path->name, "/" ) && n == 0 ) return TRUE; /* must also contain leading slash */ if ((size_t)n < (strlen(path->name) + 1)) return FALSE; /* check for current part mismatch */ last_part = str + n - strlen(path->name) - 1; if ( strncmp( last_part + 1, path->name, strlen(path->name)) != 0 ) return FALSE; if ( *last_part != G_DIR_SEPARATOR ) return FALSE; /* tail-end recursion */ return fm_path_equal_str( path->parent, str, n - strlen(path->name) - 1 ); } /** * fm_path_depth * @path: a path * * Calculates how many elements are in this path. * * Returns: %TRUE if paths are equal. * * Since: 1.0.0 */ int fm_path_depth(FmPath* path) { int depth = 1; while(path->parent) { ++depth; path = path->parent; } return depth; } /* path list */ static FmListFuncs funcs = { .item_ref = (gpointer (*)(gpointer))&fm_path_ref, .item_unref = (void (*)(gpointer))&fm_path_unref }; FmPathList* fm_path_list_new() { return (FmPathList*)fm_list_new(&funcs); } /** * fm_path_list_new_from_uris * @uris: NULL-terminated list of URIs * * Creates a #FmPathList from @uris. * * Returns: (transfer full): new #FmPathList. * * Since: 0.1.0 */ FmPathList* fm_path_list_new_from_uris(char* const* uris) { char* const* uri; FmPathList* pl = fm_path_list_new(); for(uri = uris; *uri; ++uri) { const char* puri = *uri; if(puri[0] != '\0') /* ensure that it's not an empty string */ { FmPath* path; if(puri[0] == '/') path = fm_path_new_for_path(puri); else { path = fm_path_new_for_uri(puri); if (path == root_path) { /* it's not a valid path or URI */ fm_path_unref(path); continue; } } fm_list_push_tail_noref((FmList*)pl, path); } } return pl; } /** * fm_path_list_new_from_uri_list * @uri_list: list of URIs separated by newline characters * * Creates a #FmPathList from @uri_list. * * Returns: (transfer full): new #FmPathList. * * Since: 0.1.0 */ FmPathList* fm_path_list_new_from_uri_list(const char* uri_list) { /* The line separator used by text/urilist is CRLF, not LF. However, some existing implementations seems to use '\n'. Let's handle both. */ char** uris = g_strsplit_set(uri_list, "\r\n", -1); FmPathList* pl = fm_path_list_new_from_uris(uris); g_strfreev(uris); return pl; } /** * fm_path_list_to_uri_list * @pl: a path list * * Creates newline-separated list from @pl. Returned data should be freed * with g_free() after usage. * * Returns: (transfer full): string representation of @pl. * * Since: 0.1.0 */ char* fm_path_list_to_uri_list(FmPathList* pl) { GString* buf = g_string_sized_new(4096); fm_path_list_write_uri_list(pl, buf); return g_string_free(buf, FALSE); } /* char** fm_path_list_to_uris(FmPathList* pl) { if( G_LIKELY(!fm_list_is_empty(pl)) ) { GList* l = fm_list_peek_head_link(pl); char** uris = g_new0(char*, fm_list_get_length(pl) + 1); for(i=0; l; ++i, l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; FmPath* path = fi->path; char* uri = fm_path_to_uri(path); uris[i] = uri; } } return NULL; } */ /** * fm_path_list_new_from_file_info_list * @fis: a file info list * * Creates a #FmPathList from @fis. * * Returns: (transfer full): new #FmPathList. * * Since: 0.1.0 */ FmPathList* fm_path_list_new_from_file_info_list(FmFileInfoList* fis) { FmPathList* list = fm_path_list_new(); GList* l; for(l=fm_list_peek_head_link((FmList*)fis);l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; fm_path_list_push_tail(list, fm_file_info_get_path(fi)); } return list; } /** * fm_path_list_new_from_file_info_glist * @fis: (element-type FmFileInfo): list of file infos * * Creates a #FmPathList from @fis. * * Returns: (transfer full): new #FmPathList. * * Since: 0.1.0 */ FmPathList* fm_path_list_new_from_file_info_glist(GList* fis) { FmPathList* list = fm_path_list_new(); GList* l; for(l=fis;l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; fm_path_list_push_tail(list, fm_file_info_get_path(fi)); } return list; } /** * fm_path_list_new_from_file_info_gslist * @fis: (element-type FmFileInfo): list of file infos * * Creates a #FmPathList from @fis. * * Returns: (transfer full): new #FmPathList. * * Since: 0.1.0 */ FmPathList* fm_path_list_new_from_file_info_gslist(GSList* fis) { FmPathList* list = fm_path_list_new(); GSList* l; for(l=fis;l;l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; fm_path_list_push_tail(list, fm_file_info_get_path(fi)); } return list; } /** * fm_path_list_write_uri_list * @pl: a path list * @buf: (out): a storage for resulting list * * Creates newline-separated list of URIs from @pl. * * Since: 0.1.0 */ void fm_path_list_write_uri_list(FmPathList* pl, GString* buf) { GList* l; for(l = fm_path_list_peek_head_link(pl); l; l=l->next) { FmPath* path = (FmPath*)l->data; char* uri = fm_path_to_uri(path); g_string_append(buf, uri); g_free(uri); if(l->next) g_string_append_c(buf, '\n'); } } libfm-1.4.0/src/base/fm-path.h000066400000000000000000000143031475513661000160240ustar00rootroot00000000000000/* * fm-path.h * * Copyright 2009 PCMan * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_PATH_H__ #define __FM_PATH_H__ #include #include #include "fm-list.h" G_BEGIN_DECLS #define FM_PATH(path) ((FmPath*)path) typedef struct _FmPath FmPath; typedef struct _FmPathList FmPathList; /** * FmPathFlags: * @FM_PATH_NONE: - * @FM_PATH_IS_NATIVE: This is a native path to UNIX, like /home * @FM_PATH_IS_LOCAL: This path refers to a file on local filesystem * @FM_PATH_IS_VIRTUAL: This path is virtual and it doesn't exist on real filesystem * @FM_PATH_IS_TRASH: This path is under trash:/// * @FM_PATH_IS_XDG_MENU: This path is under menu:/// * * Flags of #FmPath object. * * FM_PATH_IS_VIRTUAL and FM_PATH_IS_XDG_MENU are deprecated since 1.0.2 * and FM_PATH_IS_LOCAL is deprecated since 1.2.0, * and should not be used in newly written code. */ typedef enum { FM_PATH_NONE = 0, FM_PATH_IS_NATIVE = 1<<0, FM_PATH_IS_LOCAL = 1<<1, FM_PATH_IS_VIRTUAL = 1<<2, FM_PATH_IS_TRASH = 1<<3, FM_PATH_IS_XDG_MENU = 1<<4, /*< private >*/ /* reserved for future use */ FM_PATH_IS_RESERVED1 = 1<<5, FM_PATH_IS_RESERVED2 = 1<<6, FM_PATH_IS_RESERVED3 = 1<<7, } FmPathFlags; typedef struct _FmFileInfoList FmFileInfoList; /* fm-file-info.h includes this too */ void _fm_path_init(void); void _fm_path_finalize(void); FmPath* fm_path_new_for_path(const char* path_name); FmPath* fm_path_new_for_uri(const char* uri); FmPath* fm_path_new_for_display_name(const char* path_name); FmPath* fm_path_new_for_str(const char* path_str); FmPath* fm_path_new_for_commandline_arg(const char* arg); FmPath* fm_path_new_child(FmPath* parent, const char* basename); FmPath* fm_path_new_child_len(FmPath* parent, const char* basename, int name_len); FmPath* fm_path_new_relative(FmPath* parent, const char* rel); FmPath* fm_path_new_for_gfile(GFile* gf); /* predefined paths */ FmPath* fm_path_get_root(void); /* / */ FmPath* fm_path_get_home(void); /* home directory */ FmPath* fm_path_get_desktop(void); /* $HOME/Desktop */ FmPath* fm_path_get_trash(void); /* trash:/// */ FmPath* fm_path_get_apps_menu(void); /* menu://applications.menu/ */ FmPath* fm_path_ref(FmPath* path); void fm_path_unref(FmPath* path); FmPath* fm_path_get_parent(FmPath* path); const char* fm_path_get_basename(FmPath* path); FmPathFlags fm_path_get_flags(FmPath* path); gboolean fm_path_has_prefix(FmPath* path, FmPath* prefix); FmPath* fm_path_get_scheme_path(FmPath* path); #define fm_path_is_native(path) ((fm_path_get_flags(path)&FM_PATH_IS_NATIVE)!=0) #define fm_path_is_trash(path) ((fm_path_get_flags(path)&FM_PATH_IS_TRASH)!=0) #define fm_path_is_trash_root(path) (path == fm_path_get_trash()) #define fm_path_is_native_or_trash(path) ((fm_path_get_flags(path)&(FM_PATH_IS_NATIVE|FM_PATH_IS_TRASH))!=0) #ifndef FM_DISABLE_DEPRECATED #define fm_path_is_local(path) ((fm_path_get_flags(path)&FM_PATH_IS_LOCAL)!=0) #define fm_path_is_virtual(path) ((fm_path_get_flags(path)&FM_PATH_IS_VIRTUAL)!=0) #define fm_path_is_xdg_menu(path) ((fm_path_get_flags(path)&FM_PATH_IS_XDG_MENU)!=0) #endif char* fm_path_to_str(FmPath* path); char* fm_path_to_uri(FmPath* path); GFile* fm_path_to_gfile(FmPath* path); char* fm_path_display_name(FmPath* path, gboolean human_readable); char* fm_path_display_basename(FmPath* path); /* for usage by FmFileInfo handlers - never use in applications */ void _fm_path_set_display_name(FmPath *path, const char *disp_name); const char *_fm_path_get_display_name(FmPath *path); /* For used in hash tables */ guint fm_path_hash(FmPath* path); gboolean fm_path_equal(FmPath* p1, FmPath* p2); /* can be used for sorting */ int fm_path_compare(FmPath* p1, FmPath* p2); /* used for completion in fm_path_entry */ gboolean fm_path_equal_str(FmPath *path, const gchar *str, int n); /* calculate how many elements are in this path. */ int fm_path_depth(FmPath* path); /* path list */ FmPathList* fm_path_list_new(void); FmPathList* fm_path_list_new_from_uri_list(const char* uri_list); FmPathList* fm_path_list_new_from_uris(char* const* uris); FmPathList* fm_path_list_new_from_file_info_list(FmFileInfoList* fis); FmPathList* fm_path_list_new_from_file_info_glist(GList* fis); FmPathList* fm_path_list_new_from_file_info_gslist(GSList* fis); #ifndef __GTK_DOC_IGNORE__ static inline FmPathList* fm_path_list_ref(FmPathList* list) { return list ? (FmPathList*)fm_list_ref((FmList*)list) : NULL; } static inline void fm_path_list_unref(FmPathList* list) { g_return_if_fail(list); fm_list_unref((FmList*)list); } static inline guint fm_path_list_get_length(FmPathList* list) { return fm_list_get_length((FmList*)list); } static inline gboolean fm_path_list_is_empty(FmPathList* list) { return fm_list_is_empty((FmList*)list); } static inline FmPath* fm_path_list_peek_head(FmPathList* list) { return (FmPath*)fm_list_peek_head((FmList*)list); } static inline GList* fm_path_list_peek_head_link(FmPathList* list) { return fm_list_peek_head_link((FmList*)list); } static inline void fm_path_list_push_tail(FmPathList* list, FmPath* d) { fm_list_push_tail((FmList*)list,d); } #endif /* __GTK_DOC_IGNORE__ */ char* fm_path_list_to_uri_list(FmPathList* pl); /* char** fm_path_list_to_uris(FmPathList* pl); */ void fm_path_list_write_uri_list(FmPathList* pl, GString* buf); G_END_DECLS #endif /* __FM_PATH_H__ */ libfm-1.4.0/src/base/fm-templates.c000066400000000000000000001063661475513661000170740ustar00rootroot00000000000000/* * fm-templates.c * * Copyright 2012-2014 Andriy Grytsenko (LStranger) * Copyright 2016 Mamoru TASAKA * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-templates * @short_description: Templates for new files creation. * @title: FmTemplate * * @include: libfm/fm.h * * The #FmTemplate object represents description which files was set for * creation and how those files should be created - that includes custom * prompt, file name template, and template contents. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "fm-templates.h" #include "fm-monitor.h" #include "fm-dir-list-job.h" #include "fm-config.h" #include "fm-folder.h" typedef struct _FmTemplateFile FmTemplateFile; typedef struct _FmTemplateDir FmTemplateDir; struct _FmTemplate { GObject parent; FmTemplateFile *files; /* not referenced, it references instead */ FmMimeType *mime_type; FmPath *template_file; FmIcon *icon; gchar *command; gchar *prompt; gchar *label; }; struct _FmTemplateClass { GObjectClass parent; }; static void fm_template_finalize(GObject *object); G_DEFINE_TYPE(FmTemplate, fm_template, G_TYPE_OBJECT); static void fm_template_class_init(FmTemplateClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_template_finalize; } static GList *templates = NULL; /* in appearance reversed order */ G_LOCK_DEFINE_STATIC(templates); static void fm_template_finalize(GObject *object) { FmTemplate *self; g_return_if_fail(FM_IS_TEMPLATE(object)); self = (FmTemplate*)object; if(self->files) g_error("template reference failure"); fm_mime_type_unref(self->mime_type); if(self->template_file) fm_path_unref(self->template_file); if(self->icon) g_object_unref(self->icon); g_free(self->command); g_free(self->prompt); g_free(self->label); G_OBJECT_CLASS(fm_template_parent_class)->finalize(object); } static void fm_template_init(FmTemplate *self) { } static FmTemplate* fm_template_new(void) { return (FmTemplate*)g_object_new(FM_TEMPLATE_TYPE, NULL); } struct _FmTemplateFile { /* using 'built-in' GList/GSList for speed and less memory consuming */ FmTemplateFile *next_in_dir; FmTemplateFile *prev_in_dir; FmTemplateDir *dir; FmTemplateFile *next_in_templ; /* in priority-less order */ /* referenced */ FmTemplate *templ; FmPath *path; gboolean is_desktop_entry : 1; gboolean inactive : 1; }; struct _FmTemplateDir { /* using 'built-in' GSList for speed and less memory consuming */ FmTemplateDir *next; FmTemplateFile *files; /* referenced */ FmPath *path; GFileMonitor *monitor; gboolean user_dir : 1; }; /* allocated once, on init */ static FmTemplateDir *templates_dirs = NULL; /* determine mime type for the template using just fm_mime_type_* for this isn't appropriate because we need completely another guessing for templates content */ static FmMimeType *_fm_template_guess_mime_type(FmPath *path, FmMimeType *mime_type, FmPath **tpath) { const gchar *basename = fm_path_get_basename(path); FmPath *subpath = NULL; gchar *filename, *type, *url; GKeyFile *kf; /* SF bug #902: if file was deleted instantly we get NULL here */ if (mime_type == NULL) return NULL; /* if file is desktop entry then find the real template file path */ if(mime_type != _fm_mime_type_get_application_x_desktop()) { if(tpath) *tpath = fm_path_ref(path); return fm_mime_type_ref(mime_type); } /* parse file to find mime type */ kf = g_key_file_new(); filename = fm_path_to_str(path); type = NULL; if(g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, NULL)) { type = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, NULL); if(type && strcmp(type, G_KEY_FILE_DESKTOP_TYPE_APPLICATION) == 0) { /* Type=Application, assume it's just file */ g_key_file_free(kf); g_free(filename); g_free(type); if(tpath) *tpath = fm_path_ref(path); return fm_mime_type_ref(_fm_mime_type_get_application_x_desktop()); } if(!type || strcmp(type, G_KEY_FILE_DESKTOP_TYPE_LINK) != 0) { /* desktop entry file invalid as template */ g_key_file_free(kf); g_free(filename); g_free(type); return NULL; } g_free(type); /* valid template should have 'URL' key */ url = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_URL, NULL); if(url) { if(G_UNLIKELY(url[0] == '/')) /* absolute path */ subpath = fm_path_new_for_path(url); else if(G_UNLIKELY(strchr(url, ':'))) /* URI (huh?) */ subpath = fm_path_new_for_uri(url); else /* path relative to directory containing file */ subpath = fm_path_new_relative(fm_path_get_parent(path), url); path = subpath; /* shift to new path */ basename = fm_path_get_basename(path); g_free(url); } else { g_key_file_free(kf); g_free(filename); return NULL; /* invalid template file */ } /* some templates may have 'MimeType' key */ type = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_MIME_TYPE, NULL); if(type) { if(tpath) *tpath = subpath; else fm_path_unref(subpath); g_key_file_free(kf); g_free(filename); mime_type = fm_mime_type_from_name(type); g_free(type); return mime_type; } } /* so we have real template file now, guess from file content first */ mime_type = NULL; g_free(filename); filename = fm_path_to_str(path); /* type is NULL still */ mime_type = fm_mime_type_from_native_file(filename, basename, NULL); if(mime_type == _fm_mime_type_get_application_x_desktop()) { /* template file is an entry */ kf = g_key_file_new(); if(g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, NULL)) { type = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, NULL); if(type) { /* TODO: we support only 'Application' type for now */ if(strcmp(type, G_KEY_FILE_DESKTOP_TYPE_APPLICATION) == 0) ; else { /* desktop entry file invalid as template */ g_key_file_free(kf); g_free(filename); if(subpath) fm_path_unref(subpath); g_free(type); fm_mime_type_unref(mime_type); return NULL; } g_free(type); } } g_key_file_free(kf); } /* we got a desktop entry link to not existing file, guess from file name */ if(!mime_type) { gboolean uncertain; type = g_content_type_guess(basename, NULL, 0, &uncertain); if(type && !uncertain) mime_type = fm_mime_type_from_name(type); g_free(type); /* ignore unrecognizable files instead of using application/octet-stream */ } g_free(filename); if(tpath) *tpath = subpath; else if(subpath) fm_path_unref(subpath); return mime_type; } /* find or create new FmTemplate */ /* requires lock held */ static FmTemplate *_fm_template_find_for_file(FmPath *path, FmMimeType *mime_type) { GList *l; FmTemplate *templ; FmPath *tpath = NULL; gboolean template_type_once = fm_config->template_type_once; if(template_type_once) mime_type = _fm_template_guess_mime_type(path, mime_type, NULL); else mime_type = _fm_template_guess_mime_type(path, mime_type, &tpath); if(!mime_type) { /* g_debug("could not guess MIME type for template %s, ignoring it", fm_path_get_basename(path)); */ if(tpath) fm_path_unref(tpath); return NULL; } if(!template_type_once && !tpath) { /* g_debug("no basename defined in template %s, ignoring it", fm_path_get_basename(path)); */ fm_mime_type_unref(mime_type); return NULL; } for(l = templates; l; l = l->next) { templ = l->data; if(!template_type_once) { if(strcmp(fm_path_get_basename(templ->template_file), fm_path_get_basename(tpath)) == 0) { g_object_ref(templ); fm_mime_type_unref(mime_type); fm_path_unref(tpath); return templ; } } else if(templ->mime_type == mime_type) { g_object_ref(templ); fm_mime_type_unref(mime_type); return templ; } } templ = fm_template_new(); templ->mime_type = mime_type; templ->template_file = tpath; templates = g_list_prepend(templates, g_object_ref(templ)); return templ; } /* requires lock held */ static void _fm_template_update_from_file(FmTemplate *templ, FmTemplateFile *file) { if(file == NULL) return; /* update from less relevant file first */ _fm_template_update_from_file(templ, file->next_in_templ); if(file->is_desktop_entry) /* desktop entry */ { GKeyFile *kf = g_key_file_new(); char *filename = fm_path_to_str(file->path); char *tmp; GError *error = NULL; gboolean hidden; if(g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, &error)) { hidden = g_key_file_get_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL); file->inactive = hidden; /* g_debug("%s hidden: %d", filename, hidden); */ /* FIXME: test for G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN ? */ if(!hidden) { tmp = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, NULL); if(!tmp || strcmp(tmp, G_KEY_FILE_DESKTOP_TYPE_LINK) != 0) { /* it seems it's just Application template */ g_key_file_free(kf); g_free(filename); g_free(tmp); if(!templ->template_file) templ->template_file = fm_path_ref(file->path); return; } g_free(tmp); tmp = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_URL, NULL); if(tmp) { if(templ->template_file) fm_path_unref(templ->template_file); if(G_UNLIKELY(tmp[0] == '/')) /* absolute path */ templ->template_file = fm_path_new_for_path(tmp); else if(G_UNLIKELY(strchr(tmp, ':'))) /* URI (huh?) */ templ->template_file = fm_path_new_for_uri(tmp); else /* path relative to directory containing file */ templ->template_file = fm_path_new_relative(file->dir->path, tmp); g_free(tmp); } tmp = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL); if(tmp) { if(templ->icon) g_object_unref(templ->icon); templ->icon = fm_icon_from_name(tmp); g_free(tmp); } tmp = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); if(tmp) { g_free(templ->command); templ->command = tmp; } tmp = g_key_file_get_locale_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); if(tmp) { g_free(templ->label); templ->label = tmp; } tmp = g_key_file_get_locale_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, NULL, NULL); if(tmp) { g_free(templ->prompt); templ->prompt = tmp; } /* FIXME: forge prompt from 'Name' if not set yet? */ } } else { g_warning("problem loading template %s: %s", filename, error->message); g_error_free(error); file->inactive = TRUE; } g_key_file_free(kf); g_free(filename); } else /* plain file */ { if(!templ->template_file) templ->template_file = fm_path_ref(file->path); file->inactive = FALSE; } } /* recreate data in FmTemplate from entries */ /* requires lock held */ static FmTemplate *_fm_template_update(FmTemplate *templ) { GList *l; FmTemplate *new_templ; FmTemplateFile *file; if(templ->files == NULL) /* template is empty now */ { templates = g_list_remove(templates, templ); g_object_unref(templ); /* we removed it from list so drop reference */ return NULL; } l = g_list_find(templates, templ); if(l == NULL) g_error("FmTemplate not found in list"); /* isolate and unref old template */ l->data = new_templ = fm_template_new(); /* reference is bound to list */ new_templ->mime_type = fm_mime_type_ref(templ->mime_type); new_templ->files = templ->files; templ->files = NULL; for(file = new_templ->files; file; file = file->next_in_templ) { file->templ = g_object_ref(new_templ); g_object_unref(templ); } /* update from file list */ _fm_template_update_from_file(new_templ, new_templ->files); /* set template if it's not set, sorting by name requires it */ if(!new_templ->template_file && templ->template_file && !fm_config->template_type_once) new_templ->template_file = fm_path_ref(templ->template_file); g_object_unref(templ); /* we removed it from list so drop reference */ return new_templ; } /* add file into FmTemplate */ /* requires lock held */ static void _fm_template_insert_sorted(FmTemplate *templ, FmTemplateFile *file) { FmTemplateDir *last_dir = templates_dirs; FmTemplateFile *last = NULL, *next; for(next = templ->files; next; next = next->next_in_templ) { while(last_dir && last_dir != file->dir && last_dir != next->dir) last_dir = last_dir->next; g_assert(last_dir != NULL); /* it must be corruption otherwise */ if(last_dir == file->dir) { if(next->dir == last_dir && !file->is_desktop_entry) { if(!next->is_desktop_entry) break; /* sort files after desktop items */ } else break; } last = next; } file->next_in_templ = next; if(last) last->next_in_templ = file; else templ->files = file; } /* delete file from FmTemplate and free it */ /* requires lock held */ static void _fm_template_file_free(FmTemplate *templ, FmTemplateFile *file, gboolean do_update) { FmTemplateFile *file2 = templ->files; if(file2 == file) templ->files = file->next_in_templ; else while(file2) { if(file2->next_in_templ == file) { file2->next_in_templ = file->next_in_templ; break; } file2 = file2->next_in_templ; } if(!file2) g_critical("FmTemplate: file being freed is missed in template"); g_object_unref(templ); fm_path_unref(file->path); g_slice_free(FmTemplateFile, file); if(do_update) _fm_template_update(templ); } static void on_job_finished(FmJob *job, FmTemplateDir *dir) { GList *file_infos, *l; FmFileInfo *fi; FmPath *path; FmTemplateFile *file; FmTemplate *templ; g_signal_handlers_disconnect_by_func(job, on_job_finished, dir); file_infos = fm_file_info_list_peek_head_link(fm_dir_list_job_get_files(FM_DIR_LIST_JOB(job))); for(l = file_infos; l; l = l->next) { fi = l->data; if(fm_file_info_is_hidden(fi) || fm_file_info_is_backup(fi)) continue; path = fm_file_info_get_path(fi); G_LOCK(templates); for(file = dir->files; file; file = file->next_in_dir) if(fm_path_equal(path, file->path)) break; G_UNLOCK(templates); if(file) /* it's duplicate */ continue; /* ensure the path is based on dir->path */ path = fm_path_new_child(dir->path, fm_path_get_basename(path)); G_LOCK(templates); templ = _fm_template_find_for_file(path, fm_file_info_get_mime_type(fi)); G_UNLOCK(templates); if(!templ) /* mime type guessing error */ { fm_path_unref(path); continue; } file = g_slice_new(FmTemplateFile); file->templ = templ; file->path = path; file->is_desktop_entry = fm_file_info_is_desktop_entry(fi); file->dir = dir; G_LOCK(templates); file->next_in_dir = dir->files; file->prev_in_dir = NULL; if(dir->files) dir->files->prev_in_dir = file; dir->files = file; _fm_template_insert_sorted(templ, file); _fm_template_update(templ); G_UNLOCK(templates); } } static void on_dir_changed(GFileMonitor *mon, GFile *gf, GFile *other, GFileMonitorEvent evt, FmTemplateDir *dir) { GFile *gfile = fm_path_to_gfile(dir->path); char *basename, *pathname; FmTemplateFile *file; FmPath *path; FmTemplate *templ; FmMimeType *mime_type; if(g_file_equal(gf, gfile)) { /* it's event on folder itself, ignoring */ g_object_unref(gfile); return; } g_object_unref(gfile); switch(evt) { case G_FILE_MONITOR_EVENT_CHANGED: basename = g_file_get_basename(gf); if (basename == NULL) break; G_LOCK(templates); for(file = dir->files; file; file = file->next_in_dir) if(strcmp(fm_path_get_basename(file->path), basename) == 0) break; g_free(basename); if(file) { if(file->is_desktop_entry) /* we aware only of entries content */ _fm_template_update(file->templ); } else g_warning("templates monitor: change for unknown file"); G_UNLOCK(templates); break; case G_FILE_MONITOR_EVENT_DELETED: basename = g_file_get_basename(gf); if (basename == NULL) break; G_LOCK(templates); for(file = dir->files; file; file = file->next_in_dir) if(strcmp(fm_path_get_basename(file->path), basename) == 0) break; g_free(basename); if(file) { if(file == dir->files) dir->files = file->next_in_dir; else if(file->prev_in_dir) file->prev_in_dir->next_in_dir = file->next_in_dir; if(file->next_in_dir) file->next_in_dir->prev_in_dir = file->prev_in_dir; _fm_template_file_free(file->templ, file, TRUE); G_UNLOCK(templates); } else G_UNLOCK(templates); /* else it is already deleted */ break; case G_FILE_MONITOR_EVENT_CREATED: basename = g_file_get_basename(gf); G_LOCK(templates); for(file = dir->files; file; file = file->next_in_dir) if(strcmp(fm_path_get_basename(file->path), basename) == 0) break; G_UNLOCK(templates); /* NOTE: to query file info is too heavy so do own assumptions */ if(!file && basename[0] != '.' && !g_str_has_suffix(basename, "~")) { path = fm_path_new_child(dir->path, basename); pathname = fm_path_to_str(path); mime_type = fm_mime_type_from_native_file(pathname, basename, NULL); g_free(pathname); G_LOCK(templates); templ = _fm_template_find_for_file(path, mime_type); if(templ) { file = g_slice_new(FmTemplateFile); file->templ = templ; file->path = path; file->is_desktop_entry = (mime_type == _fm_mime_type_get_application_x_desktop()); file->dir = dir; file->next_in_dir = dir->files; file->prev_in_dir = NULL; if (dir->files) dir->files->prev_in_dir = file; dir->files = file; _fm_template_insert_sorted(templ, file); _fm_template_update(templ); G_UNLOCK(templates); } else { G_UNLOCK(templates); fm_path_unref(path); g_warning("could not guess type of template %s, ignoring it", basename); } if (G_LIKELY(mime_type)) fm_mime_type_unref(mime_type); } else g_debug("templates monitor: duplicate file %s", basename); g_free(basename); break; #if GLIB_CHECK_VERSION(2, 24, 0) case G_FILE_MONITOR_EVENT_MOVED: #endif case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: case G_FILE_MONITOR_EVENT_PRE_UNMOUNT: case G_FILE_MONITOR_EVENT_UNMOUNTED: /* ignore those */ break; } } static void _template_dir_init(FmTemplateDir *dir, GFile *gf) { FmDirListJob *job = fm_dir_list_job_new2(dir->path, FM_DIR_LIST_JOB_FAST); GError *error = NULL; dir->files = NULL; g_signal_connect(job, "finished", G_CALLBACK(on_job_finished), dir); if(!fm_job_run_async(FM_JOB(job))) g_signal_handlers_disconnect_by_func(job, on_job_finished, dir); dir->monitor = fm_monitor_directory(gf, &error); if(dir->monitor) g_signal_connect(dir->monitor, "changed", G_CALLBACK(on_dir_changed), dir); else { g_debug("file monitor cannot be created: %s", error->message); g_error_free(error); } g_object_unref(job); } static void on_once_type_changed(FmConfig *cfg, gpointer unused) { GList *l, *old_list; FmTemplateFile *file; FmTemplate *templ; G_LOCK(templates); /* rebuild templates list from known files */ old_list = templates; templates = NULL; for(l = old_list; l; l = l->next) { templ = l->data; while((file = templ->files)) { templ->files = file->next_in_templ; file->templ = _fm_template_find_for_file(file->path, templ->mime_type); _fm_template_insert_sorted(file->templ, file); g_object_unref(templ); /* for a removed file */ } g_object_unref(templ); /* for removing from list */ } g_list_free(old_list); /* update all templates now */ g_list_foreach(templates, (GFunc)_fm_template_update, NULL); G_UNLOCK(templates); } void _fm_templates_init(void) { const gchar * const *data_dirs = g_get_system_data_dirs(); const gchar * const *data_dir; const gchar *dir_name; FmTemplateDir *dir = NULL; GFile *parent, *gfile; if(templates_dirs) return; /* someone called us again? */ /* prepare list of system template directories */ for(data_dir = data_dirs; *data_dir; ++data_dir) { parent = g_file_new_for_path(*data_dir); gfile = g_file_get_child(parent, "templates"); g_object_unref(parent); if(g_file_query_exists(gfile, NULL)) { if(G_LIKELY(dir)) { dir->next = g_slice_new(FmTemplateDir); dir = dir->next; } else templates_dirs = dir = g_slice_new(FmTemplateDir); dir->path = fm_path_new_for_gfile(gfile); dir->user_dir = FALSE; _template_dir_init(dir, gfile); } g_object_unref(gfile); } if(G_LIKELY(dir)) dir->next = NULL; /* add templates dir in user data */ dir = g_slice_new(FmTemplateDir); dir->next = templates_dirs; templates_dirs = dir; parent = g_file_new_for_path(g_get_user_data_dir()); gfile = g_file_get_child(parent, "templates"); g_object_unref(parent); dir->path = fm_path_new_for_gfile(gfile); dir->user_dir = TRUE; /* FIXME: create it if it doesn't exist? */ if(g_file_query_exists(gfile, NULL)) _template_dir_init(dir, gfile); else { dir->files = NULL; dir->monitor = NULL; } g_object_unref(gfile); /* add XDG_TEMPLATES_DIR at last */ dir = g_slice_new(FmTemplateDir); dir->next = templates_dirs; templates_dirs = dir; dir_name = g_get_user_special_dir(G_USER_DIRECTORY_TEMPLATES); if(dir_name) dir->path = fm_path_new_for_path(dir_name); else dir->path = fm_path_new_child(fm_path_get_home(), "Templates"); dir->user_dir = TRUE; gfile = fm_path_to_gfile(dir->path); if(!g_file_query_exists(gfile, NULL)) { g_warning("The directory '%s' doesn't exist, ignoring it", dir_name ? dir_name : "~/Templates"); goto _skip_templates_dir; } if (dir->path == fm_path_get_home() || dir->path == fm_path_get_root()) { /* $HOME or / are invalid templates paths so just ignore */ g_warning("XDG_TEMPLATES_DIR is set to invalid path, ignoring it"); _skip_templates_dir: dir->files = NULL; dir->monitor = NULL; } else _template_dir_init(dir, gfile); g_object_unref(gfile); /* jobs will fill list of files async */ g_signal_connect(fm_config, "changed::template_type_once", G_CALLBACK(on_once_type_changed), NULL); } void _fm_templates_finalize(void) { FmTemplateDir *dir; FmTemplateFile *file; g_signal_handlers_disconnect_by_func(fm_config, on_once_type_changed, NULL); while(templates_dirs) { dir = templates_dirs; templates_dirs = dir->next; fm_path_unref(dir->path); if(dir->monitor) { g_signal_handlers_disconnect_by_func(dir->monitor, on_dir_changed, dir); g_object_unref(dir->monitor); } while(dir->files) { file = dir->files; dir->files = file->next_in_dir; if(dir->files) dir->files->prev_in_dir = NULL; _fm_template_file_free(file->templ, file, FALSE); } g_slice_free(FmTemplateDir, dir); } g_list_foreach(templates, (GFunc)g_object_unref, NULL); g_list_free(templates); templates = NULL; } /** * fm_template_list_all * @user_only: %TRUE to ignore system templates * * Retrieves list of all templates. Returned data should be freed after * usage with g_list_free_full(list, g_object_unref). * * Returns: (transfer full) (element-type FmTemplate): list of all known templates. * * Since: 1.2.0 */ GList *fm_template_list_all(gboolean user_only) { GList *list = NULL, *l; G_LOCK(templates); for(l = templates; l; l = l->next) if(!((FmTemplate*)l->data)->files->inactive && (!user_only || ((FmTemplate*)l->data)->files->dir->user_dir)) list = g_list_prepend(list, g_object_ref(l->data)); G_UNLOCK(templates); return list; } /** * fm_template_get_name * @templ: a template descriptor * @nlen: (allow-none): location to get template name length * * Retrieves file name template for @templ. If @nlen isn't %NULL then it * will receive length of file name template without suffix (in characters). * Returned data are owned by @templ and should be not freed by caller. * * Returns: (transfer none): file name template. * * Since: 1.2.0 */ const gchar *fm_template_get_name(FmTemplate *templ, gint *nlen) { const gchar *name; name = templ->template_file ? fm_path_get_basename(templ->template_file) : NULL; if(nlen) { char *point; if(!name) *nlen = 0; else if((point = strrchr(name, '.'))) *nlen = g_utf8_strlen(name, point - name); else *nlen = g_utf8_strlen(name, -1); } return name; } /** * fm_template_get_mime_type * @templ: a template descriptor * * Retrieves MIME type descriptor for @templ. Returned data are owned by * @templ and should be not freed by caller. * * Returns: (transfer none): mime type descriptor. * * Since: 1.2.0 */ FmMimeType *fm_template_get_mime_type(FmTemplate *templ) { return templ->mime_type; } /** * fm_template_get_icon * @templ: a template descriptor * * Retrieves icon defined for @templ. Returned data are owned by @templ * and should be not freed by caller. * * Returns: (transfer none): icon for template. * * Since: 1.2.0 */ FmIcon *fm_template_get_icon(FmTemplate *templ) { if(templ->icon) return templ->icon; return fm_mime_type_get_icon(templ->mime_type); } /** * fm_template_get_prompt * @templ: a template descriptor * * Retrieves prompt for @templ. It can be used as label in entry for the * desired name. If no prompt is defined then returns %NULL. Returned * data are owned by @templ and should be not freed by caller. * * Returns: (transfer none): file prompt. * * Since: 1.2.0 */ const gchar *fm_template_get_prompt(FmTemplate *templ) { return templ->prompt; } /** * fm_template_get_label * @templ: a template descriptor * * Retrieves label for @templ. It can be used as label in menu. Returned * data are owned by @templ and should be not freed by caller. * * Returns: (transfer none): template label. * * Since: 1.2.0 */ const gchar *fm_template_get_label(FmTemplate *templ) { if(!templ->label && !fm_config->template_type_once && templ->template_file) { /* set label to filename if no MIME types are used */ const char *basename = fm_path_get_basename(templ->template_file); const char *tmp = strrchr(basename, '.'); /* strip last suffix */ if(tmp) templ->label = g_strndup(basename, tmp - basename); else templ->label = g_strdup(basename); } return templ->label; } /** * fm_template_is_directory * @templ: a template descriptor * * Checks if @templ is directory template. * * Returns: %TRUE if @templ is directory template. * * Since: 1.2.0 */ gboolean fm_template_is_directory(FmTemplate *templ) { return (templ->mime_type == _fm_mime_type_get_inode_directory()); } /** * fm_template_create_file * @templ: (allow-none): a template descriptor * @path: path to file to create * @error: (allow-none): location to retrieve error * @run_default: %TRUE to run default application on new file * * Tries to create file at @path using rules of creating from @templ. * * Returns: %TRUE if file created successfully. * * Since: 1.2.0 */ gboolean fm_template_create_file(FmTemplate *templ, GFile *path, GError **error, gboolean run_default) { char *command; GAppInfo *app; GFile *tfile; GList *list; GFileOutputStream *f; FmPath *fm_path; FmFolder *fm_folder; gboolean ret; if((templ && !FM_IS_TEMPLATE(templ)) || !G_IS_FILE(path)) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("fm_template_create_file: invalid argument")); return FALSE; } tfile = NULL; if(!templ) goto _create_empty_file; if(templ->template_file) { command = fm_path_to_str(templ->template_file); tfile = g_file_new_for_path(command); g_free(command); } /* FIXME: it may block */ if(templ->mime_type == _fm_mime_type_get_inode_directory()) { if(!g_file_make_directory(path, NULL, error)) return FALSE; } else if(!g_file_copy(tfile, path, G_FILE_COPY_TARGET_DEFAULT_PERMS, NULL, NULL, NULL, error)) { if((*error)->domain != G_IO_ERROR || (*error)->code != G_IO_ERROR_NOT_FOUND) { /* we ran into problems, application will run into them too the most probably, so don't try to launch it then */ g_object_unref(tfile); return FALSE; } /* template file not found, it's normal */ g_clear_error(error); /* create empty file instead */ _create_empty_file: f = g_file_create(path, G_FILE_CREATE_NONE, NULL, error); if(!f) { if(tfile) g_object_unref(tfile); return FALSE; } g_object_unref(f); } if(tfile) g_object_unref(tfile); fm_path = fm_path_new_for_gfile(path); fm_folder = fm_folder_find_by_path(fm_path_get_parent(fm_path)); if (!fm_folder || !_fm_folder_event_file_added(fm_folder, fm_path)) fm_path_unref(fm_path); if (fm_folder) g_object_unref(fm_folder); if(!run_default || !templ) return TRUE; if(templ->command) { app = g_app_info_create_from_commandline(templ->command, NULL, G_APP_INFO_CREATE_NONE, error); } else { app = g_app_info_get_default_for_type(fm_mime_type_get_type(templ->mime_type), FALSE); if(!app && error) g_set_error(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("No default application is set for MIME type %s"), fm_mime_type_get_type(templ->mime_type)); } if(!app) return FALSE; list = g_list_prepend(NULL, path); ret = g_app_info_launch(app, list, NULL, error); g_list_free(list); g_object_unref(app); return ret; } libfm-1.4.0/src/base/fm-templates.h000066400000000000000000000037371475513661000170770ustar00rootroot00000000000000/* * fm-templates.h * * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_TEMPLATES_H__ #define __FM_TEMPLATES_H__ #include #include "fm-mime-type.h" G_BEGIN_DECLS #define FM_TEMPLATE_TYPE (fm_template_get_type()) #define FM_IS_TEMPLATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), FM_TEMPLATE_TYPE)) typedef struct _FmTemplate FmTemplate; typedef struct _FmTemplateClass FmTemplateClass; GType fm_template_get_type(void); void _fm_templates_init(void); void _fm_templates_finalize(void); GList *fm_template_list_all(gboolean user_only); const gchar *fm_template_get_name(FmTemplate *templ, gint *nlen); FmMimeType *fm_template_get_mime_type(FmTemplate *templ); FmIcon *fm_template_get_icon(FmTemplate *templ); const gchar *fm_template_get_prompt(FmTemplate *templ); const gchar *fm_template_get_label(FmTemplate *templ); gboolean fm_template_is_directory(FmTemplate *templ); gboolean fm_template_create_file(FmTemplate *templ, GFile *path, GError **error, gboolean run_default); G_END_DECLS #endif /* __FM_TEMPLATES_H__ */ libfm-1.4.0/src/base/fm-terminal.c000066400000000000000000000245551475513661000167100ustar00rootroot00000000000000/* * fm-terminal.c * * Copyright 2012-2016 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-terminal * @short_description: Terminals representation for libfm. * @title: FmTerminal * * @include: libfm/fm.h * * The FmTerminal object represents description how applications which * require start in terminal should be started. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #if !GLIB_CHECK_VERSION(2, 28, 0) && !HAVE_DECL_ENVIRON extern char **environ; #endif #include "fm-terminal.h" #include "fm-config.h" struct _FmTerminalClass { GObjectClass parent; }; static void fm_terminal_finalize(GObject *object); G_DEFINE_TYPE(FmTerminal, fm_terminal, G_TYPE_OBJECT); static void fm_terminal_class_init(FmTerminalClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_terminal_finalize; } static void fm_terminal_finalize(GObject *object) { FmTerminal* self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_TERMINAL(object)); self = (FmTerminal*)object; g_free(self->program); g_free(self->open_arg); g_free(self->noclose_arg); g_free(self->launch); g_free(self->desktop_id); g_free(self->custom_args); G_OBJECT_CLASS(fm_terminal_parent_class)->finalize(object); } static void fm_terminal_init(FmTerminal *self) { } static FmTerminal* fm_terminal_new(void) { return (FmTerminal*)g_object_new(FM_TERMINAL_TYPE, NULL); } static GSList *terminals = NULL; static FmTerminal *default_terminal = NULL; G_LOCK_DEFINE_STATIC(terminal); static void on_terminal_changed(FmConfig *cfg, gpointer unused) { FmTerminal *term = NULL; gsize n; GSList *l; gchar *name, *basename; if(cfg->terminal == NULL) goto _end; for(n = 0; cfg->terminal[n] && cfg->terminal[n] != ' '; n++); name = g_strndup(cfg->terminal, n); basename = strrchr(name, '/'); if(basename) basename++; else basename = name; /* g_debug("terminal in FmConfig: %s, args=%s", name, &cfg->terminal[n]); */ for(l = terminals; l; l = l->next) if(strcmp(basename, ((FmTerminal*)l->data)->program) == 0) break; /* don't change existing object to be thread-safe */ term = fm_terminal_new(); if(l) { if(name[0] != '/') /* not full path; call by basename */ { term->program = g_strdup(basename); g_free(name); } else /* call by full path */ term->program = name; term->open_arg = g_strdup(((FmTerminal*)l->data)->open_arg); term->noclose_arg = g_strdup(((FmTerminal*)l->data)->noclose_arg); term->launch = g_strdup(((FmTerminal*)l->data)->launch); term->desktop_id = g_strdup(((FmTerminal*)l->data)->desktop_id); } else /* unknown terminal */ { if (strcmp(basename, "x-terminal-emulator") == 0) g_message("x-terminal-emulator has very limited support, consider choosing another terminal"); else g_warning("terminal %s isn't known, consider report it to LibFM developers", basename); term->program = name; term->open_arg = g_strdup("-e"); /* assume it is default */ } if(cfg->terminal[n] == ' ' && cfg->terminal[n+1]) { term->custom_args = g_strdup(&cfg->terminal[n+1]); /* support for old style terminal line alike 'xterm -e %s' */ name = strchr(term->custom_args, '%'); if(name) { /* skip end spaces */ while(name > term->custom_args && name[-1] == ' ') name--; /* drop '-e' or '-x' */ if(name > term->custom_args + 1 && name[-2] == '-') { name -= 2; /* skip end spaces */ while(name > term->custom_args && name[-1] == ' ') name--; } if(name > term->custom_args) *name = '\0'; /* cut the line */ else { g_free(term->custom_args); term->custom_args = NULL; } } } _end: G_LOCK(terminal); if(default_terminal) g_object_unref(default_terminal); default_terminal = term; G_UNLOCK(terminal); } /* init terminal list from config */ void _fm_terminal_init(void) { GKeyFile *kf; gsize i, n; gchar **programs; FmTerminal *term; /* read system terminals file */ kf = g_key_file_new(); if(g_key_file_load_from_file(kf, PACKAGE_DATA_DIR "/terminals.list", 0, NULL)) { programs = g_key_file_get_groups(kf, &n); if(programs) { for(i = 0; i < n; ++i) { /* g_debug("found terminal configuration: %s", programs[i]); */ term = fm_terminal_new(); term->program = programs[i]; term->open_arg = g_key_file_get_string(kf, programs[i], "open_arg", NULL); term->noclose_arg = g_key_file_get_string(kf, programs[i], "noclose_arg", NULL); term->launch = g_key_file_get_string(kf, programs[i], "launch", NULL); term->desktop_id = g_key_file_get_string(kf, programs[i], "desktop_id", NULL); terminals = g_slist_append(terminals, term); } g_free(programs); /* strings in the vector are stolen by objects */ } } g_key_file_free(kf); /* TODO: read user terminals file? */ /* read from config */ on_terminal_changed(fm_config, NULL); /* monitor the config */ g_signal_connect(fm_config, "changed::terminal", G_CALLBACK(on_terminal_changed), NULL); } /* free all resources */ void _fm_terminal_finalize(void) { /* cancel monitor of config */ g_signal_handlers_disconnect_by_func(fm_config, on_terminal_changed, NULL); /* free the data */ g_slist_foreach(terminals, (GFunc)g_object_unref, NULL); g_slist_free(terminals); terminals = NULL; if(default_terminal) g_object_unref(default_terminal); default_terminal = NULL; } /** * fm_terminal_dup_default * @error: (allow-none): location of error to set * * Retrieves description of terminal which is defined in libfm config. * Returned data should be freed with g_object_unref() after usage. * * Returns: (transfer full): terminal descriptor or %NULL if no terminal is set. * * Since: 1.2.0 */ FmTerminal* fm_terminal_dup_default(GError **error) { FmTerminal *term = NULL; G_LOCK(terminal); if(default_terminal) term = g_object_ref(default_terminal); G_UNLOCK(terminal); if(!term) g_set_error_literal(error, G_SHELL_ERROR, G_SHELL_ERROR_EMPTY_STRING, _("No terminal emulator is set in libfm config")); return term; } static void child_setup(gpointer user_data) { /* Move child to grandparent group so it will not die with parent */ setpgid(0, (pid_t)(gsize)user_data); } /** * fm_terminal_launch * @dir: (allow-none): a directory to launch * @error: (allow-none): location of error to set * * Spawns a terminal window in requested @dir. If @dir is %NULL then it * will be spawned in current working directory. * * Returns: %TRUE if spawn was succesful. * * Since: 1.2.0 */ gboolean fm_terminal_launch(const gchar *dir, GError **error) { FmTerminal *term; GDesktopAppInfo *appinfo = NULL; const gchar *cmd; gchar *_cmd = NULL; gchar **argv; gchar **envp; gint argc; gboolean ret; term = fm_terminal_dup_default(error); if(!term) return FALSE; if(term->desktop_id) appinfo = g_desktop_app_info_new(term->desktop_id); if(appinfo) /* FIXME: is it possible to have some %U there? */ cmd = g_app_info_get_commandline(G_APP_INFO(appinfo)); else if(term->launch) cmd = _cmd = g_strdup_printf("%s %s", term->program, term->launch); else cmd = term->program; if (term->custom_args) { cmd = g_strdup_printf("%s %s", cmd, term->custom_args); g_free(_cmd); _cmd = (char *)cmd; } if(!g_shell_parse_argv(cmd, &argc, &argv, error)) argv = NULL; g_free(_cmd); if(appinfo) g_object_unref(appinfo); g_object_unref(term); if(!argv) /* parsing failed */ return FALSE; #if GLIB_CHECK_VERSION(2, 28, 0) envp = g_get_environ(); #else envp = g_strdupv(environ); #endif if (dir) #if GLIB_CHECK_VERSION(2, 32, 0) envp = g_environ_setenv(envp, "PWD", dir, TRUE); #else { char **env = envp; if (env) while (*env != NULL) { if (strncmp(*env, "PWD=", 4) == 0) break; env++; } if (env == NULL || *env == NULL) { gint length; length = envp ? g_strv_length(envp) : 0; envp = g_renew(gchar *, envp, length + 2); env = &envp[length]; env[1] = NULL; } else g_free(*env); *env = g_strdup_printf ("PWD=%s", dir); } #endif ret = g_spawn_async(dir, argv, envp, G_SPAWN_SEARCH_PATH, child_setup, (gpointer)(gsize)getpgid(getppid()), NULL, error); g_strfreev(argv); g_strfreev(envp); return ret; } libfm-1.4.0/src/base/fm-terminal.h000066400000000000000000000052451475513661000167100ustar00rootroot00000000000000/* * fm-terminal.h * * Copyright 2012 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_TERMINAL_H__ #define __FM_TERMINAL_H__ #include G_BEGIN_DECLS #define FM_TERMINAL_TYPE (fm_terminal_get_type()) #define FM_IS_TERMINAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), FM_TERMINAL_TYPE)) typedef struct _FmTerminal FmTerminal; typedef struct _FmTerminalClass FmTerminalClass; /** * FmTerminal: * @program: archiver program * @open_arg: options to insert before <cmd> [<args>] to run command in terminal * @noclose_arg: options to insert to run command without closing terminal or %NULL * @launch: options if required to launch in current directory * @desktop_id: desktop ID to search for icon and descriptions * @custom_args: custom arguments (only from libfm.conf) * * A terminal description. If application should be ran in terminal libfm * may do it either default way (closing terminal window after exit): * - @program @custom_args @open_arg <cmd> [<args>] * * or alternate way (not closing terminal window after exit): * - @program @custom_args @noclose_arg <cmd> [<args>] * * If terminal doesn't support not closing terminal window after exit then * default way should be used. */ struct _FmTerminal { /*< private >*/ GObject parent; /*< public >*/ char* program; char* open_arg; char* noclose_arg; char* launch; char* desktop_id; char* custom_args; /*< private >*/ gpointer _reserved1; gpointer _reserved2; }; GType fm_terminal_get_type(void); void _fm_terminal_init(void); void _fm_terminal_finalize(void); FmTerminal* fm_terminal_dup_default(GError **error); gboolean fm_terminal_launch(const gchar *dir, GError **error); G_END_DECLS #endif /* __FM_TERMINAL_H__ */ libfm-1.4.0/src/base/fm-thumbnail-loader.c000066400000000000000000001141571475513661000203220ustar00rootroot00000000000000/* * fm-thumbnail-loader.c * * Copyright 2010 - 2013 Hong Jen Yee (PCMan) * Copyright 2012-2018 Andriy Grytsenko (LStranger) * Copyright 2020 Ingo Brückl * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-thumbnail-loader * @short_description: A thumbnails cache loader and generator. * @title: FmThumbnailLoader * * @include: libfm/fm.h * * This API allows to generate thumbnails for files and save them on * disk then use that cache next time to display them. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-thumbnail-loader.h" #include "glib-compat.h" #include "fm-config.h" #include "fm-utils.h" #include #include #include #include #include #include #ifdef USE_EXIF #include #endif /* #define ENABLE_DEBUG */ #ifdef ENABLE_DEBUG #define DEBUG(...) g_debug(__VA_ARGS__) #else #define DEBUG(...) #endif #define THUMBNAILER_TIMEOUT_SEC 30 static gboolean backend_loaded = FALSE; static FmThumbnailLoaderBackend backend = {NULL}; typedef enum { LOAD_NORMAL = 1 << 0, /* need to load normal thumbnail */ LOAD_LARGE = 1 << 1, /* need to load large thumbnail */ GENERATE_NORMAL = 1 << 2, /* need to regenerated normal thumbnail */ GENERATE_LARGE = 1 << 3, /* need to regenerated large thumbnail */ }ThumbnailTaskFlags; typedef struct _ThumbnailTask ThumbnailTask; struct _ThumbnailTask { FmFileInfo* fi; /* never changed between creation and destroying */ ThumbnailTaskFlags flags; /* used internally */ GCancellable *cancellable; /* NULL until work is started */ char* uri; /* used internally */ char* normal_path; /* used internally */ char* large_path; /* used internally */ GList* requests; /* access should be locked */ }; /* cancelled above raised when all requests are cancelled and never dropped again */ /* members of this structure cannot have concurrent access */ struct _FmThumbnailLoader { FmFileInfo* fi; ThumbnailTask* task; FmThumbnailLoaderCallback callback; gpointer user_data; GObject* pix; sig_atomic_t cancelled; gshort size; gboolean done : 1; /* it has pix set so will be pushed into ready queue */ }; typedef struct _ThumbnailCacheItem ThumbnailCacheItem; struct _ThumbnailCacheItem { guint size; GObject* pix; /* no reference on it */ }; typedef struct _ThumbnailCache ThumbnailCache; struct _ThumbnailCache { FmPath* path; GSList* items; }; /* FIXME: use thread pool */ /* Lock for loader, generator, and ready queues */ #if GLIB_CHECK_VERSION(2, 32, 0) static GMutex queue_lock; #define lock_ptr &queue_lock static GCond queue_cond; #define cond_ptr &queue_cond #else static GMutex *queue_lock; #define lock_ptr queue_lock static GCond *queue_cond; #define cond_ptr queue_cond #endif /* load generated thumbnails */ static GQueue loader_queue = G_QUEUE_INIT; /* consists of ThumbnailTask */ static gboolean loader_thread_running = FALSE; /* already loaded thumbnails */ static GQueue ready_queue = G_QUEUE_INIT; /* consists of FmThumbnailLoader */ /* idle handler to call ready callback */ static guint ready_idle_handler = 0; /* cached thumbnails, elements are ThumbnailCache* */ static GHashTable* hash = NULL; static char* thumb_dir = NULL; static guint thumbnailer_timeout_id = 0; static gpointer load_thumbnail_thread(gpointer user_data); static void load_thumbnails(ThumbnailTask* task); static void generate_thumbnails(ThumbnailTask* task); static gboolean generate_thumbnails_with_builtin(ThumbnailTask* task); static void generate_thumbnails_with_thumbnailers(ThumbnailTask* task); static GObject* scale_pix(GObject* ori_pix, int size); static void save_thumbnail_to_disk(ThumbnailTask* task, GObject* pix, const char* path); /* may be called in thread */ static void fm_thumbnail_loader_free(FmThumbnailLoader* req) { fm_file_info_unref(req->fi); if(req->pix) g_object_unref(req->pix); g_slice_free(FmThumbnailLoader, req); } /* in main loop */ static gboolean on_ready_idle(gpointer user_data) { FmThumbnailLoader* req; int n = 200; /* max 200 thumbnails in a row */ g_mutex_lock(lock_ptr); while((req = (FmThumbnailLoader*)g_queue_pop_head(&ready_queue)) != NULL) { g_mutex_unlock(lock_ptr); if(!req->cancelled) req->callback(req, req->user_data); fm_thumbnail_loader_free(req); if(--n == 0) return TRUE; /* continue on next idle */ g_mutex_lock(lock_ptr); } ready_idle_handler = 0; g_mutex_unlock(lock_ptr); return FALSE; } /* should be called with queue lock held */ /* may be called in thread */ /* moves all requests into ready_queue */ inline static void thumbnail_task_free(ThumbnailTask* task) { GList *l; for(l = task->requests; l; l = l->next) { FmThumbnailLoader* req = (FmThumbnailLoader*)l->data; req->task = NULL; g_queue_push_tail(&ready_queue, req); if( 0 == ready_idle_handler ) /* schedule an idle handler if there isn't one. */ ready_idle_handler = g_idle_add_full(G_PRIORITY_LOW, on_ready_idle, NULL, NULL); } /* task requests are completely in ready queue now */ if(task->requests) g_list_free(task->requests); fm_file_info_unref(task->fi); if (task->cancellable) g_object_unref(task->cancellable); g_slice_free(ThumbnailTask, task); } static gint comp_request(gconstpointer a, gconstpointer b) { return ((FmThumbnailLoader*)a)->size - ((FmThumbnailLoader*)b)->size; } /* called when cached pixbuf get destroyed */ static void on_pixbuf_destroy(gpointer data, GObject* obj_ptr) { ThumbnailCache* cache = (ThumbnailCache*)data; GObject* pix = (GObject*)obj_ptr; GSList* l; /* remove it from cache */ DEBUG("remove from cache!"); g_mutex_lock(lock_ptr); for(l=cache->items;l;l=l->next) { ThumbnailCacheItem* item = (ThumbnailCacheItem*)l->data; if(item->pix == pix) { cache->items = g_slist_delete_link(cache->items, l); g_slice_free(ThumbnailCacheItem, item); if(!cache->items) { if(hash) /* it could be already destroyed */ g_hash_table_remove(hash, cache->path); fm_path_unref(cache->path); g_slice_free(ThumbnailCache, cache); } break; } } g_mutex_unlock(lock_ptr); } /* called with queue lock held */ /* in thread */ inline static void cache_thumbnail_in_hash(FmPath* path, GObject* pix, guint size) { ThumbnailCache* cache; ThumbnailCacheItem* item; GSList* l = NULL; cache = (ThumbnailCache*)g_hash_table_lookup(hash, path); if(cache) { for(l=cache->items;l;l=l->next) { item = (ThumbnailCacheItem*)l->data; if(item->size == size) break; } } else { cache = g_slice_new0(ThumbnailCache); cache->path = fm_path_ref(path); g_hash_table_insert(hash, cache->path, cache); } if(!l) /* the item is not in cache->items */ { item = g_slice_new(ThumbnailCacheItem); item->size = size; item->pix = pix; cache->items = g_slist_prepend(cache->items, item); g_object_weak_ref(G_OBJECT(pix), on_pixbuf_destroy, cache); } } /* in thread */ static void thumbnail_task_finish(ThumbnailTask* task, GObject* normal_pix, GObject* large_pix) { GObject* cached_pix = NULL; gint cached_size = 0; GList* l; /* sort the requests by requested size to utilize cached scaled pixbuf */ g_mutex_lock(lock_ptr); task->requests = g_list_sort(task->requests, comp_request); for(l=task->requests; l; l=l->next) { FmThumbnailLoader* req = (FmThumbnailLoader*)l->data; /* the thumbnail is ready, queue the request in ready queue. */ /* later, the ready callbacks will be called in idle handler of main thread. */ if(req->done) continue; if(req->cancelled) continue; if(req->size == cached_size) { req->pix = cached_pix ? (GObject*)g_object_ref(cached_pix) : NULL; DEBUG("cache hit!"); goto push_it; } g_mutex_unlock(lock_ptr); if(G_LIKELY(req->size <= 128)) /* normal */ { if(normal_pix) req->pix = scale_pix(normal_pix, req->size); else req->pix = NULL; } else /* large */ { if(large_pix) req->pix = scale_pix(large_pix, req->size); else req->pix = NULL; } if(cached_pix) g_object_unref(cached_pix); cached_pix = req->pix ? g_object_ref(req->pix) : NULL; cached_size = req->size; g_mutex_lock(lock_ptr); /* cache this in hash table */ if(cached_pix) cache_thumbnail_in_hash(fm_file_info_get_path(req->fi), cached_pix, cached_size); else continue; push_it: req->done = TRUE; } g_mutex_unlock(lock_ptr); if(cached_pix) g_object_unref(cached_pix); } /* in thread */ static gboolean is_thumbnail_outdated(GObject* thumb_pix, const char* thumbnail_path, time_t mtime) { char* thumb_mtime = backend.get_image_text(thumb_pix, "tEXt::Thumb::MTime"); gboolean outdated = FALSE; /* FIXME: compare thumbnail URI with value from tEXt::Thumb::URI */ /* g_print("thumb_mtime: %s, %ld\n", thumb_mtime, mtime); */ if(thumb_mtime) { if(atol(thumb_mtime) != mtime) outdated = TRUE; g_free(thumb_mtime); } else { /* if the thumbnail png file does not contain "tEXt::Thumb::MTime" value, * we compare the mtime of the thumbnail with its original directly. */ /* FIXME: XDG specification requires to regenerate it in such case */ struct stat statbuf; if(stat(thumbnail_path, &statbuf) == 0) /* get mtime of the thumbnail file */ { if(mtime > statbuf.st_mtime) outdated = TRUE; } } /* out of date, delete it */ if(outdated) { unlink(thumbnail_path); /* delete the out-dated thumbnail. */ g_object_unref(thumb_pix); } return outdated; } /* in thread */ static void load_thumbnails(ThumbnailTask* task) { GObject* normal_pix = NULL; GObject* large_pix = NULL; const char* normal_path = task->normal_path; const char* large_path = task->large_path; if( g_cancellable_is_cancelled(task->cancellable) ) goto _out; DEBUG("loading: %s, %s, %s", fm_file_info_get_name(task->fi), normal_path, large_path); if(task->flags & LOAD_NORMAL) { normal_pix = backend.read_image_from_file(normal_path); if(!normal_pix || is_thumbnail_outdated(normal_pix, normal_path, fm_file_info_get_mtime(task->fi))) { /* normal_pix is freed in is_thumbnail_outdated() if it's out of date. */ /* generate normal size thumbnail */ task->flags |= GENERATE_NORMAL; normal_pix = NULL; /* DEBUG("need to generate normal thumbnail"); */ } else { DEBUG("normal thumbnail loaded: %p", normal_pix); } } if( g_cancellable_is_cancelled(task->cancellable) ) goto _out; if(task->flags & LOAD_LARGE) { large_pix = backend.read_image_from_file(large_path); if(!large_pix || is_thumbnail_outdated(large_pix, large_path, fm_file_info_get_mtime(task->fi))) { /* large_pix is freed in is_thumbnail_outdated() if it's out of date. */ /* generate large size thumbnail */ task->flags |= GENERATE_LARGE; large_pix = NULL; } } /* thumbnails which don't require re-generation should all be loaded at this point. */ if(!g_cancellable_is_cancelled(task->cancellable) && task->requests) thumbnail_task_finish(task, normal_pix, large_pix); _out: if(normal_pix) g_object_unref(normal_pix); if(large_pix) g_object_unref(large_pix); return; } /* in thread */ static gpointer load_thumbnail_thread(gpointer user_data) { ThumbnailTask* task; GChecksum* sum = g_checksum_new(G_CHECKSUM_MD5); gchar* normal_path = g_build_filename(thumb_dir, "normal/00000000000000000000000000000000.png", NULL); gchar* normal_basename = strrchr(normal_path, '/') + 1; gchar* large_path = g_build_filename(thumb_dir, "large/00000000000000000000000000000000.png", NULL); gchar* large_basename = strrchr(large_path, '/') + 1; /* ensure thumbnail directories exists */ *(normal_basename - 1) = '\0'; g_mkdir_with_parents(normal_path, 0700); *(normal_basename - 1) = '/'; *(large_basename - 1) = '\0'; g_mkdir_with_parents(large_path, 0700); *(large_basename - 1) = '/'; for(;;) { g_mutex_lock(lock_ptr); task = g_queue_pop_head(&loader_queue); if(G_LIKELY(task)) { char* uri; const char* md5; GList *reql; for (reql = task->requests; reql; reql = reql->next) if (!((FmThumbnailLoader*)reql->data)->cancelled) break; if (reql == NULL) /* all requests were cancelled already */ goto _free_task; if (!task->cancellable) task->cancellable = g_cancellable_new(); g_mutex_unlock(lock_ptr); uri = fm_path_to_uri(fm_file_info_get_path(task->fi)); /* generate filename for the thumbnail */ g_checksum_update(sum, (guchar*)uri, -1); md5 = g_checksum_get_string(sum); /* md5 sum of the URI */ task->uri = uri; if (task->flags & LOAD_NORMAL) { memcpy( normal_basename, md5, 32 ); task->normal_path = normal_path; } if (task->flags & LOAD_LARGE) { memcpy( large_basename, md5, 32 ); task->large_path = large_path; } /* FIXME: support fail//.png to skip creation */ if(task->flags & (GENERATE_NORMAL|GENERATE_LARGE)) generate_thumbnails(task); /* second cycle */ else load_thumbnails(task); /* first cycle */ g_checksum_reset(sum); task->uri = NULL; task->normal_path = NULL; task->large_path = NULL; g_free(uri); g_mutex_lock(lock_ptr); if(g_cancellable_is_cancelled(task->cancellable) /* task is done */ || (task->flags & (GENERATE_NORMAL|GENERATE_LARGE)) == 0) _free_task: thumbnail_task_free(task); else g_queue_push_tail(&loader_queue, task); /* return it to regen */ g_mutex_unlock(lock_ptr); } else /* no task is left in the loader_queue */ { loader_thread_running = FALSE; g_mutex_unlock(lock_ptr); g_free(normal_path); g_free(large_path); g_checksum_free(sum); #if GLIB_CHECK_VERSION(2, 32, 0) g_thread_unref(g_thread_self()); #endif return NULL; } } } /* should be called with queue locked */ /* in main loop */ inline static GObject* find_thumbnail_in_hash(FmPath* path, guint size) { ThumbnailCache* cache = (ThumbnailCache*)g_hash_table_lookup(hash, path); if(cache) { GSList* l; for(l=cache->items;l;l=l->next) { ThumbnailCacheItem* item = (ThumbnailCacheItem*)l->data; if(item->size == size) return item->pix; } } return NULL; } /* should be called with queue locked */ /* may be called in thread */ static ThumbnailTask* find_queued_task(GQueue* queue, FmFileInfo* fi) { GList* l; for( l = queue->head; l; l=l->next ) { ThumbnailTask* task = (ThumbnailTask*)l->data; /* if it's processing then it's too late to add */ if(task->cancellable) continue; if(G_UNLIKELY(task->fi == fi || fm_path_equal(fm_file_info_get_path(task->fi), fm_file_info_get_path(fi)))) return task; } return NULL; } /** * fm_thumbnail_loader_load * @src_file: an image file * @size: thumbnail size * @callback: callback to requestor * @user_data: data provided for @callback * * Schedules loading/generation of thumbnail for @src_file. If the * request isn't cancelled then ready thumbnail will be given to the * requestor in @callback. Returned descriptor can be used to cancel * the job. * * Returns: (transfer none): request descriptor. * * Since: 1.2.0 */ /* in main loop */ FmThumbnailLoader* fm_thumbnail_loader_load(FmFileInfo* src_file, guint size, FmThumbnailLoaderCallback callback, gpointer user_data) { FmThumbnailLoader* req; ThumbnailTask* task; GObject* pix; FmPath* src_path = fm_file_info_get_path(src_file); gboolean thread_running; g_return_val_if_fail(hash != NULL, NULL); g_assert(callback != NULL); req = g_slice_new(FmThumbnailLoader); req->fi = fm_file_info_ref(src_file); req->size = size; req->callback = callback; req->user_data = user_data; req->pix = NULL; req->task = NULL; req->done = FALSE; req->cancelled = FALSE; DEBUG("request thumbnail: %s", fm_path_get_basename(src_path)); g_mutex_lock(lock_ptr); /* find in the cache first to see if thumbnail is already cached */ pix = find_thumbnail_in_hash(src_path, size); if(pix) { DEBUG("cache found!"); req->pix = (GObject*)g_object_ref(pix); /* call the ready callback in main loader_thread_id from idle handler. */ g_queue_push_tail(&ready_queue, req); if( 0 == ready_idle_handler ) /* schedule an idle handler if there isn't one. */ ready_idle_handler = g_idle_add_full(G_PRIORITY_LOW, on_ready_idle, NULL, NULL); g_mutex_unlock(lock_ptr); return req; } /* if it's not cached, add it to the loader_queue for loading. */ task = find_queued_task(&loader_queue, src_file); if(!task) { task = g_slice_new0(ThumbnailTask); task->fi = fm_file_info_ref(src_file); g_queue_push_tail(&loader_queue, task); } else { DEBUG("task already in the queue: %p", task); } req->task = task; if(size > 128) task->flags |= LOAD_LARGE; else task->flags |= LOAD_NORMAL; task->requests = g_list_append(task->requests, req); thread_running = loader_thread_running; loader_thread_running = TRUE; g_mutex_unlock(lock_ptr); if(!thread_running) #if GLIB_CHECK_VERSION(2, 32, 0) g_thread_new("loader", load_thumbnail_thread, NULL); /* we don't use loader_thread_id but Glib 2.32 crashes if we unref GThread while it's in creation progress. It is a bug of GLib certainly but as workaround we'll unref it in the thread itself */ #else g_thread_create( load_thumbnail_thread, NULL, FALSE, NULL); #endif return req; } /** * fm_thumbnail_loader_cancel * @req: the request descriptor * * Cancels request. After return from this call the @req becomes invalid * and cannot be used. Caller will never get callback for cancelled * request either. * * Since: 1.2.0 */ /* in main loop */ void fm_thumbnail_loader_cancel(FmThumbnailLoader* req) { GList* l; g_return_if_fail(req != NULL); g_mutex_lock(lock_ptr); req->cancelled = TRUE; if(req->task == NULL) goto done; for(l = req->task->requests; l; l = l->next) { req = (FmThumbnailLoader*)l->data; if(!req->cancelled) break; } if(l == NULL && req->task->cancellable != NULL) { g_cancellable_cancel(req->task->cancellable); DEBUG("cancelling the task"); } done: g_mutex_unlock(lock_ptr); g_cond_broadcast(cond_ptr); /* if it is loading right now then let it die */ } /** * fm_thumbnail_loader_get_data * @req: request descriptor * * Retrieves loaded thumbnail. Returned data are owned by @req and should * be not freed by caller. * * Returns: (transfer none): thumbnail. * * Since: 1.2.0 */ /* in main loop */ GObject* fm_thumbnail_loader_get_data(FmThumbnailLoader* req) { return req->pix; } /** * fm_thumbnail_loader_get_file_info * @req: request descriptor * * Retrieves file descriptor that request is for. Returned data are * owned by @req and should be not freed by caller. * * Returns: (transfer none): file descriptor. * * Since: 1.2.0 */ /* in main loop */ FmFileInfo* fm_thumbnail_loader_get_file_info(FmThumbnailLoader* req) { return req->fi; } /** * fm_thumbnail_loader_get_size * @req: request descriptor * * Retrieves thumbnail size that request is for. * * Returns: size in pixels. * * Since: 1.2.0 */ /* in main loop */ guint fm_thumbnail_loader_get_size(FmThumbnailLoader* req) { return req->size; } /* in main loop */ void _fm_thumbnail_loader_init() { thumb_dir = g_build_filename(g_get_user_cache_dir(), "thumbnails", NULL); hash = g_hash_table_new((GHashFunc)fm_path_hash, (GEqualFunc)fm_path_equal); #if !GLIB_CHECK_VERSION(2, 32, 0) lock_ptr = g_mutex_new(); cond_ptr = g_cond_new(); #endif } static gboolean fm_thumbnail_loader_cleanup(gpointer unused) { FmThumbnailLoader* req; /* loader_queue is empty and cur_loading is finished */ while((req = g_queue_pop_head(&ready_queue))) fm_thumbnail_loader_free(req); g_hash_table_destroy(hash); /* caches will be destroyed by pixbufs */ hash = NULL; g_free(thumb_dir); thumb_dir = NULL; return FALSE; } /* in main loop */ void _fm_thumbnail_loader_finalize(void) { ThumbnailTask* task; GList *qlist, *rlist; g_mutex_lock(lock_ptr); /* cancel all pending requests before destroying hash */ for (qlist = g_queue_peek_head_link(&loader_queue); qlist; qlist = qlist->next) { task = qlist->data; if (task->cancellable) g_cancellable_cancel(task->cancellable); for (rlist = task->requests; rlist; rlist = rlist->next) //g_assert(!((FmThumbnailLoader*)rlist->data)->cancelled); ((FmThumbnailLoader*)rlist->data)->cancelled = TRUE; } g_mutex_unlock(lock_ptr); /* if thread was alive it will die after that */ g_cond_broadcast(cond_ptr); g_mutex_lock(lock_ptr); while (loader_thread_running) g_cond_wait(cond_ptr, lock_ptr); g_mutex_unlock(lock_ptr); #if !GLIB_CHECK_VERSION(2, 32, 0) g_mutex_free(lock_ptr); g_cond_free(cond_ptr); #endif while((task = g_queue_pop_head(&loader_queue))) thumbnail_task_free(task); fm_thumbnail_loader_cleanup(NULL); } /* in thread */ static void generate_thumbnails(ThumbnailTask* task) { if (fm_file_info_is_image(task->fi) && /* if the image file is too large, don't generate thumbnail for it. */ (fm_config->thumbnail_max == 0 || fm_file_info_get_size(task->fi) <= (fm_config->thumbnail_max << 10))) { generate_thumbnails_with_builtin(task); } else generate_thumbnails_with_thumbnailers(task); /* mark it as fully done, see thread loop */ g_cancellable_cancel(task->cancellable); } /* in thread */ static GObject* scale_pix(GObject* ori_pix, int size) { GObject* scaled_pix; /* keep aspect ratio and scale to thumbnail size: 128 or 512 */ int width = backend.get_image_width(ori_pix); int height = backend.get_image_height(ori_pix); int new_width; int new_height; if(width > height) { gdouble aspect = (gdouble)height / width; new_width = size; new_height = size * aspect; } else if(width < height) { gdouble aspect = (gdouble)width / height; new_height = size; new_width = size * aspect; } else { new_width = new_height = size; } if((new_width == width && new_height == height) || (size > width && size > height )) /* don't scale up */ { /* if size is not changed or original size is smaller, use original size. */ scaled_pix = (GObject*)g_object_ref(ori_pix); } else { /* avoid width or height of 0 pixel. * FIXME: or we should just fail creating the thumbnail for the image? */ if(new_width == 0) new_width = 1; if(new_height == 0) new_height = 1; scaled_pix = backend.scale_image(ori_pix, new_width, new_height); } return scaled_pix; } /* in thread */ static void save_thumbnail_to_disk(ThumbnailTask* task, GObject* pix, const char* path) { /* do not save thumbnails generated in thumbail cache directory * (prevents runaway thumbnailing when browsing thumbail cache directory) */ if(strncmp(path,thumb_dir,strlen(thumb_dir)) == 0) { return; } /* save the generated thumbnail to disk */ char* tmpfile = g_strconcat(path, ".XXXXXX", NULL); gint fd; fd = g_mkstemp(tmpfile); /* save to a temp file first */ if(fd != -1) { char mtime_str[100]; g_snprintf( mtime_str, 100, "%lu", fm_file_info_get_mtime(task->fi)); chmod( tmpfile, 0600 ); /* only the owner can read it. */ backend.set_image_text(pix, "tEXt::Thumb::URI", task->uri); backend.set_image_text(pix, "tEXt::Thumb::MTime", mtime_str); backend.write_image(pix, tmpfile); close(fd); g_rename(tmpfile, path); g_free(tmpfile); } DEBUG("generator: save to %s", path); } /* in thread */ static gboolean generate_thumbnails_with_builtin(ThumbnailTask* task) { /* FIXME: only formats supported by GObject should be handled this way. */ GFile* gf = fm_path_to_gfile(fm_file_info_get_path(task->fi)); char *file_name; GObject* normal_pix = NULL; GObject* large_pix = NULL; GCancellable *cancellable = task->cancellable; DEBUG("generate thumbnail for %s", fm_file_info_get_name(task->fi)); GObject* ori_pix = NULL; int rotate_degrees = 0; #ifdef USE_EXIF FmMimeType* mime_type; /* use libexif to extract thumbnails embedded in jpeg files */ mime_type = fm_file_info_get_mime_type(task->fi); if(strcmp(fm_mime_type_get_type(mime_type), "image/jpeg") == 0) /* if this is a jpeg file */ { /* try to extract thumbnails embedded in jpeg files */ ExifLoader *exif_loader = exif_loader_new(); ExifData *exif_data; GFileInputStream* ins = g_file_read(gf, cancellable, NULL); if(ins) { while(!g_cancellable_is_cancelled(cancellable)) { unsigned char buf[4096]; gssize read_size = g_input_stream_read((GInputStream*)ins, buf, 4096, cancellable, NULL); if(read_size == 0) /* EOF */ break; if(exif_loader_write(exif_loader, buf, read_size) == 0) break; /* no more EXIF data */ } exif_data = exif_loader_get_data(exif_loader); exif_loader_unref(exif_loader); if(exif_data) { /* reference for EXIF orientation tag: * http://www.impulseadventure.com/photo/exif-orientation.html */ ExifEntry* orient_ent = exif_data_get_entry(exif_data, EXIF_TAG_ORIENTATION); if(orient_ent) /* orientation flag found in EXIF */ { gushort orient; ExifByteOrder bo = exif_data_get_byte_order(exif_data); /* bo == EXIF_BYTE_ORDER_INTEL ; */ orient = exif_get_short (orient_ent->data, bo); switch(orient) { case 1: /* no rotation */ rotate_degrees = 0; break; case 8: rotate_degrees = 90; break; case 3: rotate_degrees = 180; break; case 6: rotate_degrees = 270; break; } /* g_print("orientation flag found, rotate: %d\n", rotate_degrees); */ } if(exif_data->data) /* if an embedded thumbnail is available */ { /* load the embedded jpeg thumbnail */ GInputStream* mem_stream = g_memory_input_stream_new_from_data(exif_data->data, exif_data->size, NULL); ori_pix = backend.read_image_from_stream(mem_stream, exif_data->size, cancellable); g_object_unref(mem_stream); } exif_data_unref(exif_data); } g_input_stream_close(G_INPUT_STREAM(ins), NULL, NULL); g_object_unref(ins); } } if(!ori_pix) { #endif file_name = g_file_get_path(gf); if (file_name) ori_pix = backend.read_image_from_file(file_name); g_free(file_name); #ifdef USE_EXIF } #endif if(ori_pix) /* if the original image is successfully loaded */ { int width = backend.get_image_width(ori_pix); int height = backend.get_image_height(ori_pix); gboolean need_save; if(task->flags & GENERATE_NORMAL) { /* don't create thumbnails for images which are too small */ if(width <=128 && height <= 128) { normal_pix = (GObject*)g_object_ref(ori_pix); need_save = FALSE; } else { normal_pix = scale_pix(ori_pix, 128); need_save = TRUE; } if(rotate_degrees != 0) // rotate the image by EXIF oritation { GObject* rotated; rotated = backend.rotate_image(normal_pix, rotate_degrees); g_object_unref(normal_pix); normal_pix = rotated; } if(need_save && normal_pix) save_thumbnail_to_disk(task, normal_pix, task->normal_path); } if(task->flags & GENERATE_LARGE) { /* don't create thumbnails for images which are too small */ if (width <= 512 && height <= 512) { large_pix = (GObject*)g_object_ref(ori_pix); need_save = FALSE; } else { large_pix = scale_pix(ori_pix, 512); need_save = TRUE; } if(rotate_degrees != 0) { GObject* rotated; rotated = backend.rotate_image(large_pix, rotate_degrees); g_object_unref(large_pix); large_pix = rotated; } if(need_save && large_pix) save_thumbnail_to_disk(task, large_pix, task->large_path); } g_object_unref(ori_pix); } else { g_object_unref(gf); /* g_debug("failed to generate thumbnail internally, revert to external"); */ return FALSE; } thumbnail_task_finish(task, normal_pix, large_pix); if(normal_pix) g_object_unref(normal_pix); if(large_pix) g_object_unref(large_pix); g_object_unref(gf); return TRUE; } /* call from main thread */ static gboolean on_thumbnailer_timeout(gpointer user_data) { gboolean *timed_out; /* check if it is destroyed already */ if(g_source_is_destroyed(g_main_current_source())) return FALSE; timed_out = user_data; /* g_print("thumbnail timeout!\n"); */ g_mutex_lock(lock_ptr); *timed_out = TRUE; thumbnailer_timeout_id = 0; g_mutex_unlock(lock_ptr); g_cond_broadcast(cond_ptr); return FALSE; } typedef struct { gboolean finished; int status; } ThumbnailerStatus; /* this is in main loop due to g_child_watch_add() */ static void _pid_watcher(GPid pid, gint status, gpointer user_data) { ThumbnailerStatus *st = user_data; DEBUG("pid %d terminated", (int)pid); st->status = status; st->finished = TRUE; g_cond_broadcast(cond_ptr); } /* call from the thumbnail thread */ static gboolean run_thumbnailer(FmThumbnailer* thumbnailer, ThumbnailTask* task, const char* output_file, guint size) { /* g_print("run_thumbnailer: uri: %s\n", uri); */ ThumbnailerStatus status = { FALSE, 0 }; gboolean timed_out = FALSE; GPid _pid = fm_thumbnailer_launch_for_uri_async(thumbnailer, task->uri, output_file, size, NULL); if(_pid <= 0) /* failed to launch */ /* FIXME: print error message from failed thumbnailer */ return FALSE; g_mutex_lock(lock_ptr); if(thumbnailer_timeout_id) { g_mutex_unlock(lock_ptr); g_critical("libfm: run_thumbnailer() concurrent process attempt"); kill(_pid, SIGTERM); return FALSE; } thumbnailer_timeout_id = g_timeout_add_seconds(THUMBNAILER_TIMEOUT_SEC, on_thumbnailer_timeout, &timed_out); g_child_watch_add(_pid, _pid_watcher, &status); /* g_print("pid: %d\n", thumbnailer_pid); */ while (!timed_out && !status.finished && !g_cancellable_is_cancelled(task->cancellable)) g_cond_wait(cond_ptr, lock_ptr); if (thumbnailer_timeout_id) g_source_remove(thumbnailer_timeout_id); thumbnailer_timeout_id = 0; if (!status.finished) kill(_pid, SIGTERM); /* wait for the thumbnailer process to terminate */ while (!status.finished) g_cond_wait(cond_ptr, lock_ptr); g_mutex_unlock(lock_ptr); /* the process is terminated */ return (WIFEXITED(status.status) && WEXITSTATUS(status.status) == 0); } /* in thread */ static void generate_thumbnails_with_thumbnailers(ThumbnailTask* task) { /* external thumbnailer support */ GObject* normal_pix = NULL; GObject* large_pix = NULL; FmMimeType* mime_type = fm_file_info_get_mime_type(task->fi); /* TODO: we need to add timeout for external thumbnailers. * If a thumbnailer program is broken or locked for unknown reason, * the thumbnailer process should be killed once a timeout is reached. */ if(mime_type) { GList* thumbnailers = fm_mime_type_get_thumbnailers_list(mime_type); GList* l; guint generated = 0; /* g_debug("run thumbnailer: %s, %s, %s", fm_file_info_get_name(task->fi), task->normal_path, task->large_path); */ for(l = thumbnailers; l; l = l->next) { FmThumbnailer* thumbnailer = FM_THUMBNAILER(l->data); if((task->flags & GENERATE_NORMAL) && !(generated & GENERATE_NORMAL)) { if(run_thumbnailer(thumbnailer, task, task->normal_path, 128)) { generated |= GENERATE_NORMAL; normal_pix = backend.read_image_from_file(task->normal_path); if (normal_pix) { char *thumb_mtime = backend.get_image_text(normal_pix, "tEXt::Thumb::MTime"); /* Re-save generated thumbnail to have required data in them. Some external thumbnailers not follow the specification and not set any of Thumb::URI nor Thumb::MTime, that leads to regeneration each time. */ if (thumb_mtime == NULL) save_thumbnail_to_disk(task, normal_pix, task->normal_path); else g_free(thumb_mtime); } } } if((task->flags & GENERATE_LARGE) && !(generated & GENERATE_LARGE)) { if (run_thumbnailer(thumbnailer, task, task->large_path, 512)) { generated |= GENERATE_LARGE; large_pix = backend.read_image_from_file(task->large_path); if (large_pix) { char *thumb_mtime = backend.get_image_text(large_pix, "tEXt::Thumb::MTime"); if (thumb_mtime == NULL) save_thumbnail_to_disk(task, large_pix, task->large_path); else g_free(thumb_mtime); } } } /* if both large and normal thumbnails are generated, quit */ if(generated == task->flags) break; } g_list_free_full(thumbnailers, (GDestroyNotify)fm_thumbnailer_unref); } thumbnail_task_finish(task, normal_pix, large_pix); if(normal_pix) g_object_unref(normal_pix); if(large_pix) g_object_unref(large_pix); } /** * fm_thumbnail_loader_set_backend * @_backend: callbacks list to set * * Sets callbacks list for further usage by thumbnail loader. Callbacks * should implement operations with image representation for application * specific model. This function can be called only once per application * and every subsequent call will return %FALSE and change nothing. * * Returns: %TRUE in case of success. * * Since: 1.2.0 */ gboolean fm_thumbnail_loader_set_backend(FmThumbnailLoaderBackend* _backend) { if(backend_loaded) return FALSE; backend = *_backend; backend_loaded = TRUE; return TRUE; } libfm-1.4.0/src/base/fm-thumbnail-loader.h000066400000000000000000000075431475513661000203270ustar00rootroot00000000000000/* * fm-thumbnail-loader.h * * Copyright 2013 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_THUMBNAIL_LOADER_H__ #define __FM_THUMBNAIL_LOADER_H__ #include #include "fm-file-info.h" /* If we're not using GNU C, elide __attribute__ */ #ifndef __GNUC__ # define __attribute__(x) #endif G_BEGIN_DECLS typedef struct _FmThumbnailLoader FmThumbnailLoader; /** * FmThumbnailLoaderCallback: * @req: request descriptor * @data: user data provided when request was made * * The callback to requestor when thumbnail is ready. * Note that this call is done outside of GTK loop so if the callback * wants to use any GTK API it should call gdk_threads_enter() and * gdk_threads_leave() for safety. * * Since: 1.2.0 */ typedef void (*FmThumbnailLoaderCallback)(FmThumbnailLoader *req, gpointer data); void _fm_thumbnail_loader_init(); void _fm_thumbnail_loader_finalize(); FmThumbnailLoader* fm_thumbnail_loader_load(FmFileInfo* src_file, guint size, FmThumbnailLoaderCallback callback, gpointer user_data); void fm_thumbnail_loader_cancel(FmThumbnailLoader* req); GObject* fm_thumbnail_loader_get_data(FmThumbnailLoader* req); FmFileInfo* fm_thumbnail_loader_get_file_info(FmThumbnailLoader* req); guint fm_thumbnail_loader_get_size(FmThumbnailLoader* req); /* for toolkit-specific image loading code */ typedef struct _FmThumbnailLoaderBackend FmThumbnailLoaderBackend; /** * FmThumbnailLoaderBackend: * @read_image_from_file: callback to read image by file path * @read_image_from_stream: callback to read image by opened #GInputStream * @write_image: callback to write thumbnail file from image * @scale_image: callback to change image sizes * @rotate_image: callback to change image orientation * @get_image_width: callback to retrieve width from image * @get_image_height: callback to retrieve height from image * @get_image_text: callback to retrieve custom attributes text from image * @set_image_text: callback to set custom attributes text into image * * Abstract backend callbacks list. */ struct _FmThumbnailLoaderBackend { GObject* (*read_image_from_file)(const char* filename); GObject* (*read_image_from_stream)(GInputStream* stream, guint64 len, GCancellable* cancellable); gboolean (*write_image)(GObject* image, const char* filename); GObject* (*scale_image)(GObject* ori_pix, int new_width, int new_height); GObject* (*rotate_image)(GObject* image, int degree); int (*get_image_width)(GObject* image); int (*get_image_height)(GObject* image); char* (*get_image_text)(GObject* image, const char* key); gboolean (*set_image_text)(GObject* image, const char* key, const char* val); // const char* (*get_image_orientation)(GObject* image); // GObject* (*apply_orientation)(GObject* image); }; gboolean fm_thumbnail_loader_set_backend(FmThumbnailLoaderBackend* _backend) __attribute__((warn_unused_result,nonnull(1))); G_END_DECLS #endif /* __FM_THUMBNAIL_LOADER_H__ */ libfm-1.4.0/src/base/fm-thumbnailer.c000066400000000000000000000331671475513661000174060ustar00rootroot00000000000000/* * fm-thumbnailer.c * * Copyright 2012-2013 Hong Jen Yee (PCMan) * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-thumbnailer * @short_description: External thumbnailers handling. * @title: FmThumbnailer * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-thumbnailer.h" #include "fm-mime-type.h" #include "glib-compat.h" #include #include #include #include #include struct _FmThumbnailer { char* id; char* try_exec; /* FIXME: is this useful? */ char* exec; GList* mime_types; gint n_ref; }; time_t last_loaded_time = 0; GList* all_thumbnailers = NULL; G_LOCK_DEFINE_STATIC(all_thumbnailers); /** * fm_thumbnailer_ref * @thumbnailer: thumbnailer descriptor * * Increases reference count for @thumbnailer object. * * Returns: @thumbnailer. * * Since: 1.2.0 */ FmThumbnailer* fm_thumbnailer_ref(FmThumbnailer* thumbnailer) { g_return_val_if_fail(thumbnailer, NULL); g_atomic_int_inc(&thumbnailer->n_ref); return thumbnailer; } /** * fm_thumbnailer_free * @thumbnailer: thumbnailer descriptor * * Frees @thumbnailer object. * * Since: 1.0.0 * * Deprecated: 1.2.0: Use fm_thumbnailer_unref() instead. */ void fm_thumbnailer_free(FmThumbnailer* thumbnailer) { GList* l; g_return_if_fail(thumbnailer); g_free(thumbnailer->id); g_free(thumbnailer->try_exec); g_free(thumbnailer->exec); for(l = thumbnailer->mime_types; l; l = l->next) { FmMimeType* mime_type = (FmMimeType*)l->data; /* remove ourself from FmMimeType */ fm_mime_type_remove_thumbnailer(mime_type, thumbnailer); fm_mime_type_unref(mime_type); } g_list_free(thumbnailer->mime_types); g_slice_free(FmThumbnailer, thumbnailer); } /** * fm_thumbnailer_unref * @thumbnailer: thumbnailer descriptor * * Decreases reference count for @thumbnailer object. When last reference * is dropped, allocated resources will be freed and @thumbnailer becomes * invalid. * * Since: 1.2.0 */ void fm_thumbnailer_unref(FmThumbnailer* thumbnailer) { if (g_atomic_int_dec_and_test(&thumbnailer->n_ref)) fm_thumbnailer_free(thumbnailer); } /** * fm_thumbnailer_new_from_keyfile * @id: desktop entry Id * @kf: content of @id * * Creates new @thumbnailer object. * * Returns: (transfer full): a new #FmThumbnailer or %NULL in case of error. * * Since: 1.0.0 */ FmThumbnailer* fm_thumbnailer_new_from_keyfile(const char* id, GKeyFile* kf) { FmThumbnailer* thumbnailer = NULL; char* exec = g_key_file_get_string(kf, "Thumbnailer Entry", "Exec", NULL); if(exec) { char** mime_types = g_key_file_get_string_list(kf, "Thumbnailer Entry", "MimeType", NULL, NULL); if(mime_types) { char** mime_type_name; thumbnailer = g_slice_new0(FmThumbnailer); thumbnailer->id = g_strdup(id); thumbnailer->exec = exec; thumbnailer->try_exec = g_key_file_get_string(kf, "Thumbnailer Entry", "TryExec", NULL); thumbnailer->n_ref = 1; for(mime_type_name = mime_types; *mime_type_name; ++mime_type_name) { FmMimeType* mime_type = fm_mime_type_from_name(*mime_type_name); if(mime_type) { /* here we only add items to mime_type->thumbnailers list and do not * add reference to FmThumbnailer. FmMimeType does not own it * and will not unref FmThumbnailer when FmMimeType object is * freed. We need to do it this way. Otherwise, mutual reference * of FmMimeType and FmThumbnailer objects will cause cyclic * reference. */ fm_mime_type_add_thumbnailer(mime_type, thumbnailer); /* Do not call fm_mime_type_unref() here so we own a reference * to the FmMimeType object */ thumbnailer->mime_types = g_list_prepend(thumbnailer->mime_types, mime_type); } } g_strfreev(mime_types); } else g_free(exec); } return thumbnailer; } /** * fm_thumbnailer_command_for_uri * @thumbnailer: thumbnailer descriptor * @uri: a file to create thumbnail for * @output_file: the target file name * @size: size of thumbnail to generate * * Tries to generate command line that can be used to generate a thumbnail * for given @uri. Returned string is allocated and should be freed with * g_free() after usage. * * Returns: (transfer full): a newly allocated string or %NULL. * * Since: 1.2.0 */ char* fm_thumbnailer_command_for_uri(FmThumbnailer* thumbnailer, const char* uri, const char* output_file, guint size) { if(thumbnailer && thumbnailer->exec) { /* FIXME: how to handle TryExec? */ /* parse the command line and do required substitutions according to: * http://developer.gnome.org/integration-guide/stable/thumbnailer.html.en */ GString* cmd_line = g_string_sized_new(1024); const char* p; for(p = thumbnailer->exec; *p; ++p) { if(G_LIKELY(*p != '%')) g_string_append_c(cmd_line, *p); else { char* quoted; ++p; switch(*p) { case '\0': break; case 's': g_string_append_printf(cmd_line, "%d", size); break; case 'i': { char* src_path = g_filename_from_uri(uri, NULL, NULL); if(src_path) { quoted = g_shell_quote(src_path); g_string_append(cmd_line, quoted); g_free(quoted); g_free(src_path); } break; } case 'u': quoted = g_shell_quote(uri); g_string_append(cmd_line, quoted); g_free(quoted); break; case 'o': g_string_append(cmd_line, output_file); break; default: g_string_append_c(cmd_line, '%'); if(*p != '%') g_string_append_c(cmd_line, *p); } } } return g_string_free(cmd_line, FALSE); } return NULL; } /** * fm_thumbnailer_launch_for_uri_async * @thumbnailer: thumbnailer descriptor * @uri: a file to create thumbnail for * @output_file: the target file name * @size: size of thumbnail to generate * @error: (allow-none) (out): location to save error * * Tries to spawn thumbnailer to generate new thumbnail for given @uri. * * Returns: thumbnailer process ID or -1 in case of failure. * * Since: 1.2.0 */ GPid fm_thumbnailer_launch_for_uri_async(FmThumbnailer* thumbnailer, const char* uri, const char* output_file, guint size, GError** error) { GPid pid = -1; char* cmd_line = fm_thumbnailer_command_for_uri(thumbnailer, uri, output_file, size); /* FIXME: check for mandatory arguments */ if(cmd_line) { int argc; char** argv; if(g_shell_parse_argv(cmd_line, &argc, &argv, NULL)) { g_spawn_async("/", argv, NULL, G_SPAWN_SEARCH_PATH|G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, error); g_strfreev(argv); } /* g_print("pid = %d, %s", pid, cmd_line); */ g_free(cmd_line); } else g_set_error_literal(error, G_SHELL_ERROR, G_SHELL_ERROR_FAILED, _("Invalid description of thumbnailer application")); return pid; } /** * fm_thumbnailer_launch_for_uri * @thumbnailer: thumbnailer descriptor * @uri: a file to create thumbnail for * @output_file: the target file name * @size: size of thumbnail to generate * * Tries to generate new thumbnail for given @uri. * * Returns: %TRUE in case of success. * * Since: 1.0.0 * * Deprecated: 1.2.0: Use fm_thumbnailer_launch_for_uri_async() instead. */ gboolean fm_thumbnailer_launch_for_uri(FmThumbnailer* thumbnailer, const char* uri, const char* output_file, guint size) { char* cmd_line = fm_thumbnailer_command_for_uri(thumbnailer, uri, output_file, size); if(cmd_line) { int status; /* TODO: this call is blocking. Do we have a better way to make it async? */ g_spawn_command_line_sync(cmd_line, NULL, NULL, &status, NULL); /* g_debug("launch thumbnailer: %s", cmd_line->str); */ g_free(cmd_line); return (status == 0); } return FALSE; } static void find_thumbnailers_in_data_dir(GHashTable* hash, const char* data_dir) { char* dir_path = g_build_filename(data_dir, "thumbnailers", NULL); GDir* dir = g_dir_open(dir_path, 0, NULL); if(dir) { const char* basename; while((basename = g_dir_read_name(dir)) != NULL) { /* we only want filenames with .thumbnailer extension */ if (G_LIKELY(g_str_has_suffix(basename, ".thumbnailer")) && g_hash_table_lookup(hash, basename) == NULL) g_hash_table_replace(hash, g_strdup(basename), g_strdup(dir_path)); } g_dir_close(dir); } g_free(dir_path); } static void load_thumbnailers_from_data_dir(const char* basename, const char* dir_path, gpointer null) { char* file_path = g_build_filename(dir_path, basename, NULL); GKeyFile* kf = g_key_file_new(); if(g_key_file_load_from_file(kf, file_path, 0, NULL)) { FmThumbnailer* thumbnailer = fm_thumbnailer_new_from_keyfile(basename, kf); if (thumbnailer != NULL) { G_LOCK(all_thumbnailers); all_thumbnailers = g_list_prepend(all_thumbnailers, thumbnailer); G_UNLOCK(all_thumbnailers); /* register the thumbnailer */ } else g_warning("thumbnailer '%s' is unusable", file_path); } g_key_file_free(kf); g_free(file_path); } static void load_thumbnailers() { const gchar * const *data_dirs = g_get_system_data_dirs(); const gchar * const *data_dir; /* use a temporary hash table to collect thumbnailer basenames * key: basename of thumbnailer entry file * value: data dir the thumbnailer entry file is in */ GHashTable* tmp_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); /* load user-specific thumbnailers */ find_thumbnailers_in_data_dir(tmp_hash, g_get_user_data_dir()); /* load system-wide thumbnailers */ for(data_dir = data_dirs; *data_dir; ++data_dir) find_thumbnailers_in_data_dir(tmp_hash, *data_dir); /* load all found thumbnailers */ g_hash_table_foreach(tmp_hash, (GHFunc)load_thumbnailers_from_data_dir, NULL); /* all_thumbnailers = g_list_reverse(all_thumbnailers); */ g_hash_table_destroy(tmp_hash); /* we don't need the hash table anymore */ /* record current time which will be used to compare with * mtime of thumbnailer dirs later */ last_loaded_time = time(NULL); } static void unload_thumbnailers() { G_LOCK(all_thumbnailers); g_list_free_full(all_thumbnailers, (GDestroyNotify)fm_thumbnailer_unref); all_thumbnailers = NULL; G_UNLOCK(all_thumbnailers); } static gboolean check_data_dir(const char* data_dir) { gboolean ret = FALSE; char* dir_path = g_build_filename(data_dir, "thumbnailers", NULL); struct stat statbuf; if(stat(dir_path, &statbuf) == 0) { if(statbuf.st_mtime > last_loaded_time) ret = TRUE; } g_free(dir_path); return ret; } /** * fm_thumbnailer_check_update * * Checks new thumbnailers and reloads if needed. * * Since: 1.0.0 */ void fm_thumbnailer_check_update() { gboolean need_reload = FALSE; // check system-wide thumbnailers const gchar * const *data_dirs = g_get_system_data_dirs(); const gchar * const *data_dir; for(data_dir = data_dirs; *data_dir; ++data_dir) { need_reload = check_data_dir(*data_dir); if(need_reload) break; } /* check user-specific thumbnailers */ if(FALSE == need_reload) need_reload = check_data_dir(g_get_user_data_dir()); if(need_reload) { /* unload all thumbnailers */ unload_thumbnailers(); /* reload thumbnailers */ load_thumbnailers(); } } void _fm_thumbnailer_init() { load_thumbnailers(); } void _fm_thumbnailer_finalize() { unload_thumbnailers(); } libfm-1.4.0/src/base/fm-thumbnailer.h000066400000000000000000000041131475513661000174000ustar00rootroot00000000000000/* * fm-thumbnailer.h * * Copyright 2012 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_THUMBNAILER_H__ #define __FM_THUMBNAILER_H__ #include G_BEGIN_DECLS #define FM_THUMBNAILER(p) ((FmThumbnailer*)p) typedef struct _FmThumbnailer FmThumbnailer; FmThumbnailer* fm_thumbnailer_new_from_keyfile(const char* id, GKeyFile* kf); char* fm_thumbnailer_command_for_uri(FmThumbnailer* thumbnailer, const char* uri, const char* output_file, guint size); GPid fm_thumbnailer_launch_for_uri_async(FmThumbnailer* thumbnailer, const char* uri, const char* output_file, guint size, GError** error); #ifndef FM_DISABLE_DEPRECATED gboolean fm_thumbnailer_launch_for_uri(FmThumbnailer* thumbnailer, const char* uri, const char* output_file, guint size); void fm_thumbnailer_free(FmThumbnailer* thumbnailer); #endif FmThumbnailer* fm_thumbnailer_ref(FmThumbnailer* thumbnailer); void fm_thumbnailer_unref(FmThumbnailer* thumbnailer); /* reload the thumbnailers if needed */ void fm_thumbnailer_check_update(); void _fm_thumbnailer_init(); void _fm_thumbnailer_finalize(); G_END_DECLS #endif /* __FM_THUMBNAILER_H__ */ libfm-1.4.0/src/base/fm-utils.c000066400000000000000000000401151475513661000162230ustar00rootroot00000000000000/* * fm-utils.c * * Copyright 2009 - 2010 Hong Jen Yee (PCMan) * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-utils * @short_description: Common utility functions used by libfm and libfm-gtk. * @title: Common Libfm utilities. * * @include: libfm/fm.h * * This scope contains common data parsing utilities. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include "fm-utils.h" #include "fm-file-info-job.h" #include "fm-config.h" #define BI_KiB ((gdouble)1024.0) #define BI_MiB ((gdouble)1024.0 * 1024.0) #define BI_GiB ((gdouble)1024.0 * 1024.0 * 1024.0) #define BI_TiB ((gdouble)1024.0 * 1024.0 * 1024.0 * 1024.0) #define SI_KB ((gdouble)1000.0) #define SI_MB ((gdouble)1000.0 * 1000.0) #define SI_GB ((gdouble)1000.0 * 1000.0 * 1000.0) #define SI_TB ((gdouble)1000.0 * 1000.0 * 1000.0 * 1000.0) /** * fm_file_size_to_str * @buf: pointer to array to make a string * @buf_size: size of @buf * @size: number to convert * @si_prefix: %TRUE to convert in SI units, %FALSE to convert in IEC units * * Converts @size into text representation of form "21.4 kiB" for example. * * Returns: @buf. * * Since: 0.1.0 */ char* fm_file_size_to_str( char* buf, size_t buf_size, goffset size, gboolean si_prefix ) { return fm_file_size_to_str2(buf, buf_size, size, si_prefix ? 'H' : 'h'); } /** * fm_file_size_to_str2 * @buf: pointer to array to make a string * @buf_size: size of @buf * @size: number to convert * @size_units: type of units to convert * * Converts @size into text representation of form "21.4 kiB" for example. * The @size_units defines which unit will be selected to convert (similar * to ones that 'du' utility uses): * - b : bytes * - k : KiB (1024 bytes) * - m : MiB (1048576 bytes) * - g : GiB (1073741824 bytes) * - K : kB (1000 bytes) * - M : MB (1000000 bytes) * - G : GB (1000000000 bytes) * - h : adaptive in IEC units * - H : adaptive in SI units * * Returns: @buf. * * Since: 0.1.0 */ char *fm_file_size_to_str2(char *buf, size_t buf_size, goffset size, char size_units) { const char * unit; gdouble val; switch (size_units) { case 'b': case 'B': goto _b; case 'k': val = (gdouble)size; goto _kib; case 'K': val = (gdouble)size; goto _kb; case 'm': val = (gdouble)size; goto _mib; case 'M': val = (gdouble)size; goto _mb; case 'g': val = (gdouble)size; goto _gib; case 'G': val = (gdouble)size; goto _gb; case 'H': /* 1000 based SI units */ _si: if(size < (goffset)SI_KB) goto _b; val = (gdouble)size; if(val < SI_MB) { _kb: val /= SI_KB; unit = _("kB"); } else if(val < SI_GB) { _mb: val /= SI_MB; unit = _("MB"); } else if(val < SI_TB) { _gb: val /= SI_GB; unit = _("GB"); } else { val /= SI_TB; unit = _("TB"); } break; default: if(fm_config->si_unit) goto _si; case 'h': /* 1024-based binary prefix */ if(size < (goffset)BI_KiB) { _b: snprintf(buf, buf_size, dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes", (gulong)size), (guint)size); return buf; } val = (gdouble)size; if(val < BI_MiB) { _kib: val /= BI_KiB; unit = _("KiB"); } else if(val < BI_GiB) { _mib: val /= BI_MiB; unit = _("MiB"); } else if(val < BI_TiB) { _gib: val /= BI_GiB; unit = _("GiB"); } else { val /= BI_TiB; unit = _("TiB"); } } snprintf( buf, buf_size, "%.1f %s", val, unit ); return buf; } /** * fm_key_file_get_int * @kf: a key file * @grp: group to lookup key * @key: a key to lookup * @val: location to store value * * Lookups @key in @kf and stores found value in @val if the @key was found. * * Returns: %TRUE if @key was found. * * Since: 0.1.0 */ gboolean fm_key_file_get_int(GKeyFile* kf, const char* grp, const char* key, int* val) { char* str = g_key_file_get_value(kf, grp, key, NULL); if(G_LIKELY(str)) { *val = atoi(str); g_free(str); } return str != NULL; } /** * fm_key_file_get_bool * @kf: a key file * @grp: group to lookup key * @key: a key to lookup * @val: location to store value * * Lookups @key in @kf and stores found value in @val if the @key was found. * * Returns: %TRUE if @key was found. * * Since: 0.1.0 */ gboolean fm_key_file_get_bool(GKeyFile* kf, const char* grp, const char* key, gboolean* val) { char* str = g_key_file_get_value(kf, grp, key, NULL); if(G_LIKELY(str)) { *val = (str[0] == '1' || str[0] == 't'); g_free(str); } return str != NULL; } /** * fm_canonicalize_filename * @filename: a filename * @cwd: current work directory path * * Makes a canonical name with full path from @filename. Returned string * should be freed by caller after usage. * * Returns: (transfer full): a canonical name. * * Since: 0.1.0 */ char* fm_canonicalize_filename(const char* filename, const char* cwd) { char* _cwd = NULL; int len = strlen(filename); int i = 0; char* ret = g_malloc(len + 1), *p = ret; if(!cwd) cwd = _cwd = g_get_current_dir(); for(; i < len; ) { if(filename[i] == '.') { if(filename[i+1] == '.' && (filename[i+2] == '/' || filename[i+2] == '\0') ) /* .. */ { if(i == 0) /* .. is first element */ { int cwd_len; const char* sep; sep = strrchr(cwd, '/'); if(sep && sep != cwd) cwd_len = (sep - cwd); else cwd_len = strlen(cwd); ret = g_realloc(ret, len - 2 + cwd_len + 1); memcpy(ret, cwd, cwd_len); p = ret + cwd_len; } else /* other .. in the path */ { --p; if(p > ret && *p == '/') /* strip trailing / if it's not root */ --p; while(p > ret && *p != '/') /* strip basename */ --p; if(*p != '/' || p == ret) /* strip trailing / if it's not root */ ++p; } i += 2; continue; } else if(filename[i+1] == '/' || filename[i+1] == '\0' ) /* . */ { if(i == 0) /* first element */ { int cwd_len; cwd_len = strlen(cwd); ret = g_realloc(ret, len - 1 + cwd_len + 1); memcpy(ret, cwd, cwd_len); p = ret + cwd_len; } ++i; continue; } } else if(i == 0 && filename[0] != '/') /* relative path without ./ */ { int cwd_len = strlen(cwd); ret = g_realloc(ret, len + 1 + cwd_len + 1); memcpy(ret, cwd, cwd_len); p = ret + cwd_len; *p++ = '/'; } for(; i < len; ++p) { /* prevent duplicated / */ if(filename[i] == '/' && (p > ret && *(p-1) == '/')) { ++i; break; } *p = filename[i]; ++i; if(*p == '/') { ++p; break; } } } if((p-1) > ret && *(p-1) == '/') /* strip trailing / */ --p; *p = 0; if(_cwd) g_free(_cwd); return ret; } /** * fm_strdup_replace * @str: a string * @old_str: substring to replace * @new_str: string to replace @old_str * * Replaces every occurence of @old_str in @str with @new_str and returns * resulted string. Returned string should be freed with g_free() after * usage. * * Before 1.0.0 this API had name fm_str_replace. * * Returns: (transfer full): resulted string. * * Since: 0.1.16 */ char* fm_strdup_replace(char* str, char* old_str, char* new_str) { int len = strlen(str); char* found; GString* buf = g_string_sized_new(len); int old_str_len = strlen(old_str); while((found = strstr(str, old_str))) { g_string_append_len(buf, str, (found - str)); g_string_append(buf, new_str); str = found + old_str_len; } g_string_append(buf, str); return g_string_free(buf, FALSE); } /** * fm_app_command_parse * @cmd: line to parse * @opts: plain list of possible options * @ret: (out) (transfer full): pointer for resulting string, string should be freed by caller * @user_data: caller data to pass to callback * * This function parses line that contains some %<char> commands and does * substitutions on them using callbacks provided by caller. Only options * in @opts and %% will be expanded, all other %<char> sequences will * be skipped. * * Returns: number of valid options found in @cmd. * * Since: 1.0.0 */ int fm_app_command_parse(const char* cmd, const FmAppCommandParseOption* opts, char** ret, gpointer user_data) { const char* ptr = cmd, *c, *ins; GString* buf = g_string_sized_new(256); const FmAppCommandParseOption* opt; int hits = 0; for(c = ptr; *c; c++) { if(*c == '%') { if(c[1] == '\0') break; if(c != ptr) g_string_append_len(buf, ptr, c - ptr); ++c; ptr = c + 1; if(*c == '%') /* subst "%%" as "%" */ { g_string_append_c(buf, '%'); continue; } if(!opts) /* no options available? */ continue; for(opt = opts; opt->opt; opt++) { if(opt->opt == *c) { hits++; if(opt->callback) { ins = opt->callback(*c, user_data); if(ins && *ins) g_string_append(buf, ins); } break; } } } } if(c != ptr) g_string_append_len(buf, ptr, c - ptr); *ret = g_string_free(buf, FALSE); return hits; } /* ---- run menu cache in main context ---- */ /* Lock for main context run. */ #if GLIB_CHECK_VERSION(2, 32, 0) static GMutex main_loop_run_mutex; static GCond main_loop_run_cond; #else G_LOCK_DEFINE_STATIC(main_loop_run_mutex); static GMutex *main_loop_run_mutex = NULL; static GCond *main_loop_run_cond = NULL; #endif typedef struct { gboolean done; GSourceFunc func; gpointer data; gboolean result; } _main_context_data; static gboolean _fm_run_in_default_main_context_real(gpointer user_data) { _main_context_data *data = user_data; data->result = data->func(data->data); #if GLIB_CHECK_VERSION(2, 32, 0) g_mutex_lock(&main_loop_run_mutex); data->done = TRUE; g_cond_broadcast(&main_loop_run_cond); g_mutex_unlock(&main_loop_run_mutex); #else g_mutex_lock(main_loop_run_mutex); data->done = TRUE; g_cond_broadcast(main_loop_run_cond); g_mutex_unlock(main_loop_run_mutex); #endif return FALSE; } /** * fm_run_in_default_main_context * @func: function to run * @data: data supplied for @func * * Runs @func once in global main loop with supplied @data. * * Returns: output of @func. * * Since: 1.0.2 */ gboolean fm_run_in_default_main_context(GSourceFunc func, gpointer data) { _main_context_data md; #if GLIB_CHECK_VERSION(2, 32, 0) md.done = FALSE; md.func = func; md.data = data; g_main_context_invoke(NULL, _fm_run_in_default_main_context_real, &md); g_mutex_lock(&main_loop_run_mutex); while(!md.done) g_cond_wait(&main_loop_run_cond, &main_loop_run_mutex); g_mutex_unlock(&main_loop_run_mutex); #else /* if we already in main loop then just run it */ if(g_main_context_is_owner(g_main_context_default())) md.result = func(data); /* if we can acquire context then do it */ else if(g_main_context_acquire(g_main_context_default())) { md.result = func(data); g_main_context_release(g_main_context_default()); } /* else add idle source and wait for return */ else { G_LOCK(main_loop_run_mutex); if(!main_loop_run_mutex) main_loop_run_mutex = g_mutex_new(); if(!main_loop_run_cond) main_loop_run_cond = g_cond_new(); G_UNLOCK(main_loop_run_mutex); md.done = FALSE; md.func = func; md.data = data; g_idle_add(_fm_run_in_default_main_context_real, &md); g_mutex_lock(main_loop_run_mutex); while(!md.done) g_cond_wait(main_loop_run_cond, main_loop_run_mutex); g_mutex_unlock(main_loop_run_mutex); } #endif return md.result; } /** * fm_get_home_dir * * Retrieves valid path to home dir of user. * * Returns: path string. * * Since: 1.0.2 */ const char *fm_get_home_dir(void) { /* From GLib docs for g_get_home_dir */ const char *homedir = g_getenv("HOME"); if(!homedir) homedir = g_get_home_dir(); return homedir; } /** * fm_uri_subpath_to_native_subpath * @subpath: URI substring to convert * @error: (out) (allow-none): location to set error * * Converts escaped URI subpath into file path in native encoding. * * Returns: (transfer full): transcoded path or %NULL in case of error. * * Since: 1.2.0 */ char *fm_uri_subpath_to_native_subpath(const char *subpath, GError **error) { char *unescaped, *native; /* unescape path first */ unescaped = g_uri_unescape_string(subpath, "/"); if (unescaped == NULL) { g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, _("The URI subpath '%s' contains invalid escaped characters"), subpath); return NULL; } /* FIXME: try to gently convert characters, not return NULL */ native = g_filename_from_utf8(unescaped, -1, NULL, NULL, error); g_free(unescaped); return native; } /** * fm_strcatv * @strvp: pointer to strings list * @astrv: (allow-none): list of strings to append * * Appends string list @astrv to @strvp replacing it. * * Since: 1.2.0 */ void fm_strcatv(char ***strvp, char * const *astrv) { guint i, len, len2; char **new_strv; if (astrv == NULL || *astrv == NULL) /* empty list */ return; len = *strvp ? g_strv_length(*strvp) : 0; len2 = g_strv_length((char **)astrv); new_strv = g_new(char *, len + len2 + 1); for (i = 0; i < len; i++) new_strv[i] = (*strvp)[i]; for (i = 0; i < len2; i++) new_strv[len+i] = g_strdup(astrv[i]); new_strv[len+i] = NULL; g_free(*strvp); *strvp = new_strv; } libfm-1.4.0/src/base/fm-utils.h000066400000000000000000000053371475513661000162370ustar00rootroot00000000000000/* * fm-utils.h * * Copyright 2009 - 2010 Hong Jen Yee (PCMan) * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_UTILS_H__ #define __FM_UTILS_H__ #include #include #include "fm-file-info.h" G_BEGIN_DECLS /** * FmAppCommandParseCallback: * @opt: key character * @user_data: data passed from caller of fm_app_command_parse() * * The handler which converts key char into string representation. * * See also: fm_app_command_parse(). * * Returns: string representation. * * Since: 1.0.0 */ typedef const char* (*FmAppCommandParseCallback)(char opt, gpointer user_data); typedef struct _FmAppCommandParseOption FmAppCommandParseOption; /** * FmAppCommandParseOption: * @opt: key character * @callback: subroutine to get string for substitution * * Element of correspondence for substitutions by fm_app_command_parse(). */ struct _FmAppCommandParseOption { char opt; FmAppCommandParseCallback callback; }; int fm_app_command_parse(const char* cmd, const FmAppCommandParseOption* opts, char** ret, gpointer user_data); char* fm_file_size_to_str(char* buf, size_t buf_size, goffset size, gboolean si_prefix); char *fm_file_size_to_str2(char *buf, size_t buf_size, goffset size, char size_units); gboolean fm_key_file_get_int(GKeyFile* kf, const char* grp, const char* key, int* val); gboolean fm_key_file_get_bool(GKeyFile* kf, const char* grp, const char* key, gboolean* val); char* fm_canonicalize_filename(const char* filename, const char* cwd); char* fm_strdup_replace(char* str, char* old_str, char* new_str); gboolean fm_run_in_default_main_context(GSourceFunc func, gpointer data); const char *fm_get_home_dir(void); char *fm_uri_subpath_to_native_subpath(const char *subpath, GError **error); void fm_strcatv(char ***strvp, char * const *astrv); G_END_DECLS #endif libfm-1.4.0/src/demo/000077500000000000000000000000001475513661000143305ustar00rootroot00000000000000libfm-1.4.0/src/demo/libfm-demo.c000066400000000000000000000027641475513661000165200ustar00rootroot00000000000000/* * pcmanfm.c * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include #include #include #include "fm-gtk.h" #include "main-win.h" int main(int argc, char** argv) { FmMainWin* w; gtk_init(&argc, &argv); fm_gtk_init(NULL); /* for debugging RTL */ /* gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); */ w = fm_main_win_new(); gtk_window_set_default_size(GTK_WINDOW(w), 640, 480); gtk_widget_show(GTK_WIDGET(w)); if(argc > 1) { FmPath* path = fm_path_new_for_commandline_arg(argv[1]); fm_main_win_chdir(w, path); fm_path_unref(path); } GDK_THREADS_ENTER(); gtk_main(); GDK_THREADS_LEAVE(); fm_finalize(); return 0; } libfm-1.4.0/src/demo/main-win-ui.c000066400000000000000000000163271475513661000166370ustar00rootroot00000000000000/* * main-win-ui.c * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /* this file is included by main-win.c */ static const char main_menu_xml[] = "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""; static GtkActionEntry main_win_actions[]= { {"FileMenu", NULL, N_("_File"), NULL, NULL, NULL}, {"New", GTK_STOCK_NEW, N_("_New Window"), "N", NULL, G_CALLBACK(on_new_win)}, {"Close", GTK_STOCK_CLOSE, N_("_Close Window"), "W", NULL, G_CALLBACK(on_close_win)}, {"EditMenu", NULL, N_("_Edit"), NULL, NULL, NULL}, {"Cut", GTK_STOCK_CUT, NULL, NULL, NULL, G_CALLBACK(bounce_action)}, {"Copy", GTK_STOCK_COPY, NULL, NULL, NULL, G_CALLBACK(bounce_action)}, {"Paste", GTK_STOCK_PASTE, NULL, NULL, NULL, G_CALLBACK(bounce_action)}, {"Del", GTK_STOCK_DELETE, NULL, NULL, NULL, G_CALLBACK(bounce_action)}, {"Rename", NULL, N_("Rename"), "F2", NULL, G_CALLBACK(on_rename)}, {"Link", NULL, N_("Create Symlink"), NULL, NULL, NULL}, {"MoveTo", NULL, N_("Move To..."), NULL, NULL, G_CALLBACK(on_move_to)}, {"CopyTo", NULL, N_("Copy To..."), NULL, NULL, G_CALLBACK(on_copy_to)}, {"SelAll", GTK_STOCK_SELECT_ALL, NULL, NULL, NULL, G_CALLBACK(bounce_action)}, {"InvSel", NULL, N_("Invert Selection"), NULL, NULL, G_CALLBACK(bounce_action)}, {"Pref", GTK_STOCK_PREFERENCES, NULL, NULL, NULL, NULL}, {"ViewMenu", NULL, N_("_View"), NULL, NULL, NULL}, {"Reload", NULL, N_("Reload"), "F5", NULL, G_CALLBACK(on_reload)}, {"PathMode", NULL, N_("_Path Bar"), NULL, NULL, NULL}, {"Sort", NULL, N_("_Sort Files"), NULL, NULL, NULL}, {"HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL}, {"About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(on_about)}, {"GoMenu", NULL, N_("_Go"), NULL, NULL, NULL}, {"Prev", GTK_STOCK_GO_BACK, N_("Previous Folder"), "Left", N_("Previous Folder"), G_CALLBACK(on_go_back)}, {"Next", GTK_STOCK_GO_FORWARD, N_("Next Folder"), "Right", N_("Next Folder"), G_CALLBACK(on_go_forward)}, {"Up", GTK_STOCK_GO_UP, N_("Parent Folder"), "Up", N_("Go to parent Folder"), G_CALLBACK(on_go_up)}, {"Home", "user-home", N_("Home Folder"), "Home", N_("Home Folder"), G_CALLBACK(on_go_home)}, {"Desktop", "user-desktop", N_("Desktop"), NULL, N_("Desktop Folder"), G_CALLBACK(on_go_desktop)}, {"Computer", "computer", N_("Devices"), NULL, NULL, G_CALLBACK(on_go_computer)}, {"Trash", "user-trash", N_("Trash Can"), NULL, NULL, G_CALLBACK(on_go_trash)}, {"Network", GTK_STOCK_NETWORK, N_("Network"), NULL, NULL, G_CALLBACK(on_go_network)}, {"Apps", "system-software-install", N_("Applications"), NULL, N_("Installed Applications"), G_CALLBACK(on_go_apps)}, {"Go", GTK_STOCK_JUMP_TO, NULL, NULL, NULL, G_CALLBACK(on_go)}, {"Search", GTK_STOCK_FIND, N_("Find Files"), "", NULL, G_CALLBACK(on_search)}, {"BookmarksMenu", NULL, N_("_Bookmarks"), NULL, NULL, NULL}, {"AddBookmark", GTK_STOCK_ADD, N_("Add To Bookmarks"), NULL, N_("Add To Bookmarks"), NULL}, /* for accelerators */ {"Location", NULL, NULL, "d", NULL, G_CALLBACK(on_location)}, {"Location2", NULL, NULL, "L", NULL, G_CALLBACK(on_location)}, }; static GtkToggleActionEntry main_win_toggle_actions[]= { {"ShowHidden", NULL, N_("Show _Hidden"), "H", NULL, G_CALLBACK(on_show_hidden), FALSE} }; static GtkRadioActionEntry main_win_sort_type_actions[]= { {"Asc", GTK_STOCK_SORT_ASCENDING, NULL, NULL, NULL, GTK_SORT_ASCENDING}, {"Desc", GTK_STOCK_SORT_DESCENDING, NULL, NULL, NULL, GTK_SORT_DESCENDING}, }; static GtkRadioActionEntry main_win_sort_by_actions[]= { {"ByName", NULL, N_("By _Name"), NULL, NULL, FM_FOLDER_MODEL_COL_NAME}, {"ByMTime", NULL, N_("By _Modification Time"), NULL, NULL, FM_FOLDER_MODEL_COL_MTIME} }; static GtkRadioActionEntry main_win_pathbar_actions[]= { {"PathEntry", NULL, N_("_Location"), NULL, NULL, 0}, {"PathBar", NULL, N_("_Buttons"), NULL, NULL, 1} }; static const char folder_menu_xml[]= "" "" /* "" */ "" /* "" */ "" ""; /* Action entries for pupup menus */ static GtkActionEntry folder_menu_actions[]= { /* {"NewTab", GTK_STOCK_NEW, N_("Open in New Tab"), NULL, NULL, G_CALLBACK(on_open_in_new_tab)}, */ {"NewWin", GTK_STOCK_NEW, N_("Open in New Window"), NULL, NULL, G_CALLBACK(on_open_in_new_win)}, {"Search", GTK_STOCK_FIND, NULL, NULL, NULL, NULL} }; libfm-1.4.0/src/demo/main-win.c000066400000000000000000001065601475513661000162230ustar00rootroot00000000000000/* * main-win.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "main-win.h" #include "fm-folder-view.h" #include "fm-standard-view.h" #include "fm-folder-model.h" #include "fm-path-entry.h" #include "fm-file-menu.h" #include "fm-clipboard.h" #include "fm-gtk-utils.h" #include "fm-gtk-file-launcher.h" #include "fm-side-pane.h" #include "fm-menu-tool-item.h" static void fm_main_win_finalize (GObject *object); static void fm_main_win_dispose (GObject *object); G_DEFINE_TYPE(FmMainWin, fm_main_win, GTK_TYPE_WINDOW); /* static void on_new_tab(GtkAction* act, FmMainWin* win); */ static void on_new_win(GtkAction* act, FmMainWin* win); static void on_close_win(GtkAction* act, FmMainWin* win); /* static void on_open_in_new_tab(GtkAction* act, FmMainWin* win); */ static void on_open_in_new_win(GtkAction* act, FmMainWin* win); static void on_copy_to(GtkAction* act, FmMainWin* win); static void on_move_to(GtkAction* act, FmMainWin* win); static void on_rename(GtkAction* act, FmMainWin* win); static void bounce_action(GtkAction* act, FmMainWin* win); static void on_go(GtkAction* act, FmMainWin* win); static void on_go_back(GtkAction* act, FmMainWin* win); static void on_go_forward(GtkAction* act, FmMainWin* win); static void on_go_up(GtkAction* act, FmMainWin* win); static void on_go_home(GtkAction* act, FmMainWin* win); static void on_go_desktop(GtkAction* act, FmMainWin* win); static void on_go_trash(GtkAction* act, FmMainWin* win); static void on_go_computer(GtkAction* act, FmMainWin* win); static void on_go_network(GtkAction* act, FmMainWin* win); static void on_go_apps(GtkAction* act, FmMainWin* win); static void on_reload(GtkAction* act, FmMainWin* win); static void on_show_hidden(GtkToggleAction* act, FmMainWin* win); static void on_change_mode(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win); static void on_sort_by(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win); static void on_sort_type(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win); static void on_about(GtkAction* act, FmMainWin* win); static void on_search(GtkAction* act, FmMainWin* win); static void on_location(GtkAction* act, FmMainWin* win); static void on_side_pane_chdir(FmSidePane* sp, guint button, FmPath* path, FmMainWin* win); static void update_statusbar(FmMainWin* win); static void on_folder_start_loading(FmFolder* folder, FmMainWin* win); static void on_folder_finish_loading(FmFolder* folder, FmMainWin* win); static void on_folder_unmount(FmFolder* folder, FmMainWin* win); static void on_folder_removed(FmFolder* folder, FmMainWin* win); static void on_folder_fs_info(FmFolder* folder, FmMainWin* win); static FmJobErrorAction on_folder_error(FmFolder* folder, GError* err, FmJobErrorSeverity severity, FmMainWin* win); static void free_folder(FmMainWin* win); #include "main-win-ui.c" /* ui xml definitions and actions */ static guint n_wins = 0; static void fm_main_win_class_init(FmMainWinClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_main_win_dispose; g_object_class->finalize = fm_main_win_finalize; fm_main_win_parent_class = (GtkWindowClass*)g_type_class_peek(GTK_TYPE_WINDOW); } static void on_entry_activate(GtkEntry* entry, FmMainWin* win) { FmPath* path = fm_path_entry_get_path(FM_PATH_ENTRY(entry)); fm_main_win_chdir(win, path); if (win->pathbar_active) { gtk_widget_set_visible(win->location, FALSE); gtk_widget_set_visible(gtk_ui_manager_get_widget(win->ui, "/toolbar/Go"), FALSE); gtk_widget_set_visible(win->pathbar, TRUE); } } static void on_pathbar_chdir(FmPathBar *bar, FmPath *path, FmMainWin *win) { fm_main_win_chdir(win, path); } static void on_path_mode(GtkRadioAction *act, GtkRadioAction *cur, FmMainWin *win) { int mode = gtk_radio_action_get_current_value(cur); if (mode == win->pathbar_active) return; win->pathbar_active = mode; gtk_widget_set_visible(win->location, mode == 0); gtk_widget_set_visible(gtk_ui_manager_get_widget(win->ui, "/toolbar/Go"), mode == 0); gtk_widget_set_visible(win->pathbar, mode); } static void update_statusbar(FmMainWin* win) { char* msg; FmFolderModel* model = fm_folder_view_get_model(win->folder_view); FmFolder* folder = win->folder; if(model && folder) { FmFileInfoList* files = fm_folder_get_files(folder); int total_files = fm_file_info_list_get_length(files); int shown_files = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model), NULL); msg = g_strdup_printf("%d files are listed (%d hidden).", shown_files, (total_files - shown_files) ); gtk_statusbar_pop(GTK_STATUSBAR(win->statusbar), win->statusbar_ctx); gtk_statusbar_push(GTK_STATUSBAR(win->statusbar), win->statusbar_ctx, msg); g_free(msg); fm_folder_query_filesystem_info(folder); } } static FmJobErrorAction on_folder_error(FmFolder* folder, GError* err, FmJobErrorSeverity severity, FmMainWin* win) { if(err->domain == G_IO_ERROR) { if( err->code == G_IO_ERROR_NOT_MOUNTED && severity < FM_JOB_ERROR_CRITICAL ) { FmPath* path = fm_folder_get_path(folder); if(fm_mount_path(GTK_WINDOW(win), path, TRUE)) return FM_JOB_RETRY; } } fm_show_error(GTK_WINDOW(win), NULL, err->message); return FM_JOB_CONTINUE; } static void on_folder_start_loading(FmFolder* folder, FmMainWin* win) { FmFolderModel* model; g_debug("start-loading"); fm_set_busy_cursor(GTK_WIDGET(win)); if(fm_folder_is_incremental(folder)) { /* create a model for the folder and set it to the view it is delayed for non-incremental folders since adding rows into model is much faster without handlers connected to its signals */ model = fm_folder_model_new(folder, FALSE); fm_folder_view_set_model(win->folder_view, model); /* create folder popup and apply shortcuts from it */ fm_folder_view_add_popup(win->folder_view, GTK_WINDOW(win), NULL); g_object_unref(model); } else fm_folder_view_set_model(win->folder_view, NULL); } static gboolean update_scroll(gpointer data) { FmMainWin* win = data; GtkScrolledWindow* scroll = GTK_SCROLLED_WINDOW(win->folder_view); gint scroll_pos; /* scroll to recorded position */ scroll_pos = fm_nav_history_get_scroll_pos(win->nav_history); gtk_adjustment_set_value(gtk_scrolled_window_get_vadjustment(scroll), scroll_pos); win->update_scroll_id = 0; return FALSE; } static void on_folder_finish_loading(FmFolder* folder, FmMainWin* win) { FmFolderView* fv = win->folder_view; FmPath* path = fm_folder_get_path(folder); FmFileInfo* info = fm_folder_get_info(folder); FmPathEntry* entry = FM_PATH_ENTRY(win->location); fm_path_entry_set_path(entry, path); fm_path_bar_set_path(FM_PATH_BAR(win->pathbar), path); if(fm_folder_view_get_model(fv) == NULL) { /* create a model for the folder and set it to the view */ FmFolderModel* model = fm_folder_model_new(folder, FALSE); fm_folder_view_set_model(fv, model); /* create folder popup and apply shortcuts from it */ fm_folder_view_add_popup(win->folder_view, GTK_WINDOW(win), NULL); g_object_unref(model); } /* delaying scrolling since drawing folder view is delayed - don't know why */ if(!win->update_scroll_id) win->update_scroll_id = g_timeout_add(50, update_scroll, win); /* update status bar */ update_statusbar(win); if(info) /* not failed */ gtk_window_set_title(GTK_WINDOW(win), fm_file_info_get_disp_name(info)); else gtk_window_set_title(GTK_WINDOW(win), "(no folder)"); fm_unset_busy_cursor(GTK_WIDGET(win)); g_debug("finish-loading"); } static void on_folder_unmount(FmFolder* folder, FmMainWin* win) { free_folder(win); gtk_widget_destroy(GTK_WIDGET(win)); } static void on_folder_removed(FmFolder* folder, FmMainWin* win) { free_folder(win); gtk_widget_destroy(GTK_WIDGET(win)); } static gboolean open_folder_func(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data, GError** err) { FmMainWin* win = FM_MAIN_WIN(user_data); GList* l = folder_infos; FmFileInfo* fi = (FmFileInfo*)l->data; fm_main_win_chdir(win, fm_file_info_get_path(fi)); l=l->next; for(; l; l=l->next) { FmFileInfo* fi = (FmFileInfo*)l->data; win = fm_main_win_new(); fm_main_win_chdir(win, fm_file_info_get_path(fi)); gtk_window_present(GTK_WINDOW(win)); } return TRUE; } static gboolean open_search_func(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data, GError** err) { FmMainWin* win; GList* l = folder_infos; FmFileInfo* fi = (FmFileInfo*)l->data; GSList* cols = NULL; const FmFolderViewColumnInfo col_infos[] = { {FM_FOLDER_MODEL_COL_NAME}, {FM_FOLDER_MODEL_COL_DESC}, {FM_FOLDER_MODEL_COL_DIRNAME}, {FM_FOLDER_MODEL_COL_SIZE}, {FM_FOLDER_MODEL_COL_MTIME} }; guint i; win = fm_main_win_new(); fm_main_win_chdir(win, fm_file_info_get_path(fi)); fm_standard_view_set_mode(FM_STANDARD_VIEW(win->folder_view), FM_FV_LIST_VIEW); for(i = 0; i < G_N_ELEMENTS(col_infos); i++) cols = g_slist_append(cols, (gpointer)&col_infos[i]); fm_folder_view_set_columns(win->folder_view, cols); g_slist_free(cols); gtk_window_present(GTK_WINDOW(win)); l=l->next; for(; l; l=l->next) { /*FmFileInfo* fi = (FmFileInfo*)l->data; FIXME: open in new window */ } return TRUE; } static void update_files_popup(FmFolderView* fv, GtkWindow* win, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfoList* files) { GList *file = fm_file_info_list_peek_head_link(files); while (file) { if (!fm_file_info_is_dir(file->data)) return; file = file->next; } gtk_action_group_add_actions(act_grp, folder_menu_actions, G_N_ELEMENTS(folder_menu_actions), win); g_object_set_qdata_full(G_OBJECT(act_grp), fm_qdata_id, fm_file_info_list_ref(files), (GDestroyNotify)fm_file_info_list_unref); gtk_ui_manager_add_ui_from_string(ui, folder_menu_xml, -1, NULL); } static void update_sidebar_popup(FmSidePane* sp, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfo* file, gpointer win) { FmFileInfoList* files; if (!file || !fm_file_info_is_dir(file)) return; files = fm_file_info_list_new(); fm_file_info_list_push_tail(files, file); gtk_action_group_add_actions(act_grp, folder_menu_actions, G_N_ELEMENTS(folder_menu_actions), win); g_object_set_qdata_full(G_OBJECT(act_grp), fm_qdata_id, files, (GDestroyNotify)fm_file_info_list_unref); gtk_ui_manager_add_ui_from_string(ui, folder_menu_xml, -1, NULL); } static void on_file_clicked(FmFolderView* fv, FmFolderViewClickType type, FmFileInfo* fi, FmMainWin* win) { switch(type) { case FM_FV_ACTIVATED: /* file activated */ break; /* handled by FmFolderView */ case FM_FV_CONTEXT_MENU: break; /* handled by FmFolderView */ case FM_FV_MIDDLE_CLICK: g_debug("middle click!"); case FM_FV_CLICK_NONE: break; } } static void on_sel_changed(FmFolderView* fv, gint n_files, FmMainWin* win) { /* popup previous message if there is any */ gtk_statusbar_pop(GTK_STATUSBAR(win->statusbar), win->statusbar_ctx2); if(n_files) { char* msg; /* FIXME: display total size of all selected files. */ if(n_files == 1) /* only one file is selected */ { FmFileInfoList* files = fm_folder_view_dup_selected_files(fv); FmFileInfo* fi = fm_file_info_list_peek_head(files); const char* size_str = fm_file_info_get_disp_size(fi); fm_file_info_list_unref(files); if(size_str) { msg = g_strdup_printf("\"%s\" (%s) %s", fm_file_info_get_disp_name(fi), size_str ? size_str : "", fm_file_info_get_desc(fi)); } else { msg = g_strdup_printf("\"%s\" %s", fm_file_info_get_disp_name(fi), fm_file_info_get_desc(fi)); } } else msg = g_strdup_printf("%d items selected", n_files); gtk_statusbar_push(GTK_STATUSBAR(win->statusbar), win->statusbar_ctx2, msg); g_free(msg); } } static void on_bookmark(GtkMenuItem* mi, FmMainWin* win) { FmPath* path = (FmPath*)g_object_get_qdata(G_OBJECT(mi), fm_qdata_id); fm_main_win_chdir(win, path); } static void create_bookmarks_menu(FmMainWin* win) { GList *items, *l; int i = 0; items = fm_bookmarks_get_all(win->bookmarks); for(l=items;l;l=l->next) { FmBookmarkItem* item = (FmBookmarkItem*)l->data; GtkWidget* mi = gtk_image_menu_item_new_with_label(item->name); gtk_widget_show(mi); // gtk_image_menu_item_set_image(); // FIXME: set icons for menu items g_object_set_qdata_full(G_OBJECT(mi), fm_qdata_id, fm_path_ref(item->path), (GDestroyNotify)fm_path_unref); g_signal_connect(mi, "activate", G_CALLBACK(on_bookmark), win); gtk_menu_shell_insert(GTK_MENU_SHELL(win->bookmarks_menu), mi, i); ++i; fm_bookmark_item_unref(item); } g_list_free(items); if(i > 0) gtk_menu_shell_insert(GTK_MENU_SHELL(win->bookmarks_menu), gtk_separator_menu_item_new(), i); } static void on_bookmarks_changed(FmBookmarks* bm, FmMainWin* win) { /* delete old items first. */ GList* mis = gtk_container_get_children(GTK_CONTAINER(win->bookmarks_menu)); GList* l; for(l = mis;l;l=l->next) { GtkWidget* item = (GtkWidget*)l->data; if( GTK_IS_SEPARATOR_MENU_ITEM(item) ) break; gtk_widget_destroy(item); } g_list_free(mis); create_bookmarks_menu(win); } static void load_bookmarks(FmMainWin* win, GtkUIManager* ui) { GtkWidget* mi = gtk_ui_manager_get_widget(ui, "/menubar/BookmarksMenu"); win->bookmarks_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mi)); win->bookmarks = fm_bookmarks_dup(); g_signal_connect(win->bookmarks, "changed", G_CALLBACK(on_bookmarks_changed), win); create_bookmarks_menu(win); } static void on_history_item(GtkMenuItem* mi, FmMainWin* win) { gpointer i = g_object_get_qdata(G_OBJECT(mi), fm_qdata_id); int scroll_pos = gtk_adjustment_get_value(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(win->folder_view))); FmPath* path = fm_nav_history_go_to(win->nav_history, GPOINTER_TO_UINT(i), scroll_pos); /* FIXME: should this be driven by a signal emitted on FmNavHistory? */ fm_main_win_chdir_without_history(win, path); } static void on_show_history_menu(FmMenuToolItem* btn, FmMainWin* win) { GtkMenuShell* menu = (GtkMenuShell*)fm_menu_tool_item_get_menu(btn); FmPath* path; guint n, cur = fm_nav_history_get_cur_index(win->nav_history); /* delete old items */ gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback)gtk_widget_destroy, NULL); for(n = 0; (path = fm_nav_history_get_nth_path(win->nav_history, n)); n++) { char* str; GtkWidget* mi; str = fm_path_display_name(path, TRUE); if(n == cur) { mi = gtk_check_menu_item_new_with_label(str); gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(mi), TRUE); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi), TRUE); } else mi = gtk_menu_item_new_with_label(str); g_free(str); g_object_set_qdata_full(G_OBJECT(mi), fm_qdata_id, GUINT_TO_POINTER(n), NULL); g_signal_connect(mi, "activate", G_CALLBACK(on_history_item), win); gtk_menu_shell_append(menu, mi); } gtk_widget_show_all( GTK_WIDGET(menu) ); } static void on_side_pane_chdir(FmSidePane* sp, guint button, FmPath* path, FmMainWin* win) { g_debug("on_side_pane_chdir"); // g_signal_handlers_block_by_func(win->dirtree_view, on_dirtree_chdir, win); fm_main_win_chdir(win, path); // g_signal_handlers_unblock_by_func(win->dirtree_view, on_dirtree_chdir, win); } static void fm_main_win_init(FmMainWin *win) { GtkWidget *vbox, *menubar; GtkBox *pathbox; GtkToolItem *toolitem; GtkUIManager* ui; GtkActionGroup* act_grp; GtkAction* act; GtkAccelGroup* accel_grp; GtkRadioAction *mode_action; GSList *radio_group; GString *str, *xml; static char accel_str[] = "1"; GtkShadowType shadow_type; int i; gboolean is_first; ++n_wins; vbox = gtk_vbox_new(FALSE, 0); win->hpaned = gtk_hpaned_new(); gtk_paned_set_position(GTK_PANED(win->hpaned), 150); /* places left pane */ win->left_pane = fm_side_pane_new(); fm_side_pane_set_mode(win->left_pane, FM_SP_PLACES); fm_side_pane_set_popup_updater(win->left_pane, update_sidebar_popup, win); gtk_paned_add1(GTK_PANED(win->hpaned), GTK_WIDGET(win->left_pane)); /* folder view */ win->folder_view = (FmFolderView*)fm_standard_view_new(FM_FV_ICON_VIEW, update_files_popup, open_folder_func); fm_folder_view_set_show_hidden(win->folder_view, FALSE); fm_folder_view_set_selection_mode(win->folder_view, GTK_SELECTION_MULTIPLE); g_signal_connect(win->folder_view, "clicked", G_CALLBACK(on_file_clicked), win); g_signal_connect(win->folder_view, "sel-changed", G_CALLBACK(on_sel_changed), win); gtk_paned_add2(GTK_PANED(win->hpaned), GTK_WIDGET(win->folder_view)); /* link places view with folder view. */ g_signal_connect(win->left_pane, "chdir", G_CALLBACK(on_side_pane_chdir), win); /* create menu bar and toolbar */ ui = gtk_ui_manager_new(); act_grp = gtk_action_group_new("Main"); gtk_action_group_add_actions(act_grp, main_win_actions, G_N_ELEMENTS(main_win_actions), win); gtk_action_group_add_toggle_actions(act_grp, main_win_toggle_actions, G_N_ELEMENTS(main_win_toggle_actions), win); gtk_action_group_add_radio_actions(act_grp, main_win_sort_type_actions, G_N_ELEMENTS(main_win_sort_type_actions), GTK_SORT_ASCENDING, G_CALLBACK(on_sort_type), win); gtk_action_group_add_radio_actions(act_grp, main_win_sort_by_actions, G_N_ELEMENTS(main_win_sort_by_actions), 0, G_CALLBACK(on_sort_by), win); gtk_action_group_add_radio_actions(act_grp, main_win_pathbar_actions, G_N_ELEMENTS(main_win_pathbar_actions), 0, G_CALLBACK(on_path_mode), win); /* implement gtk_action_group_add_radio_actions() for dynamic list */ radio_group = NULL; is_first = TRUE; str = g_string_new("Mode:"); xml = g_string_new(""); accel_str[6] = '1'; for(i = 0; i < fm_standard_view_get_n_modes(); i++) { if(fm_standard_view_get_mode_label(i)) { g_string_append(str, fm_standard_view_mode_to_str(i)); mode_action = gtk_radio_action_new(str->str, fm_standard_view_get_mode_label(i), fm_standard_view_get_mode_tooltip(i), fm_standard_view_get_mode_icon(i), i); gtk_radio_action_set_group(mode_action, radio_group); radio_group = gtk_radio_action_get_group(mode_action); gtk_action_group_add_action_with_accel(act_grp, GTK_ACTION(mode_action), accel_str); if (is_first) /* work on first one only */ g_signal_connect(mode_action, "changed", G_CALLBACK(on_change_mode), win); is_first = FALSE; g_object_unref(mode_action); g_string_append_printf(xml, "", str->str); accel_str[6]++; /* 2 and so on */ g_string_truncate(str, 5); } } g_string_append(xml, ""); g_string_free(str, TRUE); accel_grp = gtk_ui_manager_get_accel_group(ui); gtk_window_add_accel_group(GTK_WINDOW(win), accel_grp); gtk_ui_manager_insert_action_group(ui, act_grp, 0); gtk_ui_manager_add_ui_from_string(ui, main_menu_xml, -1, NULL); /* add ui generated above */ gtk_ui_manager_add_ui_from_string(ui, xml->str, xml->len, NULL); g_string_free(xml, TRUE); /* disable "Find Files" button if module isn't available */ if (!fm_module_is_in_use("vfs", "search")) { act = gtk_ui_manager_get_action(ui, "/menubar/GoMenu/Search"); gtk_action_set_sensitive(act, FALSE); } /* disable "Applications" button if module isn't available */ if (!fm_module_is_in_use("vfs", "menu")) { act = gtk_ui_manager_get_action(ui, "/menubar/GoMenu/Apps"); gtk_action_set_sensitive(act, FALSE); } menubar = gtk_ui_manager_get_widget(ui, "/menubar"); win->toolbar = gtk_ui_manager_get_widget(ui, "/toolbar"); /* FIXME: should make these optional */ gtk_toolbar_set_icon_size(GTK_TOOLBAR(win->toolbar), GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_toolbar_set_style(GTK_TOOLBAR(win->toolbar), GTK_TOOLBAR_ICONS); /* create history button manually and add a popup menu to it */ toolitem = fm_menu_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(win->toolbar), toolitem, 2); gtk_widget_show(GTK_WIDGET(toolitem)); /* set up history menu */ win->nav_history = fm_nav_history_new(); win->history_menu = gtk_menu_new(); fm_menu_tool_item_set_menu(FM_MENU_TOOL_ITEM(toolitem), win->history_menu); g_signal_connect(toolitem, "show-menu", G_CALLBACK(on_show_history_menu), win); gtk_box_pack_start( (GtkBox*)vbox, menubar, FALSE, TRUE, 0 ); gtk_box_pack_start( (GtkBox*)vbox, win->toolbar, FALSE, TRUE, 0 ); /* load bookmarks menu */ load_bookmarks(win, ui); /* the location bar */ win->location = (GtkWidget*)fm_path_entry_new(); g_signal_connect(win->location, "activate", G_CALLBACK(on_entry_activate), win); win->pathbar = (GtkWidget*)fm_path_bar_new(); g_signal_connect(win->pathbar, "chdir", G_CALLBACK(on_pathbar_chdir), win); pathbox = (GtkBox*)gtk_hbox_new(FALSE, 0); gtk_box_pack_start(pathbox, win->location, TRUE, TRUE, 0); gtk_box_pack_start(pathbox, win->pathbar, TRUE, TRUE, 0); win->pathbar_active = FALSE; toolitem = gtk_tool_item_new(); gtk_container_add( GTK_CONTAINER(toolitem), GTK_WIDGET(pathbox) ); gtk_tool_item_set_expand(GTK_TOOL_ITEM(toolitem), TRUE); gtk_toolbar_insert((GtkToolbar*)win->toolbar, toolitem, gtk_toolbar_get_n_items(GTK_TOOLBAR(win->toolbar)) - 1 ); gtk_box_pack_start( (GtkBox*)vbox, win->hpaned, TRUE, TRUE, 0 ); /* status bar */ win->statusbar = gtk_statusbar_new(); /* status bar column showing volume free space */ gtk_widget_style_get(win->statusbar, "shadow-type", &shadow_type, NULL); win->vol_status = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(win->vol_status), shadow_type); gtk_box_pack_start(GTK_BOX(win->statusbar), win->vol_status, FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(win->vol_status), gtk_label_new(NULL)); gtk_box_pack_start( (GtkBox*)vbox, win->statusbar, FALSE, TRUE, 0 ); win->statusbar_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(win->statusbar), "status"); win->statusbar_ctx2 = gtk_statusbar_get_context_id(GTK_STATUSBAR(win->statusbar), "status2"); g_object_unref(act_grp); win->ui = ui; gtk_container_add( (GtkContainer*)win, vbox ); gtk_widget_show_all(vbox); gtk_widget_hide(win->pathbar); gtk_window_set_default_size(GTK_WINDOW(win), 640, 480); gtk_widget_realize(GTK_WIDGET(win)); fm_folder_view_set_show_hidden(win->folder_view, FALSE); fm_main_win_chdir(win, fm_path_get_home()); gtk_widget_grab_focus(GTK_WIDGET(win->folder_view)); } FmMainWin* fm_main_win_new(void) { return (FmMainWin*)g_object_new(FM_MAIN_WIN_TYPE, NULL); } static void free_folder(FmMainWin* win) { if(win->folder) { g_signal_handlers_disconnect_by_func(win->folder, on_folder_start_loading, win); g_signal_handlers_disconnect_by_func(win->folder, on_folder_finish_loading, win); g_signal_handlers_disconnect_by_func(win->folder, on_folder_fs_info, win); g_signal_handlers_disconnect_by_func(win->folder, on_folder_error, win); g_signal_handlers_disconnect_by_func(win->folder, on_folder_removed, win); g_signal_handlers_disconnect_by_func(win->folder, on_folder_unmount, win); g_object_unref(win->folder); win->folder = NULL; } } static void fm_main_win_dispose(GObject *object) { FmMainWin *win = FM_MAIN_WIN(object); g_debug("fm_main_win_dispose"); free_folder(win); if(win->nav_history) { g_object_unref(win->nav_history); win->nav_history = NULL; } if(win->ui) { g_object_unref(win->ui); win->ui = NULL; } if(win->bookmarks) { g_object_unref(win->bookmarks); win->bookmarks = NULL; } if(win->update_scroll_id) { g_source_remove(win->update_scroll_id); win->update_scroll_id = 0; } (* G_OBJECT_CLASS(fm_main_win_parent_class)->dispose)(object); } static void fm_main_win_finalize(GObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_MAIN_WIN(object)); --n_wins; if (G_OBJECT_CLASS(fm_main_win_parent_class)->finalize) (* G_OBJECT_CLASS(fm_main_win_parent_class)->finalize)(object); if(n_wins == 0) gtk_main_quit(); } void on_about(GtkAction* act, FmMainWin* win) { const char* authors[]={"Hong Jen Yee ", NULL}; GtkWidget* dlg = gtk_about_dialog_new(); gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dlg), "libfm-demo"); gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(dlg), authors); gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dlg), "A demo program for libfm"); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dlg), "http://pcmanfm.sf.net/"); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } void on_show_hidden(GtkToggleAction* act, FmMainWin* win) { gboolean active = gtk_toggle_action_get_active(act); fm_folder_view_set_show_hidden(win->folder_view, active); fm_side_pane_set_show_hidden(win->left_pane, active); update_statusbar(win); } void on_change_mode(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win) { int mode = gtk_radio_action_get_current_value(cur); fm_standard_view_set_mode(FM_STANDARD_VIEW(win->folder_view), mode); } void on_sort_by(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win) { guint val = gtk_radio_action_get_current_value(cur); FmFolderModel *model = fm_folder_view_get_model(win->folder_view); if(model) fm_folder_model_set_sort(model, val, FM_SORT_DEFAULT); } void on_sort_type(GtkRadioAction* act, GtkRadioAction *cur, FmMainWin* win) { guint val = gtk_radio_action_get_current_value(cur); FmFolderModel *model = fm_folder_view_get_model(win->folder_view); FmSortMode mode; if(model) { fm_folder_model_get_sort(model, NULL, &mode); mode &= ~FM_SORT_ORDER_MASK; mode |= (val == GTK_SORT_ASCENDING) ? FM_SORT_ASCENDING : FM_SORT_DESCENDING; fm_folder_model_set_sort(model, FM_FOLDER_MODEL_COL_DEFAULT, mode); } } void on_new_win(GtkAction* act, FmMainWin* win) { win = fm_main_win_new(); fm_main_win_chdir(win, fm_path_get_home()); gtk_window_present(GTK_WINDOW(win)); } void on_close_win(GtkAction* act, FmMainWin* win) { gtk_widget_destroy(GTK_WIDGET(win)); } /* void on_open_in_new_tab(GtkAction* act, FmMainWin* win); { } */ void on_open_in_new_win(GtkAction* act, FmMainWin* win) { GObject* act_grp; FmFileInfoList* sels; g_object_get(act, "action-group", &act_grp, NULL); sels = g_object_get_qdata(act_grp, fm_qdata_id); g_object_unref(act_grp); GList* l; for( l = fm_file_info_list_peek_head_link(sels); l; l=l->next ) { FmFileInfo* fi = (FmFileInfo*)l->data; win = fm_main_win_new(); fm_main_win_chdir(win, fm_file_info_get_path(fi)); gtk_window_present(GTK_WINDOW(win)); } } static void on_search(GtkAction* act, FmMainWin* win) { FmPath* cwd = fm_folder_get_path(win->folder); GList* l = g_list_append(NULL, cwd); fm_launch_search_simple(GTK_WINDOW(win), NULL, l, open_search_func, win); g_list_free(l); } void on_go(GtkAction* act, FmMainWin* win) { fm_main_win_chdir_by_name( win, gtk_entry_get_text(GTK_ENTRY(win->location))); } void on_go_back(GtkAction* act, FmMainWin* win) { if(fm_nav_history_can_back(win->nav_history)) { guint prev = fm_nav_history_get_cur_index(win->nav_history) + 1; int scroll_pos = gtk_adjustment_get_value(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(win->folder_view))); FmPath* path = fm_nav_history_go_to(win->nav_history, prev, scroll_pos); /* FIXME: should this be driven by a signal emitted on FmNavHistory? */ fm_main_win_chdir_without_history(win, path); } } void on_go_forward(GtkAction* act, FmMainWin* win) { guint cur = fm_nav_history_get_cur_index(win->nav_history); if(cur > 0) { int scroll_pos = gtk_adjustment_get_value(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(win->folder_view))); FmPath* path = fm_nav_history_go_to(win->nav_history, cur - 1, scroll_pos); /* FIXME: should this be driven by a signal emitted on FmNavHistory? */ fm_main_win_chdir_without_history(win, path); } } void on_go_up(GtkAction* act, FmMainWin* win) { FmPath* parent = fm_path_get_parent(fm_folder_get_path(win->folder)); if(parent) fm_main_win_chdir( win, parent); } void on_go_home(GtkAction* act, FmMainWin* win) { fm_main_win_chdir_by_name( win, fm_get_home_dir()); } void on_go_desktop(GtkAction* act, FmMainWin* win) { fm_main_win_chdir_by_name( win, g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); } void on_go_trash(GtkAction* act, FmMainWin* win) { fm_main_win_chdir_by_name( win, "trash:///"); } void on_go_computer(GtkAction* act, FmMainWin* win) { fm_main_win_chdir_by_name( win, "computer:///"); } void on_go_network(GtkAction* act, FmMainWin* win) { fm_main_win_chdir_by_name( win, "network:///"); } void on_go_apps(GtkAction* act, FmMainWin* win) { fm_main_win_chdir(win, fm_path_get_apps_menu()); } static void on_reload(GtkAction* act, FmMainWin* win) { if(win->folder) fm_folder_reload(win->folder); } void fm_main_win_chdir_by_name(FmMainWin* win, const char* path_str) { FmPath* path; char* tmp; path = fm_path_new_for_str(path_str); fm_main_win_chdir(win, path); tmp = fm_path_display_name(path, FALSE); gtk_entry_set_text(GTK_ENTRY(win->location), tmp); g_free(tmp); fm_path_unref(path); } static void on_folder_fs_info(FmFolder* folder, FmMainWin* win) { guint64 free, total; if(fm_folder_get_filesystem_info(folder, &total, &free)) { char total_str[ 64 ]; char free_str[ 64 ]; char buf[128]; fm_file_size_to_str(free_str, sizeof(free_str), free, TRUE); fm_file_size_to_str(total_str, sizeof(total_str), total, TRUE); g_snprintf( buf, G_N_ELEMENTS(buf), "Free space: %s (Total: %s)", free_str, total_str ); gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(win->vol_status))), buf); gtk_widget_show(win->vol_status); } else { gtk_widget_hide(win->vol_status); } } void fm_main_win_chdir_without_history(FmMainWin* win, FmPath* path) { free_folder(win); win->folder = fm_folder_from_path(path); g_signal_connect(win->folder, "start-loading", G_CALLBACK(on_folder_start_loading), win); g_signal_connect(win->folder, "finish-loading", G_CALLBACK(on_folder_finish_loading), win); g_signal_connect(win->folder, "removed", G_CALLBACK(on_folder_removed), win); g_signal_connect(win->folder, "unmount", G_CALLBACK(on_folder_unmount), win); g_signal_connect(win->folder, "error", G_CALLBACK(on_folder_error), win); g_signal_connect(win->folder, "fs-info", G_CALLBACK(on_folder_fs_info), win); on_folder_start_loading(win->folder, win); if(fm_folder_is_loaded(win->folder)) { on_folder_finish_loading(win->folder, win); on_folder_fs_info(win->folder, win); } g_signal_handlers_block_by_func(win->left_pane, on_side_pane_chdir, win); fm_side_pane_chdir(FM_SIDE_PANE(win->left_pane), path); g_signal_handlers_unblock_by_func(win->left_pane, on_side_pane_chdir, win); update_statusbar(win); /* fm_nav_history_set_cur(); */ } void fm_main_win_chdir(FmMainWin* win, FmPath* path) { FmPath* cwd = win->folder ? fm_folder_get_path(win->folder) : NULL; int scroll_pos; /* it should grab focus in any case, see bug #3589448 */ gtk_widget_grab_focus(GTK_WIDGET(win->folder_view)); if(cwd && path && fm_path_equal(cwd, path)) return; scroll_pos = gtk_adjustment_get_value(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(win->folder_view))); fm_nav_history_chdir(win->nav_history, path, scroll_pos); fm_main_win_chdir_without_history(win, path); } void on_copy_to(GtkAction* act, FmMainWin* win) { FmPathList* files = fm_folder_view_dup_selected_file_paths(win->folder_view); if(files) fm_copy_files_to(GTK_WINDOW(win), files); } void on_move_to(GtkAction* act, FmMainWin* win) { FmPathList* files = fm_folder_view_dup_selected_file_paths(win->folder_view); if(files) fm_move_files_to(GTK_WINDOW(win), files); } void on_rename(GtkAction* act, FmMainWin* win) { FmPathList* files = fm_folder_view_dup_selected_file_paths(win->folder_view); if(files) fm_rename_file(GTK_WINDOW(win), fm_path_list_peek_head(files)); /* FIXME: is it ok to only rename the first selected file here. */ } static void bounce_action(GtkAction* act, FmMainWin* win) { g_debug("bouncing action %s to popup", gtk_action_get_name(act)); fm_folder_view_bounce_action(act, win->folder_view); } void on_location(GtkAction* act, FmMainWin* win) { gtk_widget_grab_focus(win->location); if (win->pathbar_active) { gtk_widget_set_visible(win->location, TRUE); gtk_widget_set_visible(gtk_ui_manager_get_widget(win->ui, "/toolbar/Go"), TRUE); gtk_widget_set_visible(win->pathbar, FALSE); } } libfm-1.4.0/src/demo/main-win.h000066400000000000000000000047231475513661000162260ustar00rootroot00000000000000/* * main-win.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __MAIN_WIN_H__ #define __MAIN_WIN_H__ #include #include "fm-gtk.h" G_BEGIN_DECLS #define FM_MAIN_WIN_TYPE (fm_main_win_get_type()) #define FM_MAIN_WIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_MAIN_WIN_TYPE, FmMainWin)) #define FM_MAIN_WIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_MAIN_WIN_TYPE, FmMainWinClass)) #define FM_IS_MAIN_WIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_MAIN_WIN_TYPE)) #define FM_IS_MAIN_WIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_MAIN_WIN_TYPE)) typedef struct _FmMainWin FmMainWin; typedef struct _FmMainWinClass FmMainWinClass; struct _FmMainWin { GtkWindow parent; GtkUIManager* ui; GtkWidget* toolbar; GtkWidget* location; GtkWidget* pathbar; GtkWidget* hpaned; FmSidePane* left_pane; FmFolderView* folder_view; GtkWidget* statusbar; GtkWidget* vol_status; GtkWidget* bookmarks_menu; GtkWidget* history_menu; /* */ FmFolder* folder; FmNavHistory* nav_history; guint statusbar_ctx; guint statusbar_ctx2; FmBookmarks* bookmarks; guint update_scroll_id; gboolean pathbar_active; }; struct _FmMainWinClass { GtkWindowClass parent_class; }; GType fm_main_win_get_type (void); FmMainWin* fm_main_win_new (void); void fm_main_win_chdir(FmMainWin* win, FmPath* path); void fm_main_win_chdir_by_name(FmMainWin* win, const char* path_str); void fm_main_win_chdir_without_history(FmMainWin* win, FmPath* path); G_END_DECLS #endif /* __MAIN-WIN_H__ */ libfm-1.4.0/src/extra/000077500000000000000000000000001475513661000145275ustar00rootroot00000000000000libfm-1.4.0/src/extra/fm-xml-file.c000066400000000000000000001415521475513661000170200ustar00rootroot00000000000000/* * fm-xml-file.c * * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of libfm-extra package. * * 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 */ /** * SECTION:fm-xml-file * @short_description: Simple XML parser. * @title: FmXmlFile * * @include: libfm/fm-extra.h * * The FmXmlFile represents content of some XML file in form that can * be altered and saved later. * * This parser has some simplifications on XML parsing: * * Only UTF-8 encoding is supported * * No user-defined entities, those should be converted externally * * Processing instructions, comments and the doctype declaration are parsed but are not interpreted in any way * The markup format does support: * * Elements * * Attributes * * 5 standard entities: &amp; &lt; &gt; &quot; &apos; * * Character references * * Sections marked as CDATA * * The application should respect g_type_init() if this parser is used * without usage of libfm. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-xml-file.h" #include #include "glib-compat.h" #include #include typedef struct { gchar *name; FmXmlFileHandler handler; gboolean in_line : 1; } FmXmlFileTagDesc; struct _FmXmlFile { GObject parent; GList *items; GString *data; char *comment_pre; FmXmlFileItem *current_item; FmXmlFileTagDesc *tags; /* tags[0].name contains DTD */ guint n_tags; /* number of elements in tags */ guint line, pos; }; struct _FmXmlFileClass { GObjectClass parent_class; }; struct _FmXmlFileItem { FmXmlFileTag tag; union { gchar *tag_name; /* only for tag == FM_XML_FILE_TAG_NOT_HANDLED */ gchar *text; /* only for tag == FM_XML_FILE_TEXT, NULL if directive */ }; char **attribute_names; char **attribute_values; FmXmlFile *file; FmXmlFileItem *parent; GList **parent_list; /* points to file->items or to parent->children */ GList *children; gchar *comment; /* a little trick: it is equal to text if it is CDATA */ }; G_DEFINE_TYPE(FmXmlFile, fm_xml_file, G_TYPE_OBJECT); static void fm_xml_file_finalize(GObject *object) { FmXmlFile *self; guint i; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_XML_FILE(object)); self = (FmXmlFile*)object; self->current_item = NULL; /* we destroying it */ while (self->items) { g_assert(((FmXmlFileItem*)self->items->data)->file == self); g_assert(((FmXmlFileItem*)self->items->data)->parent == NULL); fm_xml_file_item_destroy(self->items->data); } for (i = 0; i < self->n_tags; i++) g_free(self->tags[i].name); g_free(self->tags); if (self->data) g_string_free(self->data, TRUE); g_free(self->comment_pre); G_OBJECT_CLASS(fm_xml_file_parent_class)->finalize(object); } static void fm_xml_file_class_init(FmXmlFileClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_xml_file_finalize; } static void fm_xml_file_init(FmXmlFile *self) { self->tags = g_new0(FmXmlFileTagDesc, 1); self->n_tags = 1; self->line = 1; } /** * fm_xml_file_new * @sibling: (allow-none): container to copy handlers data * * Creates new empty #FmXmlFile container. If @sibling is not %NULL * then new container will have callbacks identical to set in @sibling. * Use @sibling parameter if you need to work with few XML files that * share the same schema or if you need to use the same tag ids for more * than one file. * * Returns: (transfer full): newly created object. * * Since: 1.2.0 */ FmXmlFile *fm_xml_file_new(FmXmlFile *sibling) { FmXmlFile *self; FmXmlFileTag i; self = (FmXmlFile*)g_object_new(FM_XML_FILE_TYPE, NULL); if (sibling && sibling->n_tags > 1) { self->n_tags = sibling->n_tags; self->tags = g_renew(FmXmlFileTagDesc, self->tags, self->n_tags); for (i = 1; i < self->n_tags; i++) { self->tags[i].name = g_strdup(sibling->tags[i].name); self->tags[i].handler = sibling->tags[i].handler; } } return self; } /** * fm_xml_file_set_handler * @file: the parser container * @tag: tag to use @handler for * @handler: callback for @tag * @in_line: %TRUE if tag should not receive new line by fm_xml_file_to_data() * @error: (allow-none) (out): location to save error * * Sets @handler for @file to be called on parse when @tag is found * in XML data. This function will fail if some handler for @tag was * aready set, in this case @error will be set appropriately. * * Returns: id for the @tag. * * Since: 1.2.0 */ FmXmlFileTag fm_xml_file_set_handler(FmXmlFile *file, const char *tag, FmXmlFileHandler handler, gboolean in_line, GError **error) { FmXmlFileTag i; g_return_val_if_fail(file != NULL && FM_IS_XML_FILE(file), FM_XML_FILE_TAG_NOT_HANDLED); g_return_val_if_fail(handler != NULL, FM_XML_FILE_TAG_NOT_HANDLED); g_return_val_if_fail(tag != NULL, FM_XML_FILE_TAG_NOT_HANDLED); for (i = 1; i < file->n_tags; i++) if (strcmp(file->tags[i].name, tag) == 0) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Duplicate handler for tag <%s>"), tag); return i; } file->tags = g_renew(FmXmlFileTagDesc, file->tags, i + 1); file->tags[i].name = g_strdup(tag); file->tags[i].handler = handler; file->tags[i].in_line = in_line; file->n_tags = i + 1; /* g_debug("XML parser: added handler '%s' id %u", tag, (guint)i); */ return i; } /* parse */ /* * This function was taken from GLib sources and adapted to be used here. * Copyright 2000, 2003 Red Hat, Inc. * * re-write the GString in-place, unescaping anything that escaped. * most XML does not contain entities, or escaping. */ static gboolean unescape_gstring_inplace (//GMarkupParseContext *context, GString *string, //gboolean *is_ascii, guint *line_num, guint *pos, gboolean normalize_attribute, GError **error) { //char mask, *to; char *to; //int line_num = 1; const char *from, *sol; //*is_ascii = FALSE; /* * Meeks' theorum: unescaping can only shrink text. * for < etc. this is obvious, for ￿ more * thought is required, but this is patently so. */ //mask = 0; for (from = to = string->str; *from != '\0'; from++, to++) { *to = *from; //mask |= *to; if (*to == '\n') { (*line_num)++; *pos = 0; } if (normalize_attribute && (*to == '\t' || *to == '\n')) *to = ' '; if (*to == '\r') { *to = normalize_attribute ? ' ' : '\n'; if (from[1] == '\n') { from++; (*line_num)++; *pos = 0; } } sol = from; if (*from == '&') { from++; if (*from == '#') { gboolean is_hex = FALSE; gulong l; gchar *end = NULL; from++; if (*from == 'x') { is_hex = TRUE; from++; } /* digit is between start and p */ errno = 0; if (is_hex) l = strtoul (from, &end, 16); else l = strtoul (from, &end, 10); if (end == from || errno != 0) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Failed to parse '%-.*s', which " "should have been a digit " "inside a character reference " "(ê for example) - perhaps " "the digit is too large"), (int)(end - from), from); return FALSE; } else if (*end != ';') { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Character reference did not end with a " "semicolon; " "most likely you used an ampersand " "character without intending to start " "an entity - escape ampersand as &")); return FALSE; } else { /* characters XML 1.1 permits */ if ((0 < l && l <= 0xD7FF) || (0xE000 <= l && l <= 0xFFFD) || (0x10000 <= l && l <= 0x10FFFF)) { gchar buf[8]; memset (buf, 0, 8); g_unichar_to_utf8 (l, buf); strncpy (to, buf, 8); to += strlen (buf) - 1; from = end; //if (l >= 0x80) /* not ascii */ //mask |= 0x80; } else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Character reference '%-.*s' does not " "encode a permitted character"), (int)(end - from), from); return FALSE; } } } else if (strncmp (from, "lt;", 3) == 0) { *to = '<'; from += 2; } else if (strncmp (from, "gt;", 3) == 0) { *to = '>'; from += 2; } else if (strncmp (from, "amp;", 4) == 0) { *to = '&'; from += 3; } else if (strncmp (from, "quot;", 5) == 0) { *to = '"'; from += 4; } else if (strncmp (from, "apos;", 5) == 0) { *to = '\''; from += 4; } else { if (*from == ';') g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Empty entity '&;' seen; valid " "entities are: & " < > '")); else { const char *end = strchr (from, ';'); if (end) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Entity name '%-.*s' is not known"), (int)(end-from), from); else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Entity did not end with a semicolon; " "most likely you used an ampersand " "character without intending to start " "an entity - escape ampersand as &")); } return FALSE; } } *pos += (from - sol) + 1; } /* g_debug("unescape_gstring_inplace completed"); */ g_assert (to - string->str <= (gint)string->len); if (to - string->str != (gint)string->len) g_string_truncate (string, to - string->str); //*is_ascii = !(mask & 0x80); return TRUE; } static inline void _update_file_ptr_part(FmXmlFile *file, const char *start, const char *end) { while (start < end) { if (*start == '\n') { file->line++; file->pos = 0; } else /* FIXME: advance by chars not bytes? */ file->pos++; start++; } } static inline void _update_file_ptr(FmXmlFile *file, int add_cols) { guint i; char *p; for (i = file->data->len, p = file->data->str; i > 0; i--, p++) { if (*p == '\n') { file->line++; file->pos = 0; } else /* FIXME: advance by chars not bytes? */ file->pos++; } file->pos += add_cols; } static inline gboolean _is_space(char c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\r'); } /** * fm_xml_file_parse_data * @file: the parser container * @text: data to parse * @size: size of @text * @error: (allow-none) (out): location to save error * @user_data: data to pass to handlers * * Parses next chunk of @text data. Parsing stops at end of data or at any * error. In latter case @error will be set appropriately. * * See also: fm_xml_file_finish_parse(). * * Returns: %FALSE if parsing failed. * * Since: 1.2.0 */ gboolean fm_xml_file_parse_data(FmXmlFile *file, const char *text, gsize size, GError **error, gpointer user_data) { gsize ptr, len; char *dst, *end, *tag, *name, *value; GString *buff; FmXmlFileItem *item; gboolean closing, selfdo; FmXmlFileTag i; char **attrib_names, **attrib_values; guint attribs; char quote; g_return_val_if_fail(file != NULL && FM_IS_XML_FILE(file), FALSE); _restart: if (size == 0) return TRUE; /* if file->data has '<' as first char then we stopped at tag */ if (file->data && file->data->len && file->data->str[0] == '<') { for (ptr = 0; ptr < size; ptr++) if (text[ptr] == '>') break; if (ptr == size) /* still no end of that tag */ { g_string_append_len(file->data, text, size); return TRUE; } /* we got a complete tag, nice, let parse it */ g_string_append_len(file->data, text, ptr); ptr++; text += ptr; size -= ptr; /* check for CDATA first */ if (file->data->len >= 11 /* data->str, "data->str + file->data->len; if (end[-2] != ']' || end[-1] != ']') /* find end of CDATA */ { g_string_append_c(file->data, '>'); goto _restart; } if (file->current_item == NULL) /* CDATA at top level! */ g_warning("FmXmlFile: line %u: junk CDATA in XML file ignored", file->line); else { item = fm_xml_file_item_new(FM_XML_FILE_TEXT); item->text = item->comment = g_strndup(&file->data->str[9], file->data->len - 11); fm_xml_file_item_append_child(file->current_item, item); } _update_file_ptr(file, 1); g_string_truncate(file->data, 0); goto _restart; } /* check for comment */ if (file->data->len >= 7 /* ", item->comment); escaped = g_markup_escape_text(item->text, -1); g_string_append(string, escaped); g_free(escaped); } else /* processing directive */ { g_string_append_printf(string, "%s", prefix->str, item->comment); *has_nl = TRUE; } return TRUE; default: if (item->tag >= file->n_tags) { _no_tag: g_set_error_literal(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("fm_xml_file_to_data: XML data error")); return FALSE; } tag_name = file->tags[item->tag].name; _do_tag: /* do comment */ if (item->comment != NULL) g_string_append_printf(string, "%s", prefix->str, item->comment); else if (item->attribute_names == NULL && item->children == NULL && file->tags[item->tag].in_line) { /* don't add prefix if it is simple tag such as
*/ g_string_append_printf(string, "<%s/>", tag_name); return TRUE; } /* start the tag */ g_string_append_printf(string, "%s<%s", prefix->str, tag_name); /* do attributes */ if (item->attribute_names) { char **name = item->attribute_names; char **value = item->attribute_values; while (*name) { if (*value) { char *escaped = g_markup_escape_text(*value, -1); g_string_append_printf(string, " %s='%s'", *name, escaped); g_free(escaped); } /* else error? */ name++; value++; } } if (item->children == NULL) { /* handle empty tags such as */ g_string_append(string, "/>"); *has_nl = TRUE; return TRUE; } g_string_append_c(string, '>'); } /* do with children */ *has_nl = FALSE; /* to collect data from nested elements */ g_string_append(prefix, " "); for (l = item->children; l; l = l->next) if (!_parser_item_to_gstring(file, string, l->data, prefix, has_nl, error)) break; g_string_truncate(prefix, prefix->len - 4); if (l != NULL) /* failed */ return FALSE; /* close the tag */ g_string_append_printf(string, "%s", (*has_nl) ? prefix->str : "", tag_name); *has_nl = TRUE; /* it was prefixed above */ return TRUE; } /** * fm_xml_file_to_data * @file: the parser container * @text_size: (allow-none) (out): location to save size of returned data * @error: (allow-none) (out): location to save error * * Prepares string representation (XML text) for the data that are in * the container. Returned data should be freed with g_free() after * usage. * * Returns: (transfer full): XML text representing data in @file. * * Since: 1.2.0 */ char *fm_xml_file_to_data(FmXmlFile *file, gsize *text_size, GError **error) { GString *string, *prefix; GList *l; gboolean has_nl = FALSE; g_return_val_if_fail(file != NULL && FM_IS_XML_FILE(file), NULL); string = g_string_sized_new(512); prefix = g_string_new("\n"); if (G_LIKELY(file->tags[0].name)) g_string_printf(string, "", file->tags[0].name); for (l = file->items; l; l = l->next) if (!_parser_item_to_gstring(file, string, l->data, prefix, &has_nl, error)) break; /* if failed then l != NULL */ g_string_free(prefix, TRUE); if (text_size) *text_size = string->len; return g_string_free(string, (l != NULL)); /* returns NULL if failed */ } /* item data accessor functions */ /** * fm_xml_file_item_get_comment * @item: the file element to inspect * * If an element @item has a comment ahead of it then retrieves that * comment. The returned data are owned by @item and should not be freed * nor otherwise altered by caller. * * Returns: (transfer none): comment or %NULL if no comment is set. * * Since: 1.2.0 */ const char *fm_xml_file_item_get_comment(FmXmlFileItem *item) { g_return_val_if_fail(item != NULL, NULL); return item->comment; } /** * fm_xml_file_item_get_children * @item: the file element to inspect * * Retrieves list of children for @item that are known to the parser. * Returned list should be freed by g_list_free() after usage. * * Note: any text between opening tag and closing tag such as * |[ <Tag>Some text</Tag> ]| * is presented as a child of special type #FM_XML_FILE_TEXT and can be * retrieved from that child, not from the item representing <Tag>. * * See also: fm_xml_file_item_get_data(). * * Returns: (transfer container) (element-type FmXmlFileItem): children list. * * Since: 1.2.0 */ GList *fm_xml_file_item_get_children(FmXmlFileItem *item) { g_return_val_if_fail(item != NULL, NULL); return g_list_copy(item->children); } /** * fm_xml_file_item_find_child * @item: the file element to inspect * @tag: tag id to search among children * * Searches for first child of @item which have child with tag id @tag. * Returned data are owned by file and should not be freed by caller. * * Returns: (transfer none): found child or %NULL if no such child was found. * * Since: 1.2.0 */ FmXmlFileItem *fm_xml_file_item_find_child(FmXmlFileItem *item, FmXmlFileTag tag) { GList *l; for (l = item->children; l; l = l->next) if (((FmXmlFileItem*)l->data)->tag == tag) return (FmXmlFileItem*)l->data; return NULL; } /** * fm_xml_file_item_get_tag * @item: the file element to inspect * * Retrieves tag id of @item. * * Returns: tag id. * * Since: 1.2.0 */ FmXmlFileTag fm_xml_file_item_get_tag(FmXmlFileItem *item) { g_return_val_if_fail(item != NULL, FM_XML_FILE_TAG_NOT_HANDLED); return item->tag; } /** * fm_xml_file_item_get_data * @item: the file element to inspect * @text_size: (allow-none) (out): location to save data size * * Retrieves text data from @item of type #FM_XML_FILE_TEXT. Returned * data are owned by file and should not be freed nor altered. * * Returns: (transfer none): text data or %NULL if @item isn't text data. * * Since: 1.2.0 */ const char *fm_xml_file_item_get_data(FmXmlFileItem *item, gsize *text_size) { if (text_size) *text_size = 0; g_return_val_if_fail(item != NULL, NULL); if (item->tag != FM_XML_FILE_TEXT) return NULL; if (text_size && item->text != NULL) *text_size = strlen(item->text); return item->text; } /** * fm_xml_file_item_get_parent * @item: the file element to inspect * * Retrieves parent element of @item if the @item has one. Returned data * are owned by file and should not be freed by caller. * * Returns: (transfer none): parent element or %NULL if element has no parent. * * Since: 1.2.0 */ FmXmlFileItem *fm_xml_file_item_get_parent(FmXmlFileItem *item) { g_return_val_if_fail(item != NULL, NULL); return item->parent; } /** * fm_xml_file_get_tag_name * @file: the parser container * @tag: the tag id to inspect * * Retrieves tag for its id. Returned data are owned by @file and should * not be modified by caller. * * Returns: (transfer none): tag string representation. * * Since: 1.2.0 */ const char *fm_xml_file_get_tag_name(FmXmlFile *file, FmXmlFileTag tag) { g_return_val_if_fail(file != NULL && FM_IS_XML_FILE(file), NULL); g_return_val_if_fail(tag > 0 && tag < file->n_tags, NULL); return file->tags[tag].name; } /** * fm_xml_file_item_get_tag_name * @item: the file element to inspect * * Retrieves tag for its id. Returned data are owned by @item and should * not be modified by caller. * * Returns: (transfer none): tag string representation or %NULL if @item is text. * * Since: 1.2.0 */ const char *fm_xml_file_item_get_tag_name(FmXmlFileItem *item) { g_return_val_if_fail(item != NULL, NULL); switch (item->tag) { case FM_XML_FILE_TEXT: return NULL; case FM_XML_FILE_TAG_NOT_HANDLED: return item->tag_name; default: return item->file->tags[item->tag].name; } } libfm-1.4.0/src/extra/fm-xml-file.h000066400000000000000000000115451475513661000170230ustar00rootroot00000000000000/* * fm-xml-file.h * * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of libfm-extra package. * * 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 */ #ifndef __FM_XML_FILE_H__ #define __FM_XML_FILE_H__ 1 #include G_BEGIN_DECLS #define FM_XML_FILE_TYPE (fm_xml_file_get_type()) #define FM_IS_XML_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), FM_XML_FILE_TYPE)) typedef struct _FmXmlFile FmXmlFile; typedef struct _FmXmlFileClass FmXmlFileClass; GType fm_xml_file_get_type(void); typedef struct _FmXmlFileItem FmXmlFileItem; typedef guint FmXmlFileTag; /** * FM_XML_FILE_TAG_NOT_HANDLED: * * Value of FmXmlFileTag which means this element has no handler installed. */ #define FM_XML_FILE_TAG_NOT_HANDLED 0 /** * FM_XML_FILE_TEXT: * * Value of FmXmlFileTag which means this element has parsed character data. */ #define FM_XML_FILE_TEXT (FmXmlFileTag)-1 /** * FmXmlFileHandler * @item: XML element being parsed * @children: (element-type FmXmlFileItem): elements found in @item * @attribute_names: attributes names list for @item * @attribute_values: attributes values list for @item * @n_attributes: list length of @attribute_names and @attribute_values * @line: current line number in the file (starting from 1) * @pos: current pos number in the file (starting from 0) * @error: (allow-none) (out): location to save error * @user_data: data passed to fm_xml_file_parse_data() * * Callback for processing some element in XML file. * It will be called at closing tag. * * Returns: %TRUE if no errors were found by handler. * * Since: 1.2.0 */ typedef gboolean (*FmXmlFileHandler)(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data); /* setup */ FmXmlFile *fm_xml_file_new(FmXmlFile *sibling); FmXmlFileTag fm_xml_file_set_handler(FmXmlFile *file, const char *tag, FmXmlFileHandler handler, gboolean in_line, GError **error); /* parse */ gboolean fm_xml_file_parse_data(FmXmlFile *file, const char *text, gsize size, GError **error, gpointer user_data); GList *fm_xml_file_finish_parse(FmXmlFile *file, GError **error); gint fm_xml_file_get_current_line(FmXmlFile *file, gint *pos); const char *fm_xml_file_get_dtd(FmXmlFile *file); /* item manipulations */ FmXmlFileItem *fm_xml_file_item_new(FmXmlFileTag tag); void fm_xml_file_item_append_text(FmXmlFileItem *item, const char *text, gssize text_size, gboolean cdata); gboolean fm_xml_file_item_append_child(FmXmlFileItem *item, FmXmlFileItem *child); void fm_xml_file_item_set_comment(FmXmlFileItem *item, const char *comment); gboolean fm_xml_file_item_set_attribute(FmXmlFileItem *item, const char *name, const char *value); gboolean fm_xml_file_item_destroy(FmXmlFileItem *item); gboolean fm_xml_file_insert_before(FmXmlFileItem *item, FmXmlFileItem *new_item); gboolean fm_xml_file_insert_first(FmXmlFile *file, FmXmlFileItem *new_item); /* save XML */ void fm_xml_file_set_dtd(FmXmlFile *file, const char *dtd, GError **error); char *fm_xml_file_to_data(FmXmlFile *file, gsize *text_size, GError **error); /* item data accessor functions */ const char *fm_xml_file_item_get_comment(FmXmlFileItem *item); GList *fm_xml_file_item_get_children(FmXmlFileItem *item); FmXmlFileItem *fm_xml_file_item_find_child(FmXmlFileItem *item, FmXmlFileTag tag); FmXmlFileTag fm_xml_file_item_get_tag(FmXmlFileItem *item); const char *fm_xml_file_item_get_data(FmXmlFileItem *item, gsize *text_size); FmXmlFileItem *fm_xml_file_item_get_parent(FmXmlFileItem *item); const char *fm_xml_file_item_get_tag_name(FmXmlFileItem *item); const char *fm_xml_file_get_tag_name(FmXmlFile *file, FmXmlFileTag tag); G_END_DECLS #endif /* __FM_XML_FILE_H__ */ libfm-1.4.0/src/fm-extra.h000066400000000000000000000020611475513661000152770ustar00rootroot00000000000000/* * fm-extra.h * * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of libfm-extra package. * * 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 */ #ifndef __LIBFM_FM_EXTRA_H__ #define __LIBFM_FM_EXTRA_H__ #include "fm-version.h" #include "fm-xml-file.h" #endif libfm-1.4.0/src/fm-gtk.c000066400000000000000000000050511475513661000147360ustar00rootroot00000000000000/* * fm-gtk.c * * Copyright 2009 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-gtk * @short_description: Libfm-gtk initialization * @title: Libfm-Gtk * * @include: libfm/fm-gtk.h * */ #include "fm-gtk.h" static volatile gint gtk_initialized = 0; /** * fm_gtk_init * @config: configuration file data * * Initializes libfm-gtk data. This API should be always called before any * other libfm-gtk function is called. It is idempotent. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_gtk_init(FmConfig* config) { #if GLIB_CHECK_VERSION(2, 30, 0) if (g_atomic_int_add(>k_initialized, 1) != 0 || #else if (g_atomic_int_exchange_and_add(>k_initialized, 1) != 0 || #endif G_UNLIKELY(!fm_init(config))) return FALSE; /* see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734691 if no theme was selected and GTK fallback isn't available then no icons are shown - we should add folder and file icons as fallbacks theme */ gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), PACKAGE_THEME_DIR); _fm_icon_pixbuf_init(); _fm_thumbnail_init(); _fm_file_properties_init(); _fm_folder_model_init(); _fm_folder_view_init(); _fm_file_menu_init(); return TRUE; } /** * fm_gtk_finalize * * Frees libfm data. * * This API should be called exactly that many times the fm_gtk_init() * was called before. * * Since: 0.1.0 */ void fm_gtk_finalize(void) { if (!g_atomic_int_dec_and_test(>k_initialized)) return; _fm_icon_pixbuf_finalize(); _fm_thumbnail_finalize(); _fm_file_properties_finalize(); _fm_folder_model_finalize(); _fm_folder_view_finalize(); _fm_file_menu_finalize(); fm_finalize(); } libfm-1.4.0/src/fm-gtk.h000066400000000000000000000035351475513661000147500ustar00rootroot00000000000000/* * fm-gtk.h * * Copyright 2009 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_GTK_H__ #define __FM_GTK_H__ #include "fm.h" #include "fm-app-chooser-combo-box.h" #include "fm-app-chooser-dlg.h" #include "fm-app-menu-view.h" #include "fm-cell-renderer-pixbuf.h" #include "fm-cell-renderer-text.h" #include "fm-clipboard.h" #include "fm-dir-tree-model.h" #include "fm-dir-tree-view.h" #include "fm-dnd-auto-scroll.h" #include "fm-dnd-dest.h" #include "fm-dnd-src.h" #include "fm-file-menu.h" #include "fm-file-properties.h" #include "fm-folder-model.h" #include "fm-folder-view.h" #include "fm-gtk-file-launcher.h" #include "fm-gtk-marshal.h" #include "fm-gtk-utils.h" #include "fm-icon-pixbuf.h" #include "fm-menu-tool-item.h" #include "fm-path-bar.h" #include "fm-path-entry.h" #include "fm-places-model.h" #include "fm-places-view.h" #include "fm-progress-dlg.h" #include "fm-side-pane.h" #include "fm-standard-view.h" #include "fm-tab-label.h" #include "fm-thumbnail.h" G_BEGIN_DECLS gboolean fm_gtk_init(FmConfig* config); void fm_gtk_finalize(); G_END_DECLS #endif libfm-1.4.0/src/fm-seal.h000066400000000000000000000021411475513661000150770ustar00rootroot00000000000000/* * fm-seal.h * * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __LIBFM_FM_SEAL_H__ #define __LIBFM_FM_SEAL_H__ 1 #ifdef FM_DISABLE_SEAL # define FM_SEAL(_x_) _x_ #else # define FM_SEAL(_x_) _sealed_##_x_ #endif #endif libfm-1.4.0/src/fm-version.h.in000066400000000000000000000024661475513661000162570ustar00rootroot00000000000000/* * fm-version.h * * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * 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 */ #ifndef __FM_VERSION_H__ #define __FM_VERSION_H__ #define FM_VERSION_MAJOR @FM_VERSION_MAJOR@ #define FM_VERSION_MINOR @FM_VERSION_MINOR@ #define FM_VERSION_MICRO @FM_VERSION_MICRO@ #define FM_CHECK_VERSION(_a,_b,_c) \ (FM_VERSION_MAJOR > _a || \ (FM_VERSION_MAJOR == _a && FM_VERSION_MINOR > _b) || \ (FM_VERSION_MAJOR == _a && FM_VERSION_MINOR == _b && FM_VERSION_MICRO >= _c)) #endif /* __FM_VERSION_H__ */ libfm-1.4.0/src/fm.c000066400000000000000000000104421475513661000141530ustar00rootroot00000000000000/* * fm.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm * @short_description: Libfm initialization * @title: Libfm * * @include: libfm/fm.h * */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm.h" #ifdef HAVE_OLD_ACTIONS #include "actions/fm-actions.h" #endif #ifdef USE_UDISKS #include "udisks/fm-udisks.h" #endif GQuark fm_qdata_id = 0; /** * fm_version * * Returns text representation of Libfm version. * * Returns: (transfer none): text string. * * Since: 1.2.0 */ const char *fm_version(void) { return PACKAGE_VERSION; } static volatile gint init_done = 0; /** * fm_init * @config: (allow-none): configuration file data * * Initializes libfm data. This API should be always called before any * other Libfm function is called. It is idempotent. * * Returns: %FALSE in case of duplicate call. * * Since: 0.1.0 */ gboolean fm_init(FmConfig* config) { #if GLIB_CHECK_VERSION(2, 30, 0) if (g_atomic_int_add(&init_done, 1) != 0) #else if (g_atomic_int_exchange_and_add(&init_done, 1) != 0) #endif return FALSE; /* duplicate call */ #ifdef ENABLE_NLS bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); #endif #if !GLIB_CHECK_VERSION(2, 36, 0) g_type_init(); #endif #if !GLIB_CHECK_VERSION(2, 32, 0) g_thread_init(NULL); #endif g_thread_pool_set_max_idle_time(10000); /* is 10 sec enough? */ if(config) fm_config = (FmConfig*)g_object_ref(config); else { /* create default config object */ fm_config = fm_config_new(); fm_config_load_from_file(fm_config, NULL); } #ifdef USE_UDISKS /* extension point should be added before any other GIO monitor call otherwise it will be ignored by GIO because GIO initializes it once */ _fm_udisks_init(); #endif _fm_file_init(); _fm_path_init(); _fm_icon_init(); _fm_monitor_init(); _fm_mime_type_init(); _fm_file_info_init(); /* should be called only after _fm_mime_type_init() */ _fm_folder_init(); _fm_archiver_init(); _fm_thumbnailer_init(); // must be called after mime-types are initialized _fm_thumbnail_loader_init(); _fm_terminal_init(); /* should be called after config initialization */ _fm_templates_init(); _fm_folder_config_init(); #ifdef HAVE_OLD_ACTIONS /* generated by vala */ _fm_file_actions_init(); #endif fm_qdata_id = g_quark_from_static_string("fm_qdata_id"); return TRUE; } /** * fm_finalize * * Frees libfm data. * * This API should be called exactly that many times the fm_init() was * called before. * * Since: 0.1.0 */ void fm_finalize(void) { if (!g_atomic_int_dec_and_test(&init_done)) return; #ifdef HAVE_OLD_ACTIONS /* generated by vala */ _fm_file_actions_finalize(); #endif _fm_folder_config_finalize(); _fm_templates_finalize(); _fm_terminal_finalize(); _fm_thumbnail_loader_finalize(); _fm_thumbnailer_finalize(); /* need to be before fm_mime_type_finalize() */ _fm_archiver_finalize(); _fm_folder_finalize(); _fm_file_info_finalize(); _fm_mime_type_finalize(); _fm_monitor_finalize(); _fm_icon_finalize(); _fm_path_finalize(); _fm_file_finalize(); #ifdef USE_UDISKS _fm_udisks_finalize(); #endif /* fm_config_save(fm_config, _fm_config_get_name(fm_config)); */ g_object_unref(fm_config); fm_config = NULL; } libfm-1.4.0/src/fm.h000066400000000000000000000040211475513661000141540ustar00rootroot00000000000000/* * fm.h * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __LIBFM_FM_H__ #define __LIBFM_FM_H__ #include "fm-version.h" #include "fm-app-info.h" #include "fm-archiver.h" #include "fm-bookmarks.h" #include "fm-config.h" #include "fm-dummy-monitor.h" #include "fm-file.h" #include "fm-file-info.h" #include "fm-file-launcher.h" #include "fm-folder.h" #include "fm-folder-config.h" #include "fm-icon.h" #include "fm-list.h" #include "fm-marshal.h" #include "fm-mime-type.h" #include "fm-module.h" #include "fm-monitor.h" #include "fm-nav-history.h" #include "fm-path.h" #include "fm-templates.h" #include "fm-terminal.h" #include "fm-thumbnail-loader.h" #include "fm-thumbnailer.h" #include "fm-utils.h" #include "fm-deep-count-job.h" #include "fm-dir-list-job.h" #include "fm-file-info-job.h" #include "fm-file-ops-job.h" #include "fm-file-ops-job-change-attr.h" #include "fm-file-ops-job-delete.h" #include "fm-file-ops-job-xfer.h" #include "fm-job.h" #include "fm-simple-job.h" G_BEGIN_DECLS gboolean fm_init(FmConfig* config); void fm_finalize(); const char *fm_version(void); extern GQuark fm_qdata_id; /* a quark value used to associate data with objects */ G_END_DECLS #endif libfm-1.4.0/src/gio/000077500000000000000000000000001475513661000141625ustar00rootroot00000000000000libfm-1.4.0/src/gio/fm-app-lookup.c000066400000000000000000000100041475513661000170100ustar00rootroot00000000000000/* * fm-app-lookup.c * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-app-lookup.h" #include #ifndef G_IMPLEMENT_INTERFACE_DYNAMIC /* this macro is only provided in glib > 2.24 */ #define G_IMPLEMENT_INTERFACE_DYNAMIC(TYPE_IFACE, iface_init) { \ const GInterfaceInfo g_implement_interface_info = { \ (GInterfaceInitFunc) iface_init, NULL, NULL \ }; \ g_type_module_add_interface (type_module, g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \ } #endif static void app_lookup_iface_init(GDesktopAppInfoLookupIface *iface); static GObject* fm_app_lookup_constructor(GType type, guint n_props, GObjectConstructParam *props); static void fm_app_lookup_finalize (GObject *object); static GAppInfo *get_default_for_uri_scheme(GDesktopAppInfoLookup *lookup, const char *scheme); G_DEFINE_DYNAMIC_TYPE_EXTENDED(FmAppLookup, fm_app_lookup, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE_DYNAMIC(G_TYPE_DESKTOP_APP_INFO_LOOKUP, app_lookup_iface_init)) static void fm_app_lookup_class_init(FmAppLookupClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->constructor = fm_app_lookup_constructor; g_object_class->finalize = fm_app_lookup_finalize; } static void fm_app_lookup_class_finalize(FmAppLookupClass *klass) { } GObject* fm_app_lookup_constructor(GType type, guint n_props, GObjectConstructParam *props) { GObject* obj; /* call parent constructor. */ obj = G_OBJECT_CLASS(fm_app_lookup_parent_class)->constructor(type, n_props, props); return obj; } static void fm_app_lookup_finalize(GObject *object) { FmAppLookup *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_APP_LOOKUP(object)); self = FM_APP_LOOKUP(object); G_OBJECT_CLASS(fm_app_lookup_parent_class)->finalize(object); } static void fm_app_lookup_init(FmAppLookup *self) { } void fm_app_lookup_register(GIOModule *module) { gint priority; fm_app_lookup_register_type(G_TYPE_MODULE (module)); /* check if we're in gnome, if true, use lower priority. * otherwise, use a high priority to override gvfs gconf module. * priority of the gconf module of gvfs is 10. */ if(G_UNLIKELY(g_getenv("GNOME_DESKTOP_SESSION_ID"))) /* we're in Gnome */ priority = 9; else /* we're in other desktop envionments */ priority = 90; g_io_extension_point_implement(G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME, FM_TYPE_APP_LOOKUP, "libfm-applookup", priority); /* TODO: implement our own G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME */ } static void app_lookup_iface_init(GDesktopAppInfoLookupIface *iface) { iface->get_default_for_uri_scheme = get_default_for_uri_scheme; } /* FIXME: implement our own browser lookup method not depending on gconf. */ GAppInfo *get_default_for_uri_scheme(GDesktopAppInfoLookup *lookup, const char *scheme) { GAppInfo* app; /* use a way compatible with glib >= 2.27 */ char* mime_type = g_strconcat("x-scheme-handler/", scheme, NULL); app = g_app_info_get_default_for_type(mime_type, FALSE); g_free(mime_type); return app; } libfm-1.4.0/src/gio/fm-app-lookup.h000066400000000000000000000033341475513661000170250ustar00rootroot00000000000000/* * fm-app-lookup.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_APP_LOOKUP_H__ #define __FM_APP_LOOKUP_H__ #include G_BEGIN_DECLS #define FM_TYPE_APP_LOOKUP (fm_app_lookup_get_type()) #define FM_APP_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_APP_LOOKUP, FmAppLookup)) #define FM_APP_LOOKUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_APP_LOOKUP, FmAppLookupClass)) #define FM_IS_APP_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_APP_LOOKUP)) #define FM_IS_APP_LOOKUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_APP_LOOKUP)) typedef struct _FmAppLookup FmAppLookup; typedef struct _FmAppLookupClass FmAppLookupClass; struct _FmAppLookup { GObject parent; }; struct _FmAppLookupClass { GObjectClass parent_class; }; GType fm_app_lookup_get_type(void); void fm_app_lookup_register(GIOModule *module); G_END_DECLS #endif /* __FM_APP_LOOKUP_H__ */ libfm-1.4.0/src/gio/module.c000066400000000000000000000027141475513661000156170ustar00rootroot00000000000000/* * module.c * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "fm-app-lookup.h" void g_io_module_load (GIOModule *module) { bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); fm_app_lookup_register (module); } void g_io_module_unload (GIOModule *module) { } char** g_io_module_query (void) { char** eps = g_new(char*, 2); eps[0] = g_strdup(G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME); eps[1] = NULL; return eps; } libfm-1.4.0/src/glib-compat.c000066400000000000000000000025171475513661000157530ustar00rootroot00000000000000/* * glib-compat.c * * Copyright 2011 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #include "glib-compat.h" #if !GLIB_CHECK_VERSION(2, 28, 0) gboolean g_signal_accumulator_first_wins (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer dummy) { g_value_copy (handler_return, return_accu); return FALSE; } #endif libfm-1.4.0/src/glib-compat.h000066400000000000000000000061111475513661000157520ustar00rootroot00000000000000/* * glib-compat.h * * Copyright 2011 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __GLIB_COMPAT_H__ #define __GLIB_COMPAT_H__ #include #include G_BEGIN_DECLS /* GLib prior 2.24 have no such macro */ #ifndef G_DEFINE_INTERFACE # define G_DEFINE_INTERFACE(TN, t_n, T_P) \ static void t_n##_default_init (TN##Interface *klass); \ GType t_n##_get_type (void) \ { \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ GType g_define_type_id = \ g_type_register_static_simple (G_TYPE_INTERFACE, \ g_intern_static_string (#TN), \ sizeof (TN##Interface), \ (GClassInitFunc)t_n##_default_init, \ 0, \ (GInstanceInitFunc)NULL, \ (GTypeFlags) 0); \ if (T_P) \ g_type_interface_add_prerequisite (g_define_type_id, T_P); \ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ } \ return g_define_type_id__volatile; \ } /* closes t_n##_get_type() */ #endif /* G_DEFINE_INTERFACE */ #if !GLIB_CHECK_VERSION(2, 28, 0) gboolean g_signal_accumulator_first_wins (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer dummy); #endif #if !GLIB_CHECK_VERSION(2, 28, 0) /* This API was added in glib 2.28 */ #define g_slist_free_full(slist, free_func) \ { \ g_slist_foreach(slist, (GFunc)free_func, NULL); \ g_slist_free(slist); \ } #define g_list_free_full(list, free_func) \ { \ g_list_foreach(list, (GFunc)free_func, NULL); \ g_list_free(list); \ } #endif #if !GLIB_CHECK_VERSION(2, 34, 0) /* This useful API was added in glib 2.34 */ static inline GSList *g_slist_copy_deep(GSList *list, GCopyFunc func, gpointer user_data) { GSList *new_list = g_slist_copy(list), *l; for(l = new_list; l; l = l->next) l->data = func(l->data, user_data); return new_list; } #endif G_END_DECLS #endif libfm-1.4.0/src/gtk-compat.c000066400000000000000000000016201475513661000156150ustar00rootroot00000000000000/* * gtk-compat.c * * Copyright 2011 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "gtk-compat.h" libfm-1.4.0/src/gtk-compat.h000066400000000000000000000072761475513661000156370ustar00rootroot00000000000000/* * gtk-compat.h * * Copyright 2011 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __GTK_COMPAT_H__ #define __GTK_COMPAT_H__ #include #include "glib-compat.h" G_BEGIN_DECLS /* for gtk+ 3.0 migration */ #if !GTK_CHECK_VERSION(3, 0, 0) #define gdk_display_get_app_launch_context(dpy) gdk_app_launch_context_new() # define gdk_window_get_device_position(win,dev,xptr,yptr,mptr) \ gdk_window_get_pointer(win,xptr,yptr,mptr) #else # define gdk_cursor_unref(obj) g_object_unref(obj) #endif #if !GTK_CHECK_VERSION(2, 21, 0) # define GDK_KEY_Left GDK_Left # define GDK_KEY_Right GDK_Right # define GDK_KEY_Tab GDK_Tab # define GDK_KEY_Escape GDK_Escape # define GDK_KEY_a GDK_a # define GDK_KEY_space GDK_space # define GDK_KEY_Return GDK_Return # define GDK_KEY_ISO_Enter GDK_ISO_Enter # define GDK_KEY_KP_Enter GDK_KP_Enter # define GDK_KEY_f GDK_f # define GDK_KEY_F GDK_F # define GDK_KEY_g GDK_g # define GDK_KEY_G GDK_G # define GDK_KEY_Up GDK_Up # define GDK_KEY_KP_Up GDK_KP_Up # define GDK_KEY_Down GDK_Down # define GDK_KEY_KP_Down GDK_KP_Down # define GDK_KEY_p GDK_p # define GDK_KEY_n GDK_n # define GDK_KEY_Home GDK_Home # define GDK_KEY_KP_Home GDK_KP_Home # define GDK_KEY_End GDK_End # define GDK_KEY_KP_End GDK_KP_End # define GDK_KEY_Page_Up GDK_Page_Up # define GDK_KEY_KP_Page_Up GDK_KP_Page_Up # define GDK_KEY_Page_Down GDK_Page_Down # define GDK_KEY_KP_Page_Down GDK_KP_Page_Down # define GDK_KEY_KP_Right GDK_KP_Right # define GDK_KEY_KP_Left GDK_KP_Left # define GDK_KEY_F10 GDK_F10 # define GDK_KEY_Menu GDK_Menu #endif #if !GTK_CHECK_VERSION(3, 0, 0) #define gtk_widget_in_destruction(widget) \ (GTK_OBJECT_FLAGS(GTK_OBJECT(widget)) & GTK_IN_DESTRUCTION) #endif #if !GTK_CHECK_VERSION(3, 0, 0) # define gtk_selection_data_get_data_with_length(sel_data,length) \ gtk_selection_data_get_data(sel_data); \ *(length) = gtk_selection_data_get_length(sel_data) #endif #if !GTK_CHECK_VERSION(2, 24, 0) # define gdk_window_get_screen(window) gdk_drawable_get_screen(window) #endif #if !GTK_CHECK_VERSION(2, 22, 0) # define gdk_drag_context_get_source_window(drag_context) \ drag_context->source_window # define gdk_drag_context_get_selected_action(drag_context) \ drag_context->action # define gdk_drag_context_get_actions(drag_context) \ drag_context->actions # define gdk_drag_context_get_suggested_action(drag_context) \ drag_context->suggested_action # define gtk_accessible_get_widget(accessible) accessible->widget #endif #if !GTK_CHECK_VERSION(2, 20, 0) # define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget) #endif #ifndef ATK_CHECK_VERSION # define ATK_CHECK_VERSION(_a,_b,_c) (_a < 2 || (_a == 2 && _b < 8)) /* < 2.8 */ #endif G_END_DECLS #endif libfm-1.4.0/src/gtk/000077500000000000000000000000001475513661000141715ustar00rootroot00000000000000libfm-1.4.0/src/gtk/exo/000077500000000000000000000000001475513661000147645ustar00rootroot00000000000000libfm-1.4.0/src/gtk/exo/README000066400000000000000000000005521475513661000156460ustar00rootroot00000000000000These files under exo subdir are taken from libexo of XFCE. License: LGPL version 2 The original authors are: * Copyright (c) 2008 Jannis Pohlmann * Copyright (c) 2004-2006 os-cillation e.K. * Copyright (c) 2002,2004 Anders Carlsson This modified copy is based on exo git: b896ca3c980a087aea4931ed16c59c4f444e0dac libfm-1.4.0/src/gtk/exo/exo-icon-view.c000066400000000000000000013354041475513661000176330ustar00rootroot00000000000000/*- * Copyright (c) 2008 Jannis Pohlmann * Copyright (c) 2004-2006 os-cillation e.K. * Copyright (c) 2002,2004 Anders Carlsson * Copyright 2024 Ingo Brückl * * Written by Benedikt Meurer . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Modified by Hong Jen Yee (PCMan) * on 2009-08-30 for use in libfm */ #ifdef HAVE_CONFIG_H #include #endif /* #ifdef HAVE_MATH_H */ #include /* #endif */ #ifdef HAVE_MEMORY_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include /* #include #include #include #include #include #include #include */ #include "exo-icon-view.h" #include "exo-string.h" #include "exo-marshal.h" #include "exo-private.h" /* libfm specific */ #include "gtk-compat.h" /* from exo/exo-marshal.h */ #if defined(G_PARAM_STATIC_NAME) && defined(G_PARAM_STATIC_NICK) && defined(G_PARAM_STATIC_BLURB) #define EXO_PARAM_READABLE (G_PARAM_READABLE \ | G_PARAM_STATIC_NAME \ | G_PARAM_STATIC_NICK \ | G_PARAM_STATIC_BLURB) #define EXO_PARAM_WRITABLE (G_PARAM_WRITABLE \ | G_PARAM_STATIC_NAME \ | G_PARAM_STATIC_NICK \ | G_PARAM_STATIC_BLURB) #define EXO_PARAM_READWRITE (G_PARAM_READWRITE \ | G_PARAM_STATIC_NAME \ | G_PARAM_STATIC_NICK \ | G_PARAM_STATIC_BLURB) #else #define EXO_PARAM_READABLE (G_PARAM_READABLE) #define EXO_PARAM_WRITABLE (G_PARAM_WRITABLE) #define EXO_PARAM_READWRITE (G_PARAM_READWRITE) #endif #define I_(string) g_intern_static_string(string) /* from exo/exo-enum-types.h */ GType exo_icon_view_layout_mode_get_type (void) { static GType type = 0; if (type == 0) { static const GEnumValue values[] = { { EXO_ICON_VIEW_LAYOUT_ROWS, "EXO_ICON_VIEW_LAYOUT_ROWS", "rows" }, { EXO_ICON_VIEW_LAYOUT_COLS, "EXO_ICON_VIEW_LAYOUT_COLS", "cols" }, { 0, NULL, NULL } }; type = g_enum_register_static ("ExoIconViewLayoutMode", values); } return type; } #define EXO_TYPE_ICON_VIEW_LAYOUT_MODE (exo_icon_view_layout_mode_get_type()) /* enumerations from "exo-mount-point.h" */ /* the search dialog timeout (in ms) */ #define EXO_ICON_VIEW_SEARCH_DIALOG_TIMEOUT (5000) #define SCROLL_EDGE_SIZE 15 /* Property identifiers */ enum { PROP_0, PROP_PIXBUF_COLUMN, PROP_TEXT_COLUMN, PROP_MARKUP_COLUMN, PROP_SELECTION_MODE, PROP_LAYOUT_MODE, PROP_ORIENTATION, PROP_MODEL, PROP_COLUMNS, PROP_ITEM_WIDTH, PROP_SPACING, PROP_ROW_SPACING, PROP_COLUMN_SPACING, PROP_MARGIN, PROP_REORDERABLE, PROP_SINGLE_CLICK, PROP_SINGLE_CLICK_TIMEOUT, PROP_MIDDLE_CLICK, PROP_ENABLE_SEARCH, PROP_SEARCH_COLUMN, /* For scrollable interface */ PROP_HADJUSTMENT, PROP_VADJUSTMENT, PROP_HSCROLL_POLICY, PROP_VSCROLL_POLICY }; /* Signal identifiers */ enum { ITEM_ACTIVATED, SELECTION_CHANGED, SELECT_ALL, UNSELECT_ALL, SELECT_CURSOR_ITEM, TOGGLE_CURSOR_ITEM, MOVE_CURSOR, ACTIVATE_CURSOR_ITEM, START_INTERACTIVE_SEARCH, LAST_SIGNAL }; /* Icon view flags */ typedef enum { EXO_ICON_VIEW_DRAW_KEYFOCUS = (1l << 0), /* whether to draw keyboard focus */ EXO_ICON_VIEW_ITERS_PERSIST = (1l << 1), /* whether current model provides persistent iterators */ } ExoIconViewFlags; #define EXO_ICON_VIEW_SET_FLAG(icon_view, flag) G_STMT_START{ (EXO_ICON_VIEW (icon_view)->priv->flags |= flag); }G_STMT_END #define EXO_ICON_VIEW_UNSET_FLAG(icon_view, flag) G_STMT_START{ (EXO_ICON_VIEW (icon_view)->priv->flags &= ~(flag)); }G_STMT_END #define EXO_ICON_VIEW_FLAG_SET(icon_view, flag) ((EXO_ICON_VIEW (icon_view)->priv->flags & (flag)) == (flag)) typedef struct _ExoIconViewCellInfo ExoIconViewCellInfo; typedef struct _ExoIconViewChild ExoIconViewChild; typedef struct _ExoIconViewItem ExoIconViewItem; #define EXO_ICON_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EXO_TYPE_ICON_VIEW, ExoIconViewPrivate)) #define EXO_ICON_VIEW_CELL_INFO(obj) ((ExoIconViewCellInfo *) (obj)) #define EXO_ICON_VIEW_CHILD(obj) ((ExoIconViewChild *) (obj)) #define EXO_ICON_VIEW_ITEM(obj) ((ExoIconViewItem *) (obj)) static void exo_icon_view_cell_layout_init (GtkCellLayoutIface *iface); static void exo_icon_view_dispose (GObject *object); static void exo_icon_view_finalize (GObject *object); static void exo_icon_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void exo_icon_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void exo_icon_view_realize (GtkWidget *widget); static void exo_icon_view_unrealize (GtkWidget *widget); #if GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_state_flags_changed (GtkWidget *widget, GtkStateFlags previous_state); #else static void exo_icon_view_state_changed (GtkWidget *widget, GtkStateType previous_state); #endif #if GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width); static void exo_icon_view_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height); #endif static void exo_icon_view_size_request (GtkWidget *widget, GtkRequisition *requisition); static void exo_icon_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static void exo_icon_view_style_set (GtkWidget *widget, GtkStyle *previous_style); #if GTK_CHECK_VERSION(3, 0, 0) static gboolean exo_icon_view_draw (GtkWidget *widget, cairo_t *cr); #else static gboolean exo_icon_view_expose_event (GtkWidget *widget, GdkEventExpose *event); #endif static gboolean exo_icon_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event); static gboolean exo_icon_view_button_press_event (GtkWidget *widget, GdkEventButton *event); static gboolean exo_icon_view_button_release_event (GtkWidget *widget, GdkEventButton *event); static gboolean exo_icon_view_scroll_event (GtkWidget *widget, GdkEventScroll *event); static gboolean exo_icon_view_key_press_event (GtkWidget *widget, GdkEventKey *event); static gboolean exo_icon_view_focus_out_event (GtkWidget *widget, GdkEventFocus *event); static gboolean exo_icon_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event); static void exo_icon_view_remove (GtkContainer *container, GtkWidget *widget); static void exo_icon_view_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); static AtkObject *exo_icon_view_get_accessible (GtkWidget *widget); #if !GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_set_adjustments (ExoIconView *icon_view, GtkAdjustment *hadj, GtkAdjustment *vadj); #else static void exo_icon_view_set_hadjustment (ExoIconView *icon_view, GtkAdjustment *hadj); static void exo_icon_view_set_vadjustment (ExoIconView *icon_view, GtkAdjustment *vadj); #endif static void exo_icon_view_real_select_all (ExoIconView *icon_view); static void exo_icon_view_real_unselect_all (ExoIconView *icon_view); static void exo_icon_view_real_select_cursor_item (ExoIconView *icon_view); static void exo_icon_view_real_toggle_cursor_item (ExoIconView *icon_view); static gboolean exo_icon_view_real_activate_cursor_item (ExoIconView *icon_view); static gboolean exo_icon_view_real_start_interactive_search (ExoIconView *icon_view); static void exo_icon_view_adjustment_changed (GtkAdjustment *adjustment, ExoIconView *icon_view); static gint exo_icon_view_layout_cols (ExoIconView *icon_view, gint item_height, gint *x, gint *maximum_height, gint max_rows); static gint exo_icon_view_layout_rows (ExoIconView *icon_view, gint item_width, gint *y, gint *maximum_width, gint max_cols); static void exo_icon_view_layout (ExoIconView *icon_view); static void exo_icon_view_paint_item (ExoIconView *icon_view, ExoIconViewItem *item, GdkRectangle *area, #if GTK_CHECK_VERSION(3, 0, 0) cairo_t *drawable, #else GdkDrawable *drawable, #endif gint x, gint y, gboolean draw_focus); static void exo_icon_view_queue_draw_item (ExoIconView *icon_view, ExoIconViewItem *item); static void exo_icon_view_queue_layout (ExoIconView *icon_view); static void exo_icon_view_set_cursor_item (ExoIconView *icon_view, ExoIconViewItem *item, gint cursor_cell); static void exo_icon_view_start_rubberbanding (ExoIconView *icon_view, gint x, gint y); static void exo_icon_view_stop_rubberbanding (ExoIconView *icon_view); static void exo_icon_view_update_rubberband_selection (ExoIconView *icon_view); static gboolean exo_icon_view_item_hit_test (ExoIconView *icon_view, ExoIconViewItem *item, gint x, gint y, gint width, gint height); static gboolean exo_icon_view_unselect_all_internal (ExoIconView *icon_view); static void exo_icon_view_calculate_item_size (ExoIconView *icon_view, ExoIconViewItem *item); static void exo_icon_view_calculate_item_size2 (ExoIconView *icon_view, ExoIconViewItem *item, gint *max_width, gint *max_height); static void exo_icon_view_update_rubberband (gpointer data); static void exo_icon_view_invalidate_sizes (ExoIconView *icon_view); static void exo_icon_view_add_move_binding (GtkBindingSet *binding_set, guint keyval, guint modmask, GtkMovementStep step, gint count); static gboolean exo_icon_view_real_move_cursor (ExoIconView *icon_view, GtkMovementStep step, gint count); static void exo_icon_view_move_cursor_up_down (ExoIconView *icon_view, gint count); static void exo_icon_view_move_cursor_page_up_down (ExoIconView *icon_view, gint count); static void exo_icon_view_move_cursor_left_right (ExoIconView *icon_view, gint count); static void exo_icon_view_move_cursor_start_end (ExoIconView *icon_view, gint count); static void exo_icon_view_scroll_to_item (ExoIconView *icon_view, ExoIconViewItem *item); static void exo_icon_view_select_item (ExoIconView *icon_view, ExoIconViewItem *item); static void exo_icon_view_unselect_item (ExoIconView *icon_view, ExoIconViewItem *item); static gboolean exo_icon_view_select_all_between (ExoIconView *icon_view, ExoIconViewItem *anchor, ExoIconViewItem *cursor); static ExoIconViewItem * exo_icon_view_get_item_at_coords (const ExoIconView *icon_view, gint x, gint y, gboolean only_in_cell, ExoIconViewCellInfo **cell_at_pos); static void exo_icon_view_get_cell_area (ExoIconView *icon_view, ExoIconViewItem *item, ExoIconViewCellInfo *cell_info, GdkRectangle *cell_area); static ExoIconViewCellInfo *exo_icon_view_get_cell_info (ExoIconView *icon_view, GtkCellRenderer *renderer); static void exo_icon_view_set_cell_data (const ExoIconView *icon_view, ExoIconViewItem *item); static void exo_icon_view_cell_layout_pack_start (GtkCellLayout *layout, GtkCellRenderer *renderer, gboolean expand); static void exo_icon_view_cell_layout_pack_end (GtkCellLayout *layout, GtkCellRenderer *renderer, gboolean expand); static void exo_icon_view_cell_layout_add_attribute (GtkCellLayout *layout, GtkCellRenderer *renderer, const gchar *attribute, gint column); static void exo_icon_view_cell_layout_clear (GtkCellLayout *layout); static void exo_icon_view_cell_layout_clear_attributes (GtkCellLayout *layout, GtkCellRenderer *renderer); static void exo_icon_view_cell_layout_set_cell_data_func (GtkCellLayout *layout, GtkCellRenderer *cell, GtkCellLayoutDataFunc func, gpointer func_data, GDestroyNotify destroy); static void exo_icon_view_cell_layout_reorder (GtkCellLayout *layout, GtkCellRenderer *cell, gint position); static void exo_icon_view_item_activate_cell (ExoIconView *icon_view, ExoIconViewItem *item, ExoIconViewCellInfo *cell_info, GdkEvent *event); static void exo_icon_view_put (ExoIconView *icon_view, GtkWidget *widget, ExoIconViewItem *item, gint cell); static void exo_icon_view_remove_widget (GtkCellEditable *editable, ExoIconView *icon_view); static void exo_icon_view_start_editing (ExoIconView *icon_view, ExoIconViewItem *item, ExoIconViewCellInfo *cell_info, GdkEvent *event); static void exo_icon_view_stop_editing (ExoIconView *icon_view, gboolean cancel_editing); /* Source side drag signals */ static void exo_icon_view_drag_begin (GtkWidget *widget, GdkDragContext *context); static void exo_icon_view_drag_end (GtkWidget *widget, GdkDragContext *context); static void exo_icon_view_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint drag_time); static void exo_icon_view_drag_data_delete (GtkWidget *widget, GdkDragContext *context); /* Target side drag signals */ static void exo_icon_view_drag_leave (GtkWidget *widget, GdkDragContext *context, guint drag_time); static gboolean exo_icon_view_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint drag_time); static gboolean exo_icon_view_drag_drop (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint drag_time); static void exo_icon_view_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint drag_time); static gboolean exo_icon_view_maybe_begin_drag (ExoIconView *icon_view, GdkEventMotion *event); static void remove_scroll_timeout (ExoIconView *icon_view); /* single-click autoselection support */ static gboolean exo_icon_view_single_click_timeout (gpointer user_data); static void exo_icon_view_single_click_timeout_destroy (gpointer user_data); /* Interactive search support */ static void exo_icon_view_search_activate (GtkEntry *entry, ExoIconView *icon_view); static void exo_icon_view_search_dialog_hide (GtkWidget *search_dialog, ExoIconView *icon_view); static void exo_icon_view_search_ensure_directory (ExoIconView *icon_view); static void exo_icon_view_search_init (GtkWidget *search_entry, ExoIconView *icon_view); static gboolean exo_icon_view_search_iter (ExoIconView *icon_view, GtkTreeModel *model, GtkTreeIter *iter, const gchar *text, gint *count, gint n); static void exo_icon_view_search_move (GtkWidget *widget, ExoIconView *icon_view, gboolean move_up); #if GTK_CHECK_VERSION(2, 20, 0) static void exo_icon_view_search_preedit_changed (GtkEntry *entry, gchar *preedit, ExoIconView *icon_view); #else static void exo_icon_view_search_preedit_changed (GtkIMContext *im_context, ExoIconView *icon_view); #endif static gboolean exo_icon_view_search_start (ExoIconView *icon_view, gboolean keybinding); static gboolean exo_icon_view_search_equal_func (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer user_data); static void exo_icon_view_search_position_func (ExoIconView *icon_view, GtkWidget *search_dialog, gpointer user_data); static gboolean exo_icon_view_search_button_press_event (GtkWidget *widget, GdkEventButton *event, ExoIconView *icon_view); static gboolean exo_icon_view_search_delete_event (GtkWidget *widget, GdkEventAny *event, ExoIconView *icon_view); static gboolean exo_icon_view_search_key_press_event (GtkWidget *widget, GdkEventKey *event, ExoIconView *icon_view); static gboolean exo_icon_view_search_scroll_event (GtkWidget *widget, GdkEventScroll *event, ExoIconView *icon_view); static gboolean exo_icon_view_search_timeout (gpointer user_data); static void exo_icon_view_search_timeout_destroy (gpointer user_data); struct _ExoIconViewCellInfo { GtkCellRenderer *cell; guint expand : 1; guint pack : 1; guint editing : 1; gint position; GSList *attributes; GtkCellLayoutDataFunc func; gpointer func_data; GDestroyNotify destroy; gboolean is_text; }; struct _ExoIconViewChild { ExoIconViewItem *item; GtkWidget *widget; gint cell; }; struct _ExoIconViewItem { GtkTreeIter iter; /* Bounding box (a value of -1 for width indicates * that the item needs to be layouted first) */ GdkRectangle area; /* Individual cells. * box[i] is the actual area occupied by cell i, * before, after are used to calculate the cell * area relative to the box. * See exo_icon_view_get_cell_area(). */ gint n_cells; GdkRectangle *box; gint index; gint *before; gint *after; guint row : ((sizeof (guint) / 2) * 8) - 1; guint col : ((sizeof (guint) / 2) * 8) - 1; guint selected : 1; guint selected_before_rubberbanding : 1; }; struct _ExoIconViewPrivate { gint width, height; gint rows, cols; GtkSelectionMode selection_mode; ExoIconViewLayoutMode layout_mode; GdkWindow *bin_window; GList *children; GtkTreeModel *model; GList *items; GtkAdjustment *hadjustment; GtkAdjustment *vadjustment; #if GTK_CHECK_VERSION(3, 0, 0) /* GtkScrollablePolicy needs to be checked when * driving the scrollable adjustment values */ guint hscroll_policy : 1; guint vscroll_policy : 1; #endif gint layout_idle_id; gboolean doing_rubberband; gint rubberband_x_1, rubberband_y_1; gint rubberband_x2, rubberband_y2; gint scroll_timeout_id; gint scroll_value_diff; gint event_last_x, event_last_y; ExoIconViewItem *anchor_item; ExoIconViewItem *cursor_item; ExoIconViewItem *edited_item; GtkCellEditable *editable; ExoIconViewItem *prelit_item; ExoIconViewItem *last_single_clicked; GList *cell_list; gint n_cells; gint cursor_cell; GtkOrientation orientation; gint columns; gint item_width; gint spacing; gint row_spacing; gint column_spacing; gint margin; gint text_column; gint markup_column; gint pixbuf_column; gint pixbuf_cell; gint text_cell; /* Drag-and-drop. */ GdkModifierType start_button_mask; gint pressed_button; gint press_start_x; gint press_start_y; GtkTargetList *source_targets; GdkDragAction source_actions; GtkTargetList *dest_targets; GdkDragAction dest_actions; GtkTreeRowReference *dest_item; ExoIconViewDropPosition dest_pos; /* delayed scrolling */ GtkTreeRowReference *scroll_to_path; gfloat scroll_to_row_align; gfloat scroll_to_col_align; guint scroll_to_use_align : 1; /* misc flags */ guint source_set : 1; guint dest_set : 1; guint reorderable : 1; guint empty_view_drop :1; guint ctrl_pressed : 1; guint shift_pressed : 1; guint dnd_locked : 1; /* Single-click support * The single_click_timeout is the timeout after which the * prelited item will be automatically selected in single * click mode (0 to disable). */ guint single_click : 1; guint single_click_timeout; guint single_click_timeout_id; guint single_click_timeout_state; /* Middle-click support */ guint middle_click : 1; /* Interactive search support */ guint enable_search : 1; guint search_imcontext_changed : 1; gint search_column; gint search_selected_iter; gint search_timeout_id; gboolean search_disable_popdown; ExoIconViewSearchEqualFunc search_equal_func; gpointer search_equal_data; GDestroyNotify search_equal_destroy; ExoIconViewSearchPositionFunc search_position_func; gpointer search_position_data; GDestroyNotify search_position_destroy; gint search_entry_changed_id; GtkWidget *search_entry; GtkWidget *search_window; /* ExoIconViewFlags */ guint flags; }; static guint icon_view_signals[LAST_SIGNAL]; G_DEFINE_TYPE_WITH_CODE (ExoIconView, exo_icon_view, GTK_TYPE_CONTAINER, #if GTK_CHECK_VERSION(3, 0, 0) G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL) #endif G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT, exo_icon_view_cell_layout_init)) static void exo_icon_view_class_init (ExoIconViewClass *klass) { GtkContainerClass *gtkcontainer_class; GtkWidgetClass *gtkwidget_class; GtkBindingSet *gtkbinding_set; GObjectClass *gobject_class; /* add our private data to the type's instances */ g_type_class_add_private (klass, sizeof (ExoIconViewPrivate)); gobject_class = G_OBJECT_CLASS (klass); gobject_class->dispose = exo_icon_view_dispose; gobject_class->finalize = exo_icon_view_finalize; gobject_class->set_property = exo_icon_view_set_property; gobject_class->get_property = exo_icon_view_get_property; gtkwidget_class = GTK_WIDGET_CLASS (klass); gtkwidget_class->realize = exo_icon_view_realize; gtkwidget_class->unrealize = exo_icon_view_unrealize; gtkwidget_class->get_accessible = exo_icon_view_get_accessible; #if GTK_CHECK_VERSION(3, 0, 0) gtkwidget_class->state_flags_changed = exo_icon_view_state_flags_changed; gtkwidget_class->get_preferred_width = exo_icon_view_get_preferred_width; gtkwidget_class->get_preferred_height = exo_icon_view_get_preferred_height; #else gtkwidget_class->state_changed = exo_icon_view_state_changed; gtkwidget_class->size_request = exo_icon_view_size_request; #endif gtkwidget_class->size_allocate = exo_icon_view_size_allocate; gtkwidget_class->style_set = exo_icon_view_style_set; #if GTK_CHECK_VERSION(3, 0, 0) gtkwidget_class->draw = exo_icon_view_draw; #else gtkwidget_class->expose_event = exo_icon_view_expose_event; #endif gtkwidget_class->motion_notify_event = exo_icon_view_motion_notify_event; gtkwidget_class->button_press_event = exo_icon_view_button_press_event; gtkwidget_class->button_release_event = exo_icon_view_button_release_event; gtkwidget_class->scroll_event = exo_icon_view_scroll_event; gtkwidget_class->key_press_event = exo_icon_view_key_press_event; gtkwidget_class->focus_out_event = exo_icon_view_focus_out_event; gtkwidget_class->leave_notify_event = exo_icon_view_leave_notify_event; gtkwidget_class->drag_begin = exo_icon_view_drag_begin; gtkwidget_class->drag_end = exo_icon_view_drag_end; gtkwidget_class->drag_data_get = exo_icon_view_drag_data_get; gtkwidget_class->drag_data_delete = exo_icon_view_drag_data_delete; gtkwidget_class->drag_leave = exo_icon_view_drag_leave; gtkwidget_class->drag_motion = exo_icon_view_drag_motion; gtkwidget_class->drag_drop = exo_icon_view_drag_drop; gtkwidget_class->drag_data_received = exo_icon_view_drag_data_received; gtkcontainer_class = GTK_CONTAINER_CLASS (klass); gtkcontainer_class->remove = exo_icon_view_remove; gtkcontainer_class->forall = exo_icon_view_forall; #if !GTK_CHECK_VERSION(3, 0, 0) klass->set_scroll_adjustments = exo_icon_view_set_adjustments; #endif klass->select_all = exo_icon_view_real_select_all; klass->unselect_all = exo_icon_view_real_unselect_all; klass->select_cursor_item = exo_icon_view_real_select_cursor_item; klass->toggle_cursor_item = exo_icon_view_real_toggle_cursor_item; klass->move_cursor = exo_icon_view_real_move_cursor; klass->activate_cursor_item = exo_icon_view_real_activate_cursor_item; klass->start_interactive_search = exo_icon_view_real_start_interactive_search; /** * ExoIconView:column-spacing: * * The column-spacing property specifies the space which is inserted between * the columns of the icon view. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_COLUMN_SPACING, g_param_spec_int ("column-spacing", _("Column Spacing"), _("Space which is inserted between grid column"), 0, G_MAXINT, 6, EXO_PARAM_READWRITE)); /** * ExoIconView:columns: * * The columns property contains the number of the columns in which the * items should be displayed. If it is -1, the number of columns will * be chosen automatically to fill the available area. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_COLUMNS, g_param_spec_int ("columns", _("Number of columns"), _("Number of columns to display"), -1, G_MAXINT, -1, EXO_PARAM_READWRITE)); /** * ExoIconView:enable-search: * * View allows user to search through columns interactively. * * Since: 0.3.1.3 **/ g_object_class_install_property (gobject_class, PROP_ENABLE_SEARCH, g_param_spec_boolean ("enable-search", _("Enable Search"), _("View allows user to search through columns interactively"), TRUE, EXO_PARAM_READWRITE)); /** * ExoIconView:item-width: * * The item-width property specifies the width to use for each item. * If it is set to -1, the icon view will automatically determine a * suitable item size. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_ITEM_WIDTH, g_param_spec_int ("item-width", _("Width for each item"), _("The width used for each item"), -1, G_MAXINT, -1, EXO_PARAM_READWRITE)); /** * ExoIconView:layout-mode: * * The layout-mode property specifies the way items are layed out in * the #ExoIconView. This can be either %EXO_ICON_VIEW_LAYOUT_ROWS, * which is the default, where items are layed out horizontally in * rows from top to bottom, or %EXO_ICON_VIEW_LAYOUT_COLS, where items * are layed out vertically in columns from left to right. * * Since: 0.3.1.5 **/ g_object_class_install_property (gobject_class, PROP_LAYOUT_MODE, g_param_spec_enum ("layout-mode", _("Layout mode"), _("The layout mode"), EXO_TYPE_ICON_VIEW_LAYOUT_MODE, EXO_ICON_VIEW_LAYOUT_ROWS, EXO_PARAM_READWRITE)); /** * ExoIconView:margin: * * The margin property specifies the space which is inserted * at the edges of the icon view. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_MARGIN, g_param_spec_int ("margin", _("Margin"), _("Space which is inserted at the edges of the icon view"), 0, G_MAXINT, 6, EXO_PARAM_READWRITE)); /** * ExoIconView:markup-column: * * The markup-column property contains the number of the model column * containing markup information to be displayed. The markup column must be * of type #G_TYPE_STRING. If this property and the text-column property * are both set to column numbers, it overrides the text column. * If both are set to -1, no texts are displayed. **/ g_object_class_install_property (gobject_class, PROP_MARKUP_COLUMN, g_param_spec_int ("markup-column", _("Markup column"), _("Model column used to retrieve the text if using Pango markup"), -1, G_MAXINT, -1, EXO_PARAM_READWRITE)); /** * ExoIconView:model: * * The model property contains the #GtkTreeModel, which should be * display by this icon view. Setting this property to %NULL turns * off the display of anything. **/ g_object_class_install_property (gobject_class, PROP_MODEL, g_param_spec_object ("model", _("Icon View Model"), _("The model for the icon view"), GTK_TYPE_TREE_MODEL, EXO_PARAM_READWRITE)); /** * ExoIconView:orientation: * * The orientation property specifies how the cells (i.e. the icon and * the text) of the item are positioned relative to each other. **/ g_object_class_install_property (gobject_class, PROP_ORIENTATION, g_param_spec_enum ("orientation", _("Orientation"), _("How the text and icon of each item are positioned relative to each other"), GTK_TYPE_ORIENTATION, GTK_ORIENTATION_VERTICAL, EXO_PARAM_READWRITE)); /** * ExoIconView:pixbuf-column: * * The ::pixbuf-column property contains the number of the model column * containing the pixbufs which are displayed. The pixbuf column must be * of type #GDK_TYPE_PIXBUF. Setting this property to -1 turns off the * display of pixbufs. **/ g_object_class_install_property (gobject_class, PROP_PIXBUF_COLUMN, g_param_spec_int ("pixbuf-column", _("Pixbuf column"), _("Model column used to retrieve the icon pixbuf from"), -1, G_MAXINT, -1, EXO_PARAM_READWRITE)); /** * ExoIconView:reorderable: * * The reorderable property specifies if the items can be reordered * by Drag and Drop. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_REORDERABLE, g_param_spec_boolean ("reorderable", _("Reorderable"), _("View is reorderable"), FALSE, EXO_PARAM_READWRITE)); /** * ExoIconView:row-spacing: * * The row-spacing property specifies the space which is inserted between * the rows of the icon view. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_ROW_SPACING, g_param_spec_int ("row-spacing", _("Row Spacing"), _("Space which is inserted between grid rows"), 0, G_MAXINT, 6, EXO_PARAM_READWRITE)); /** * ExoIconView:search-column: * * Model column to search through when searching through code. * * Since: 0.3.1.3 **/ g_object_class_install_property (gobject_class, PROP_SEARCH_COLUMN, g_param_spec_int ("search-column", _("Search Column"), _("Model column to search through when searching through item"), -1, G_MAXINT, -1, EXO_PARAM_READWRITE)); /** * ExoIconView:selection-mode: * * The selection-mode property specifies the selection mode of * icon view. If the mode is #GTK_SELECTION_MULTIPLE, rubberband selection * is enabled, for the other modes, only keyboard selection is possible. **/ g_object_class_install_property (gobject_class, PROP_SELECTION_MODE, g_param_spec_enum ("selection-mode", _("Selection mode"), _("The selection mode"), GTK_TYPE_SELECTION_MODE, GTK_SELECTION_SINGLE, EXO_PARAM_READWRITE)); /** * ExoIconView:single-click: * * Determines whether items can be activated by single or double clicks. * * Since: 0.3.1.3 **/ g_object_class_install_property (gobject_class, PROP_SINGLE_CLICK, g_param_spec_boolean ("single-click", _("Single Click"), _("Whether the items in the view can be activated with single clicks"), FALSE, EXO_PARAM_READWRITE)); /** * ExoIconView:single-click-timeout: * * The amount of time in milliseconds after which a prelited item (an item * which is hovered by the mouse cursor) will be selected automatically in * single click mode. A value of %0 disables the automatic selection. * * Since: 0.3.1.5 **/ g_object_class_install_property (gobject_class, PROP_SINGLE_CLICK_TIMEOUT, g_param_spec_uint ("single-click-timeout", _("Single Click Timeout"), _("The amount of time after which the item under the mouse cursor will be selected automatically in single click mode"), 0, G_MAXUINT, 0, EXO_PARAM_READWRITE)); /** * ExoIconView:middle-click: * * Determines whether items can be activated by single middle-clicks. * * Since: 1.4.0 **/ g_object_class_install_property (gobject_class, PROP_MIDDLE_CLICK, g_param_spec_boolean ("middle-click", _("Middle Click"), _("Whether the items in the view can be activated with middle clicks"), FALSE, EXO_PARAM_READWRITE)); /** * ExoIconView:spacing: * * The spacing property specifies the space which is inserted between * the cells (i.e. the icon and the text) of an item. * * Since: 0.3.1 **/ g_object_class_install_property (gobject_class, PROP_SPACING, g_param_spec_int ("spacing", _("Spacing"), _("Space which is inserted between cells of an item"), 0, G_MAXINT, 0, EXO_PARAM_READWRITE)); /** * ExoIconView:text-column: * * The text-column property contains the number of the model column * containing the texts which are displayed. The text column must be * of type #G_TYPE_STRING. If this property and the markup-column * property are both set to -1, no texts are displayed. **/ g_object_class_install_property (gobject_class, PROP_TEXT_COLUMN, g_param_spec_int ("text-column", _("Text column"), _("Model column used to retrieve the text from"), -1, G_MAXINT, -1, EXO_PARAM_READWRITE)); #if GTK_CHECK_VERSION(3, 0, 0) /* Scrollable interface properties */ g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy"); g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy"); #endif gtk_widget_class_install_style_property (gtkwidget_class, g_param_spec_boxed ("selection-box-color", _("Selection Box Color"), _("Color of the selection box"), GDK_TYPE_COLOR, EXO_PARAM_READABLE)); gtk_widget_class_install_style_property (gtkwidget_class, g_param_spec_uchar ("selection-box-alpha", _("Selection Box Alpha"), _("Opacity of the selection box"), 0, 0xff, 0x40, EXO_PARAM_READABLE)); /** * ExoIconView::item-activated: * @icon_view : a #ExoIconView. * @path : **/ icon_view_signals[ITEM_ACTIVATED] = g_signal_new (I_("item-activated"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ExoIconViewClass, item_activated), NULL, NULL, g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GTK_TYPE_TREE_PATH); /** * ExoIconView::selection-changed: * @icon_view : a #ExoIconView. **/ icon_view_signals[SELECTION_CHANGED] = g_signal_new (I_("selection-changed"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (ExoIconViewClass, selection_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); #if !GTK_CHECK_VERSION(3, 0, 0) /** * ExoIconView::set-scroll-adjustments: * @icon_view : a #ExoIconView. * @hadjustment : * @vadjustment : **/ gtkwidget_class->set_scroll_adjustments_signal = g_signal_new (I_("set-scroll-adjustments"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ExoIconViewClass, set_scroll_adjustments), NULL, NULL, _exo_marshal_VOID__OBJECT_OBJECT, G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); #endif /** * ExoIconView::select-all: * @icon_view : a #ExoIconView. **/ icon_view_signals[SELECT_ALL] = g_signal_new (I_("select-all"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, select_all), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * ExoIconView::unselect-all: * @icon_view : a #ExoIconView. **/ icon_view_signals[UNSELECT_ALL] = g_signal_new (I_("unselect-all"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, unselect_all), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * ExoIconView::select-cursor-item: * @icon_view : a #ExoIconView. **/ icon_view_signals[SELECT_CURSOR_ITEM] = g_signal_new (I_("select-cursor-item"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, select_cursor_item), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * ExoIconView::toggle-cursor-item: * @icon_view : a #ExoIconView. **/ icon_view_signals[TOGGLE_CURSOR_ITEM] = g_signal_new (I_("toggle-cursor-item"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, toggle_cursor_item), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * ExoIconView::activate-cursor-item: * @icon_view : a #ExoIconView. * * Return value: **/ icon_view_signals[ACTIVATE_CURSOR_ITEM] = g_signal_new (I_("activate-cursor-item"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, activate_cursor_item), NULL, NULL, _exo_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); /** * ExoIconView::start-interactive-search: * @iconb_view : a #ExoIconView. * * Return value: **/ icon_view_signals[START_INTERACTIVE_SEARCH] = g_signal_new (I_("start-interactive-search"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, start_interactive_search), NULL, NULL, _exo_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); /** * ExoIconView::move-cursor: * @icon_view : a #ExoIconView. * @step : * @count : * * Return value: **/ icon_view_signals[MOVE_CURSOR] = g_signal_new (I_("move-cursor"), G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (ExoIconViewClass, move_cursor), NULL, NULL, _exo_marshal_BOOLEAN__ENUM_INT, G_TYPE_BOOLEAN, 2, GTK_TYPE_MOVEMENT_STEP, G_TYPE_INT); /* Key bindings */ gtkbinding_set = gtk_binding_set_by_class (klass); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_a, GDK_CONTROL_MASK, "select-all", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "unselect-all", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_space, GDK_CONTROL_MASK, "toggle-cursor-item", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_space, 0, "activate-cursor-item", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_Return, 0, "activate-cursor-item", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_ISO_Enter, 0, "activate-cursor-item", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_KP_Enter, 0, "activate-cursor-item", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_f, GDK_CONTROL_MASK, "start-interactive-search", 0); gtk_binding_entry_add_signal (gtkbinding_set, GDK_KEY_F, GDK_CONTROL_MASK, "start-interactive-search", 0); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Up, 0, GTK_MOVEMENT_DISPLAY_LINES, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Up, 0, GTK_MOVEMENT_DISPLAY_LINES, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Down, 0, GTK_MOVEMENT_DISPLAY_LINES, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Down, 0, GTK_MOVEMENT_DISPLAY_LINES, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_p, GDK_CONTROL_MASK, GTK_MOVEMENT_DISPLAY_LINES, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_n, GDK_CONTROL_MASK, GTK_MOVEMENT_DISPLAY_LINES, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Home, 0, GTK_MOVEMENT_BUFFER_ENDS, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Home, 0, GTK_MOVEMENT_BUFFER_ENDS, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_End, 0, GTK_MOVEMENT_BUFFER_ENDS, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_End, 0, GTK_MOVEMENT_BUFFER_ENDS, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Page_Up, 0, GTK_MOVEMENT_PAGES, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Page_Up, 0, GTK_MOVEMENT_PAGES, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Page_Down, 0, GTK_MOVEMENT_PAGES, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Page_Down, 0, GTK_MOVEMENT_PAGES, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Right, 0, GTK_MOVEMENT_VISUAL_POSITIONS, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_Left, 0, GTK_MOVEMENT_VISUAL_POSITIONS, -1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Right, 0, GTK_MOVEMENT_VISUAL_POSITIONS, 1); exo_icon_view_add_move_binding (gtkbinding_set, GDK_KEY_KP_Left, 0, GTK_MOVEMENT_VISUAL_POSITIONS, -1); } static void exo_icon_view_cell_layout_init (GtkCellLayoutIface *iface) { iface->pack_start = exo_icon_view_cell_layout_pack_start; iface->pack_end = exo_icon_view_cell_layout_pack_end; iface->clear = exo_icon_view_cell_layout_clear; iface->add_attribute = exo_icon_view_cell_layout_add_attribute; iface->set_cell_data_func = exo_icon_view_cell_layout_set_cell_data_func; iface->clear_attributes = exo_icon_view_cell_layout_clear_attributes; iface->reorder = exo_icon_view_cell_layout_reorder; } static void exo_icon_view_init (ExoIconView *icon_view) { icon_view->priv = EXO_ICON_VIEW_GET_PRIVATE (icon_view); icon_view->priv->selection_mode = GTK_SELECTION_SINGLE; icon_view->priv->pressed_button = -1; icon_view->priv->press_start_x = -1; icon_view->priv->press_start_y = -1; icon_view->priv->text_column = -1; icon_view->priv->markup_column = -1; icon_view->priv->pixbuf_column = -1; icon_view->priv->text_cell = -1; icon_view->priv->pixbuf_cell = -1; gtk_widget_set_can_focus (GTK_WIDGET (icon_view), TRUE); #if !GTK_CHECK_VERSION(3, 0, 0) exo_icon_view_set_adjustments (icon_view, NULL, NULL); #endif icon_view->priv->cursor_cell = -1; icon_view->priv->orientation = GTK_ORIENTATION_VERTICAL; icon_view->priv->columns = -1; icon_view->priv->item_width = -1; icon_view->priv->row_spacing = 6; icon_view->priv->column_spacing = 6; icon_view->priv->margin = 6; icon_view->priv->enable_search = TRUE; icon_view->priv->search_column = -1; icon_view->priv->search_equal_func = exo_icon_view_search_equal_func; icon_view->priv->search_position_func = exo_icon_view_search_position_func; icon_view->priv->flags = EXO_ICON_VIEW_DRAW_KEYFOCUS; } static void exo_icon_view_dispose (GObject *object) { ExoIconView *icon_view = EXO_ICON_VIEW (object); /* cancel any pending search timeout */ if (G_UNLIKELY (icon_view->priv->search_timeout_id != 0)) g_source_remove (icon_view->priv->search_timeout_id); /* destroy the interactive search dialog */ if (G_UNLIKELY (icon_view->priv->search_window != NULL)) { gtk_widget_destroy (icon_view->priv->search_window); icon_view->priv->search_entry = NULL; icon_view->priv->search_window = NULL; } /* drop search equal and position functions (if any) */ exo_icon_view_set_search_equal_func (icon_view, NULL, NULL, NULL); exo_icon_view_set_search_position_func (icon_view, NULL, NULL, NULL); /* reset the drag dest item */ exo_icon_view_set_drag_dest_item (icon_view, NULL, EXO_ICON_VIEW_NO_DROP); /* drop the scroll to path (if any) */ if (G_UNLIKELY (icon_view->priv->scroll_to_path != NULL)) { gtk_tree_row_reference_free (icon_view->priv->scroll_to_path); icon_view->priv->scroll_to_path = NULL; } /* reset the model (also stops any active editing) */ exo_icon_view_set_model (icon_view, NULL); /* drop the scroll timer */ remove_scroll_timeout (icon_view); (*G_OBJECT_CLASS (exo_icon_view_parent_class)->dispose) (object); } static void exo_icon_view_finalize (GObject *object) { ExoIconView *icon_view = EXO_ICON_VIEW (object); /* drop the scroll adjustments */ g_object_unref (G_OBJECT (icon_view->priv->hadjustment)); g_object_unref (G_OBJECT (icon_view->priv->vadjustment)); /* drop the cell renderers */ exo_icon_view_cell_layout_clear (GTK_CELL_LAYOUT (icon_view)); /* be sure to cancel the single click timeout */ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); /* kill the layout idle source (it's important to have this last!) */ if (G_UNLIKELY (icon_view->priv->layout_idle_id != 0)) g_source_remove (icon_view->priv->layout_idle_id); (*G_OBJECT_CLASS (exo_icon_view_parent_class)->finalize) (object); } static void exo_icon_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { const ExoIconViewPrivate *priv = EXO_ICON_VIEW (object)->priv; switch (prop_id) { case PROP_COLUMN_SPACING: g_value_set_int (value, priv->column_spacing); break; case PROP_COLUMNS: g_value_set_int (value, priv->columns); break; case PROP_ENABLE_SEARCH: g_value_set_boolean (value, priv->enable_search); break; case PROP_ITEM_WIDTH: g_value_set_int (value, priv->item_width); break; case PROP_MARGIN: g_value_set_int (value, priv->margin); break; case PROP_MARKUP_COLUMN: g_value_set_int (value, priv->markup_column); break; case PROP_MODEL: g_value_set_object (value, priv->model); break; case PROP_ORIENTATION: g_value_set_enum (value, priv->orientation); break; case PROP_PIXBUF_COLUMN: g_value_set_int (value, priv->pixbuf_column); break; case PROP_REORDERABLE: g_value_set_boolean (value, priv->reorderable); break; case PROP_ROW_SPACING: g_value_set_int (value, priv->row_spacing); break; case PROP_SEARCH_COLUMN: g_value_set_int (value, priv->search_column); break; case PROP_SELECTION_MODE: g_value_set_enum (value, priv->selection_mode); break; case PROP_SINGLE_CLICK: g_value_set_boolean (value, priv->single_click); break; case PROP_SINGLE_CLICK_TIMEOUT: g_value_set_uint (value, priv->single_click_timeout); break; case PROP_MIDDLE_CLICK: g_value_set_boolean (value, priv->middle_click); break; case PROP_SPACING: g_value_set_int (value, priv->spacing); break; case PROP_TEXT_COLUMN: g_value_set_int (value, priv->text_column); break; case PROP_LAYOUT_MODE: g_value_set_enum (value, priv->layout_mode); break; #if GTK_CHECK_VERSION(3, 0, 0) case PROP_HADJUSTMENT: g_value_set_object (value, priv->hadjustment); break; case PROP_VADJUSTMENT: g_value_set_object (value, priv->vadjustment); break; case PROP_HSCROLL_POLICY: g_value_set_enum (value, priv->hscroll_policy); break; case PROP_VSCROLL_POLICY: g_value_set_enum (value, priv->vscroll_policy); break; #endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void exo_icon_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ExoIconView *icon_view = EXO_ICON_VIEW (object); switch (prop_id) { case PROP_COLUMN_SPACING: exo_icon_view_set_column_spacing (icon_view, g_value_get_int (value)); break; case PROP_COLUMNS: exo_icon_view_set_columns (icon_view, g_value_get_int (value)); break; case PROP_ENABLE_SEARCH: exo_icon_view_set_enable_search (icon_view, g_value_get_boolean (value)); break; case PROP_ITEM_WIDTH: exo_icon_view_set_item_width (icon_view, g_value_get_int (value)); break; case PROP_MARGIN: exo_icon_view_set_margin (icon_view, g_value_get_int (value)); break; case PROP_MODEL: exo_icon_view_set_model (icon_view, g_value_get_object (value)); break; case PROP_ORIENTATION: exo_icon_view_set_orientation (icon_view, g_value_get_enum (value)); break; case PROP_REORDERABLE: exo_icon_view_set_reorderable (icon_view, g_value_get_boolean (value)); break; case PROP_ROW_SPACING: exo_icon_view_set_row_spacing (icon_view, g_value_get_int (value)); break; case PROP_SEARCH_COLUMN: exo_icon_view_set_search_column (icon_view, g_value_get_int (value)); break; case PROP_SELECTION_MODE: exo_icon_view_set_selection_mode (icon_view, g_value_get_enum (value)); break; case PROP_SINGLE_CLICK: exo_icon_view_set_single_click (icon_view, g_value_get_boolean (value)); break; case PROP_SINGLE_CLICK_TIMEOUT: exo_icon_view_set_single_click_timeout (icon_view, g_value_get_uint (value)); break; case PROP_MIDDLE_CLICK: exo_icon_view_set_middle_click (icon_view, g_value_get_boolean (value)); break; case PROP_SPACING: exo_icon_view_set_spacing (icon_view, g_value_get_int (value)); break; case PROP_LAYOUT_MODE: exo_icon_view_set_layout_mode (icon_view, g_value_get_enum (value)); break; #if GTK_CHECK_VERSION(3, 0, 0) case PROP_HADJUSTMENT: exo_icon_view_set_hadjustment (icon_view, g_value_get_object (value)); break; case PROP_VADJUSTMENT: exo_icon_view_set_vadjustment (icon_view, g_value_get_object (value)); break; case PROP_HSCROLL_POLICY: icon_view->priv->hscroll_policy = g_value_get_enum (value); gtk_widget_queue_resize (GTK_WIDGET (icon_view)); break; case PROP_VSCROLL_POLICY: icon_view->priv->vscroll_policy = g_value_get_enum (value); gtk_widget_queue_resize (GTK_WIDGET (icon_view)); break; #endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void exo_icon_view_realize (GtkWidget *widget) { ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv; GdkWindow *window; #if GTK_CHECK_VERSION(3, 0, 0) GtkStyleContext *style; #else GtkStyle *style; #endif GdkWindowAttr attributes; GtkAllocation allocation; gint attributes_mask; #if GTK_CHECK_VERSION(2, 20, 0) gtk_widget_set_realized (widget, TRUE); #else GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); #endif /* Allocate the clipping window */ gtk_widget_get_allocation (widget, &allocation); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK; #if GTK_CHECK_VERSION(3, 0, 0) attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; #else attributes.colormap = gtk_widget_get_colormap (widget); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; #endif window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gtk_widget_set_window (widget, window); gdk_window_set_user_data (window, widget); /* Allocate the icons window */ attributes.x = 0; attributes.y = 0; attributes.width = MAX (priv->width, allocation.width); attributes.height = MAX (priv->height, allocation.height); attributes.event_mask = GDK_EXPOSURE_MASK | GDK_SCROLL_MASK #if GTK_CHECK_VERSION(3, 4, 0) | GDK_SMOOTH_SCROLL_MASK #endif | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | gtk_widget_get_events (widget); priv->bin_window = gdk_window_new (window, &attributes, attributes_mask); gdk_window_set_user_data (priv->bin_window, widget); /* Attach style/background */ #if GTK_CHECK_VERSION(3, 0, 0) style = gtk_widget_get_style_context (widget); gtk_style_context_set_background (style, priv->bin_window); gtk_style_context_set_background (style, window); #else style = gtk_style_attach (gtk_widget_get_style (widget), window); gtk_widget_set_style (widget, style); gdk_window_set_background (priv->bin_window, &style->base[gtk_widget_get_state(widget)]); gdk_window_set_background (window, &style->base[gtk_widget_get_state(widget)]); #endif /* map the icons window */ gdk_window_show (priv->bin_window); } static void exo_icon_view_unrealize (GtkWidget *widget) { ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv; /* drop the icons window */ gdk_window_set_user_data (priv->bin_window, NULL); gdk_window_destroy (priv->bin_window); priv->bin_window = NULL; /* let GtkWidget destroy children and widget->window */ if (GTK_WIDGET_CLASS (exo_icon_view_parent_class)->unrealize) (*GTK_WIDGET_CLASS (exo_icon_view_parent_class)->unrealize) (widget); } #if GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_state_flags_changed (GtkWidget *widget, GtkStateFlags previous_state) #else static void exo_icon_view_state_changed (GtkWidget *widget, GtkStateType previous_state) #endif { ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv; GdkWindow *window = gtk_widget_get_window (widget); if (gtk_widget_get_realized (widget)) { #if GTK_CHECK_VERSION(3, 0, 0) GtkStyleContext *style = gtk_widget_get_style_context (widget); gtk_style_context_save (style); gtk_style_context_add_class (style, GTK_STYLE_CLASS_VIEW); gtk_style_context_set_background (style, priv->bin_window); gtk_style_context_set_background (style, window); gtk_style_context_restore (style); #else GtkStyle *style = gtk_widget_get_style (widget); gdk_window_set_background (priv->bin_window, &style->base[gtk_widget_get_state(widget)]); gdk_window_set_background (window, &style->base[gtk_widget_get_state(widget)]); #endif } gtk_widget_queue_draw (widget); } static void exo_icon_view_size_request (GtkWidget *widget, GtkRequisition *requisition) { const ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv; ExoIconViewChild *child; GtkRequisition child_requisition; GList *lp; /* well, this is easy */ requisition->width = priv->width; requisition->height = priv->height; /* handle the child widgets */ for (lp = priv->children; lp != NULL; lp = lp->next) { child = lp->data; if (gtk_widget_get_visible (child->widget)) #if GTK_CHECK_VERSION(3, 0, 0) gtk_widget_get_preferred_size (child->widget, NULL, &child_requisition); #else gtk_widget_size_request (child->widget, &child_requisition); #endif } } #if GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width) { GtkRequisition requisition; exo_icon_view_size_request (widget, &requisition); *minimal_width = *natural_width = requisition.width; } static void exo_icon_view_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height) { GtkRequisition requisition; exo_icon_view_size_request (widget, &requisition); *minimal_height = *natural_height = requisition.height; } #endif static void exo_icon_view_allocate_children (ExoIconView *icon_view) { const ExoIconViewPrivate *priv = icon_view->priv; const ExoIconViewChild *child; GtkAllocation allocation; const GList *lp; gint focus_line_width; gint focus_padding; for (lp = priv->children; lp != NULL; lp = lp->next) { child = EXO_ICON_VIEW_CHILD (lp->data); /* totally ignore our child's requisition */ if (child->cell < 0) allocation = child->item->area; else allocation = child->item->box[child->cell]; /* increase the item area by focus width/padding */ gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_line_width, "focus-padding", &focus_padding, NULL); allocation.x = MAX (0, allocation.x - (focus_line_width + focus_padding)); allocation.y = MAX (0, allocation.y - (focus_line_width + focus_padding)); allocation.width = MIN (priv->width - allocation.x, allocation.width + 2 * (focus_line_width + focus_padding)); allocation.height = MIN (priv->height - allocation.y, allocation.height + 2 * (focus_line_width + focus_padding)); /* allocate the area to the child */ gtk_widget_size_allocate (child->widget, &allocation); } } static void exo_icon_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkAdjustment *hadjustment; GtkAdjustment *vadjustment; ExoIconView *icon_view = EXO_ICON_VIEW (widget); /* FIXME: gtk 3.4.2 calls this with weird values sometimes. Don't know if that is a bug of gtk or something else. Since that will break the view a workaround is required. */ if (allocation->x < 0) allocation->x = 0; if (allocation->y < 0) allocation->y = 0; /* apply the new size allocation */ gtk_widget_set_allocation (widget, allocation); /* move/resize the clipping window, the icons window * will be handled by exo_icon_view_layout(). */ if (gtk_widget_get_realized (widget)) gdk_window_move_resize (gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); /* layout the items */ exo_icon_view_layout (icon_view); /* allocate space to the widgets (editing) */ exo_icon_view_allocate_children (icon_view); /* update the horizontal scroll adjustment accordingly */ hadjustment = icon_view->priv->hadjustment; gtk_adjustment_set_page_size(hadjustment, allocation->width); gtk_adjustment_set_page_increment(hadjustment, allocation->width * 0.9); gtk_adjustment_set_step_increment(hadjustment, allocation->width * 0.1); gtk_adjustment_set_lower(hadjustment, 0); gtk_adjustment_set_upper(hadjustment, MAX (allocation->width, icon_view->priv->width)); if (gtk_adjustment_get_value(hadjustment) > gtk_adjustment_get_upper(hadjustment) - gtk_adjustment_get_page_size(hadjustment)) gtk_adjustment_set_value (hadjustment, MAX (0, gtk_adjustment_get_upper(hadjustment) - gtk_adjustment_get_page_size(hadjustment))); /* update the vertical scroll adjustment accordingly */ vadjustment = icon_view->priv->vadjustment; gtk_adjustment_set_page_size(vadjustment, allocation->height); gtk_adjustment_set_page_increment(vadjustment, allocation->height * 0.9); gtk_adjustment_set_step_increment(vadjustment, allocation->height * 0.1); gtk_adjustment_set_lower(vadjustment, 0); gtk_adjustment_set_upper(vadjustment, MAX (allocation->height, icon_view->priv->height)); if (gtk_adjustment_get_value(vadjustment) > gtk_adjustment_get_upper(vadjustment) - gtk_adjustment_get_page_size(vadjustment)) gtk_adjustment_set_value (vadjustment, MAX (0, gtk_adjustment_get_upper(vadjustment) - gtk_adjustment_get_page_size(vadjustment))); /* we need to emit "changed" ourselves */ gtk_adjustment_changed (hadjustment); gtk_adjustment_changed (vadjustment); #if GTK_CHECK_VERSION(3, 0, 0) g_object_notify (G_OBJECT (icon_view), "hadjustment"); g_object_notify (G_OBJECT (icon_view), "vadjustment"); #endif } static void exo_icon_view_style_set (GtkWidget *widget, GtkStyle *previous_style) { ExoIconView *icon_view = EXO_ICON_VIEW (widget); GtkStyle *style; /* let GtkWidget do its work */ (*GTK_WIDGET_CLASS (exo_icon_view_parent_class)->style_set) (widget, previous_style); /* apply the new style for the bin_window if we're realized */ style = gtk_widget_get_style (widget); if (gtk_widget_get_realized (widget)) gdk_window_set_background (icon_view->priv->bin_window, &style->base[gtk_widget_get_state(widget)]); } static gboolean #if GTK_CHECK_VERSION(3, 0, 0) exo_icon_view_draw (GtkWidget *widget, cairo_t *cr) #else exo_icon_view_expose_event (GtkWidget *widget, GdkEventExpose *event) #endif { ExoIconViewDropPosition dest_pos; ExoIconViewPrivate *priv = EXO_ICON_VIEW (widget)->priv; ExoIconViewItem *dest_item = NULL; ExoIconViewItem *item; ExoIconView *icon_view = EXO_ICON_VIEW (widget); GtkTreePath *path; GdkRectangle rubber_rect; GdkRectangle rect; const GList *lp; gint dest_index = -1; #if !GTK_CHECK_VERSION(3, 0, 0) GdkColor *fill_color_gdk; guchar fill_color_alpha = 0; gboolean rtl; gint event_area_last; GdkRectangle event_area; cairo_t *cr; GtkStyle *style; /* verify that the expose happened on the icon window */ if (G_UNLIKELY (event->window != priv->bin_window)) return FALSE; #else GtkStyleContext *style; if (!gtk_cairo_should_draw_window (cr, priv->bin_window)) return FALSE; /* draw a background according to the css theme */ style = gtk_widget_get_style_context (widget); gtk_style_context_save (style); gtk_style_context_add_class (style, GTK_STYLE_CLASS_VIEW); gtk_render_background (style, cr, 0, 0, gtk_widget_get_allocated_width (widget), gtk_widget_get_allocated_height (widget)); gtk_style_context_restore (style); #endif /* don't handle expose if the layout isn't done yet; the layout * method will schedule a redraw when done. */ if (G_UNLIKELY (priv->layout_idle_id != 0)) return FALSE; /* scroll to the previously remembered path (if any) */ if (G_UNLIKELY (priv->scroll_to_path != NULL)) { /* grab the path from the reference and invalidate the reference */ path = gtk_tree_row_reference_get_path (priv->scroll_to_path); gtk_tree_row_reference_free (priv->scroll_to_path); priv->scroll_to_path = NULL; /* check if the reference was still valid */ if (G_LIKELY (path != NULL)) { /* try to scroll again */ exo_icon_view_scroll_to_path (icon_view, path, priv->scroll_to_use_align, priv->scroll_to_row_align, priv->scroll_to_col_align); /* release the path */ gtk_tree_path_free (path); } } /* check if we need to draw a drag indicator */ exo_icon_view_get_drag_dest_item (icon_view, &path, &dest_pos); if (G_UNLIKELY (path != NULL)) { dest_index = gtk_tree_path_get_indices (path)[0]; gtk_tree_path_free (path); } #if GTK_CHECK_VERSION(3, 0, 0) cairo_save (cr); gtk_cairo_transform_to_window (cr, widget, priv->bin_window); #else rtl = (gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL); event_area = event->area; /* determine the last interesting coordinate (depending on the layout mode) */ event_area_last = (priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS) ? event_area.y + event_area.height : event_area.x + event_area.width; #endif /* paint all items that are affected by the expose event */ for (lp = priv->items; lp != NULL; lp = lp->next) { /* check if this item is in the visible area */ item = EXO_ICON_VIEW_ITEM (lp->data); #if !GTK_CHECK_VERSION(3, 0, 0) if (G_LIKELY (priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS)) { if (item->area.y > event_area_last) break; else if (item->area.y + item->area.height < event_area.y) continue; } else if (rtl) { if (item->area.x > event_area_last) continue; else if (item->area.x + item->area.width < event_area.x) break; } else { if (item->area.x > event_area_last) break; else if (item->area.x + item->area.width < event_area.x) continue; } /* check if this item needs an update */ if (G_LIKELY (gdk_region_rect_in (event->region, &item->area) != GDK_OVERLAP_RECTANGLE_OUT)) { exo_icon_view_paint_item (icon_view, item, &event_area, event->window, item->area.x, item->area.y, TRUE); #else cairo_save (cr); cairo_rectangle (cr, item->area.x, item->area.y, item->area.width, item->area.height); cairo_clip (cr); if (gdk_cairo_get_clip_rectangle (cr, NULL)) { exo_icon_view_paint_item (icon_view, item, &item->area, cr, item->area.x, item->area.y, TRUE); #endif if (G_UNLIKELY (dest_index == item->index)) dest_item = item; } #if GTK_CHECK_VERSION(3, 0, 0) cairo_restore (cr); #endif } #if !GTK_CHECK_VERSION(3, 0, 0) if (G_UNLIKELY (dest_item != NULL || priv->doing_rubberband)) style = gtk_widget_get_style (widget); #endif /* draw the drag indicator */ if (G_UNLIKELY (dest_item != NULL)) { switch (dest_pos) { case EXO_ICON_VIEW_DROP_INTO: rect = dest_item->area; break; case GTK_ICON_VIEW_DROP_ABOVE: rect.x = dest_item->area.x; rect.y = dest_item->area.y - 1; rect.width = dest_item->area.width; rect.height = 2; break; case GTK_ICON_VIEW_DROP_LEFT: rect.x = dest_item->area.x - 1; rect.y = dest_item->area.y; rect.width = 2; rect.height = dest_item->area.height; break; case GTK_ICON_VIEW_DROP_BELOW: rect.x = dest_item->area.x; rect.y = dest_item->area.y + dest_item->area.height - 1; rect.width = dest_item->area.width; rect.height = 2; break; case GTK_ICON_VIEW_DROP_RIGHT: rect.x = dest_item->area.x + dest_item->area.width - 1; rect.y = dest_item->area.y; rect.width = 2; rect.height = dest_item->area.height; case EXO_ICON_VIEW_NO_DROP: rect.x = rect.y = rect.width = rect.height = 0; break; default: g_assert_not_reached (); } #if GTK_CHECK_VERSION(3, 0, 0) gtk_render_focus (style, cr, #else gtk_paint_focus (style, priv->bin_window, gtk_widget_get_state (widget), NULL, widget, "iconview-drop-indicator", #endif rect.x, rect.y, rect.width, rect.height); } /* draw the rubberband border */ if (G_UNLIKELY (priv->doing_rubberband)) { /* calculate the rubberband area */ rubber_rect.x = MIN (priv->rubberband_x_1, priv->rubberband_x2); rubber_rect.y = MIN (priv->rubberband_y_1, priv->rubberband_y2); rubber_rect.width = ABS (priv->rubberband_x_1 - priv->rubberband_x2) + 1; rubber_rect.height = ABS (priv->rubberband_y_1 - priv->rubberband_y2) + 1; #if !GTK_CHECK_VERSION(3, 0, 0) if (gdk_rectangle_intersect (&rubber_rect, &event_area, &rect)) { cr = gdk_cairo_create (event->window); gtk_widget_style_get (widget, "selection-box-color", &fill_color_gdk, "selection-box-alpha", &fill_color_alpha, NULL); if (!fill_color_gdk) { style = gtk_widget_get_style (widget); fill_color_gdk = gdk_color_copy (&style->base[GTK_STATE_SELECTED]); } /* draw the area */ cairo_set_source_rgba (cr, fill_color_gdk->red / 65535., fill_color_gdk->green / 65535., fill_color_gdk->blue / 65535., fill_color_alpha / 255.); gdk_cairo_rectangle (cr, &rect); cairo_clip (cr); cairo_paint (cr); /* draw the border */ cairo_set_source_rgb (cr, fill_color_gdk->red / 65535., fill_color_gdk->green / 65535., fill_color_gdk->blue / 65535.); cairo_rectangle (cr, rubber_rect.x + 0.5, rubber_rect.y + 0.5, rubber_rect.width - 1, rubber_rect.height - 1); cairo_set_line_width (cr, 1); cairo_stroke (cr); gdk_color_free (fill_color_gdk); cairo_destroy (cr); } #else gtk_style_context_save (style); gtk_style_context_add_class (style, GTK_STYLE_CLASS_RUBBERBAND); gdk_cairo_rectangle (cr, &rubber_rect); cairo_clip (cr); gtk_render_background (style, cr, rubber_rect.x, rubber_rect.y, rubber_rect.width, rubber_rect.height); gtk_render_frame (style, cr, rubber_rect.x, rubber_rect.y, rubber_rect.width, rubber_rect.height); gtk_style_context_restore (style); #endif } /* let the GtkContainer forward the expose event to all children */ #if GTK_CHECK_VERSION(3, 0, 0) cairo_restore (cr); (*GTK_WIDGET_CLASS (exo_icon_view_parent_class)->draw) (widget, cr); #else (*GTK_WIDGET_CLASS (exo_icon_view_parent_class)->expose_event) (widget, event); #endif return FALSE; } static gboolean rubberband_scroll_timeout (gpointer user_data) { GtkAdjustment *adjustment; ExoIconView *icon_view = EXO_ICON_VIEW (user_data); gdouble value; /* ensure that source isn't removed yet */ if(g_source_is_destroyed(g_main_current_source())) { return FALSE; } /* determine the adjustment for the scroll direction */ adjustment = (icon_view->priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS) ? icon_view->priv->vadjustment : icon_view->priv->hadjustment; /* determine the new scroll value */ value = MIN (gtk_adjustment_get_value(adjustment) + icon_view->priv->scroll_value_diff, gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)); /* apply the new value */ gtk_adjustment_set_value (adjustment, value); /* update the rubberband */ exo_icon_view_update_rubberband (icon_view); return TRUE; } static gboolean exo_icon_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { ExoIconViewItem *item; ExoIconView *icon_view = EXO_ICON_VIEW (widget); GdkCursor *cursor; gint size; gint abso; GtkAllocation allocation; exo_icon_view_maybe_begin_drag (icon_view, event); gtk_widget_get_allocation (widget, &allocation); if (icon_view->priv->doing_rubberband) { exo_icon_view_update_rubberband (widget); if (icon_view->priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS) { abso = event->y - icon_view->priv->height * (gtk_adjustment_get_value(icon_view->priv->vadjustment) / (gtk_adjustment_get_upper(icon_view->priv->vadjustment) - gtk_adjustment_get_lower(icon_view->priv->vadjustment))); size = allocation.height; } else { abso = event->x - icon_view->priv->width * (gtk_adjustment_get_value(icon_view->priv->hadjustment) / (gtk_adjustment_get_upper(icon_view->priv->hadjustment) - gtk_adjustment_get_lower(icon_view->priv->hadjustment))); size = allocation.width; } if (abso < 0 || abso > size) { if (abso < 0) icon_view->priv->scroll_value_diff = abso; else icon_view->priv->scroll_value_diff = abso - size; icon_view->priv->event_last_x = event->x; icon_view->priv->event_last_y = event->y; if (icon_view->priv->scroll_timeout_id == 0) icon_view->priv->scroll_timeout_id = gdk_threads_add_timeout (30, rubberband_scroll_timeout, icon_view); } else { remove_scroll_timeout (icon_view); } } else { item = exo_icon_view_get_item_at_coords (icon_view, event->x, event->y, TRUE, NULL); if (item != icon_view->priv->prelit_item) { if (G_LIKELY (icon_view->priv->prelit_item != NULL)) exo_icon_view_queue_draw_item (icon_view, icon_view->priv->prelit_item); icon_view->priv->prelit_item = item; if (G_LIKELY (item != NULL)) exo_icon_view_queue_draw_item (icon_view, item); /* check if we are in single click mode right now */ if (G_UNLIKELY (icon_view->priv->single_click)) { /* display a hand cursor when pointer is above an item */ if (G_LIKELY (item != NULL)) { /* hand2 seems to be what we should use */ cursor = gdk_cursor_new (GDK_HAND2); gdk_window_set_cursor (event->window, cursor); gdk_cursor_unref (cursor); } else { /* reset the cursor */ gdk_window_set_cursor (event->window, NULL); } /* check if autoselection is enabled */ if (G_LIKELY (icon_view->priv->single_click_timeout > 0)) { /* drop any running timeout */ if (G_LIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); /* remember the current event state */ icon_view->priv->single_click_timeout_state = event->state; /* schedule a new timeout */ icon_view->priv->single_click_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, icon_view->priv->single_click_timeout, exo_icon_view_single_click_timeout, icon_view, exo_icon_view_single_click_timeout_destroy); } } } } return TRUE; } static void exo_icon_view_remove (GtkContainer *container, GtkWidget *widget) { ExoIconViewChild *child; ExoIconView *icon_view = EXO_ICON_VIEW (container); GList *lp; for (lp = icon_view->priv->children; lp != NULL; lp = lp->next) { child = lp->data; if (G_LIKELY (child->widget == widget)) { icon_view->priv->children = g_list_delete_link (icon_view->priv->children, lp); gtk_widget_unparent (widget); g_slice_free (ExoIconViewChild, child); return; } } } static void exo_icon_view_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { ExoIconView *icon_view = EXO_ICON_VIEW (container); GList *lp; for (lp = icon_view->priv->children; lp != NULL; lp = lp->next) (*callback) (((ExoIconViewChild *) lp->data)->widget, callback_data); } static void exo_icon_view_item_selected_changed (ExoIconView *icon_view, ExoIconViewItem *item) { AtkObject *obj; AtkObject *item_obj; obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view)); if (obj != NULL) { item_obj = atk_object_ref_accessible_child (obj, item->index); if (item_obj != NULL) { atk_object_notify_state_change (item_obj, ATK_STATE_SELECTED, item->selected); g_object_unref (item_obj); } } } static void exo_icon_view_item_activate_cell (ExoIconView *icon_view, ExoIconViewItem *item, ExoIconViewCellInfo *info, GdkEvent *event) { GtkCellRendererMode mode; GdkRectangle cell_area; GtkTreePath *path; gboolean visible; gchar *path_string; exo_icon_view_set_cell_data (icon_view, item); g_object_get (G_OBJECT (info->cell), "visible", &visible, "mode", &mode, NULL); if (G_UNLIKELY (visible && mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE)) { exo_icon_view_get_cell_area (icon_view, item, info, &cell_area); path = gtk_tree_path_new_from_indices (item->index, -1); path_string = gtk_tree_path_to_string (path); gtk_tree_path_free (path); gtk_cell_renderer_activate (info->cell, event, GTK_WIDGET (icon_view), path_string, &cell_area, &cell_area, 0); g_free (path_string); } } static void exo_icon_view_put (ExoIconView *icon_view, GtkWidget *widget, ExoIconViewItem *item, gint cell) { ExoIconViewChild *child; /* allocate the new child */ child = g_slice_new (ExoIconViewChild); child->widget = widget; child->item = item; child->cell = cell; /* hook up the child */ icon_view->priv->children = g_list_append (icon_view->priv->children, child); /* setup the parent for the child */ if (gtk_widget_get_realized (GTK_WIDGET (icon_view))) gtk_widget_set_parent_window (child->widget, icon_view->priv->bin_window); gtk_widget_set_parent (widget, GTK_WIDGET (icon_view)); } static void exo_icon_view_remove_widget (GtkCellEditable *editable, ExoIconView *icon_view) { ExoIconViewItem *item; GList *lp; if (G_LIKELY (icon_view->priv->edited_item != NULL)) { item = icon_view->priv->edited_item; icon_view->priv->edited_item = NULL; icon_view->priv->editable = NULL; for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) ((ExoIconViewCellInfo *) lp->data)->editing = FALSE; if (gtk_widget_has_focus (GTK_WIDGET (editable))) gtk_widget_grab_focus (GTK_WIDGET (icon_view)); g_signal_handlers_disconnect_by_func (editable, exo_icon_view_remove_widget, icon_view); gtk_container_remove (GTK_CONTAINER (icon_view), GTK_WIDGET (editable)); exo_icon_view_queue_draw_item (icon_view, item); } } static void exo_icon_view_start_editing (ExoIconView *icon_view, ExoIconViewItem *item, ExoIconViewCellInfo *info, GdkEvent *event) { GtkCellRendererMode mode; GtkCellEditable *editable; GdkRectangle cell_area; GtkTreePath *path; gboolean visible; gchar *path_string; /* setup cell data for the given item */ exo_icon_view_set_cell_data (icon_view, item); /* check if the cell is visible and editable (given the updated cell data) */ g_object_get (info->cell, "visible", &visible, "mode", &mode, NULL); if (G_LIKELY (visible && mode == GTK_CELL_RENDERER_MODE_EDITABLE)) { /* draw keyboard focus while editing */ EXO_ICON_VIEW_SET_FLAG (icon_view, EXO_ICON_VIEW_DRAW_KEYFOCUS); /* determine the cell area */ exo_icon_view_get_cell_area (icon_view, item, info, &cell_area); /* determine the tree path */ path = gtk_tree_path_new_from_indices (item->index, -1); path_string = gtk_tree_path_to_string (path); gtk_tree_path_free (path); /* allocate the editable from the cell renderer */ editable = gtk_cell_renderer_start_editing (info->cell, event, GTK_WIDGET (icon_view), path_string, &cell_area, &cell_area, 0); /* ugly hack, but works */ if (g_object_class_find_property (G_OBJECT_GET_CLASS (editable), "has-frame") != NULL) g_object_set (editable, "has-frame", TRUE, NULL); /* setup the editing widget */ icon_view->priv->edited_item = item; icon_view->priv->editable = editable; info->editing = TRUE; exo_icon_view_put (icon_view, GTK_WIDGET (editable), item, info->position); gtk_cell_editable_start_editing (GTK_CELL_EDITABLE (editable), (GdkEvent *)event); gtk_widget_grab_focus (GTK_WIDGET (editable)); g_signal_connect (G_OBJECT (editable), "remove-widget", G_CALLBACK (exo_icon_view_remove_widget), icon_view); /* cleanup */ g_free (path_string); } } static void exo_icon_view_stop_editing (ExoIconView *icon_view, gboolean cancel_editing) { ExoIconViewItem *item; GtkCellRenderer *cell = NULL; GList *lp; if (icon_view->priv->edited_item == NULL) return; /* * This is very evil. We need to do this, because * gtk_cell_editable_editing_done may trigger exo_icon_view_row_changed * later on. If exo_icon_view_row_changed notices * icon_view->priv->edited_item != NULL, it'll call * exo_icon_view_stop_editing again. Bad things will happen then. * * Please read that again if you intend to modify anything here. */ item = icon_view->priv->edited_item; icon_view->priv->edited_item = NULL; for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) { ExoIconViewCellInfo *info = lp->data; if (info->editing) { cell = info->cell; break; } } if (G_UNLIKELY (cell == NULL)) return; gtk_cell_renderer_stop_editing (cell, cancel_editing); if (G_LIKELY (!cancel_editing)) gtk_cell_editable_editing_done (icon_view->priv->editable); icon_view->priv->edited_item = item; gtk_cell_editable_remove_widget (icon_view->priv->editable); } static gboolean exo_icon_view_button_press_event (GtkWidget *widget, GdkEventButton *event) { ExoIconViewCellInfo *info = NULL; GtkCellRendererMode mode; ExoIconViewItem *item; ExoIconView *icon_view; GtkTreePath *path; gboolean dirty = FALSE; gint cursor_cell; gpointer drag_data; icon_view = EXO_ICON_VIEW (widget); if (event->window != icon_view->priv->bin_window) return FALSE; /* the widget can be destroyed by click so let keep reference on it */ g_object_ref(widget); /* stop any pending "single-click-timeout" */ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); if (G_UNLIKELY (!gtk_widget_has_focus (widget))) gtk_widget_grab_focus (widget); if (event->button == 1 && event->type == GDK_BUTTON_PRESS) { if (G_LIKELY (icon_view->priv->dnd_locked)) { /* re-enable Gtk+ DnD callbacks if they were disabled by a double click before, otherwise DnD will not work */ drag_data = g_object_get_data (G_OBJECT (icon_view), I_("gtk-site-data")); if (G_LIKELY (drag_data != NULL)) { g_signal_handlers_unblock_matched (G_OBJECT (icon_view), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, drag_data); } icon_view->priv->dnd_locked = FALSE; } item = exo_icon_view_get_item_at_coords (icon_view, event->x, event->y, TRUE, &info); if (item != NULL) { g_object_get (info->cell, "mode", &mode, NULL); if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE || mode == GTK_CELL_RENDERER_MODE_EDITABLE) cursor_cell = g_list_index (icon_view->priv->cell_list, info); else cursor_cell = -1; exo_icon_view_scroll_to_item (icon_view, item); if (icon_view->priv->selection_mode == GTK_SELECTION_NONE) { exo_icon_view_set_cursor_item (icon_view, item, cursor_cell); } else if (icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE && (event->state & GDK_SHIFT_MASK)) { if (!(event->state & GDK_CONTROL_MASK)) exo_icon_view_unselect_all_internal (icon_view); exo_icon_view_set_cursor_item (icon_view, item, cursor_cell); if (!icon_view->priv->anchor_item) icon_view->priv->anchor_item = item; else exo_icon_view_select_all_between (icon_view, icon_view->priv->anchor_item, item); dirty = TRUE; } else { if ((icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE || ((icon_view->priv->selection_mode == GTK_SELECTION_SINGLE) && item->selected)) && (event->state & GDK_CONTROL_MASK)) { item->selected = !item->selected; exo_icon_view_queue_draw_item (icon_view, item); dirty = TRUE; } else { if (!item->selected) { exo_icon_view_unselect_all_internal (icon_view); item->selected = TRUE; exo_icon_view_queue_draw_item (icon_view, item); dirty = TRUE; } } exo_icon_view_set_cursor_item (icon_view, item, cursor_cell); icon_view->priv->anchor_item = item; } /* Save press to possibly begin a drag */ if (icon_view->priv->pressed_button < 0) { icon_view->priv->pressed_button = event->button; icon_view->priv->press_start_x = event->x; icon_view->priv->press_start_y = event->y; } if (G_LIKELY (icon_view->priv->last_single_clicked == NULL)) icon_view->priv->last_single_clicked = item; /* cancel the current editing, if it exists */ exo_icon_view_stop_editing (icon_view, TRUE); if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE) exo_icon_view_item_activate_cell (icon_view, item, info, (GdkEvent *)event); else if (mode == GTK_CELL_RENDERER_MODE_EDITABLE) exo_icon_view_start_editing (icon_view, item, info, (GdkEvent *)event); } else { /* cancel the current editing, if it exists */ exo_icon_view_stop_editing (icon_view, TRUE); if (icon_view->priv->selection_mode != GTK_SELECTION_BROWSE && !(event->state & GDK_CONTROL_MASK)) { dirty = exo_icon_view_unselect_all_internal (icon_view); } if (icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE) exo_icon_view_start_rubberbanding (icon_view, event->x, event->y); } } else if ((event->button == 1 && event->type == GDK_2BUTTON_PRESS) || (icon_view->priv->middle_click && event->button == 2 && event->type == GDK_BUTTON_PRESS)) { /* ignore double-click events in single-click mode */ if (G_LIKELY (!icon_view->priv->single_click)) { item = exo_icon_view_get_item_at_coords (icon_view, event->x, event->y, TRUE, NULL); if (G_LIKELY (item != NULL)) { path = gtk_tree_path_new_from_indices (item->index, -1); exo_icon_view_item_activated (icon_view, path); gtk_tree_path_free (path); /* bug #3615031: don't start DnD by double click */ if (icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE && gtk_widget_get_realized(widget)) { drag_data = g_object_get_data (G_OBJECT (icon_view), I_("gtk-site-data")); if (G_LIKELY (drag_data != NULL)) { g_signal_handlers_block_matched (G_OBJECT (icon_view), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, drag_data); icon_view->priv->dnd_locked = TRUE; } } } } icon_view->priv->last_single_clicked = NULL; icon_view->priv->pressed_button = -1; } /* grab focus and stop drawing the keyboard focus indicator on single clicks */ if (G_LIKELY (event->type != GDK_2BUTTON_PRESS && event->type != GDK_3BUTTON_PRESS)) { if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) gtk_widget_grab_focus (GTK_WIDGET (icon_view)); EXO_ICON_VIEW_UNSET_FLAG (icon_view, EXO_ICON_VIEW_DRAW_KEYFOCUS); } if (dirty) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); /* SF bug #929: we have to drop prelit state to drop tooltip, see text renderer */ icon_view->priv->prelit_item = NULL; /* release reference that was taken above */ g_object_unref(widget); return event->button == (icon_view->priv->middle_click ? 2 : 1); } static gboolean exo_icon_view_button_release_event (GtkWidget *widget, GdkEventButton *event) { ExoIconViewItem *item; ExoIconView *icon_view = EXO_ICON_VIEW (widget); GtkTreePath *path; /* the widget can be destroyed by click so let keep reference on it */ g_object_ref(widget); if (icon_view->priv->pressed_button == (gint) event->button) { /* check if we're in single click mode */ if (G_UNLIKELY (icon_view->priv->single_click && (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) == 0)) { /* determine the item at the mouse coords and check if this is the last single clicked one */ item = exo_icon_view_get_item_at_coords (icon_view, event->x, event->y, TRUE, NULL); if (G_LIKELY (item != NULL && item == icon_view->priv->last_single_clicked)) { /* emit an "item-activated" signal for this item */ path = gtk_tree_path_new_from_indices (item->index, -1); exo_icon_view_item_activated (icon_view, path); gtk_tree_path_free (path); } /* reset the last single clicked item */ icon_view->priv->last_single_clicked = NULL; } /* reset the pressed_button state */ icon_view->priv->pressed_button = -1; } exo_icon_view_stop_rubberbanding (icon_view); remove_scroll_timeout (icon_view); /* release reference that was taken above */ g_object_unref(widget); return TRUE; } static gboolean exo_icon_view_scroll_event (GtkWidget *widget, GdkEventScroll *event) { GtkAdjustment *adjustment; ExoIconView *icon_view = EXO_ICON_VIEW (widget); gdouble delta, delta_x; gdouble value; /* we don't care for scroll events in "rows" layout mode, as * that's completely handled by GtkScrolledWindow. */ if (icon_view->priv->layout_mode != EXO_ICON_VIEW_LAYOUT_COLS) return FALSE; /* also, we don't care for anything but Up/Down, as * everything else will be handled by GtkScrolledWindow. */ if (event->direction != GDK_SCROLL_UP && event->direction != GDK_SCROLL_DOWN #if GTK_CHECK_VERSION(3, 4, 0) && event->direction != GDK_SCROLL_SMOOTH #endif ) return FALSE; /* we also don't care for scroll events with Shift/Ctrl/Alt pressed */ if ((event->state & gtk_accelerator_get_default_mod_mask()) != 0) return FALSE; /* determine the horizontal adjustment */ adjustment = icon_view->priv->hadjustment; /* determine the scroll delta */ delta = pow (gtk_adjustment_get_page_size(adjustment), 2.0 / 3.0); delta = (event->direction == GDK_SCROLL_UP) ? -delta : delta; #if GTK_CHECK_VERSION(3, 4, 0) if (gdk_event_get_scroll_deltas((GdkEvent *) event, &delta_x, NULL)) /* it was smooth scrolling - try to approach the usual scrolling speed */ delta = delta_x * 33.3; #endif /* apply the new adjustment value */ value = CLAMP (gtk_adjustment_get_value(adjustment) + delta, gtk_adjustment_get_lower(adjustment), gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)); gtk_adjustment_set_value (adjustment, value); return TRUE; } static gboolean exo_icon_view_key_press_event (GtkWidget *widget, GdkEventKey *event) { ExoIconView *icon_view = EXO_ICON_VIEW (widget); GdkScreen *screen; GdkEvent *new_event; gboolean retval; gulong popup_menu_id; gchar *new_text; gchar *old_text; /* let the parent class handle the key bindings and stuff */ if ((*GTK_WIDGET_CLASS (exo_icon_view_parent_class)->key_press_event) (widget, event)) return TRUE; /* 'space' keypress should not start search even if there is no selection */ if (G_UNLIKELY (event->keyval == GDK_KEY_space)) return FALSE; /* check if typeahead search is enabled */ if (G_UNLIKELY (!icon_view->priv->enable_search)) return FALSE; exo_icon_view_search_ensure_directory (icon_view); /* make sure the search window is realized */ gtk_widget_realize (icon_view->priv->search_window); /* make a copy of the current text */ old_text = gtk_editable_get_chars (GTK_EDITABLE (icon_view->priv->search_entry), 0, -1); /* make sure we don't accidently popup the context menu */ popup_menu_id = g_signal_connect (G_OBJECT (icon_view->priv->search_entry), "popup-menu", G_CALLBACK (gtk_true), NULL); /* move the search window offscreen */ screen = gtk_widget_get_screen (GTK_WIDGET (icon_view)); gtk_window_move (GTK_WINDOW (icon_view->priv->search_window), gdk_screen_get_width (screen) + 1, gdk_screen_get_height (screen) + 1); gtk_widget_show (icon_view->priv->search_window); /* allocate a new event to forward */ new_event = gdk_event_copy ((GdkEvent *) event); g_object_unref (G_OBJECT (new_event->key.window)); new_event->key.window = GDK_WINDOW(g_object_ref (G_OBJECT (gtk_widget_get_window (icon_view->priv->search_entry)))); /* send the event to the search entry. If the "preedit-changed" signal is * emitted during this event, priv->search_imcontext_changed will be set. */ icon_view->priv->search_imcontext_changed = FALSE; retval = gtk_widget_event (icon_view->priv->search_entry, new_event); gtk_widget_hide (icon_view->priv->search_window); /* release the temporary event */ gdk_event_free (new_event); /* disconnect the popup menu prevention */ g_signal_handler_disconnect (G_OBJECT (icon_view->priv->search_entry), popup_menu_id); /* we check to make sure that the entry tried to handle the, * and that the text has actually changed. */ new_text = gtk_editable_get_chars (GTK_EDITABLE (icon_view->priv->search_entry), 0, -1); retval = retval && (strcmp (new_text, old_text) != 0); g_free (old_text); g_free (new_text); /* if we're in a preedit or the text was modified */ if (icon_view->priv->search_imcontext_changed || retval) { if (exo_icon_view_search_start (icon_view, FALSE)) { gtk_widget_grab_focus (GTK_WIDGET (icon_view)); return TRUE; } else { gtk_entry_set_text (GTK_ENTRY (icon_view->priv->search_entry), ""); return FALSE; } } return FALSE; } static gboolean exo_icon_view_focus_out_event (GtkWidget *widget, GdkEventFocus *event) { ExoIconView *icon_view = EXO_ICON_VIEW (widget); /* be sure to cancel any single-click timeout */ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); /* reset the cursor if we're still realized */ if (G_LIKELY (icon_view->priv->bin_window != NULL)) gdk_window_set_cursor (icon_view->priv->bin_window, NULL); /* destroy the interactive search dialog */ if (G_UNLIKELY (icon_view->priv->search_window != NULL)) exo_icon_view_search_dialog_hide (icon_view->priv->search_window, icon_view); /* schedule a redraw with the new focus state */ gtk_widget_queue_draw (widget); return FALSE; } static gboolean exo_icon_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event) { /* reset cursor to default */ if (gtk_widget_get_realized (widget)) gdk_window_set_cursor (gtk_widget_get_window(widget), NULL); /* call the parent's leave_notify_event (if any) */ if (GTK_WIDGET_CLASS (exo_icon_view_parent_class)->leave_notify_event != NULL) return (*GTK_WIDGET_CLASS (exo_icon_view_parent_class)->leave_notify_event) (widget, event); /* other signal handlers may be invoked */ return FALSE; } static void exo_icon_view_update_rubberband (gpointer data) { ExoIconView *icon_view; gint x, y; GdkRectangle old_area; GdkRectangle new_area; GdkRectangle common; #if GTK_CHECK_VERSION(3, 0, 0) cairo_region_t *invalid_region; #else GdkRegion *invalid_region; #endif icon_view = EXO_ICON_VIEW (data); gdk_window_get_device_position (icon_view->priv->bin_window, gtk_get_current_event_device(), &x, &y, NULL); x = MAX (x, 0); y = MAX (y, 0); old_area.x = MIN (icon_view->priv->rubberband_x_1, icon_view->priv->rubberband_x2); old_area.y = MIN (icon_view->priv->rubberband_y_1, icon_view->priv->rubberband_y2); old_area.width = ABS (icon_view->priv->rubberband_x2 - icon_view->priv->rubberband_x_1) + 1; old_area.height = ABS (icon_view->priv->rubberband_y2 - icon_view->priv->rubberband_y_1) + 1; new_area.x = MIN (icon_view->priv->rubberband_x_1, x); new_area.y = MIN (icon_view->priv->rubberband_y_1, y); new_area.width = ABS (x - icon_view->priv->rubberband_x_1) + 1; new_area.height = ABS (y - icon_view->priv->rubberband_y_1) + 1; #if GTK_CHECK_VERSION(3, 0, 0) invalid_region = cairo_region_create_rectangle (&old_area); cairo_region_union_rectangle (invalid_region, &new_area); #else invalid_region = gdk_region_rectangle (&old_area); gdk_region_union_with_rect (invalid_region, &new_area); #endif gdk_rectangle_intersect (&old_area, &new_area, &common); if (common.width > 2 && common.height > 2) { #if GTK_CHECK_VERSION(3, 0, 0) cairo_region_t *common_region; #else GdkRegion *common_region; #endif /* make sure the border is invalidated */ common.x += 1; common.y += 1; common.width -= 2; common.height -= 2; #if GTK_CHECK_VERSION(3, 0, 0) common_region = cairo_region_create_rectangle (&common); cairo_region_subtract (invalid_region, common_region); cairo_region_destroy (common_region); #else common_region = gdk_region_rectangle (&common); gdk_region_subtract (invalid_region, common_region); gdk_region_destroy (common_region); #endif } gdk_window_invalidate_region (icon_view->priv->bin_window, invalid_region, TRUE); #if GTK_CHECK_VERSION(3, 0, 0) cairo_region_destroy (invalid_region); #else gdk_region_destroy (invalid_region); #endif icon_view->priv->rubberband_x2 = x; icon_view->priv->rubberband_y2 = y; exo_icon_view_update_rubberband_selection (icon_view); } static void exo_icon_view_start_rubberbanding (ExoIconView *icon_view, gint x, gint y) { gpointer drag_data; GList *items; /* be sure to disable any previously active rubberband */ exo_icon_view_stop_rubberbanding (icon_view); for (items = icon_view->priv->items; items; items = items->next) { ExoIconViewItem *item = items->data; item->selected_before_rubberbanding = item->selected; } icon_view->priv->rubberband_x_1 = x; icon_view->priv->rubberband_y_1 = y; icon_view->priv->rubberband_x2 = x; icon_view->priv->rubberband_y2 = y; icon_view->priv->doing_rubberband = TRUE; gtk_grab_add (GTK_WIDGET (icon_view)); /* be sure to disable Gtk+ DnD callbacks, because else rubberbanding will be interrupted */ drag_data = g_object_get_data (G_OBJECT (icon_view), I_("gtk-site-data")); if (G_LIKELY (drag_data != NULL)) { g_signal_handlers_block_matched (G_OBJECT (icon_view), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, drag_data); icon_view->priv->dnd_locked = TRUE; } } static void exo_icon_view_stop_rubberbanding (ExoIconView *icon_view) { gpointer drag_data; if (G_LIKELY (icon_view->priv->doing_rubberband)) { icon_view->priv->doing_rubberband = FALSE; gtk_grab_remove (GTK_WIDGET (icon_view)); gtk_widget_queue_draw (GTK_WIDGET (icon_view)); } if (G_LIKELY (icon_view->priv->dnd_locked)) { /* re-enable Gtk+ DnD callbacks again */ drag_data = g_object_get_data (G_OBJECT (icon_view), I_("gtk-site-data")); if (G_LIKELY (drag_data != NULL)) { g_signal_handlers_unblock_matched (G_OBJECT (icon_view), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, drag_data); } icon_view->priv->dnd_locked = FALSE; } } static void exo_icon_view_update_rubberband_selection (ExoIconView *icon_view) { ExoIconViewItem *item; gboolean selected; gboolean changed = FALSE; gboolean is_in; GList *lp; gint x, y; gint width; gint height; /* determine the new rubberband area */ x = MIN (icon_view->priv->rubberband_x_1, icon_view->priv->rubberband_x2); y = MIN (icon_view->priv->rubberband_y_1, icon_view->priv->rubberband_y2); width = ABS (icon_view->priv->rubberband_x_1 - icon_view->priv->rubberband_x2); height = ABS (icon_view->priv->rubberband_y_1 - icon_view->priv->rubberband_y2); /* check all items */ for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) { item = EXO_ICON_VIEW_ITEM (lp->data); is_in = exo_icon_view_item_hit_test (icon_view, item, x, y, width, height); selected = is_in ^ item->selected_before_rubberbanding; if (G_UNLIKELY (item->selected != selected)) { changed = TRUE; item->selected = selected; exo_icon_view_queue_draw_item (icon_view, item); } } if (G_LIKELY (changed)) g_signal_emit (G_OBJECT (icon_view), icon_view_signals[SELECTION_CHANGED], 0); } static gboolean exo_icon_view_item_hit_test (ExoIconView *icon_view, ExoIconViewItem *item, gint x, gint y, gint width, gint height) { GList *l; GdkRectangle box; for (l = icon_view->priv->cell_list; l; l = l->next) { ExoIconViewCellInfo *info = (ExoIconViewCellInfo *)l->data; if (!gtk_cell_renderer_get_visible(info->cell)) continue; /* libfm: bug #3390778: item->box isn't allocated yet here! bad design! */ if (!item->box) continue; box = item->box[info->position]; if (MIN (x + width, box.x + box.width) - MAX (x, box.x) > 0 && MIN (y + height, box.y + box.height) - MAX (y, box.y) > 0) return TRUE; } return FALSE; } static gboolean exo_icon_view_unselect_all_internal (ExoIconView *icon_view) { ExoIconViewItem *item; gboolean dirty = FALSE; GList *lp; if (G_LIKELY (icon_view->priv->selection_mode != GTK_SELECTION_NONE)) { for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) { item = EXO_ICON_VIEW_ITEM (lp->data); if (item->selected) { dirty = TRUE; item->selected = FALSE; exo_icon_view_queue_draw_item (icon_view, item); exo_icon_view_item_selected_changed (icon_view, item); } } } return dirty; } #if !GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_set_adjustments (ExoIconView *icon_view, GtkAdjustment *hadj, GtkAdjustment *vadj) { gboolean need_adjust = FALSE; if (hadj) _exo_return_if_fail (GTK_IS_ADJUSTMENT (hadj)); else hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); if (vadj) _exo_return_if_fail (GTK_IS_ADJUSTMENT (vadj)); else vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); if (icon_view->priv->hadjustment && (icon_view->priv->hadjustment != hadj)) { g_signal_handlers_disconnect_matched (icon_view->priv->hadjustment, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, icon_view); g_object_unref (icon_view->priv->hadjustment); } if (icon_view->priv->vadjustment && (icon_view->priv->vadjustment != vadj)) { g_signal_handlers_disconnect_matched (icon_view->priv->vadjustment, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, icon_view); g_object_unref (icon_view->priv->vadjustment); } if (icon_view->priv->hadjustment != hadj) { icon_view->priv->hadjustment = hadj; g_object_ref_sink (icon_view->priv->hadjustment); g_signal_connect (icon_view->priv->hadjustment, "value-changed", G_CALLBACK (exo_icon_view_adjustment_changed), icon_view); need_adjust = TRUE; } if (icon_view->priv->vadjustment != vadj) { icon_view->priv->vadjustment = vadj; g_object_ref_sink (icon_view->priv->vadjustment); g_signal_connect (icon_view->priv->vadjustment, "value-changed", G_CALLBACK (exo_icon_view_adjustment_changed), icon_view); need_adjust = TRUE; } if (need_adjust) exo_icon_view_adjustment_changed (NULL, icon_view); } #else static void exo_icon_view_set_hadjustment (ExoIconView *icon_view, GtkAdjustment *hadj) { gboolean need_adjust = FALSE; if (hadj) _exo_return_if_fail (GTK_IS_ADJUSTMENT (hadj)); else hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); if (icon_view->priv->hadjustment && (icon_view->priv->hadjustment != hadj)) { g_signal_handlers_disconnect_matched (icon_view->priv->hadjustment, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, icon_view); g_object_unref (icon_view->priv->hadjustment); } if (icon_view->priv->hadjustment != hadj) { icon_view->priv->hadjustment = hadj; g_object_ref_sink (icon_view->priv->hadjustment); g_signal_connect (icon_view->priv->hadjustment, "value-changed", G_CALLBACK (exo_icon_view_adjustment_changed), icon_view); need_adjust = TRUE; } if (need_adjust) exo_icon_view_adjustment_changed (NULL, icon_view); g_object_notify (G_OBJECT (icon_view), "hadjustment"); } static void exo_icon_view_set_vadjustment (ExoIconView *icon_view, GtkAdjustment *vadj) { gboolean need_adjust = FALSE; if (vadj) _exo_return_if_fail (GTK_IS_ADJUSTMENT (vadj)); else vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); if (icon_view->priv->vadjustment && (icon_view->priv->vadjustment != vadj)) { g_signal_handlers_disconnect_matched (icon_view->priv->vadjustment, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, icon_view); g_object_unref (icon_view->priv->vadjustment); } if (icon_view->priv->vadjustment != vadj) { icon_view->priv->vadjustment = vadj; g_object_ref_sink (icon_view->priv->vadjustment); g_signal_connect (icon_view->priv->vadjustment, "value-changed", G_CALLBACK (exo_icon_view_adjustment_changed), icon_view); need_adjust = TRUE; } if (need_adjust) exo_icon_view_adjustment_changed (NULL, icon_view); g_object_notify (G_OBJECT (icon_view), "vadjustment"); } #endif static void exo_icon_view_real_select_all (ExoIconView *icon_view) { exo_icon_view_select_all (icon_view); } static void exo_icon_view_real_unselect_all (ExoIconView *icon_view) { exo_icon_view_unselect_all (icon_view); } static void exo_icon_view_real_select_cursor_item (ExoIconView *icon_view) { exo_icon_view_unselect_all (icon_view); if (icon_view->priv->cursor_item != NULL) exo_icon_view_select_item (icon_view, icon_view->priv->cursor_item); } static gboolean exo_icon_view_real_activate_cursor_item (ExoIconView *icon_view) { GtkTreePath *path; GtkCellRendererMode mode; ExoIconViewCellInfo *info = NULL; if (!icon_view->priv->cursor_item) return FALSE; info = g_list_nth_data (icon_view->priv->cell_list, icon_view->priv->cursor_cell); if (info) { g_object_get (info->cell, "mode", &mode, NULL); if (mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE) { exo_icon_view_item_activate_cell (icon_view, icon_view->priv->cursor_item, info, NULL); return TRUE; } else if (mode == GTK_CELL_RENDERER_MODE_EDITABLE) { exo_icon_view_start_editing (icon_view, icon_view->priv->cursor_item, info, NULL); return TRUE; } } path = gtk_tree_path_new_from_indices (icon_view->priv->cursor_item->index, -1); exo_icon_view_item_activated (icon_view, path); gtk_tree_path_free (path); return TRUE; } static gboolean exo_icon_view_real_start_interactive_search (ExoIconView *icon_view) { return exo_icon_view_search_start (icon_view, TRUE); } static void exo_icon_view_real_toggle_cursor_item (ExoIconView *icon_view) { if (G_LIKELY (icon_view->priv->cursor_item != NULL)) { switch (icon_view->priv->selection_mode) { case GTK_SELECTION_NONE: break; case GTK_SELECTION_BROWSE: exo_icon_view_select_item (icon_view, icon_view->priv->cursor_item); break; case GTK_SELECTION_SINGLE: if (icon_view->priv->cursor_item->selected) exo_icon_view_unselect_item (icon_view, icon_view->priv->cursor_item); else exo_icon_view_select_item (icon_view, icon_view->priv->cursor_item); break; case GTK_SELECTION_MULTIPLE: icon_view->priv->cursor_item->selected = !icon_view->priv->cursor_item->selected; g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); exo_icon_view_item_selected_changed (icon_view, icon_view->priv->cursor_item); exo_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item); break; default: g_assert_not_reached (); } } } static void exo_icon_view_adjustment_changed (GtkAdjustment *adjustment, ExoIconView *icon_view) { if (gtk_widget_get_realized (GTK_WIDGET(icon_view))) { gdk_window_move (icon_view->priv->bin_window, -gtk_adjustment_get_value(icon_view->priv->hadjustment), -gtk_adjustment_get_value(icon_view->priv->vadjustment)); if (G_UNLIKELY (icon_view->priv->doing_rubberband)) exo_icon_view_update_rubberband (GTK_WIDGET (icon_view)); #if !GTK_CHECK_VERSION(3, 22, 0) gdk_window_process_updates (icon_view->priv->bin_window, TRUE); #endif } } static GList* exo_icon_view_layout_single_row (ExoIconView *icon_view, GList *first_item, gint item_width, gint row, gint *y, gint *maximum_width, gint max_cols) { ExoIconViewPrivate *priv = icon_view->priv; ExoIconViewItem *item; gboolean rtl; GList *last_item; GList *items = first_item; gint *max_width; gint *max_height; gint focus_width; gint current_width; gint colspan; gint col = 0; gint x; gint i; GtkAllocation allocation; rtl = (gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL); gtk_widget_get_allocation (GTK_WIDGET (icon_view), &allocation); max_width = g_newa (gint, priv->n_cells); max_height = g_newa (gint, priv->n_cells); for (i = priv->n_cells; --i >= 0; ) { max_width[i] = 0; max_height[i] = 0; } gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_width, NULL); x = priv->margin + focus_width; current_width = 2 * (priv->margin + focus_width); for (items = first_item; items != NULL; items = items->next) { item = EXO_ICON_VIEW_ITEM (items->data); exo_icon_view_calculate_item_size (icon_view, item); colspan = 1 + (item->area.width - 1) / (item_width + priv->column_spacing); item->area.width = colspan * item_width + (colspan - 1) * priv->column_spacing; current_width += item->area.width + priv->column_spacing + 2 * focus_width; if (G_LIKELY (items != first_item)) { if ((priv->columns <= 0 && current_width > allocation.width) || (priv->columns > 0 && col >= priv->columns) || (max_cols > 0 && col >= max_cols)) break; } item->area.y = *y + focus_width; item->area.x = rtl ? allocation.width - item->area.width - x : x; x = current_width - (priv->margin + focus_width); for (i = 0; i < priv->n_cells; i++) { max_width[i] = MAX (max_width[i], item->box[i].width); max_height[i] = MAX (max_height[i], item->box[i].height); } if (current_width > *maximum_width) *maximum_width = current_width; item->row = row; item->col = col; col += colspan; } last_item = items; /* Now go through the row again and align the icons */ for (items = first_item; items != last_item; items = items->next) { item = EXO_ICON_VIEW_ITEM (items->data); exo_icon_view_calculate_item_size2 (icon_view, item, max_width, max_height); /* We may want to readjust the new y coordinate. */ if (item->area.y + item->area.height + focus_width + priv->row_spacing > *y) *y = item->area.y + item->area.height + focus_width + priv->row_spacing; if (G_UNLIKELY (rtl)) item->col = col - 1 - item->col; } return last_item; } static GList* exo_icon_view_layout_single_col (ExoIconView *icon_view, GList *first_item, gint item_height, gint col, gint *x, gint *maximum_height, gint max_rows) { ExoIconViewPrivate *priv = icon_view->priv; ExoIconViewItem *item; GList *items = first_item; GList *last_item; gint *max_width; gint *max_height; gint focus_width; gint current_height; gint rowspan; gint row = 0; gint y; gint i; GtkAllocation allocation; max_width = g_newa (gint, priv->n_cells); max_height = g_newa (gint, priv->n_cells); for (i = priv->n_cells; --i >= 0; ) { max_width[i] = 0; max_height[i] = 0; } gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_width, NULL); gtk_widget_get_allocation (GTK_WIDGET (icon_view), &allocation); y = priv->margin + focus_width; current_height = 2 * (priv->margin + focus_width); for (items = first_item; items != NULL; items = items->next) { item = EXO_ICON_VIEW_ITEM (items->data); exo_icon_view_calculate_item_size (icon_view, item); rowspan = 1 + (item->area.height - 1) / (item_height + priv->row_spacing); item->area.height = rowspan * item_height + (rowspan - 1) * priv->row_spacing; current_height += item->area.height + priv->row_spacing + 2 * focus_width; if (G_LIKELY (items != first_item)) { if (current_height >= allocation.height || (max_rows > 0 && row >= max_rows)) break; } item->area.y = y + focus_width; item->area.x = *x; y = current_height - (priv->margin + focus_width); for (i = 0; i < priv->n_cells; i++) { max_width[i] = MAX (max_width[i], item->box[i].width); max_height[i] = MAX (max_height[i], item->box[i].height); } if (current_height > *maximum_height) *maximum_height = current_height; item->row = row; item->col = col; row += rowspan; } last_item = items; /* Now go through the column again and align the icons */ for (items = first_item; items != last_item; items = items->next) { item = EXO_ICON_VIEW_ITEM (items->data); exo_icon_view_calculate_item_size2 (icon_view, item, max_width, max_height); /* We may want to readjust the new x coordinate. */ if (item->area.x + item->area.width + focus_width + priv->column_spacing > *x) *x = item->area.x + item->area.width + focus_width + priv->column_spacing; } return last_item; } static void exo_icon_view_set_adjustment_upper (GtkAdjustment *adj, gdouble upper) { if (upper != gtk_adjustment_get_upper(adj)) { gdouble min = MAX (0.0, upper - gtk_adjustment_get_page_size(adj)); gboolean value_changed = FALSE; gtk_adjustment_set_upper(adj, upper); if (gtk_adjustment_get_value(adj) > min) { gtk_adjustment_set_value(adj, min); value_changed = TRUE; } gtk_adjustment_changed (adj); if (value_changed) gtk_adjustment_value_changed (adj); } } static gint exo_icon_view_layout_cols (ExoIconView *icon_view, gint item_height, gint *x, gint *maximum_height, gint max_rows) { GList *icons = icon_view->priv->items; GList *items; gboolean rtl; gint col = 0; gint rows = 0; gint shift; rtl = (gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL); shift = icon_view->priv->margin; *x = shift; do { items = icons; /* it will be used below */ icons = exo_icon_view_layout_single_col (icon_view, icons, item_height, col, &shift, maximum_height, max_rows); if (rtl) { GList *items2; ExoIconViewItem *item; gint i; /* update width */ shift -= icon_view->priv->margin; /* width of the new column */ *x += shift; /* shift all previous items to right so new column will be left one */ if (items) for (items2 = icon_view->priv->items; items2 != items; items2 = items2->next) { item = EXO_ICON_VIEW_ITEM (items2->data); item->area.x += shift; for (i = 0; i < icon_view->priv->n_cells; i++) item->box[i].x += shift; } /* prepare for the next col */ shift = icon_view->priv->margin; } else *x = shift; /* count the number of rows in the first column */ if (G_UNLIKELY (col == 0)) { for (items = icon_view->priv->items, rows = 0; items != icons; items = items->next, ++rows) ; } col++; } while (icons != NULL); *x += icon_view->priv->margin; icon_view->priv->cols = col; return rows; } static gint exo_icon_view_layout_rows (ExoIconView *icon_view, gint item_width, gint *y, gint *maximum_width, gint max_cols) { GList *icons = icon_view->priv->items; GList *items; gint row = 0; gint cols = 0; *y = icon_view->priv->margin; do { icons = exo_icon_view_layout_single_row (icon_view, icons, item_width, row, y, maximum_width, max_cols); /* count the number of columns in the first row */ if (G_UNLIKELY (row == 0)) { for (items = icon_view->priv->items, cols = 0; items != icons; items = items->next, ++cols) ; } row++; } while (icons != NULL); *y += icon_view->priv->margin; icon_view->priv->rows = row; return cols; } static void exo_icon_view_layout (ExoIconView *icon_view) { ExoIconViewPrivate *priv = icon_view->priv; ExoIconViewItem *item; GList *icons; gint maximum_height = 0; gint maximum_width = 0; gint item_height; gint item_width; gint rows, cols; gint x, y; GtkAllocation allocation; #if GTK_CHECK_VERSION(2, 20, 0) GtkRequisition requisition; #endif /* verify that we still have a valid model */ if (G_UNLIKELY (priv->model == NULL)) return; gtk_widget_get_allocation (GTK_WIDGET (icon_view), &allocation); /* determine the layout mode */ if (G_LIKELY (priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS)) { /* calculate item sizes on-demand */ item_width = priv->item_width; if (item_width < 0) { for (icons = priv->items; icons != NULL; icons = icons->next) { item = icons->data; exo_icon_view_calculate_item_size (icon_view, item); item_width = MAX (item_width, item->area.width); } } cols = exo_icon_view_layout_rows (icon_view, item_width, &y, &maximum_width, 0); /* If, by adding another column, we increase the height of the icon view, thus forcing a * vertical scrollbar to appear that would prevent the last column from being able to fit, * we need to relayout the icons with one less column. */ if (cols == priv->cols + 1 && y > allocation.height && priv->height <= allocation.height) { cols = exo_icon_view_layout_rows (icon_view, item_width, &y, &maximum_width, priv->cols); } priv->width = maximum_width; priv->height = y; priv->cols = cols; } else { /* calculate item sizes on-demand */ for (icons = priv->items, item_height = 0; icons != NULL; icons = icons->next) { item = icons->data; exo_icon_view_calculate_item_size (icon_view, item); item_height = MAX (item_height, item->area.height); } rows = exo_icon_view_layout_cols (icon_view, item_height, &x, &maximum_height, 0); /* If, by adding another row, we increase the width of the icon view, thus forcing a * horizontal scrollbar to appear that would prevent the last row from being able to fit, * we need to relayout the icons with one less row. */ if (rows == priv->rows + 1 && x > allocation.width && priv->width <= allocation.width) { rows = exo_icon_view_layout_cols (icon_view, item_height, &x, &maximum_height, priv->rows); } else if (x < allocation.width && gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL) { /* shift items to align right border */ gint shift = allocation.width - x, i; for (icons = priv->items; icons != NULL; icons = icons->next) { item = icons->data; item->area.x += shift; for (i = 0; i < icon_view->priv->n_cells; i++) item->box[i].x += shift; } } priv->height = maximum_height; priv->width = x; priv->rows = rows; } exo_icon_view_set_adjustment_upper (priv->hadjustment, priv->width); exo_icon_view_set_adjustment_upper (priv->vadjustment, priv->height); #if GTK_CHECK_VERSION(2, 20, 0) gtk_widget_get_requisition (GTK_WIDGET (icon_view), &requisition); if (priv->width != requisition.width || priv->height != requisition.height) #else if (priv->width != GTK_WIDGET (icon_view)->requisition.width || priv->height != GTK_WIDGET (icon_view)->requisition.height) #endif gtk_widget_queue_resize_no_redraw (GTK_WIDGET (icon_view)); if (gtk_widget_get_realized (GTK_WIDGET(icon_view))) { gdk_window_resize (priv->bin_window, MAX (priv->width, allocation.width), MAX (priv->height, allocation.height)); } /* drop any pending layout idle source */ if (priv->layout_idle_id != 0) g_source_remove (priv->layout_idle_id); gtk_widget_queue_draw (GTK_WIDGET (icon_view)); } static void exo_icon_view_get_cell_area (ExoIconView *icon_view, ExoIconViewItem *item, ExoIconViewCellInfo *info, GdkRectangle *cell_area) { if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cell_area->x = item->box[info->position].x - item->before[info->position]; cell_area->y = item->area.y; cell_area->width = item->box[info->position].width + item->before[info->position] + item->after[info->position]; cell_area->height = item->area.height; } else { cell_area->x = item->area.x; cell_area->y = item->box[info->position].y - item->before[info->position]; cell_area->width = item->area.width; cell_area->height = item->box[info->position].height + item->before[info->position] + item->after[info->position]; } } static void exo_icon_view_calculate_item_size (ExoIconView *icon_view, ExoIconViewItem *item) { ExoIconViewCellInfo *info; GList *lp; gchar *buffer; #if GTK_CHECK_VERSION(3, 0, 0) GtkRequisition requisition; #endif if (G_LIKELY (item->area.width != -1)) return; if (G_UNLIKELY (item->n_cells != icon_view->priv->n_cells)) { /* apply the new cell size */ item->n_cells = icon_view->priv->n_cells; /* release the memory chunk (if any) */ g_free (item->box); /* allocate a single memory chunk for box, after and before */ buffer = g_malloc0 (item->n_cells * (sizeof (GdkRectangle) + 2 * sizeof (gint))); /* assign the memory */ item->box = (GdkRectangle *) buffer; item->after = (gint *) (buffer + item->n_cells * sizeof (GdkRectangle)); item->before = item->after + item->n_cells; } exo_icon_view_set_cell_data (icon_view, item); item->area.width = 0; item->area.height = 0; for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) { info = EXO_ICON_VIEW_CELL_INFO (lp->data); if (G_UNLIKELY (!gtk_cell_renderer_get_visible(info->cell))) continue; #if GTK_CHECK_VERSION(3, 0, 0) gtk_cell_renderer_get_preferred_size (info->cell, GTK_WIDGET (icon_view), NULL, &requisition); item->box[info->position].width = requisition.width; item->box[info->position].height = requisition.height; #else gtk_cell_renderer_get_size (info->cell, GTK_WIDGET (icon_view), NULL, NULL, NULL, &item->box[info->position].width, &item->box[info->position].height); #endif if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) { item->area.width += item->box[info->position].width + (info->position > 0 ? icon_view->priv->spacing : 0); item->area.height = MAX (item->area.height, item->box[info->position].height); } else { item->area.width = MAX (item->area.width, item->box[info->position].width); item->area.height += item->box[info->position].height + (info->position > 0 ? icon_view->priv->spacing : 0); } } } static void exo_icon_view_calculate_item_size2 (ExoIconView *icon_view, ExoIconViewItem *item, gint *max_width, gint *max_height) { ExoIconViewCellInfo *info; GdkRectangle *box; GdkRectangle cell_area; gboolean rtl; GList *lp; gint spacing; gint i, k; gint xpad, ypad; gfloat xalign, yalign; rtl = (gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL); spacing = icon_view->priv->spacing; if (G_LIKELY (icon_view->priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS)) { item->area.height = 0; for (i = 0; i < icon_view->priv->n_cells; ++i) { if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) item->area.height = MAX (item->area.height, max_height[i]); else item->area.height += max_height[i] + (i > 0 ? spacing : 0); } } else { item->area.width = 0; for (i = 0; i < icon_view->priv->n_cells; ++i) { if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) item->area.width += max_width[i] + (i > 0 ? spacing : 0); else item->area.width = MAX (item->area.width, max_width[i]); } } cell_area.x = item->area.x; cell_area.y = item->area.y; for (k = 0; k < 2; ++k) { for (lp = icon_view->priv->cell_list, i = 0; lp != NULL; lp = lp->next, ++i) { info = EXO_ICON_VIEW_CELL_INFO (lp->data); if (G_UNLIKELY (!gtk_cell_renderer_get_visible(info->cell) || info->pack == (k ? GTK_PACK_START : GTK_PACK_END))) continue; if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cell_area.width = item->box[info->position].width; cell_area.height = item->area.height; } else { cell_area.width = item->area.width; cell_area.height = max_height[i]; } box = item->box + info->position; gtk_cell_renderer_get_alignment (info->cell, &xalign, &yalign); gtk_cell_renderer_get_padding (info->cell, &xpad, &ypad); box->x = cell_area.x + (rtl ? (1.0 - xalign) : xalign) * (cell_area.width - box->width - (2 * xpad)); box->x = MAX (box->x, 0); box->y = cell_area.y + yalign * (cell_area.height - box->height - (2 * ypad)); box->y = MAX (box->y, 0); if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) { item->before[info->position] = item->box[info->position].x - cell_area.x; item->after[info->position] = cell_area.width - item->box[info->position].width - item->before[info->position]; cell_area.x += cell_area.width + spacing; } else { if (item->box[info->position].width > item->area.width) { item->area.width = item->box[info->position].width; cell_area.width = item->area.width; } item->before[info->position] = item->box[info->position].y - cell_area.y; item->after[info->position] = cell_area.height - item->box[info->position].height - item->before[info->position]; cell_area.y += cell_area.height + spacing; } } } if (G_UNLIKELY (rtl && icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL)) { for (i = 0; i < icon_view->priv->n_cells; i++) item->box[i].x = item->area.x + item->area.width - (item->box[i].x + item->box[i].width - item->area.x); } } static void exo_icon_view_invalidate_sizes (ExoIconView *icon_view) { GList *lp; for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) EXO_ICON_VIEW_ITEM (lp->data)->area.width = -1; exo_icon_view_queue_layout (icon_view); } static void exo_icon_view_paint_item (ExoIconView *icon_view, ExoIconViewItem *item, GdkRectangle *area, #if GTK_CHECK_VERSION(3, 0, 0) cairo_t *drawable, #else GdkDrawable *drawable, #endif gint x, gint y, gboolean draw_focus) { GtkCellRendererState flags; ExoIconViewCellInfo *info; //GtkStateType state; GdkRectangle cell_area; //gboolean rtl; GList *lp; if (G_UNLIKELY (icon_view->priv->model == NULL)) return; exo_icon_view_set_cell_data (icon_view, item); //rtl = gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL; if (item->selected) { flags = GTK_CELL_RENDERER_SELECTED; //state = gtk_widget_has_focus (icon_view) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE; #if 0 /* FIXME We hardwire background drawing behind text cell renderers * here. This is ugly, but it's done to be consistent with GtkIconView. * The additional info->is_text attribute is used for performance * optimization and should be removed alongside the following code. */ cr = gdk_cairo_create (drawable); for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) { info = EXO_ICON_VIEW_CELL_INFO (lp->data); if (G_UNLIKELY (!gtk_cell_renderer_get_visible(info->cell))) continue; if (info->is_text) { exo_icon_view_get_cell_area (icon_view, item, info, &cell_area); x_0 = x - item->area.x + cell_area.x; y_0 = x - item->area.x + cell_area.y; x_1 = x_0 + cell_area.width; y_1 = y_0 + cell_area.height; cairo_move_to (cr, x_0 + 5, y_0); cairo_line_to (cr, x_1 - 5, y_0); cairo_curve_to (cr, x_1 - 5, y_0, x_1, y_0, x_1, y_0 + 5); cairo_line_to (cr, x_1, y_1 - 5); cairo_curve_to (cr, x_1, y_1 - 5, x_1, y_1, x_1 - 5, y_1); cairo_line_to (cr, x_0 + 5, y_1); cairo_curve_to (cr, x_0 + 5, y_1, x_0, y_1, x_0, y_1 - 5); cairo_line_to (cr, x_0, y_0 + 5); cairo_curve_to (cr, x_0, y_0 + 5, x_0, y_0, x_0 + 5, y_0); gdk_cairo_set_source_color (cr, >K_WIDGET (icon_view)->style->base[state]); cairo_fill (cr); } } cairo_destroy (cr); /* FIXME Ugly code ends here */ #endif } else { flags = 0; //state = GTK_STATE_NORMAL; } if (G_UNLIKELY (icon_view->priv->prelit_item == item)) flags |= GTK_CELL_RENDERER_PRELIT; if (G_UNLIKELY (EXO_ICON_VIEW_FLAG_SET (icon_view, EXO_ICON_VIEW_DRAW_KEYFOCUS) && icon_view->priv->cursor_item == item)) flags |= GTK_CELL_RENDERER_FOCUSED; #ifdef DEBUG_ICON_VIEW gdk_draw_rectangle (drawable, GTK_WIDGET (icon_view)->style->black_gc, FALSE, x, y, item->area.width, item->area.height); #endif for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) { info = EXO_ICON_VIEW_CELL_INFO (lp->data); if (G_UNLIKELY (!gtk_cell_renderer_get_visible(info->cell))) continue; exo_icon_view_get_cell_area (icon_view, item, info, &cell_area); #ifdef DEBUG_ICON_VIEW gdk_draw_rectangle (drawable, GTK_WIDGET (icon_view)->style->black_gc, FALSE, x - item->area.x + cell_area.x, y - item->area.y + cell_area.y, cell_area.width, cell_area.height); gdk_draw_rectangle (drawable, GTK_WIDGET (icon_view)->style->black_gc, FALSE, x - item->area.x + item->box[info->position].x, y - item->area.y + item->box[info->position].y, item->box[info->position].width, item->box[info->position].height); #endif cell_area.x = x - item->area.x + cell_area.x; cell_area.y = y - item->area.y + cell_area.y; gtk_cell_renderer_render (info->cell, drawable, GTK_WIDGET (icon_view), &cell_area, &cell_area, #if !GTK_CHECK_VERSION(3, 0, 0) area, #endif flags); } } static void exo_icon_view_queue_draw_item (ExoIconView *icon_view, ExoIconViewItem *item) { GdkRectangle rect; gint focus_width; gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_width, NULL); rect.x = item->area.x - focus_width; rect.y = item->area.y - focus_width; rect.width = item->area.width + 2 * focus_width; rect.height = item->area.height + 2 * focus_width; if (icon_view->priv->bin_window) gdk_window_invalidate_rect (icon_view->priv->bin_window, &rect, TRUE); } static gboolean layout_callback (gpointer user_data) { ExoIconView *icon_view = EXO_ICON_VIEW (user_data); if(!g_source_is_destroyed(g_main_current_source())) exo_icon_view_layout (icon_view); return FALSE; } static void layout_destroy (gpointer user_data) { EXO_ICON_VIEW (user_data)->priv->layout_idle_id = 0; } static void exo_icon_view_queue_layout (ExoIconView *icon_view) { if (G_UNLIKELY (icon_view->priv->layout_idle_id == 0)) icon_view->priv->layout_idle_id = gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE, layout_callback, icon_view, layout_destroy); } static void exo_icon_view_set_cursor_item (ExoIconView *icon_view, ExoIconViewItem *item, gint cursor_cell) { AtkObject *obj; AtkObject *item_obj; AtkObject *cursor_item_obj; /* When hitting this path from keynav, the focus cell is * already set, we dont need to notify the atk object * but we still need to queue the draw here (in the case * that the focus cell changes but not the cursor item). */ exo_icon_view_queue_draw_item (icon_view, item); if (icon_view->priv->cursor_item == item && (cursor_cell < 0 || cursor_cell == icon_view->priv->cursor_cell)) return; obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view)); if (icon_view->priv->cursor_item != NULL) { exo_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item); if (obj != NULL) { cursor_item_obj = atk_object_ref_accessible_child (obj, icon_view->priv->cursor_item->index); if (cursor_item_obj != NULL) atk_object_notify_state_change (cursor_item_obj, ATK_STATE_FOCUSED, FALSE); } } icon_view->priv->cursor_item = item; if (cursor_cell >= 0) icon_view->priv->cursor_cell = cursor_cell; /* Notify that accessible focus object has changed */ item_obj = atk_object_ref_accessible_child (obj, item->index); if (item_obj != NULL) { #if !ATK_CHECK_VERSION(2, 9, 4) atk_focus_tracker_notify (item_obj); #endif atk_object_notify_state_change (item_obj, ATK_STATE_FOCUSED, TRUE); g_object_unref (item_obj); } } static ExoIconViewItem* exo_icon_view_get_item_at_coords (const ExoIconView *icon_view, gint x, gint y, gboolean only_in_cell, ExoIconViewCellInfo **cell_at_pos) { const ExoIconViewPrivate *priv = icon_view->priv; ExoIconViewCellInfo *info; ExoIconViewItem *item; GdkRectangle box; const GList *items; const GList *lp; for (items = priv->items; items != NULL; items = items->next) { item = items->data; if (x >= item->area.x - priv->row_spacing / 2 && x <= item->area.x + item->area.width + priv->row_spacing / 2 && y >= item->area.y - priv->column_spacing / 2 && y <= item->area.y + item->area.height + priv->column_spacing / 2) { if (only_in_cell || cell_at_pos) { exo_icon_view_set_cell_data (icon_view, item); for (lp = priv->cell_list; lp != NULL; lp = lp->next) { /* check if the cell is visible */ info = (ExoIconViewCellInfo *) lp->data; if (!gtk_cell_renderer_get_visible(info->cell)) continue; box = item->box[info->position]; if ((x >= box.x && x <= box.x + box.width && y >= box.y && y <= box.y + box.height) || (x >= box.x && x <= box.x + box.width && y >= box.y && y <= box.y + box.height)) { if (cell_at_pos != NULL) *cell_at_pos = info; return item; } } if (only_in_cell) return NULL; if (cell_at_pos != NULL) *cell_at_pos = NULL; } return item; } } return NULL; } static void exo_icon_view_select_item (ExoIconView *icon_view, ExoIconViewItem *item) { if (item->selected || icon_view->priv->selection_mode == GTK_SELECTION_NONE) return; else if (icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE) exo_icon_view_unselect_all_internal (icon_view); item->selected = TRUE; exo_icon_view_queue_draw_item (icon_view, item); exo_icon_view_item_selected_changed (icon_view, item); g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } static void exo_icon_view_unselect_item (ExoIconView *icon_view, ExoIconViewItem *item) { if (!item->selected) return; if (icon_view->priv->selection_mode == GTK_SELECTION_NONE || icon_view->priv->selection_mode == GTK_SELECTION_BROWSE) return; item->selected = FALSE; exo_icon_view_item_selected_changed (icon_view, item); g_signal_emit (G_OBJECT (icon_view), icon_view_signals[SELECTION_CHANGED], 0); exo_icon_view_queue_draw_item (icon_view, item); } static void verify_items (ExoIconView *icon_view) { GList *items; int i = 0; for (items = icon_view->priv->items; items; items = items->next) { ExoIconViewItem *item = items->data; if (item->index != i) g_error ("List item does not match its index: " "item index %d and list index %d\n", item->index, i); i++; } } static void exo_icon_view_row_changed (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, ExoIconView *icon_view) { ExoIconViewItem *item; item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); /* stop editing this item */ if (G_UNLIKELY (item == icon_view->priv->edited_item)) exo_icon_view_stop_editing (icon_view, TRUE); /* emit "selection-changed" if the item is selected */ if (G_UNLIKELY (item->selected)) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); /* recalculate layout (a value of -1 for width * indicates that the item needs to be layouted). */ item->area.width = -1; exo_icon_view_queue_layout (icon_view); verify_items (icon_view); } static void exo_icon_view_row_inserted (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, ExoIconView *icon_view) { ExoIconViewItem *item; GList *list; gint idx; idx = gtk_tree_path_get_indices (path)[0]; /* allocate the new item */ item = g_slice_new0 (ExoIconViewItem); item->iter = *iter; item->area.width = -1; item->index = idx; icon_view->priv->items = g_list_insert (icon_view->priv->items, item, idx); list = g_list_nth (icon_view->priv->items, idx + 1); for (; list; list = list->next) { item = list->data; item->index++; } verify_items (icon_view); /* recalculate the layout */ exo_icon_view_queue_layout (icon_view); } static void exo_icon_view_row_deleted (GtkTreeModel *model, GtkTreePath *path, ExoIconView *icon_view) { ExoIconViewItem *item; gboolean changed = FALSE; GList *list, *next; /* determine the position and the item for the path */ list = g_list_nth (icon_view->priv->items, gtk_tree_path_get_indices (path)[0]); next = list->next; item = list->data; if (G_UNLIKELY (item == icon_view->priv->edited_item)) exo_icon_view_stop_editing (icon_view, TRUE); /* use the next item (if any) as anchor, else use prev, otherwise reset anchor */ if (G_UNLIKELY (item == icon_view->priv->anchor_item)) icon_view->priv->anchor_item = (list->next != NULL) ? list->next->data : ((list->prev != NULL) ? list->prev->data : NULL); /* use the next item (if any) as cursor, else use prev, otherwise reset cursor */ if (G_UNLIKELY (item == icon_view->priv->cursor_item)) icon_view->priv->cursor_item = (list->next != NULL) ? list->next->data : ((list->prev != NULL) ? list->prev->data : NULL); if (G_UNLIKELY (item == icon_view->priv->prelit_item)) { /* reset the prelit item */ icon_view->priv->prelit_item = NULL; /* cancel any pending single click timer */ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); /* in single click mode, we also reset the cursor when realized */ if (G_UNLIKELY (icon_view->priv->single_click && gtk_widget_get_realized (GTK_WIDGET(icon_view)))) gdk_window_set_cursor (icon_view->priv->bin_window, NULL); } /* check if the selection changed */ if (G_UNLIKELY (item->selected)) changed = TRUE; /* release the item resources */ g_free (item->box); /* drop the item from the list */ icon_view->priv->items = g_list_delete_link (icon_view->priv->items, list); /* release the item */ g_slice_free (ExoIconViewItem, item); /* update indices */ for (; next; next = next->next) { item = next->data; item->index--; } verify_items (icon_view); /* recalculate the layout */ exo_icon_view_queue_layout (icon_view); /* if we removed a previous selected item, we need * to tell others that we have a new selection. */ if (G_UNLIKELY (changed)) g_signal_emit (G_OBJECT (icon_view), icon_view_signals[SELECTION_CHANGED], 0); } static void exo_icon_view_rows_reordered (GtkTreeModel *model, GtkTreePath *parent, GtkTreeIter *iter, gint *new_order, ExoIconView *icon_view) { GList **list_array; GList *list; gint *order; gint length; gint i; /* cancel any editing attempt */ exo_icon_view_stop_editing (icon_view, TRUE); /* determine the number of items to reorder */ length = gtk_tree_model_iter_n_children (model, NULL); if (G_UNLIKELY (length == 0)) return; list_array = g_newa (GList *, length); order = g_newa (gint, length); for (i = 0; i < length; i++) order[new_order[i]] = i; for (i = 0, list = icon_view->priv->items; list != NULL; list = list->next, i++) list_array[order[i]] = list; /* hook up the first item */ icon_view->priv->items = list_array[0]; list_array[0]->prev = NULL; ((ExoIconViewItem*)list_array[0]->data)->index = 0; /* hook up the remaining items */ for (i = 1; i < length; ++i) { ((ExoIconViewItem*)list_array[i]->data)->index = i; list_array[i - 1]->next = list_array[i]; list_array[i]->prev = list_array[i - 1]; } /* hook up the last item */ list_array[length - 1]->next = NULL; exo_icon_view_queue_layout (icon_view); verify_items (icon_view); } static void exo_icon_view_add_move_binding (GtkBindingSet *binding_set, guint keyval, guint modmask, GtkMovementStep step, gint count) { gtk_binding_entry_add_signal (binding_set, keyval, modmask, "move-cursor", 2, G_TYPE_ENUM, step, G_TYPE_INT, count); /* skip shift+n and shift+p because this blocks type-ahead search. * see http://bugzilla.xfce.org/show_bug.cgi?id=4633 */ if (G_LIKELY (keyval != GDK_KEY_p && keyval != GDK_KEY_n)) gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK, "move-cursor", 2, G_TYPE_ENUM, step, G_TYPE_INT, count); if ((modmask & GDK_CONTROL_MASK) != GDK_CONTROL_MASK) { gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "move-cursor", 2, G_TYPE_ENUM, step, G_TYPE_INT, count); gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK, "move-cursor", 2, G_TYPE_ENUM, step, G_TYPE_INT, count); } } static gboolean exo_icon_view_real_move_cursor (ExoIconView *icon_view, GtkMovementStep step, gint count) { GdkModifierType state; _exo_return_val_if_fail (EXO_ICON_VIEW (icon_view), FALSE); _exo_return_val_if_fail (step == GTK_MOVEMENT_LOGICAL_POSITIONS || step == GTK_MOVEMENT_VISUAL_POSITIONS || step == GTK_MOVEMENT_DISPLAY_LINES || step == GTK_MOVEMENT_PAGES || step == GTK_MOVEMENT_BUFFER_ENDS, FALSE); if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) return FALSE; exo_icon_view_stop_editing (icon_view, FALSE); EXO_ICON_VIEW_SET_FLAG (icon_view, EXO_ICON_VIEW_DRAW_KEYFOCUS); gtk_widget_grab_focus (GTK_WIDGET (icon_view)); if (gtk_get_current_event_state (&state)) { if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) icon_view->priv->ctrl_pressed = TRUE; if ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) icon_view->priv->shift_pressed = TRUE; } /* else we assume not pressed */ switch (step) { case GTK_MOVEMENT_LOGICAL_POSITIONS: case GTK_MOVEMENT_VISUAL_POSITIONS: exo_icon_view_move_cursor_left_right (icon_view, count); break; case GTK_MOVEMENT_DISPLAY_LINES: exo_icon_view_move_cursor_up_down (icon_view, count); break; case GTK_MOVEMENT_PAGES: exo_icon_view_move_cursor_page_up_down (icon_view, count); break; case GTK_MOVEMENT_BUFFER_ENDS: exo_icon_view_move_cursor_start_end (icon_view, count); break; default: g_assert_not_reached (); } icon_view->priv->ctrl_pressed = FALSE; icon_view->priv->shift_pressed = FALSE; return TRUE; } static gint find_cell (ExoIconView *icon_view, ExoIconViewItem *item, gint cell, GtkOrientation orientation, gint step, gint *count) { gint n_focusable; gint *focusable; gint first_text; gint current; gint i, k; GList *l; if (icon_view->priv->orientation != orientation) return cell; exo_icon_view_set_cell_data (icon_view, item); focusable = g_new0 (gint, icon_view->priv->n_cells); n_focusable = 0; first_text = 0; current = 0; for (k = 0; k < 2; k++) for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++) { ExoIconViewCellInfo *info = (ExoIconViewCellInfo *)l->data; GtkCellRendererMode mode; if (info->pack == (k ? GTK_PACK_START : GTK_PACK_END)) continue; if (!gtk_cell_renderer_get_visible(info->cell)) continue; if (GTK_IS_CELL_RENDERER_TEXT (info->cell)) first_text = i; g_object_get(info->cell, "mode", &mode, NULL); if (mode != GTK_CELL_RENDERER_MODE_INERT) { if (cell == i) current = n_focusable; focusable[n_focusable] = i; n_focusable++; } } if (n_focusable == 0) focusable[n_focusable++] = first_text; if (cell < 0) { current = step > 0 ? 0 : n_focusable - 1; cell = focusable[current]; } if (current + *count < 0) { cell = -1; *count = current + *count; } else if (current + *count > n_focusable - 1) { cell = -1; *count = current + *count - (n_focusable - 1); } else { cell = focusable[current + *count]; *count = 0; } g_free (focusable); return cell; } static ExoIconViewItem * find_item_page_up_down (ExoIconView *icon_view, ExoIconViewItem *current, gint count) { GList *item = g_list_find (icon_view->priv->items, current); GList *next; gint col = current->col; gint y = current->area.y + count * gtk_adjustment_get_page_size(icon_view->priv->vadjustment); if (count > 0) { for (; item != NULL; item = item->next) { for (next = item->next; next; next = next->next) if (EXO_ICON_VIEW_ITEM (next->data)->col == col) break; if (next == NULL || EXO_ICON_VIEW_ITEM (next->data)->area.y > y) break; } } else { for (; item != NULL; item = item->prev) { for (next = item->prev; next; next = next->prev) if (EXO_ICON_VIEW_ITEM (next->data)->col == col) break; if (next == NULL || EXO_ICON_VIEW_ITEM (next->data)->area.y < y) break; } } return (item != NULL) ? item->data : NULL; } static gboolean exo_icon_view_select_all_between (ExoIconView *icon_view, ExoIconViewItem *anchor, ExoIconViewItem *cursor) { GList *items; ExoIconViewItem *item, *last; gboolean dirty = FALSE; for (items = icon_view->priv->items; items; items = items->next) { item = items->data; if (item == anchor) { last = cursor; break; } else if (item == cursor) { last = anchor; break; } } for (; items; items = items->next) { item = items->data; if (!item->selected) { dirty = TRUE; item->selected = TRUE; exo_icon_view_item_selected_changed (icon_view, item); } exo_icon_view_queue_draw_item (icon_view, item); if (item == last) break; } return dirty; } static void exo_icon_view_move_cursor_up_down (ExoIconView *icon_view, gint count) { ExoIconViewItem *item; gboolean dirty = FALSE; GList *list; gint cell = -1; gint step; if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) return; if (!icon_view->priv->cursor_item) { if (count > 0) list = icon_view->priv->items; else list = g_list_last (icon_view->priv->items); item = list ? list->data : NULL; } else { item = icon_view->priv->cursor_item; cell = icon_view->priv->cursor_cell; step = count > 0 ? 1 : -1; while (item) { cell = find_cell (icon_view, item, cell, GTK_ORIENTATION_VERTICAL, step, &count); if (count == 0) break; /* determine the list position for the item */ list = g_list_find (icon_view->priv->items, item); if (G_LIKELY (icon_view->priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS)) { /* determine the item in the next/prev row */ if (step > 0) { for (list = list->next; list != NULL; list = list->next) if (EXO_ICON_VIEW_ITEM (list->data)->row == item->row + step && EXO_ICON_VIEW_ITEM (list->data)->col == item->col) break; } else { for (list = list->prev; list != NULL; list = list->prev) if (EXO_ICON_VIEW_ITEM (list->data)->row == item->row + step && EXO_ICON_VIEW_ITEM (list->data)->col == item->col) break; } } else { list = (step > 0) ? list->next : list->prev; } /* check if we found a matching item */ item = (list != NULL) ? list->data : NULL; count = count - step; } } if (item == icon_view->priv->cursor_item) gtk_widget_error_bell (GTK_WIDGET (icon_view)); if (!item) return; if (icon_view->priv->ctrl_pressed || !icon_view->priv->shift_pressed || !icon_view->priv->anchor_item || icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE) icon_view->priv->anchor_item = item; exo_icon_view_set_cursor_item (icon_view, item, cell); if (!icon_view->priv->ctrl_pressed && icon_view->priv->selection_mode != GTK_SELECTION_NONE) { dirty = exo_icon_view_unselect_all_internal (icon_view); dirty = exo_icon_view_select_all_between (icon_view, icon_view->priv->anchor_item, item) || dirty; } exo_icon_view_scroll_to_item (icon_view, item); if (dirty) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } static void exo_icon_view_move_cursor_page_up_down (ExoIconView *icon_view, gint count) { ExoIconViewItem *item; gboolean dirty = FALSE; if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) return; if (!icon_view->priv->cursor_item) { GList *list; if (count > 0) list = icon_view->priv->items; else list = g_list_last (icon_view->priv->items); item = list ? list->data : NULL; } else item = find_item_page_up_down (icon_view, icon_view->priv->cursor_item, count); if (item == icon_view->priv->cursor_item) gtk_widget_error_bell (GTK_WIDGET (icon_view)); if (!item) return; if (icon_view->priv->ctrl_pressed || !icon_view->priv->shift_pressed || !icon_view->priv->anchor_item || icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE) icon_view->priv->anchor_item = item; exo_icon_view_set_cursor_item (icon_view, item, -1); if (!icon_view->priv->ctrl_pressed && icon_view->priv->selection_mode != GTK_SELECTION_NONE) { dirty = exo_icon_view_unselect_all_internal (icon_view); dirty = exo_icon_view_select_all_between (icon_view, icon_view->priv->anchor_item, item) || dirty; } exo_icon_view_scroll_to_item (icon_view, item); if (dirty) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } static void exo_icon_view_move_cursor_left_right (ExoIconView *icon_view, gint count) { ExoIconViewItem *item; gboolean dirty = FALSE; GList *list; gint cell = -1; gint step; if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) return; if (gtk_widget_get_direction (GTK_WIDGET (icon_view)) == GTK_TEXT_DIR_RTL) count *= -1; if (!icon_view->priv->cursor_item) { if (count > 0) list = icon_view->priv->items; else list = g_list_last (icon_view->priv->items); item = list ? list->data : NULL; } else { item = icon_view->priv->cursor_item; cell = icon_view->priv->cursor_cell; step = count > 0 ? 1 : -1; while (item) { cell = find_cell (icon_view, item, cell, GTK_ORIENTATION_HORIZONTAL, step, &count); if (count == 0) break; /* lookup the item in the list */ list = g_list_find (icon_view->priv->items, item); if (G_LIKELY (icon_view->priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS)) { /* determine the next/prev list item depending on step, * support wrapping around on the edges, as requested * in http://bugzilla.xfce.org/show_bug.cgi?id=1623. */ list = (step > 0) ? list->next : list->prev; } else { /* determine the item in the next/prev row */ if (step > 0) { for (list = list->next; list != NULL; list = list->next) if (EXO_ICON_VIEW_ITEM (list->data)->col == item->col + step && EXO_ICON_VIEW_ITEM (list->data)->row == item->row) break; } else { for (list = list->prev; list != NULL; list = list->prev) if (EXO_ICON_VIEW_ITEM (list->data)->col == item->col + step && EXO_ICON_VIEW_ITEM (list->data)->row == item->row) break; } } /* determine the item for the list position (if any) */ item = (list != NULL) ? list->data : NULL; count = count - step; } } if (item == icon_view->priv->cursor_item) gtk_widget_error_bell (GTK_WIDGET (icon_view)); if (!item) return; if (icon_view->priv->ctrl_pressed || !icon_view->priv->shift_pressed || !icon_view->priv->anchor_item || icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE) icon_view->priv->anchor_item = item; exo_icon_view_set_cursor_item (icon_view, item, cell); if (!icon_view->priv->ctrl_pressed && icon_view->priv->selection_mode != GTK_SELECTION_NONE) { dirty = exo_icon_view_unselect_all_internal (icon_view); dirty = exo_icon_view_select_all_between (icon_view, icon_view->priv->anchor_item, item) || dirty; } exo_icon_view_scroll_to_item (icon_view, item); if (dirty) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } static void exo_icon_view_move_cursor_start_end (ExoIconView *icon_view, gint count) { ExoIconViewItem *item; gboolean dirty = FALSE; GList *lp; if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) return; lp = (count < 0) ? icon_view->priv->items : g_list_last (icon_view->priv->items); item = lp ? EXO_ICON_VIEW_ITEM (lp->data) : NULL; if (item == icon_view->priv->cursor_item) gtk_widget_error_bell (GTK_WIDGET (icon_view)); if (G_UNLIKELY (item == NULL)) return; if (icon_view->priv->ctrl_pressed || !icon_view->priv->shift_pressed || !icon_view->priv->anchor_item || icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE) icon_view->priv->anchor_item = item; exo_icon_view_set_cursor_item (icon_view, item, -1); if (!icon_view->priv->ctrl_pressed && icon_view->priv->selection_mode != GTK_SELECTION_NONE) { dirty = exo_icon_view_unselect_all_internal (icon_view); dirty = exo_icon_view_select_all_between (icon_view, icon_view->priv->anchor_item, item) || dirty; } exo_icon_view_scroll_to_item (icon_view, item); if (G_UNLIKELY (dirty)) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } static void exo_icon_view_scroll_to_item (ExoIconView *icon_view, ExoIconViewItem *item) { gint x, y; gint focus_width; GtkAllocation allocation; GList *lp; GdkRectangle rect; gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_width, NULL); gtk_widget_get_allocation (GTK_WIDGET (icon_view), &allocation); gdk_window_get_position (icon_view->priv->bin_window, &x, &y); rect.x = item->area.x; rect.y = item->area.y; rect.width = rect.height = 0; for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) { ExoIconViewCellInfo *info = EXO_ICON_VIEW_CELL_INFO (lp->data); if (G_UNLIKELY (!gtk_cell_renderer_get_visible(info->cell))) continue; if (icon_view->priv->orientation == GTK_ORIENTATION_HORIZONTAL) { rect.width += item->box[info->position].width + (info->position > 0 ? icon_view->priv->spacing : 0); rect.height = MAX (rect.height, item->box[info->position].height); } else { rect.width = MAX (rect.width, item->box[info->position].width); rect.height += item->box[info->position].height + (info->position > 0 ? icon_view->priv->spacing : 0); } } if (y + rect.y - focus_width < 0) gtk_adjustment_set_value (icon_view->priv->vadjustment, gtk_adjustment_get_value(icon_view->priv->vadjustment) + y + rect.y - focus_width); else if (y + rect.y + rect.height + focus_width > allocation.height) gtk_adjustment_set_value (icon_view->priv->vadjustment, gtk_adjustment_get_value(icon_view->priv->vadjustment) + y + rect.y + rect.height + focus_width - allocation.height); if (x + rect.x - focus_width < 0) { gtk_adjustment_set_value (icon_view->priv->hadjustment, gtk_adjustment_get_value(icon_view->priv->hadjustment) + x + rect.x - focus_width); } else if (x + rect.x + rect.width + focus_width > allocation.width && rect.width < allocation.width) { /* the second condition above is to make sure that we don't scroll horizontally if the item * width is larger than the allocation width. Fixes a weird scrolling bug in the compact view. * See http://bugzilla.xfce.org/show_bug.cgi?id=1683 for details. */ gtk_adjustment_set_value (icon_view->priv->hadjustment, gtk_adjustment_get_value(icon_view->priv->hadjustment) + x + rect.x + rect.width + focus_width - allocation.width); } gtk_adjustment_changed (icon_view->priv->hadjustment); gtk_adjustment_changed (icon_view->priv->vadjustment); } static ExoIconViewCellInfo * exo_icon_view_get_cell_info (ExoIconView *icon_view, GtkCellRenderer *renderer) { GList *lp; for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) if (EXO_ICON_VIEW_CELL_INFO (lp->data)->cell == renderer) return lp->data; return NULL; } static void exo_icon_view_set_cell_data (const ExoIconView *icon_view, ExoIconViewItem *item) { ExoIconViewCellInfo *info; GtkTreePath *path; GtkTreeIter iter; GValue value = {0, }; GSList *slp; GList *lp; if (G_UNLIKELY (!EXO_ICON_VIEW_FLAG_SET (icon_view, EXO_ICON_VIEW_ITERS_PERSIST))) { path = gtk_tree_path_new_from_indices (item->index, -1); gtk_tree_model_get_iter (icon_view->priv->model, &iter, path); gtk_tree_path_free (path); } else { iter = item->iter; } for (lp = icon_view->priv->cell_list; lp != NULL; lp = lp->next) { info = EXO_ICON_VIEW_CELL_INFO (lp->data); for (slp = info->attributes; slp != NULL && slp->next != NULL; slp = slp->next->next) { gtk_tree_model_get_value (icon_view->priv->model, &iter, GPOINTER_TO_INT (slp->next->data), &value); g_object_set_property (G_OBJECT (info->cell), slp->data, &value); g_value_unset (&value); } if (G_UNLIKELY (info->func != NULL)) (*info->func) (GTK_CELL_LAYOUT (icon_view), info->cell, icon_view->priv->model, &iter, info->func_data); } } static void free_cell_attributes (ExoIconViewCellInfo *info) { GSList *lp; for (lp = info->attributes; lp != NULL && lp->next != NULL; lp = lp->next->next) g_free (lp->data); g_slist_free (info->attributes); info->attributes = NULL; } static void free_cell_info (ExoIconViewCellInfo *info) { if (G_UNLIKELY (info->destroy != NULL)) (*info->destroy) (info->func_data); free_cell_attributes (info); g_object_unref (G_OBJECT (info->cell)); g_slice_free (ExoIconViewCellInfo, info); } static void exo_icon_view_cell_layout_pack_start (GtkCellLayout *layout, GtkCellRenderer *renderer, gboolean expand) { ExoIconViewCellInfo *info; ExoIconView *icon_view = EXO_ICON_VIEW (layout); _exo_return_if_fail (GTK_IS_CELL_RENDERER (renderer)); _exo_return_if_fail (exo_icon_view_get_cell_info (icon_view, renderer) == NULL); g_object_ref_sink (renderer); info = g_slice_new0 (ExoIconViewCellInfo); info->cell = renderer; info->expand = expand ? TRUE : FALSE; info->pack = GTK_PACK_START; info->position = icon_view->priv->n_cells; info->is_text = GTK_IS_CELL_RENDERER_TEXT (renderer); icon_view->priv->cell_list = g_list_append (icon_view->priv->cell_list, info); icon_view->priv->n_cells++; exo_icon_view_invalidate_sizes (icon_view); } static void exo_icon_view_cell_layout_pack_end (GtkCellLayout *layout, GtkCellRenderer *renderer, gboolean expand) { ExoIconViewCellInfo *info; ExoIconView *icon_view = EXO_ICON_VIEW (layout); _exo_return_if_fail (GTK_IS_CELL_RENDERER (renderer)); _exo_return_if_fail (exo_icon_view_get_cell_info (icon_view, renderer) == NULL); g_object_ref_sink (renderer); info = g_slice_new0 (ExoIconViewCellInfo); info->cell = renderer; info->expand = expand ? TRUE : FALSE; info->pack = GTK_PACK_END; info->position = icon_view->priv->n_cells; info->is_text = GTK_IS_CELL_RENDERER_TEXT (renderer); icon_view->priv->cell_list = g_list_append (icon_view->priv->cell_list, info); icon_view->priv->n_cells++; exo_icon_view_invalidate_sizes (icon_view); } static void exo_icon_view_cell_layout_add_attribute (GtkCellLayout *layout, GtkCellRenderer *renderer, const gchar *attribute, gint column) { ExoIconViewCellInfo *info; info = exo_icon_view_get_cell_info (EXO_ICON_VIEW (layout), renderer); if (G_LIKELY (info != NULL)) { info->attributes = g_slist_prepend (info->attributes, GINT_TO_POINTER (column)); info->attributes = g_slist_prepend (info->attributes, g_strdup (attribute)); exo_icon_view_invalidate_sizes (EXO_ICON_VIEW (layout)); } } static void exo_icon_view_cell_layout_clear (GtkCellLayout *layout) { ExoIconView *icon_view = EXO_ICON_VIEW (layout); g_list_foreach (icon_view->priv->cell_list, (GFunc) free_cell_info, NULL); g_list_free (icon_view->priv->cell_list); icon_view->priv->cell_list = NULL; icon_view->priv->n_cells = 0; exo_icon_view_invalidate_sizes (icon_view); } static void exo_icon_view_cell_layout_set_cell_data_func (GtkCellLayout *layout, GtkCellRenderer *cell, GtkCellLayoutDataFunc func, gpointer func_data, GDestroyNotify destroy) { ExoIconViewCellInfo *info; GDestroyNotify notify; info = exo_icon_view_get_cell_info (EXO_ICON_VIEW (layout), cell); if (G_LIKELY (info != NULL)) { if (G_UNLIKELY (info->destroy != NULL)) { notify = info->destroy; info->destroy = NULL; (*notify) (info->func_data); } info->func = func; info->func_data = func_data; info->destroy = destroy; exo_icon_view_invalidate_sizes (EXO_ICON_VIEW (layout)); } } static void exo_icon_view_cell_layout_clear_attributes (GtkCellLayout *layout, GtkCellRenderer *renderer) { ExoIconViewCellInfo *info; info = exo_icon_view_get_cell_info (EXO_ICON_VIEW (layout), renderer); if (G_LIKELY (info != NULL)) { free_cell_attributes (info); exo_icon_view_invalidate_sizes (EXO_ICON_VIEW (layout)); } } static void exo_icon_view_cell_layout_reorder (GtkCellLayout *layout, GtkCellRenderer *cell, gint position) { ExoIconViewCellInfo *info; ExoIconView *icon_view = EXO_ICON_VIEW (layout); GList *lp; gint n; icon_view = EXO_ICON_VIEW (layout); info = exo_icon_view_get_cell_info (icon_view, cell); if (G_LIKELY (info != NULL)) { lp = g_list_find (icon_view->priv->cell_list, info); icon_view->priv->cell_list = g_list_remove_link (icon_view->priv->cell_list, lp); icon_view->priv->cell_list = g_list_insert (icon_view->priv->cell_list, info, position); for (lp = icon_view->priv->cell_list, n = 0; lp != NULL; lp = lp->next, ++n) EXO_ICON_VIEW_CELL_INFO (lp->data)->position = n; exo_icon_view_invalidate_sizes (icon_view); } } /** * exo_icon_view_new: * * Creates a new #ExoIconView widget * * Return value: A newly created #ExoIconView widget **/ GtkWidget* exo_icon_view_new (void) { return g_object_new (EXO_TYPE_ICON_VIEW, NULL); } /** * exo_icon_view_new_with_model: * @model: The model. * * Creates a new #ExoIconView widget with the model @model. * * Return value: A newly created #ExoIconView widget. **/ GtkWidget* exo_icon_view_new_with_model (GtkTreeModel *model) { g_return_val_if_fail (model == NULL || GTK_IS_TREE_MODEL (model), NULL); return g_object_new (EXO_TYPE_ICON_VIEW, "model", model, NULL); } /** * exo_icon_view_widget_to_icon_coords: * @icon_view : a #ExoIconView. * @wx : widget x coordinate. * @wy : widget y coordinate. * @ix : return location for icon x coordinate or %NULL. * @iy : return location for icon y coordinate or %NULL. * * Converts widget coordinates to coordinates for the icon window * (the full scrollable area of the icon view). **/ void exo_icon_view_widget_to_icon_coords (const ExoIconView *icon_view, gint wx, gint wy, gint *ix, gint *iy) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (ix != NULL)) *ix = wx + gtk_adjustment_get_value(icon_view->priv->hadjustment); if (G_LIKELY (iy != NULL)) *iy = wy + gtk_adjustment_get_value(icon_view->priv->vadjustment); } /** * exo_icon_view_icon_to_widget_coords: * @icon_view : a #ExoIconView. * @ix : icon x coordinate. * @iy : icon y coordinate. * @wx : return location for widget x coordinate or %NULL. * @wy : return location for widget y coordinate or %NULL. * * Converts icon view coordinates (coordinates in full scrollable * area of the icon view) to widget coordinates. **/ void exo_icon_view_icon_to_widget_coords (const ExoIconView *icon_view, gint ix, gint iy, gint *wx, gint *wy) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (wx != NULL)) *wx = ix - gtk_adjustment_get_value(icon_view->priv->hadjustment); if (G_LIKELY (wy != NULL)) *wy = iy - gtk_adjustment_get_value(icon_view->priv->vadjustment); } /** * exo_icon_view_get_path_at_pos: * @icon_view : A #ExoIconView. * @x : The x position to be identified * @y : The y position to be identified * * Finds the path at the point (@x, @y), relative to widget coordinates. * See exo_icon_view_get_item_at_pos(), if you are also interested in * the cell at the specified position. * * Return value: The #GtkTreePath corresponding to the icon or %NULL * if no icon exists at that position. **/ GtkTreePath* exo_icon_view_get_path_at_pos (const ExoIconView *icon_view, gint x, gint y) { ExoIconViewItem *item; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL); /* translate the widget coordinates to icon window coordinates */ x += gtk_adjustment_get_value(icon_view->priv->hadjustment); y += gtk_adjustment_get_value(icon_view->priv->vadjustment); item = exo_icon_view_get_item_at_coords (icon_view, x, y, TRUE, NULL); return (item != NULL) ? gtk_tree_path_new_from_indices (item->index, -1) : NULL; } /** * exo_icon_view_get_item_at_pos: * @icon_view: A #ExoIconView. * @x: The x position to be identified * @y: The y position to be identified * @path: Return location for the path, or %NULL * @cell: Return location for the renderer responsible for the cell * at (@x, @y), or %NULL * * Finds the path at the point (@x, @y), relative to widget coordinates. * In contrast to exo_icon_view_get_path_at_pos(), this function also * obtains the cell at the specified position. The returned path should * be freed with gtk_tree_path_free(). * * Return value: %TRUE if an item exists at the specified position * * Since: 0.3.1 **/ gboolean exo_icon_view_get_item_at_pos (const ExoIconView *icon_view, gint x, gint y, GtkTreePath **path, GtkCellRenderer **cell) { ExoIconViewCellInfo *info = NULL; ExoIconViewItem *item; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); item = exo_icon_view_get_item_at_coords (icon_view, x, y, TRUE, &info); if (G_LIKELY (path != NULL)) *path = (item != NULL) ? gtk_tree_path_new_from_indices (item->index, -1) : NULL; if (G_LIKELY (cell != NULL)) *cell = (info != NULL) ? info->cell : NULL; return (item != NULL); } /** * exo_icon_view_get_visible_range: * @icon_view : A #ExoIconView * @start_path : Return location for start of region, or %NULL * @end_path : Return location for end of region, or %NULL * * Sets @start_path and @end_path to be the first and last visible path. * Note that there may be invisible paths in between. * * Both paths should be freed with gtk_tree_path_free() after use. * * Return value: %TRUE, if valid paths were placed in @start_path and @end_path * * Since: 0.3.1 **/ gboolean exo_icon_view_get_visible_range (const ExoIconView *icon_view, GtkTreePath **start_path, GtkTreePath **end_path) { const ExoIconViewPrivate *priv = icon_view->priv; const ExoIconViewItem *item; const GList *lp; gint start_index = -1; gint end_index = -1; gint i; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); if (priv->hadjustment == NULL || priv->vadjustment == NULL) return FALSE; if (start_path == NULL && end_path == NULL) return FALSE; for (i = 0, lp = priv->items; lp != NULL; ++i, lp = lp->next) { item = (const ExoIconViewItem *) lp->data; if ((item->area.x + item->area.width >= (gint) gtk_adjustment_get_value(priv->hadjustment)) && (item->area.y + item->area.height >= (gint) gtk_adjustment_get_value(priv->vadjustment)) && (item->area.x <= (gint) (gtk_adjustment_get_value(priv->hadjustment) + gtk_adjustment_get_page_size(priv->hadjustment))) && (item->area.y <= (gint) (gtk_adjustment_get_value(priv->vadjustment) + gtk_adjustment_get_page_size(priv->vadjustment)))) { if (start_index == -1) start_index = i; end_index = i; } } if (start_path != NULL && start_index != -1) *start_path = gtk_tree_path_new_from_indices (start_index, -1); if (end_path != NULL && end_index != -1) *end_path = gtk_tree_path_new_from_indices (end_index, -1); return (start_index != -1); } /** * exo_icon_view_selected_foreach: * @icon_view : A #ExoIconView. * @func : The funcion to call for each selected icon. * @data : User data to pass to the function. * * Calls a function for each selected icon. Note that the model or * selection cannot be modified from within this function. **/ void exo_icon_view_selected_foreach (ExoIconView *icon_view, ExoIconViewForeachFunc func, gpointer data) { GtkTreePath *path; GList *lp; path = gtk_tree_path_new_first (); for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) { if (EXO_ICON_VIEW_ITEM (lp->data)->selected) (*func) (icon_view, path, data); gtk_tree_path_next (path); } gtk_tree_path_free (path); } /** * exo_icon_view_get_selection_mode: * @icon_view : A #ExoIconView. * * Gets the selection mode of the @icon_view. * * Return value: the current selection mode **/ GtkSelectionMode exo_icon_view_get_selection_mode (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), GTK_SELECTION_SINGLE); return icon_view->priv->selection_mode; } /** * exo_icon_view_set_selection_mode: * @icon_view : A #ExoIconView. * @mode : The selection mode * * Sets the selection mode of the @icon_view. **/ void exo_icon_view_set_selection_mode (ExoIconView *icon_view, GtkSelectionMode mode) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (mode != icon_view->priv->selection_mode)) { if (mode == GTK_SELECTION_NONE || icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE) exo_icon_view_unselect_all (icon_view); icon_view->priv->selection_mode = mode; g_object_notify (G_OBJECT (icon_view), "selection-mode"); } } /** * exo_icon_view_get_layout_mode: * @icon_view : A #ExoIconView. * * Returns the #ExoIconViewLayoutMode used to layout the * items in the @icon_view. * * Return value: the layout mode of @icon_view. * * Since: 0.3.1.5 **/ ExoIconViewLayoutMode exo_icon_view_get_layout_mode (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), EXO_ICON_VIEW_LAYOUT_ROWS); return icon_view->priv->layout_mode; } /** * exo_icon_view_set_layout_mode: * @icon_view : a #ExoIconView. * @layout_mode : the new #ExoIconViewLayoutMode for @icon_view. * * Sets the layout mode of @icon_view to @layout_mode. * * Since: 0.3.1.5 **/ void exo_icon_view_set_layout_mode (ExoIconView *icon_view, ExoIconViewLayoutMode layout_mode) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); /* check if we have a new setting */ if (G_LIKELY (icon_view->priv->layout_mode != layout_mode)) { /* apply the new setting */ icon_view->priv->layout_mode = layout_mode; /* cancel any active cell editor */ exo_icon_view_stop_editing (icon_view, TRUE); /* invalidate the current item sizes */ exo_icon_view_invalidate_sizes (icon_view); exo_icon_view_queue_layout (icon_view); /* notify listeners */ g_object_notify (G_OBJECT (icon_view), "layout-mode"); } } /** * exo_icon_view_get_model: * @icon_view : a #ExoIconView * * Returns the model the #ExoIconView is based on. Returns %NULL if the * model is unset. * * Return value: A #GtkTreeModel, or %NULL if none is currently being used. **/ GtkTreeModel* exo_icon_view_get_model (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL); return icon_view->priv->model; } /** * exo_icon_view_set_model: * @icon_view : A #ExoIconView. * @model : The model. * * Sets the model for a #ExoIconView. * If the @icon_view already has a model set, it will remove * it before setting the new model. If @model is %NULL, then * it will unset the old model. **/ void exo_icon_view_set_model (ExoIconView *icon_view, GtkTreeModel *model) { ExoIconViewItem *item; GtkTreeIter iter; GList *items = NULL; GList *lp; gint n; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model)); /* verify that we don't already use that model */ if (G_UNLIKELY (icon_view->priv->model == model)) return; /* verify the new model */ if (G_LIKELY (model != NULL)) { g_return_if_fail (gtk_tree_model_get_flags (model) & GTK_TREE_MODEL_LIST_ONLY); if (G_UNLIKELY (icon_view->priv->pixbuf_column != -1)) g_return_if_fail (gtk_tree_model_get_column_type (model, icon_view->priv->pixbuf_column) == GDK_TYPE_PIXBUF); if (G_UNLIKELY (icon_view->priv->text_column != -1)) g_return_if_fail (gtk_tree_model_get_column_type (model, icon_view->priv->text_column) == G_TYPE_STRING); if (G_UNLIKELY (icon_view->priv->markup_column != -1)) g_return_if_fail (gtk_tree_model_get_column_type (model, icon_view->priv->markup_column) == G_TYPE_STRING); } /* be sure to cancel any pending editor */ exo_icon_view_stop_editing (icon_view, TRUE); /* disconnect from the previous model */ if (G_LIKELY (icon_view->priv->model != NULL)) { /* disconnect signals handlers from the previous model */ g_signal_handlers_disconnect_by_func (G_OBJECT (icon_view->priv->model), exo_icon_view_row_changed, icon_view); g_signal_handlers_disconnect_by_func (G_OBJECT (icon_view->priv->model), exo_icon_view_row_inserted, icon_view); g_signal_handlers_disconnect_by_func (G_OBJECT (icon_view->priv->model), exo_icon_view_row_deleted, icon_view); g_signal_handlers_disconnect_by_func (G_OBJECT (icon_view->priv->model), exo_icon_view_rows_reordered, icon_view); /* release our reference on the model */ g_object_unref (G_OBJECT (icon_view->priv->model)); /* drop all items belonging to the previous model */ for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) { g_free (EXO_ICON_VIEW_ITEM (lp->data)->box); g_slice_free (ExoIconViewItem, lp->data); } g_list_free (icon_view->priv->items); icon_view->priv->items = NULL; /* reset statistics */ icon_view->priv->search_column = -1; icon_view->priv->anchor_item = NULL; icon_view->priv->cursor_item = NULL; icon_view->priv->prelit_item = NULL; icon_view->priv->last_single_clicked = NULL; icon_view->priv->width = 0; icon_view->priv->height = 0; /* cancel any pending single click timer */ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); /* reset cursor when in single click mode and realized */ if (G_UNLIKELY (icon_view->priv->single_click && gtk_widget_get_realized (GTK_WIDGET(icon_view)))) gdk_window_set_cursor (icon_view->priv->bin_window, NULL); } /* be sure to drop any previous scroll_to_path reference, * as it points to the old (no longer valid) model. */ if (G_UNLIKELY (icon_view->priv->scroll_to_path != NULL)) { gtk_tree_row_reference_free (icon_view->priv->scroll_to_path); icon_view->priv->scroll_to_path = NULL; } /* activate the new model */ icon_view->priv->model = model; /* connect to the new model */ if (G_LIKELY (model != NULL)) { /* take a reference on the model */ g_object_ref (G_OBJECT (model)); /* connect signals */ g_signal_connect (G_OBJECT (model), "row-changed", G_CALLBACK (exo_icon_view_row_changed), icon_view); g_signal_connect (G_OBJECT (model), "row-inserted", G_CALLBACK (exo_icon_view_row_inserted), icon_view); g_signal_connect (G_OBJECT (model), "row-deleted", G_CALLBACK (exo_icon_view_row_deleted), icon_view); g_signal_connect (G_OBJECT (model), "rows-reordered", G_CALLBACK (exo_icon_view_rows_reordered), icon_view); /* check if the new model supports persistent iterators */ if (gtk_tree_model_get_flags (model) & GTK_TREE_MODEL_ITERS_PERSIST) EXO_ICON_VIEW_SET_FLAG (icon_view, EXO_ICON_VIEW_ITERS_PERSIST); else EXO_ICON_VIEW_UNSET_FLAG (icon_view, EXO_ICON_VIEW_ITERS_PERSIST); /* determine an appropriate search column */ if (icon_view->priv->search_column <= 0) { /* we simply use the first string column */ for (n = 0; n < gtk_tree_model_get_n_columns (model); ++n) if (g_value_type_transformable (gtk_tree_model_get_column_type (model, n), G_TYPE_STRING)) { icon_view->priv->search_column = n; break; } } /* build up the initial items list */ if (gtk_tree_model_get_iter_first (model, &iter)) { n = 0; do { item = g_slice_new0 (ExoIconViewItem); item->iter = iter; item->area.width = -1; item->index = n++; items = g_list_prepend (items, item); } while (gtk_tree_model_iter_next (model, &iter)); } icon_view->priv->items = g_list_reverse (items); /* layout the new items */ exo_icon_view_queue_layout (icon_view); } /* hide the interactive search dialog (if any) */ if (G_LIKELY (icon_view->priv->search_window != NULL)) exo_icon_view_search_dialog_hide (icon_view->priv->search_window, icon_view); /* notify listeners */ g_object_notify (G_OBJECT (icon_view), "model"); if (gtk_widget_get_realized (GTK_WIDGET (icon_view))) gtk_widget_queue_resize (GTK_WIDGET (icon_view)); } static void update_text_cell (ExoIconView *icon_view) { ExoIconViewCellInfo *info; GList *l; gint i; if (icon_view->priv->text_column == -1 && icon_view->priv->markup_column == -1) { if (icon_view->priv->text_cell != -1) { info = g_list_nth_data (icon_view->priv->cell_list, icon_view->priv->text_cell); icon_view->priv->cell_list = g_list_remove (icon_view->priv->cell_list, info); free_cell_info (info); icon_view->priv->n_cells--; icon_view->priv->text_cell = -1; } } else { if (icon_view->priv->text_cell == -1) { GtkCellRenderer *cell = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_end (GTK_CELL_LAYOUT (icon_view), cell, FALSE); for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++) { info = l->data; if (info->cell == cell) { icon_view->priv->text_cell = i; break; } } } info = g_list_nth_data (icon_view->priv->cell_list, icon_view->priv->text_cell); if (icon_view->priv->markup_column != -1) gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view), info->cell, "markup", icon_view->priv->markup_column, NULL); else gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view), info->cell, "text", icon_view->priv->text_column, NULL); } } static void update_pixbuf_cell (ExoIconView *icon_view) { ExoIconViewCellInfo *info; GList *l; gint i; if (icon_view->priv->pixbuf_column == -1) { if (icon_view->priv->pixbuf_cell != -1) { info = g_list_nth_data (icon_view->priv->cell_list, icon_view->priv->pixbuf_cell); icon_view->priv->cell_list = g_list_remove (icon_view->priv->cell_list, info); free_cell_info (info); icon_view->priv->n_cells--; icon_view->priv->pixbuf_cell = -1; } } else { if (icon_view->priv->pixbuf_cell == -1) { GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (icon_view), cell, FALSE); for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++) { info = l->data; if (info->cell == cell) { icon_view->priv->pixbuf_cell = i; break; } } } info = g_list_nth_data (icon_view->priv->cell_list, icon_view->priv->pixbuf_cell); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (icon_view), info->cell, "pixbuf", icon_view->priv->pixbuf_column, NULL); } } /** * exo_icon_view_select_path: * @icon_view : A #ExoIconView. * @path : The #GtkTreePath to be selected. * * Selects the row at @path. **/ void exo_icon_view_select_path (ExoIconView *icon_view, GtkTreePath *path) { ExoIconViewItem *item; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (icon_view->priv->model != NULL); g_return_if_fail (gtk_tree_path_get_depth (path) > 0); item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); if (G_LIKELY (item != NULL)) exo_icon_view_select_item (icon_view, item); } /** * exo_icon_view_unselect_path: * @icon_view : A #ExoIconView. * @path : The #GtkTreePath to be unselected. * * Unselects the row at @path. **/ void exo_icon_view_unselect_path (ExoIconView *icon_view, GtkTreePath *path) { ExoIconViewItem *item; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (icon_view->priv->model != NULL); g_return_if_fail (gtk_tree_path_get_depth (path) > 0); item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); if (G_LIKELY (item != NULL)) exo_icon_view_unselect_item (icon_view, item); } /** * exo_icon_view_get_selected_items: * @icon_view: A #ExoIconView. * * Creates a list of paths of all selected items. Additionally, if you are * planning on modifying the model after calling this function, you may * want to convert the returned list into a list of #GtkTreeRowReferences. * To do this, you can use gtk_tree_row_reference_new(). * * To free the return value, use: * * g_list_foreach (list, gtk_tree_path_free, NULL); * g_list_free (list); * * * Return value: A #GList containing a #GtkTreePath for each selected row. **/ GList* exo_icon_view_get_selected_items (const ExoIconView *icon_view) { GList *selected = NULL; GList *lp; gint i; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL); for (i = 0, lp = icon_view->priv->items; lp != NULL; ++i, lp = lp->next) { if (EXO_ICON_VIEW_ITEM (lp->data)->selected) selected = g_list_append (selected, gtk_tree_path_new_from_indices (i, -1)); } return selected; } gint exo_icon_view_count_selected_items (const ExoIconView *icon_view) { GList *lp; gint i = 0; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), 0); for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) { if (EXO_ICON_VIEW_ITEM (lp->data)->selected) i++; } return i; } /** * exo_icon_view_select_all: * @icon_view : A #ExoIconView. * * Selects all the icons. @icon_view must has its selection mode set * to #GTK_SELECTION_MULTIPLE. **/ void exo_icon_view_select_all (ExoIconView *icon_view) { GList *items; gboolean dirty = FALSE; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE) return; for (items = icon_view->priv->items; items; items = items->next) { ExoIconViewItem *item = items->data; if (!item->selected) { dirty = TRUE; item->selected = TRUE; exo_icon_view_queue_draw_item (icon_view, item); } } if (dirty) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } /** * exo_icon_view_unselect_all: * @icon_view : A #ExoIconView. * * Unselects all the icons. **/ void exo_icon_view_unselect_all (ExoIconView *icon_view) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_UNLIKELY (icon_view->priv->selection_mode == GTK_SELECTION_BROWSE)) return; if (exo_icon_view_unselect_all_internal (icon_view)) g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); } /** * exo_icon_view_path_is_selected: * @icon_view: A #ExoIconView. * @path: A #GtkTreePath to check selection on. * * Returns %TRUE if the icon pointed to by @path is currently * selected. If @icon does not point to a valid location, %FALSE is returned. * * Return value: %TRUE if @path is selected. **/ gboolean exo_icon_view_path_is_selected (const ExoIconView *icon_view, GtkTreePath *path) { ExoIconViewItem *item; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); g_return_val_if_fail (icon_view->priv->model != NULL, FALSE); g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE); item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); return (item != NULL && item->selected); } /** * exo_icon_view_item_activated: * @icon_view : a #ExoIconView * @path : the #GtkTreePath to be activated * * Activates the item determined by @path. **/ void exo_icon_view_item_activated (ExoIconView *icon_view, GtkTreePath *path) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (gtk_tree_path_get_depth (path) > 0); g_signal_emit (icon_view, icon_view_signals[ITEM_ACTIVATED], 0, path); } /** * exo_icon_view_get_cursor: * @icon_view : A #ExoIconView * @path : Return location for the current cursor path, or %NULL * @cell : Return location the current focus cell, or %NULL * * Fills in @path and @cell with the current cursor path and cell. * If the cursor isn't currently set, then *@path will be %NULL. * If no cell currently has focus, then *@cell will be %NULL. * * The returned #GtkTreePath must be freed with gtk_tree_path_free(). * * Return value: %TRUE if the cursor is set. * * Since: 0.3.1 **/ gboolean exo_icon_view_get_cursor (const ExoIconView *icon_view, GtkTreePath **path, GtkCellRenderer **cell) { ExoIconViewCellInfo *info; ExoIconViewItem *item; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); item = icon_view->priv->cursor_item; info = (icon_view->priv->cursor_cell < 0) ? NULL : g_list_nth_data (icon_view->priv->cell_list, icon_view->priv->cursor_cell); if (G_LIKELY (path != NULL)) *path = (item != NULL) ? gtk_tree_path_new_from_indices (item->index, -1) : NULL; if (G_LIKELY (cell != NULL)) *cell = (info != NULL) ? info->cell : NULL; return (item != NULL); } /** * exo_icon_view_set_cursor: * @icon_view : a #ExoIconView * @path : a #GtkTreePath * @cell : a #GtkCellRenderer or %NULL * @start_editing : %TRUE if the specified cell should start being edited. * * Sets the current keyboard focus to be at @path, and selects it. This is * useful when you want to focus the user's attention on a particular item. * If @cell is not %NULL, then focus is given to the cell specified by * it. Additionally, if @start_editing is %TRUE, then editing should be * started in the specified cell. * * This function is often followed by gtk_widget_grab_focus * (icon_view) in order to give keyboard focus to the widget. * Please note that editing can only happen when the widget is realized. * * Since: 0.3.1 **/ void exo_icon_view_set_cursor (ExoIconView *icon_view, GtkTreePath *path, GtkCellRenderer *cell, gboolean start_editing) { ExoIconViewItem *item; ExoIconViewCellInfo *info = NULL; GList *l; gint i, cell_pos; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (path != NULL); g_return_if_fail (cell == NULL || GTK_IS_CELL_RENDERER (cell)); exo_icon_view_stop_editing (icon_view, TRUE); item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); if (G_UNLIKELY (item == NULL)) return; cell_pos = -1; for (l = icon_view->priv->cell_list, i = 0; l; l = l->next, i++) { info = l->data; if (info->cell == cell) { cell_pos = i; break; } info = NULL; } /* place the cursor on the item */ exo_icon_view_set_cursor_item (icon_view, item, cell_pos); icon_view->priv->anchor_item = item; /* scroll to the item (maybe delayed) */ exo_icon_view_scroll_to_path (icon_view, path, FALSE, 0.0f, 0.0f); if (start_editing) exo_icon_view_start_editing (icon_view, item, info, NULL); } /** * exo_icon_view_scroll_to_path: * @icon_view: A #ExoIconView. * @path: The path of the item to move to. * @use_align: whether to use alignment arguments, or %FALSE. * @row_align: The vertical alignment of the item specified by @path. * @col_align: The horizontal alignment of the item specified by @column. * * Moves the alignments of @icon_view to the position specified by @path. * @row_align determines where the row is placed, and @col_align determines where * @column is placed. Both are expected to be between 0.0 and 1.0. * 0.0 means left/top alignment, 1.0 means right/bottom alignment, 0.5 means center. * * If @use_align is %FALSE, then the alignment arguments are ignored, and the * tree does the minimum amount of work to scroll the item onto the screen. * This means that the item will be scrolled to the edge closest to its current * position. If the item is currently visible on the screen, nothing is done. * * This function only works if the model is set, and @path is a valid row on the * model. If the model changes before the @tree_view is realized, the centered * path will be modified to reflect this change. * * Since: 0.3.1 **/ void exo_icon_view_scroll_to_path (ExoIconView *icon_view, GtkTreePath *path, gboolean use_align, gfloat row_align, gfloat col_align) { ExoIconViewItem *item; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (gtk_tree_path_get_depth (path) > 0); g_return_if_fail (row_align >= 0.0 && row_align <= 1.0); g_return_if_fail (col_align >= 0.0 && col_align <= 1.0); /* Delay scrolling if either not realized or pending layout() */ if (!gtk_widget_get_realized (GTK_WIDGET (icon_view)) || icon_view->priv->layout_idle_id != 0) { /* release the previous scroll_to_path reference */ if (G_UNLIKELY (icon_view->priv->scroll_to_path != NULL)) gtk_tree_row_reference_free (icon_view->priv->scroll_to_path); /* remember a reference for the new path and settings */ icon_view->priv->scroll_to_path = gtk_tree_row_reference_new_proxy (G_OBJECT (icon_view), icon_view->priv->model, path); icon_view->priv->scroll_to_use_align = use_align; icon_view->priv->scroll_to_row_align = row_align; icon_view->priv->scroll_to_col_align = col_align; } else { item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices(path)[0]); if (G_UNLIKELY (item == NULL)) return; if (use_align) { gint x, y; gint focus_width; gfloat offset, value; GtkAllocation allocation; gtk_widget_style_get (GTK_WIDGET (icon_view), "focus-line-width", &focus_width, NULL); gtk_widget_get_allocation (GTK_WIDGET (icon_view), &allocation); gdk_window_get_position (icon_view->priv->bin_window, &x, &y); offset = y + item->area.y - focus_width - row_align * (allocation.height - item->area.height); value = CLAMP (gtk_adjustment_get_value(icon_view->priv->vadjustment) + offset, gtk_adjustment_get_lower(icon_view->priv->vadjustment), gtk_adjustment_get_upper(icon_view->priv->vadjustment) - gtk_adjustment_get_page_size(icon_view->priv->vadjustment)); gtk_adjustment_set_value (icon_view->priv->vadjustment, value); offset = x + item->area.x - focus_width - col_align * (allocation.width - item->area.width); value = CLAMP (gtk_adjustment_get_value(icon_view->priv->hadjustment) + offset, gtk_adjustment_get_lower(icon_view->priv->hadjustment), gtk_adjustment_get_upper(icon_view->priv->hadjustment) - gtk_adjustment_get_page_size(icon_view->priv->hadjustment)); gtk_adjustment_set_value (icon_view->priv->hadjustment, value); gtk_adjustment_changed (icon_view->priv->hadjustment); gtk_adjustment_changed (icon_view->priv->vadjustment); } else { exo_icon_view_scroll_to_item (icon_view, item); } } } /** * exo_icon_view_get_orientation: * @icon_view : a #ExoIconView * * Returns the value of the ::orientation property which determines * whether the labels are drawn beside the icons instead of below. * * Return value: the relative position of texts and icons * * Since: 0.3.1 **/ GtkOrientation exo_icon_view_get_orientation (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), GTK_ORIENTATION_VERTICAL); return icon_view->priv->orientation; } /** * exo_icon_view_set_orientation: * @icon_view : a #ExoIconView * @orientation : the relative position of texts and icons * * Sets the ::orientation property which determines whether the labels * are drawn beside the icons instead of below. * * Since: 0.3.1 **/ void exo_icon_view_set_orientation (ExoIconView *icon_view, GtkOrientation orientation) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (icon_view->priv->orientation != orientation)) { icon_view->priv->orientation = orientation; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_invalidate_sizes (icon_view); update_text_cell (icon_view); update_pixbuf_cell (icon_view); g_object_notify (G_OBJECT (icon_view), "orientation"); } } /** * exo_icon_view_get_columns: * @icon_view: a #ExoIconView * * Returns the value of the ::columns property. * * Return value: the number of columns, or -1 */ gint exo_icon_view_get_columns (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->columns; } /** * exo_icon_view_set_columns: * @icon_view : a #ExoIconView * @columns : the number of columns * * Sets the ::columns property which determines in how * many columns the icons are arranged. If @columns is * -1, the number of columns will be chosen automatically * to fill the available area. * * Since: 0.3.1 */ void exo_icon_view_set_columns (ExoIconView *icon_view, gint columns) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (icon_view->priv->columns != columns)) { icon_view->priv->columns = columns; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_queue_layout (icon_view); g_object_notify (G_OBJECT (icon_view), "columns"); } } /** * exo_icon_view_get_item_width: * @icon_view: a #ExoIconView * * Returns the value of the ::item-width property. * * Return value: the width of a single item, or -1 * * Since: 0.3.1 */ gint exo_icon_view_get_item_width (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->item_width; } /** * exo_icon_view_set_item_width: * @icon_view : a #ExoIconView * @item_width : the width for each item * * Sets the ::item-width property which specifies the width * to use for each item. If it is set to -1, the icon view will * automatically determine a suitable item size. * * Since: 0.3.1 */ void exo_icon_view_set_item_width (ExoIconView *icon_view, gint item_width) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (icon_view->priv->item_width != item_width) { icon_view->priv->item_width = item_width; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_invalidate_sizes (icon_view); update_text_cell (icon_view); g_object_notify (G_OBJECT (icon_view), "item-width"); } } /** * exo_icon_view_get_spacing: * @icon_view: a #ExoIconView * * Returns the value of the ::spacing property. * * Return value: the space between cells * * Since: 0.3.1 */ gint exo_icon_view_get_spacing (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->spacing; } /** * exo_icon_view_set_spacing: * @icon_view : a #ExoIconView * @spacing : the spacing * * Sets the ::spacing property which specifies the space * which is inserted between the cells (i.e. the icon and * the text) of an item. * * Since: 0.3.1 */ void exo_icon_view_set_spacing (ExoIconView *icon_view, gint spacing) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (icon_view->priv->spacing != spacing)) { icon_view->priv->spacing = spacing; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_invalidate_sizes (icon_view); g_object_notify (G_OBJECT (icon_view), "spacing"); } } /** * exo_icon_view_get_row_spacing: * @icon_view: a #ExoIconView * * Returns the value of the ::row-spacing property. * * Return value: the space between rows * * Since: 0.3.1 */ gint exo_icon_view_get_row_spacing (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->row_spacing; } /** * exo_icon_view_set_row_spacing: * @icon_view : a #ExoIconView * @row_spacing : the row spacing * * Sets the ::row-spacing property which specifies the space * which is inserted between the rows of the icon view. * * Since: 0.3.1 */ void exo_icon_view_set_row_spacing (ExoIconView *icon_view, gint row_spacing) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (icon_view->priv->row_spacing != row_spacing)) { icon_view->priv->row_spacing = row_spacing; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_invalidate_sizes (icon_view); g_object_notify (G_OBJECT (icon_view), "row-spacing"); } } /** * exo_icon_view_get_column_spacing: * @icon_view: a #ExoIconView * * Returns the value of the ::column-spacing property. * * Return value: the space between columns * * Since: 0.3.1 **/ gint exo_icon_view_get_column_spacing (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->column_spacing; } /** * exo_icon_view_set_column_spacing: * @icon_view : a #ExoIconView * @column_spacing : the column spacing * * Sets the ::column-spacing property which specifies the space * which is inserted between the columns of the icon view. * * Since: 0.3.1 **/ void exo_icon_view_set_column_spacing (ExoIconView *icon_view, gint column_spacing) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (icon_view->priv->column_spacing != column_spacing)) { icon_view->priv->column_spacing = column_spacing; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_invalidate_sizes (icon_view); g_object_notify (G_OBJECT (icon_view), "column-spacing"); } } /** * exo_icon_view_get_margin: * @icon_view : a #ExoIconView * * Returns the value of the ::margin property. * * Return value: the space at the borders * * Since: 0.3.1 **/ gint exo_icon_view_get_margin (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->margin; } /** * exo_icon_view_set_margin: * @icon_view : a #ExoIconView * @margin : the margin * * Sets the ::margin property which specifies the space * which is inserted at the top, bottom, left and right * of the icon view. * * Since: 0.3.1 **/ void exo_icon_view_set_margin (ExoIconView *icon_view, gint margin) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (G_LIKELY (icon_view->priv->margin != margin)) { icon_view->priv->margin = margin; exo_icon_view_stop_editing (icon_view, TRUE); exo_icon_view_invalidate_sizes (icon_view); g_object_notify (G_OBJECT (icon_view), "margin"); } } /* Get/set whether drag_motion requested the drag data and * drag_data_received should thus not actually insert the data, * since the data doesn't result from a drop. */ static void set_status_pending (GdkDragContext *context, GdkDragAction suggested_action) { g_object_set_data (G_OBJECT (context), I_("exo-icon-view-status-pending"), GINT_TO_POINTER (suggested_action)); } static GdkDragAction get_status_pending (GdkDragContext *context) { return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (context), I_("exo-icon-view-status-pending"))); } static void unset_reorderable (ExoIconView *icon_view) { if (icon_view->priv->reorderable) { icon_view->priv->reorderable = FALSE; g_object_notify (G_OBJECT (icon_view), "reorderable"); } } static void clear_source_info (ExoIconView *icon_view) { if (icon_view->priv->source_targets) gtk_target_list_unref (icon_view->priv->source_targets); icon_view->priv->source_targets = NULL; icon_view->priv->source_set = FALSE; } static void clear_dest_info (ExoIconView *icon_view) { if (icon_view->priv->dest_targets) gtk_target_list_unref (icon_view->priv->dest_targets); icon_view->priv->dest_targets = NULL; icon_view->priv->dest_set = FALSE; } static void set_source_row (GdkDragContext *context, GtkTreeModel *model, GtkTreePath *source_row) { if (source_row) g_object_set_data_full (G_OBJECT (context), I_("exo-icon-view-source-row"), gtk_tree_row_reference_new (model, source_row), (GDestroyNotify) gtk_tree_row_reference_free); else g_object_set_data_full (G_OBJECT (context), I_("exo-icon-view-source-row"), NULL, NULL); } static GtkTreePath* get_source_row (GdkDragContext *context) { GtkTreeRowReference *ref; ref = g_object_get_data (G_OBJECT (context), I_("exo-icon-view-source-row")); if (ref) return gtk_tree_row_reference_get_path (ref); else return NULL; } typedef struct { GtkTreeRowReference *dest_row; gboolean empty_view_drop; gboolean drop_append_mode; } DestRow; static void dest_row_free (gpointer data) { DestRow *dr = (DestRow *)data; gtk_tree_row_reference_free (dr->dest_row); g_slice_free (DestRow, dr); } static void set_dest_row (GdkDragContext *context, GtkTreeModel *model, GtkTreePath *dest_row, gboolean empty_view_drop, gboolean drop_append_mode) { DestRow *dr; if (!dest_row) { g_object_set_data_full (G_OBJECT (context), I_("exo-icon-view-dest-row"), NULL, NULL); return; } dr = g_slice_new0 (DestRow); dr->dest_row = gtk_tree_row_reference_new (model, dest_row); dr->empty_view_drop = empty_view_drop; dr->drop_append_mode = drop_append_mode; g_object_set_data_full (G_OBJECT (context), I_("exo-icon-view-dest-row"), dr, (GDestroyNotify) dest_row_free); } static GtkTreePath* get_dest_row (GdkDragContext *context) { DestRow *dr; dr = g_object_get_data (G_OBJECT (context), I_("exo-icon-view-dest-row")); if (dr) { GtkTreePath *path = NULL; if (dr->dest_row) path = gtk_tree_row_reference_get_path (dr->dest_row); else if (dr->empty_view_drop) path = gtk_tree_path_new_from_indices (0, -1); else path = NULL; if (path && dr->drop_append_mode) gtk_tree_path_next (path); return path; } else return NULL; } static gboolean check_model_dnd (GtkTreeModel *model, GType required_iface, const gchar *_signal) { if (model == NULL || !G_TYPE_CHECK_INSTANCE_TYPE ((model), required_iface)) { g_warning ("You must override the default '%s' handler " "on ExoIconView when using models that don't support " "the %s interface and enabling drag-and-drop. The simplest way to do this " "is to connect to '%s' and call " "g_signal_stop_emission_by_name() in your signal handler to prevent " "the default handler from running. Look at the source code " "for the default handler in gtkiconview.c to get an idea what " "your handler should do. (gtkiconview.c is in the GTK+ source " "code.) If you're using GTK+ from a language other than C, " "there may be a more natural way to override default handlers, e.g. via derivation.", _signal, g_type_name (required_iface), _signal); return FALSE; } else return TRUE; } static void remove_scroll_timeout (ExoIconView *icon_view) { if (icon_view->priv->scroll_timeout_id != 0) { g_source_remove (icon_view->priv->scroll_timeout_id); icon_view->priv->scroll_timeout_id = 0; } } static void exo_icon_view_autoscroll (ExoIconView *icon_view) { gint px, py, x, y, width, height; gint hoffset, voffset; gfloat value; GdkWindow *window = gtk_widget_get_window (GTK_WIDGET (icon_view)); gdk_window_get_device_position (window, gdk_device_manager_get_client_pointer( gdk_display_get_device_manager( gdk_window_get_display(window))), &px, &py, NULL); #if GTK_CHECK_VERSION(3, 0, 0) gdk_window_get_geometry (window, &x, &y, &width, &height); #else gdk_window_get_geometry (window, &x, &y, &width, &height, NULL); #endif /* see if we are near the edge. */ voffset = py - (y + 2 * SCROLL_EDGE_SIZE); if (voffset > 0) voffset = MAX (py - (y + height - 2 * SCROLL_EDGE_SIZE), 0); hoffset = px - (x + 2 * SCROLL_EDGE_SIZE); if (hoffset > 0) hoffset = MAX (px - (x + width - 2 * SCROLL_EDGE_SIZE), 0); if (voffset != 0) { value = CLAMP (gtk_adjustment_get_value(icon_view->priv->vadjustment) + voffset, gtk_adjustment_get_lower(icon_view->priv->vadjustment), gtk_adjustment_get_upper(icon_view->priv->vadjustment) - gtk_adjustment_get_page_size(icon_view->priv->vadjustment)); gtk_adjustment_set_value (icon_view->priv->vadjustment, value); } if (hoffset != 0) { value = CLAMP (gtk_adjustment_get_value(icon_view->priv->hadjustment) + hoffset, gtk_adjustment_get_lower(icon_view->priv->hadjustment), gtk_adjustment_get_upper(icon_view->priv->hadjustment) - gtk_adjustment_get_page_size(icon_view->priv->hadjustment)); gtk_adjustment_set_value (icon_view->priv->hadjustment, value); } } static gboolean drag_scroll_timeout (gpointer data) { ExoIconView *icon_view = EXO_ICON_VIEW (data); if(!g_source_is_destroyed(g_main_current_source())) exo_icon_view_autoscroll (icon_view); return TRUE; } static gboolean set_destination (ExoIconView *icon_view, GdkDragContext *context, gint x, gint y, GdkDragAction *suggested_action, GdkAtom *target) { GtkWidget *widget; GtkTreePath *path = NULL; ExoIconViewDropPosition pos; ExoIconViewDropPosition old_pos; GtkTreePath *old_dest_path = NULL; gboolean can_drop = FALSE; widget = GTK_WIDGET (icon_view); *suggested_action = 0; *target = GDK_NONE; if (!icon_view->priv->dest_set) { /* someone unset us as a drag dest, note that if * we return FALSE drag_leave isn't called */ exo_icon_view_set_drag_dest_item (icon_view, NULL, EXO_ICON_VIEW_DROP_LEFT); remove_scroll_timeout (EXO_ICON_VIEW (widget)); return FALSE; /* no longer a drop site */ } *target = gtk_drag_dest_find_target (widget, context, icon_view->priv->dest_targets); if (*target == GDK_NONE) return FALSE; if (!exo_icon_view_get_dest_item_at_pos (icon_view, x, y, &path, &pos)) { gint n_children; GtkTreeModel *model; /* the row got dropped on empty space, let's setup a special case */ if (path) gtk_tree_path_free (path); model = exo_icon_view_get_model (icon_view); n_children = gtk_tree_model_iter_n_children (model, NULL); if (n_children) { pos = EXO_ICON_VIEW_DROP_BELOW; path = gtk_tree_path_new_from_indices (n_children - 1, -1); } else { pos = EXO_ICON_VIEW_DROP_ABOVE; path = gtk_tree_path_new_from_indices (0, -1); } can_drop = TRUE; goto out; } g_assert (path); exo_icon_view_get_drag_dest_item (icon_view, &old_dest_path, &old_pos); if (old_dest_path) gtk_tree_path_free (old_dest_path); if (TRUE /* FIXME if the location droppable predicate */) { can_drop = TRUE; } out: if (can_drop) { GtkWidget *source_widget; *suggested_action = gdk_drag_context_get_suggested_action (context); source_widget = gtk_drag_get_source_widget (context); if (source_widget == widget) { /* Default to MOVE, unless the user has * pressed ctrl or shift to affect available actions */ if ((gdk_drag_context_get_actions (context) & GDK_ACTION_MOVE) != 0) *suggested_action = GDK_ACTION_MOVE; } exo_icon_view_set_drag_dest_item (EXO_ICON_VIEW (widget), path, pos); } else { /* can't drop here */ exo_icon_view_set_drag_dest_item (EXO_ICON_VIEW (widget), NULL, EXO_ICON_VIEW_DROP_LEFT); } if (path) gtk_tree_path_free (path); return TRUE; } static GtkTreePath* get_logical_destination (ExoIconView *icon_view, gboolean *drop_append_mode) { /* adjust path to point to the row the drop goes in front of */ GtkTreePath *path = NULL; ExoIconViewDropPosition pos; *drop_append_mode = FALSE; exo_icon_view_get_drag_dest_item (icon_view, &path, &pos); if (path == NULL) return NULL; if (pos == EXO_ICON_VIEW_DROP_RIGHT || pos == EXO_ICON_VIEW_DROP_BELOW) { GtkTreeIter iter; GtkTreeModel *model = icon_view->priv->model; if (!gtk_tree_model_get_iter (model, &iter, path) || !gtk_tree_model_iter_next (model, &iter)) *drop_append_mode = TRUE; else { *drop_append_mode = FALSE; gtk_tree_path_next (path); } } return path; } static gboolean exo_icon_view_maybe_begin_drag (ExoIconView *icon_view, GdkEventMotion *event) { GdkDragContext *context; GtkTreePath *path = NULL; gint button; GtkTreeModel *model; gboolean retval = FALSE; if (!icon_view->priv->source_set) goto out; if (icon_view->priv->pressed_button < 0) goto out; if (!gtk_drag_check_threshold (GTK_WIDGET (icon_view), icon_view->priv->press_start_x, icon_view->priv->press_start_y, event->x, event->y)) goto out; model = exo_icon_view_get_model (icon_view); if (model == NULL) goto out; button = icon_view->priv->pressed_button; icon_view->priv->pressed_button = -1; path = exo_icon_view_get_path_at_pos (icon_view, icon_view->priv->press_start_x, icon_view->priv->press_start_y); if (path == NULL) goto out; if (!GTK_IS_TREE_DRAG_SOURCE (model) || !gtk_tree_drag_source_row_draggable (GTK_TREE_DRAG_SOURCE (model), path)) goto out; /* FIXME Check whether we're a start button, if not return FALSE and * free path */ /* Now we can begin the drag */ retval = TRUE; context = gtk_drag_begin (GTK_WIDGET (icon_view), icon_view->priv->source_targets, icon_view->priv->source_actions, button, (GdkEvent*)event); set_source_row (context, model, path); out: if (path) gtk_tree_path_free (path); return retval; } /* Source side drag signals */ static void exo_icon_view_drag_begin (GtkWidget *widget, GdkDragContext *context) { ExoIconView *icon_view; ExoIconViewItem *item; GdkPixbuf *icon; gint x, y; GtkTreePath *path; icon_view = EXO_ICON_VIEW (widget); /* if the user uses a custom DnD impl, we don't set the icon here */ if (!icon_view->priv->dest_set && !icon_view->priv->source_set) return; item = exo_icon_view_get_item_at_coords (icon_view, icon_view->priv->press_start_x, icon_view->priv->press_start_y, TRUE, NULL); _exo_return_if_fail (item != NULL); x = icon_view->priv->press_start_x - item->area.x + 1; y = icon_view->priv->press_start_y - item->area.y + 1; path = gtk_tree_path_new_from_indices (item->index, -1); icon = exo_icon_view_create_drag_icon (icon_view, path); gtk_tree_path_free (path); gtk_drag_set_icon_pixbuf (context, icon, x, y); g_object_unref (icon); } static void exo_icon_view_drag_end (GtkWidget *widget, GdkDragContext *context) { /* do nothing */ } static void exo_icon_view_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint drag_time) { ExoIconView *icon_view; GtkTreeModel *model; GtkTreePath *source_row; icon_view = EXO_ICON_VIEW (widget); model = exo_icon_view_get_model (icon_view); if (model == NULL) return; if (!icon_view->priv->dest_set) return; source_row = get_source_row (context); if (source_row == NULL) return; /* We can implement the GTK_TREE_MODEL_ROW target generically for * any model; for DragSource models there are some other targets * we also support. */ if (GTK_IS_TREE_DRAG_SOURCE (model) && gtk_tree_drag_source_drag_data_get (GTK_TREE_DRAG_SOURCE (model), source_row, selection_data)) goto done; /* If drag_data_get does nothing, try providing row data. */ if (gtk_selection_data_get_target(selection_data) == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE)) gtk_tree_set_row_drag_data (selection_data, model, source_row); done: gtk_tree_path_free (source_row); } static void exo_icon_view_drag_data_delete (GtkWidget *widget, GdkDragContext *context) { GtkTreeModel *model; ExoIconView *icon_view; GtkTreePath *source_row; icon_view = EXO_ICON_VIEW (widget); model = exo_icon_view_get_model (icon_view); if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_SOURCE, "drag_data_delete")) return; if (!icon_view->priv->dest_set) return; source_row = get_source_row (context); if (source_row == NULL) return; gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (model), source_row); gtk_tree_path_free (source_row); set_source_row (context, NULL, NULL); } /* Target side drag signals */ static void exo_icon_view_drag_leave (GtkWidget *widget, GdkDragContext *context, guint drag_time) { ExoIconView *icon_view; icon_view = EXO_ICON_VIEW (widget); /* unset any highlight row */ exo_icon_view_set_drag_dest_item (icon_view, NULL, EXO_ICON_VIEW_DROP_LEFT); remove_scroll_timeout (icon_view); } static gboolean exo_icon_view_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint drag_time) { ExoIconViewDropPosition pos; GdkDragAction suggested_action = 0; GtkTreePath *path = NULL; ExoIconView *icon_view = EXO_ICON_VIEW (widget); gboolean empty; GdkAtom target; if (!set_destination (icon_view, context, x, y, &suggested_action, &target)) return FALSE; exo_icon_view_get_drag_dest_item (icon_view, &path, &pos); /* we only know this *after* set_desination_row */ empty = icon_view->priv->empty_view_drop; if (path == NULL && !empty) { /* Can't drop here. */ gdk_drag_status (context, 0, drag_time); } else { if (icon_view->priv->scroll_timeout_id == 0) icon_view->priv->scroll_timeout_id = gdk_threads_add_timeout (50, drag_scroll_timeout, icon_view); if (target == gdk_atom_intern ("GTK_TREE_MODEL_ROW", FALSE)) { /* Request data so we can use the source row when * determining whether to accept the drop */ set_status_pending (context, suggested_action); gtk_drag_get_data (widget, context, target, drag_time); } else { set_status_pending (context, 0); gdk_drag_status (context, suggested_action, drag_time); } } if (path != NULL) gtk_tree_path_free (path); return TRUE; } static gboolean exo_icon_view_drag_drop (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint drag_time) { ExoIconView *icon_view; GtkTreePath *path; GdkDragAction suggested_action = 0; GdkAtom target = GDK_NONE; GtkTreeModel *model; gboolean drop_append_mode; icon_view = EXO_ICON_VIEW (widget); model = exo_icon_view_get_model (icon_view); remove_scroll_timeout (EXO_ICON_VIEW (widget)); if (!icon_view->priv->dest_set) return FALSE; if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_DEST, "drag_drop")) return FALSE; if (!set_destination (icon_view, context, x, y, &suggested_action, &target)) return FALSE; path = get_logical_destination (icon_view, &drop_append_mode); if (target != GDK_NONE && path != NULL) { /* in case a motion had requested drag data, change things so we * treat drag data receives as a drop. */ set_status_pending (context, 0); set_dest_row (context, model, path, icon_view->priv->empty_view_drop, drop_append_mode); } if (path) gtk_tree_path_free (path); /* Unset this thing */ exo_icon_view_set_drag_dest_item (icon_view, NULL, EXO_ICON_VIEW_DROP_LEFT); if (target != GDK_NONE) { gtk_drag_get_data (widget, context, target, drag_time); return TRUE; } else return FALSE; } static void exo_icon_view_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint drag_time) { GtkTreePath *path; gboolean accepted = FALSE; GtkTreeModel *model; ExoIconView *icon_view; GtkTreePath *dest_row; GdkDragAction suggested_action; gboolean drop_append_mode; icon_view = EXO_ICON_VIEW (widget); model = exo_icon_view_get_model (icon_view); if (!check_model_dnd (model, GTK_TYPE_TREE_DRAG_DEST, "drag_data_received")) return; if (!icon_view->priv->dest_set) return; suggested_action = get_status_pending (context); if (suggested_action) { /* We are getting this data due to a request in drag_motion, * rather than due to a request in drag_drop, so we are just * supposed to call drag_status, not actually paste in the * data. */ path = get_logical_destination (icon_view, &drop_append_mode); if (path == NULL) suggested_action = 0; if (suggested_action) { if (!gtk_tree_drag_dest_row_drop_possible (GTK_TREE_DRAG_DEST (model), path, selection_data)) suggested_action = 0; } gdk_drag_status (context, suggested_action, drag_time); if (path) gtk_tree_path_free (path); /* If you can't drop, remove user drop indicator until the next motion */ if (suggested_action == 0) exo_icon_view_set_drag_dest_item (icon_view, NULL, EXO_ICON_VIEW_DROP_LEFT); return; } dest_row = get_dest_row (context); if (dest_row == NULL) return; if (gtk_selection_data_get_length(selection_data) >= 0) { if (gtk_tree_drag_dest_drag_data_received (GTK_TREE_DRAG_DEST (model), dest_row, selection_data)) accepted = TRUE; } gtk_drag_finish (context, accepted, (gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE), drag_time); gtk_tree_path_free (dest_row); /* drop dest_row */ set_dest_row (context, NULL, NULL, FALSE, FALSE); } /** * exo_icon_view_enable_model_drag_source: * @icon_view : a #GtkIconTreeView * @start_button_mask : Mask of allowed buttons to start drag * @targets : the table of targets that the drag will support * @n_targets : the number of items in @targets * @actions : the bitmask of possible actions for a drag from this widget * * Turns @icon_view into a drag source for automatic DND. * * Since: 0.3.1 **/ void exo_icon_view_enable_model_drag_source (ExoIconView *icon_view, GdkModifierType start_button_mask, const GtkTargetEntry *targets, gint n_targets, GdkDragAction actions) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); gtk_drag_source_set (GTK_WIDGET (icon_view), 0, NULL, 0, actions); clear_source_info (icon_view); icon_view->priv->start_button_mask = start_button_mask; icon_view->priv->source_targets = gtk_target_list_new (targets, n_targets); icon_view->priv->source_actions = actions; icon_view->priv->source_set = TRUE; unset_reorderable (icon_view); } /** * exo_icon_view_enable_model_drag_dest: * @icon_view : a #ExoIconView * @targets : the table of targets that the drag will support * @n_targets : the number of items in @targets * @actions : the bitmask of possible actions for a drag from this widget * * Turns @icon_view into a drop destination for automatic DND. * * Since: 0.3.1 **/ void exo_icon_view_enable_model_drag_dest (ExoIconView *icon_view, const GtkTargetEntry *targets, gint n_targets, GdkDragAction actions) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); gtk_drag_dest_set (GTK_WIDGET (icon_view), 0, NULL, 0, actions); clear_dest_info (icon_view); icon_view->priv->dest_targets = gtk_target_list_new (targets, n_targets); icon_view->priv->dest_actions = actions; icon_view->priv->dest_set = TRUE; unset_reorderable (icon_view); } /** * exo_icon_view_unset_model_drag_source: * @icon_view : a #ExoIconView * * Undoes the effect of #exo_icon_view_enable_model_drag_source(). * * Since: 0.3.1 **/ void exo_icon_view_unset_model_drag_source (ExoIconView *icon_view) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (icon_view->priv->source_set) { gtk_drag_source_unset (GTK_WIDGET (icon_view)); clear_source_info (icon_view); } unset_reorderable (icon_view); } /** * exo_icon_view_unset_model_drag_dest: * @icon_view : a #ExoIconView * * Undoes the effect of #exo_icon_view_enable_model_drag_dest(). * * Since: 0.3.1 **/ void exo_icon_view_unset_model_drag_dest (ExoIconView *icon_view) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (icon_view->priv->dest_set) { gtk_drag_dest_unset (GTK_WIDGET (icon_view)); clear_dest_info (icon_view); } unset_reorderable (icon_view); } /** * exo_icon_view_set_drag_dest_item: * @icon_view : a #ExoIconView * @path : The path of the item to highlight, or %NULL. * @pos : Specifies whether to drop, relative to the item * * Sets the item that is highlighted for feedback. * * Since: 0.3.1 */ void exo_icon_view_set_drag_dest_item (ExoIconView *icon_view, GtkTreePath *path, ExoIconViewDropPosition pos) { ExoIconViewItem *item; GtkTreePath *previous_path; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); /* Note; this function is exported to allow a custom DND * implementation, so it can't touch TreeViewDragInfo */ if (icon_view->priv->dest_item != NULL) { /* determine and reset the previous path */ previous_path = gtk_tree_row_reference_get_path (icon_view->priv->dest_item); gtk_tree_row_reference_free (icon_view->priv->dest_item); icon_view->priv->dest_item = NULL; /* check if the path is still valid */ if (G_LIKELY (previous_path != NULL)) { /* schedule a redraw for the previous path */ item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices (previous_path)[0]); if (G_LIKELY (item != NULL)) exo_icon_view_queue_draw_item (icon_view, item); gtk_tree_path_free (previous_path); } } /* special case a drop on an empty model */ icon_view->priv->empty_view_drop = FALSE; if (pos == EXO_ICON_VIEW_NO_DROP && path && gtk_tree_path_get_depth (path) == 1 && gtk_tree_path_get_indices (path)[0] == 0) { gint n_children; n_children = gtk_tree_model_iter_n_children (icon_view->priv->model, NULL); if (n_children == 0) icon_view->priv->empty_view_drop = TRUE; } icon_view->priv->dest_pos = pos; if (G_LIKELY (path != NULL)) { /* take a row reference for the new item path */ icon_view->priv->dest_item = gtk_tree_row_reference_new_proxy (G_OBJECT (icon_view), icon_view->priv->model, path); /* schedule a redraw on the new path */ item = g_list_nth_data (icon_view->priv->items, gtk_tree_path_get_indices (path)[0]); if (G_LIKELY (item != NULL)) exo_icon_view_queue_draw_item (icon_view, item); } } /** * exo_icon_view_get_drag_dest_item: * @icon_view : a #ExoIconView * @path : Return location for the path of the highlighted item, or %NULL. * @pos : Return location for the drop position, or %NULL * * Gets information about the item that is highlighted for feedback. * * Since: 0.3.1 **/ void exo_icon_view_get_drag_dest_item (ExoIconView *icon_view, GtkTreePath **path, ExoIconViewDropPosition *pos) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (path) { if (icon_view->priv->dest_item) *path = gtk_tree_row_reference_get_path (icon_view->priv->dest_item); else *path = NULL; } if (pos) *pos = icon_view->priv->dest_pos; } /** * exo_icon_view_get_dest_item_at_pos: * @icon_view : a #ExoIconView * @drag_x : the position to determine the destination item for * @drag_y : the position to determine the destination item for * @path : Return location for the path of the highlighted item, or %NULL. * @pos : Return location for the drop position, or %NULL * * Determines the destination item for a given position. * * Both @drag_x and @drag_y are given in icon window coordinates. Use * #exo_icon_view_widget_to_icon_coords() if you need to translate * widget coordinates first. * * Return value: whether there is an item at the given position. * * Since: 0.3.1 **/ gboolean exo_icon_view_get_dest_item_at_pos (ExoIconView *icon_view, gint drag_x, gint drag_y, GtkTreePath **path, ExoIconViewDropPosition *pos) { ExoIconViewItem *item; /* Note; this function is exported to allow a custom DND * implementation, so it can't touch TreeViewDragInfo */ g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); g_return_val_if_fail (drag_x >= 0, FALSE); g_return_val_if_fail (drag_y >= 0, FALSE); g_return_val_if_fail (icon_view->priv->bin_window != NULL, FALSE); if (G_LIKELY (path != NULL)) *path = NULL; item = exo_icon_view_get_item_at_coords (icon_view, drag_x, drag_y, FALSE, NULL); if (G_UNLIKELY (item == NULL)) return FALSE; if (G_LIKELY (path != NULL)) *path = gtk_tree_path_new_from_indices (item->index, -1); if (G_LIKELY (pos != NULL)) { if (drag_x < item->area.x + item->area.width / 4) *pos = EXO_ICON_VIEW_DROP_LEFT; else if (drag_x > item->area.x + item->area.width * 3 / 4) *pos = EXO_ICON_VIEW_DROP_RIGHT; else if (drag_y < item->area.y + item->area.height / 4) *pos = EXO_ICON_VIEW_DROP_ABOVE; else if (drag_y > item->area.y + item->area.height * 3 / 4) *pos = EXO_ICON_VIEW_DROP_BELOW; else *pos = EXO_ICON_VIEW_DROP_INTO; } return TRUE; } /** * exo_icon_view_create_drag_icon: * @icon_view : a #ExoIconView * @path : a #GtkTreePath in @icon_view * * Creates a #GdkPixbuf representation of the item at @path. * This image is used for a drag icon. * * Return value: a newly-allocated pixmap of the drag icon. * * Since: 0.3.1 **/ GdkPixbuf* exo_icon_view_create_drag_icon (ExoIconView *icon_view, GtkTreePath *path) { GdkRectangle area; GtkWidget *widget = GTK_WIDGET (icon_view); #if GTK_CHECK_VERSION(3, 0, 0) cairo_surface_t *s; #else GdkPixmap *drawable; #endif GdkPixbuf *pixbuf; cairo_t *cr; GList *lp; GtkStyle *style; gint idx; g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL); g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, NULL); /* verify that the widget is realized */ if (G_UNLIKELY (!gtk_widget_get_realized (GTK_WIDGET (icon_view)))) return NULL; idx = gtk_tree_path_get_indices (path)[0]; style = gtk_widget_get_style (widget); for (lp = icon_view->priv->items; lp != NULL; lp = lp->next) { ExoIconViewItem *item = lp->data; if (G_UNLIKELY (idx == item->index)) { #if GTK_CHECK_VERSION(3, 0, 0) s = cairo_image_surface_create (CAIRO_FORMAT_RGB24, item->area.width + 2, item->area.height + 2); cr = cairo_create (s); #else drawable = gdk_pixmap_new (icon_view->priv->bin_window, item->area.width + 2, item->area.height + 2, -1); cr = gdk_cairo_create (drawable); #endif gdk_cairo_set_source_color (cr, &style->base[gtk_widget_get_state (widget)]); cairo_rectangle (cr, 0, 0, item->area.width + 2, item->area.height + 2); cairo_fill (cr); area.x = 0; area.y = 0; area.width = item->area.width; area.height = item->area.height; #if GTK_CHECK_VERSION(3, 0, 0) exo_icon_view_paint_item (icon_view, item, &area, cr, 1, 1, FALSE); #else /* NOTE: this is inefficient but Gtk+2 uses GtkWindow for render */ exo_icon_view_paint_item (icon_view, item, &area, drawable, 1, 1, FALSE); #endif gdk_cairo_set_source_color (cr, &style->black); cairo_rectangle (cr, 1, 1, item->area.width + 1, item->area.height + 1); cairo_stroke (cr); cairo_destroy (cr); #if GTK_CHECK_VERSION(3, 0, 0) pixbuf = gdk_pixbuf_get_from_surface (s, 0, 0, item->area.width + 2, item->area.height + 2); cairo_surface_destroy (s); return pixbuf; #else pixbuf = gdk_pixbuf_get_from_drawable (NULL, drawable, gdk_drawable_get_colormap (drawable), 0, 0, 0, 0, item->area.width + 2, item->area.height + 2); g_object_unref (drawable); return pixbuf; #endif } } return NULL; } /** * exo_icon_view_get_reorderable: * @icon_view : a #ExoIconView * * Retrieves whether the user can reorder the list via drag-and-drop. * See exo_icon_view_set_reorderable(). * * Return value: %TRUE if the list can be reordered. * * Since: 0.3.1 **/ gboolean exo_icon_view_get_reorderable (ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); return icon_view->priv->reorderable; } /** * exo_icon_view_set_reorderable: * @icon_view : A #ExoIconView. * @reorderable : %TRUE, if the list of items can be reordered. * * This function is a convenience function to allow you to reorder models that * support the #GtkTreeDragSourceIface and the #GtkTreeDragDestIface. Both * #GtkTreeStore and #GtkListStore support these. If @reorderable is %TRUE, then * the user can reorder the model by dragging and dropping rows. The * developer can listen to these changes by connecting to the model's * ::row-inserted and ::row-deleted signals. * * This function does not give you any degree of control over the order -- any * reordering is allowed. If more control is needed, you should probably * handle drag and drop manually. * * Since: 0.3.1 **/ void exo_icon_view_set_reorderable (ExoIconView *icon_view, gboolean reorderable) { static const GtkTargetEntry item_targets[] = { { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, 0, }, }; g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); reorderable = (reorderable != FALSE); if (G_UNLIKELY (icon_view->priv->reorderable == reorderable)) return; if (G_LIKELY (reorderable)) { exo_icon_view_enable_model_drag_source (icon_view, GDK_BUTTON1_MASK, item_targets, G_N_ELEMENTS (item_targets), GDK_ACTION_MOVE); exo_icon_view_enable_model_drag_dest (icon_view, item_targets, G_N_ELEMENTS (item_targets), GDK_ACTION_MOVE); } else { exo_icon_view_unset_model_drag_source (icon_view); exo_icon_view_unset_model_drag_dest (icon_view); } icon_view->priv->reorderable = reorderable; g_object_notify (G_OBJECT (icon_view), "reorderable"); } /*----------------------* * Single-click support * *----------------------*/ /** * exo_icon_view_get_single_click: * @icon_view : a #ExoIconView. * * Returns %TRUE if @icon_view is currently in single click mode, * else %FALSE will be returned. * * Return value: whether @icon_view is currently in single click mode. * * Since: 0.3.1.3 **/ gboolean exo_icon_view_get_single_click (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); return icon_view->priv->single_click; } /** * exo_icon_view_set_single_click: * @icon_view : a #ExoIconView. * @single_click : %TRUE for single click, %FALSE for double click mode. * * If @single_click is %TRUE, @icon_view will be in single click mode * afterwards, else @icon_view will be in double click mode. * * Since: 0.3.1.3 **/ void exo_icon_view_set_single_click (ExoIconView *icon_view, gboolean single_click) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); /* normalize the value */ single_click = !!single_click; /* check if we have a new setting here */ if (icon_view->priv->single_click != single_click) { icon_view->priv->single_click = single_click; g_object_notify (G_OBJECT (icon_view), "single-click"); } } /** * exo_icon_view_get_single_click_timeout: * @icon_view : a #ExoIconView. * * Returns the amount of time in milliseconds after which the * item under the mouse cursor will be selected automatically * in single click mode. A value of %0 means that the behavior * is disabled and the user must alter the selection manually. * * Return value: the single click autoselect timeout or %0 if * the behavior is disabled. * * Since: 0.3.1.5 **/ guint exo_icon_view_get_single_click_timeout (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), 0u); return icon_view->priv->single_click_timeout; } /** * exo_icon_view_set_single_click_timeout: * @icon_view : a #ExoIconView. * @single_click_timeout : the new timeout or %0 to disable. * * If @single_click_timeout is a value greater than zero, it specifies * the amount of time in milliseconds after which the item under the * mouse cursor will be selected automatically in single click mode. * A value of %0 for @single_click_timeout disables the autoselection * for @icon_view. * * This setting does not have any effect unless the @icon_view is in * single-click mode, see exo_icon_view_set_single_click(). * * Since: 0.3.1.5 **/ void exo_icon_view_set_single_click_timeout (ExoIconView *icon_view, guint single_click_timeout) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); /* check if we have a new setting */ if (icon_view->priv->single_click_timeout != single_click_timeout) { /* apply the new setting */ icon_view->priv->single_click_timeout = single_click_timeout; /* be sure to cancel any pending single click timeout */ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0)) g_source_remove (icon_view->priv->single_click_timeout_id); /* notify listeners */ g_object_notify (G_OBJECT (icon_view), "single-click-timeout"); } } static gboolean exo_icon_view_single_click_timeout (gpointer user_data) { ExoIconViewItem *item; gboolean dirty = FALSE; ExoIconView *icon_view = EXO_ICON_VIEW (user_data); /* ensure that source isn't removed yet */ if(g_source_is_destroyed(g_main_current_source())) return FALSE; /* verify that we are in single-click mode, have focus and a prelit item */ if (gtk_widget_has_focus (GTK_WIDGET (icon_view)) && icon_view->priv->single_click && icon_view->priv->prelit_item != NULL) { /* work on the prelit item */ item = icon_view->priv->prelit_item; /* be sure the item is fully visible */ exo_icon_view_scroll_to_item (icon_view, item); /* change the selection appropriately */ if (G_UNLIKELY (icon_view->priv->selection_mode == GTK_SELECTION_NONE)) { exo_icon_view_set_cursor_item (icon_view, item, -1); } else if ((icon_view->priv->single_click_timeout_state & GDK_SHIFT_MASK) != 0 && icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE) { if (!(icon_view->priv->single_click_timeout_state & GDK_CONTROL_MASK)) /* unselect all previously selected items */ exo_icon_view_unselect_all_internal (icon_view); /* select all items between the anchor and the prelit item */ exo_icon_view_set_cursor_item (icon_view, item, -1); if (icon_view->priv->anchor_item == NULL) icon_view->priv->anchor_item = item; else exo_icon_view_select_all_between (icon_view, icon_view->priv->anchor_item, item); /* selection was changed */ dirty = TRUE; } else { if ((icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE || ((icon_view->priv->selection_mode == GTK_SELECTION_SINGLE) && item->selected)) && (icon_view->priv->single_click_timeout_state & GDK_CONTROL_MASK) != 0) { item->selected = !item->selected; exo_icon_view_queue_draw_item (icon_view, item); dirty = TRUE; } else if (!item->selected) { exo_icon_view_unselect_all_internal (icon_view); exo_icon_view_queue_draw_item (icon_view, item); item->selected = TRUE; dirty = TRUE; } exo_icon_view_set_cursor_item (icon_view, item, -1); icon_view->priv->anchor_item = item; } } /* emit "selection-changed" and stop drawing keyboard * focus indicator if the selection was altered */ if (G_LIKELY (dirty)) { /* reset "draw keyfocus" flag */ EXO_ICON_VIEW_UNSET_FLAG (icon_view, EXO_ICON_VIEW_DRAW_KEYFOCUS); /* emit "selection-changed" */ g_signal_emit (G_OBJECT (icon_view), icon_view_signals[SELECTION_CHANGED], 0); } return FALSE; } static void exo_icon_view_single_click_timeout_destroy (gpointer user_data) { EXO_ICON_VIEW (user_data)->priv->single_click_timeout_id = 0; } /*----------------------* * Middle-click support * *----------------------*/ /** * exo_icon_view_get_middle_click: * @icon_view : a #ExoIconView. * * Returns %TRUE if @icon_view is currently in middle click mode, * else %FALSE will be returned. * * Return value: whether @icon_view is currently in middle click mode. * * Since: 1.4.0 **/ gboolean exo_icon_view_get_middle_click (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); return icon_view->priv->middle_click; } /** * exo_icon_view_set_middle_click: * @icon_view : a #ExoIconView. * @middle_click : %TRUE for middle click, %FALSE for double click mode. * * If @middle_click is %TRUE, @icon_view will be in middle click mode * afterwards, else @icon_view will be in double click mode. * * Since: 1.4.0 **/ void exo_icon_view_set_middle_click (ExoIconView *icon_view, gboolean middle_click) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); /* normalize the value */ middle_click = !!middle_click; /* check if we have a new setting here */ if (icon_view->priv->middle_click != middle_click) { icon_view->priv->middle_click = middle_click; g_object_notify (G_OBJECT (icon_view), "middle-click"); } } /*----------------------------* * Interactive search support * *----------------------------*/ /** * exo_icon_view_get_enable_search: * @icon_view : an #ExoIconView. * * Returns whether or not the @icon_view allows to start * interactive searching by typing in text. * * Return value: whether or not to let the user search * interactively. * * Since: 0.3.1.3 **/ gboolean exo_icon_view_get_enable_search (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); return icon_view->priv->enable_search; } /** * exo_icon_view_set_enable_search: * @icon_view : an #ExoIconView. * @enable_search : %TRUE if the user can search interactively. * * If @enable_search is set, then the user can type in text to search through * the @icon_view interactively (this is sometimes called "typeahead find"). * * Note that even if this is %FALSE, the user can still initiate a search * using the "start-interactive-search" key binding. * * Since: 0.3.1.3 **/ void exo_icon_view_set_enable_search (ExoIconView *icon_view, gboolean enable_search) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); enable_search = !!enable_search; if (G_LIKELY (icon_view->priv->enable_search != enable_search)) { icon_view->priv->enable_search = enable_search; g_object_notify (G_OBJECT (icon_view), "enable-search"); } } /** * exo_icon_view_get_search_column: * @icon_view : an #ExoIconView. * * Returns the column searched on by the interactive search code. * * Return value: the column the interactive search code searches in. * * Since: 0.3.1.3 **/ gint exo_icon_view_get_search_column (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), -1); return icon_view->priv->search_column; } /** * exo_icon_view_set_search_column: * @icon_view : an #ExoIconView. * @search_column : the column of the model to search in, or -1 to disable searching. * * Sets @search_column as the column where the interactive search code should search in. * * If the search column is set, user can use the "start-interactive-search" key * binding to bring up search popup. The "enable-search" property controls * whether simply typing text will also start an interactive search. * * Note that @search_column refers to a column of the model. * * Since: 0.3.1.3 **/ void exo_icon_view_set_search_column (ExoIconView *icon_view, gint search_column) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (search_column >= -1); if (G_LIKELY (icon_view->priv->search_column != search_column)) { icon_view->priv->search_column = search_column; g_object_notify (G_OBJECT (icon_view), "search-column"); } } /** * exo_icon_view_get_search_equal_func: * @icon_view : an #ExoIconView. * * Returns the compare function currently in use. * * Return value: the currently used compare function for the search code. * * Since: 0.3.1.3 **/ ExoIconViewSearchEqualFunc exo_icon_view_get_search_equal_func (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL); return icon_view->priv->search_equal_func; } /** * exo_icon_view_set_search_equal_func: * @icon_view : an #ExoIconView. * @search_equal_func : the compare function to use during the search, or %NULL. * @search_equal_data : user data to pass to @search_equal_func, or %NULL. * @search_equal_destroy : destroy notifier for @search_equal_data, or %NULL. * * Sets the compare function for the interactive search capabilities; * note that some like strcmp() returning 0 for equality * #ExoIconViewSearchEqualFunc returns %FALSE on matches. * * Specifying %NULL for @search_equal_func will reset @icon_view to use the default * search equal function. * * Since: 0.3.1.3 **/ void exo_icon_view_set_search_equal_func (ExoIconView *icon_view, ExoIconViewSearchEqualFunc search_equal_func, gpointer search_equal_data, GDestroyNotify search_equal_destroy) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (search_equal_func != NULL || (search_equal_data == NULL && search_equal_destroy == NULL)); /* destroy the previous data (if any) */ if (G_UNLIKELY (icon_view->priv->search_equal_destroy != NULL)) (*icon_view->priv->search_equal_destroy) (icon_view->priv->search_equal_data); icon_view->priv->search_equal_func = (search_equal_func != NULL) ? search_equal_func : exo_icon_view_search_equal_func; icon_view->priv->search_equal_data = search_equal_data; icon_view->priv->search_equal_destroy = search_equal_destroy; } /** * exo_icon_view_get_search_position_func: * @icon_view : an #ExoIconView. * * Returns the search dialog positioning function currently in use. * * Return value: the currently used function for positioning the search dialog. * * Since: 0.3.1.3 **/ ExoIconViewSearchPositionFunc exo_icon_view_get_search_position_func (const ExoIconView *icon_view) { g_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), NULL); return icon_view->priv->search_position_func; } /** * exo_icon_view_set_search_position_func: * @icon_view : an #ExoIconView. * @search_position_func : the function to use to position the search dialog, or %NULL. * @search_position_data : user data to pass to @search_position_func, or %NULL. * @search_position_destroy : destroy notifier for @search_position_data, or %NULL. * * Sets the function to use when positioning the seach dialog. * * Specifying %NULL for @search_position_func will reset @icon_view to use the default * search position function. * * Since: 0.3.1.3 **/ void exo_icon_view_set_search_position_func (ExoIconView *icon_view, ExoIconViewSearchPositionFunc search_position_func, gpointer search_position_data, GDestroyNotify search_position_destroy) { g_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); g_return_if_fail (search_position_func != NULL || (search_position_data == NULL && search_position_destroy == NULL)); /* destroy the previous data (if any) */ if (icon_view->priv->search_position_destroy != NULL) (*icon_view->priv->search_position_destroy) (icon_view->priv->search_position_data); icon_view->priv->search_position_func = (search_position_func != NULL) ? search_position_func : exo_icon_view_search_position_func; icon_view->priv->search_position_data = search_position_data; icon_view->priv->search_position_destroy = search_position_destroy; } static void exo_icon_view_search_activate (GtkEntry *entry, ExoIconView *icon_view) { GtkTreePath *path; /* hide the interactive search dialog */ exo_icon_view_search_dialog_hide (icon_view->priv->search_window, icon_view); /* check if we have a cursor item, and if so, activate it */ if (exo_icon_view_get_cursor (icon_view, &path, NULL)) { /* only activate the cursor item if it's selected */ if (exo_icon_view_path_is_selected (icon_view, path)) exo_icon_view_item_activated (icon_view, path); gtk_tree_path_free (path); } } static void exo_icon_view_search_dialog_hide (GtkWidget *search_dialog, ExoIconView *icon_view) { _exo_return_if_fail (GTK_IS_WIDGET (search_dialog)); _exo_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); if (icon_view->priv->search_disable_popdown) return; /* disconnect the "changed" signal handler */ if (icon_view->priv->search_entry_changed_id != 0) { g_signal_handler_disconnect (G_OBJECT (icon_view->priv->search_entry), icon_view->priv->search_entry_changed_id); icon_view->priv->search_entry_changed_id = 0; } /* disable the flush timeout */ if (icon_view->priv->search_timeout_id != 0) g_source_remove (icon_view->priv->search_timeout_id); /* send focus-out event */ _exo_gtk_widget_send_focus_change (icon_view->priv->search_entry, FALSE); gtk_widget_hide (search_dialog); gtk_entry_set_text (GTK_ENTRY (icon_view->priv->search_entry), ""); } static void exo_icon_view_search_ensure_directory (ExoIconView *icon_view) { GtkWidget *toplevel; GtkWidget *frame; GtkWidget *vbox; GtkWindowGroup *group; /* determine the toplevel window */ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (icon_view)); /* check if we already have a search window */ if (G_LIKELY (icon_view->priv->search_window != NULL)) { if ((group = gtk_window_get_group (GTK_WINDOW (toplevel))) != NULL) gtk_window_group_add_window (group, GTK_WINDOW (icon_view->priv->search_window)); else if ((group = gtk_window_get_group (GTK_WINDOW (icon_view->priv->search_window))) != NULL) gtk_window_group_remove_window (group, GTK_WINDOW (icon_view->priv->search_window)); return; } /* allocate a new search window */ icon_view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_type_hint (GTK_WINDOW (icon_view->priv->search_window), GDK_WINDOW_TYPE_HINT_UTILITY); if ((group = gtk_window_get_group (GTK_WINDOW (toplevel))) != NULL) gtk_window_group_add_window (group, GTK_WINDOW (icon_view->priv->search_window)); gtk_window_set_modal (GTK_WINDOW (icon_view->priv->search_window), TRUE); gtk_window_set_screen (GTK_WINDOW (icon_view->priv->search_window), gtk_widget_get_screen (GTK_WIDGET (icon_view))); gtk_window_set_transient_for (GTK_WINDOW (icon_view->priv->search_window), GTK_WINDOW (toplevel)); /* connect signal handlers */ g_signal_connect (G_OBJECT (icon_view->priv->search_window), "delete-event", G_CALLBACK (exo_icon_view_search_delete_event), icon_view); g_signal_connect (G_OBJECT (icon_view->priv->search_window), "scroll-event", G_CALLBACK (exo_icon_view_search_scroll_event), icon_view); g_signal_connect (G_OBJECT (icon_view->priv->search_window), "key-press-event", G_CALLBACK (exo_icon_view_search_key_press_event), icon_view); g_signal_connect (G_OBJECT (icon_view->priv->search_window), "button-press-event", G_CALLBACK (exo_icon_view_search_button_press_event), icon_view); /* allocate the frame widget */ frame = g_object_new (GTK_TYPE_FRAME, "shadow-type", GTK_SHADOW_ETCHED_IN, NULL); gtk_container_add (GTK_CONTAINER (icon_view->priv->search_window), frame); gtk_widget_show (frame); /* allocate the vertical box */ vbox = g_object_new (GTK_TYPE_VBOX, "border-width", 3, NULL); gtk_container_add (GTK_CONTAINER (frame), vbox); gtk_widget_show (vbox); /* allocate the search entry widget */ icon_view->priv->search_entry = gtk_entry_new (); g_signal_connect (G_OBJECT (icon_view->priv->search_entry), "activate", G_CALLBACK (exo_icon_view_search_activate), icon_view); #if GTK_CHECK_VERSION(2, 20, 0) g_signal_connect (G_OBJECT (icon_view->priv->search_entry), "preedit-changed", G_CALLBACK (exo_icon_view_search_preedit_changed), icon_view); #else g_signal_connect (G_OBJECT (GTK_ENTRY (icon_view->priv->search_entry)->im_context), "preedit-changed", G_CALLBACK (exo_icon_view_search_preedit_changed), icon_view); #endif gtk_box_pack_start (GTK_BOX (vbox), icon_view->priv->search_entry, TRUE, TRUE, 0); gtk_widget_realize (icon_view->priv->search_entry); gtk_widget_show (icon_view->priv->search_entry); } static void exo_icon_view_search_init (GtkWidget *search_entry, ExoIconView *icon_view) { GtkTreeModel *model; GtkTreeIter iter; const gchar *text; gint length; gint count = 0; _exo_return_if_fail (GTK_IS_ENTRY (search_entry)); _exo_return_if_fail (EXO_IS_ICON_VIEW (icon_view)); /* determine the current text for the search entry */ text = gtk_entry_get_text (GTK_ENTRY (search_entry)); if (G_UNLIKELY (text == NULL)) return; /* unselect all items */ exo_icon_view_unselect_all (icon_view); /* renew the flush timeout */ if ((icon_view->priv->search_timeout_id != 0)) { /* drop the previous timeout */ g_source_remove (icon_view->priv->search_timeout_id); /* schedule a new timeout */ icon_view->priv->search_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, EXO_ICON_VIEW_SEARCH_DIALOG_TIMEOUT, exo_icon_view_search_timeout, icon_view, exo_icon_view_search_timeout_destroy); } /* verify that we have a search text */ length = strlen (text); if (length < 1) return; /* verify that we have a valid model */ model = exo_icon_view_get_model (icon_view); if (G_UNLIKELY (model == NULL)) return; /* start the interactive search */ if (gtk_tree_model_get_iter_first (model, &iter)) { /* let's see if we have a match */ if (exo_icon_view_search_iter (icon_view, model, &iter, text, &count, 1)) icon_view->priv->search_selected_iter = 1; } } static gboolean exo_icon_view_search_iter (ExoIconView *icon_view, GtkTreeModel *model, GtkTreeIter *iter, const gchar *text, gint *count, gint n) { GtkTreePath *path; _exo_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); _exo_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE); _exo_return_val_if_fail (count != NULL, FALSE); /* search for a matching item */ do { if (!(*icon_view->priv->search_equal_func) (model, icon_view->priv->search_column, text, iter, icon_view->priv->search_equal_data)) { (*count) += 1; if (*count == n) { /* place cursor on the item and select it */ path = gtk_tree_model_get_path (model, iter); exo_icon_view_select_path (icon_view, path); exo_icon_view_set_cursor (icon_view, path, NULL, FALSE); gtk_tree_path_free (path); return TRUE; } } } while (gtk_tree_model_iter_next (model, iter)); /* no match */ return FALSE; } static void exo_icon_view_search_move (GtkWidget *widget, ExoIconView *icon_view, gboolean move_up) { GtkTreeModel *model; const gchar *text; GtkTreeIter iter; gboolean retval; gint length; gint count = 0; /* determine the current text for the search entry */ text = gtk_entry_get_text (GTK_ENTRY (icon_view->priv->search_entry)); if (G_UNLIKELY (text == NULL)) return; /* if we already selected the first item, we cannot go up */ if (move_up && icon_view->priv->search_selected_iter == 1) return; /* determine the length of the search text */ length = strlen (text); if (G_UNLIKELY (length < 1)) return; /* unselect all items */ exo_icon_view_unselect_all (icon_view); /* verify that we have a valid model */ model = exo_icon_view_get_model (icon_view); if (G_UNLIKELY (model == NULL)) return; /* determine the iterator to the first item */ if (!gtk_tree_model_get_iter_first (model, &iter)) return; /* first attempt to search */ retval = exo_icon_view_search_iter (icon_view, model, &iter, text, &count, move_up ? (icon_view->priv->search_selected_iter - 1) : (icon_view->priv->search_selected_iter + 1)); /* check if we found something */ if (G_LIKELY (retval)) { /* match found */ icon_view->priv->search_selected_iter += move_up ? -1 : 1; } else { /* return to old iter */ if (gtk_tree_model_get_iter_first (model, &iter)) { count = 0; exo_icon_view_search_iter (icon_view, model, &iter, text, &count, icon_view->priv->search_selected_iter); } } } static void #if GTK_CHECK_VERSION(2, 20, 0) exo_icon_view_search_preedit_changed (GtkEntry *entry, gchar *preedit, ExoIconView *icon_view) #else exo_icon_view_search_preedit_changed (GtkIMContext *im_context, ExoIconView *icon_view) #endif { icon_view->priv->search_imcontext_changed = TRUE; /* re-register the search timeout */ if (G_LIKELY (icon_view->priv->search_timeout_id != 0)) { g_source_remove (icon_view->priv->search_timeout_id); icon_view->priv->search_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, EXO_ICON_VIEW_SEARCH_DIALOG_TIMEOUT, exo_icon_view_search_timeout, icon_view, exo_icon_view_search_timeout_destroy); } } static gboolean exo_icon_view_search_start (ExoIconView *icon_view, gboolean keybinding) { GTypeClass *klass; /* check if typeahead is enabled */ if (G_UNLIKELY (!icon_view->priv->enable_search && !keybinding)) return FALSE; /* check if we already display the search window */ if (icon_view->priv->search_window != NULL && gtk_widget_get_visible (icon_view->priv->search_window)) return TRUE; /* we only start interactive search if we have focus, * we don't want to start interactive search if one of * our children has the focus. */ if (!gtk_widget_has_focus (GTK_WIDGET (icon_view))) return FALSE; /* verify that we have a search column */ if (G_UNLIKELY (icon_view->priv->search_column < 0)) return FALSE; exo_icon_view_search_ensure_directory (icon_view); /* clear search entry if we were started by a keybinding */ if (G_UNLIKELY (keybinding)) gtk_entry_set_text (GTK_ENTRY (icon_view->priv->search_entry), ""); /* determine the position for the search dialog */ (*icon_view->priv->search_position_func) (icon_view, icon_view->priv->search_window, icon_view->priv->search_position_data); /* display the search dialog */ gtk_widget_show (icon_view->priv->search_window); /* connect "changed" signal for the entry */ if (G_UNLIKELY (icon_view->priv->search_entry_changed_id == 0)) { icon_view->priv->search_entry_changed_id = g_signal_connect (G_OBJECT (icon_view->priv->search_entry), "changed", G_CALLBACK (exo_icon_view_search_init), icon_view); } /* start the search timeout */ icon_view->priv->search_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, EXO_ICON_VIEW_SEARCH_DIALOG_TIMEOUT, exo_icon_view_search_timeout, icon_view, exo_icon_view_search_timeout_destroy); /* grab focus will select all the text, we don't want that to happen, so we * call the parent instance and bypass the selection change. This is probably * really hackish, but GtkTreeView does it as well *hrhr* */ klass = g_type_class_peek_parent (GTK_ENTRY_GET_CLASS (icon_view->priv->search_entry)); (*GTK_WIDGET_CLASS (klass)->grab_focus) (icon_view->priv->search_entry); /* send focus-in event */ _exo_gtk_widget_send_focus_change (icon_view->priv->search_entry, TRUE); /* search first matching iter */ exo_icon_view_search_init (icon_view->priv->search_entry, icon_view); return TRUE; } static gboolean exo_icon_view_search_equal_func (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer user_data) { const gchar *str; gboolean retval = TRUE; GValue transformed = { 0, }; GValue value = { 0, }; gchar *case_normalized_string = NULL; gchar *case_normalized_key = NULL; gchar *normalized_string; gchar *normalized_key; /* determine the value for the column/iter */ gtk_tree_model_get_value (model, iter, column, &value); /* try to transform the value to a string */ g_value_init (&transformed, G_TYPE_STRING); if (!g_value_transform (&value, &transformed)) { g_value_unset (&value); return TRUE; } g_value_unset (&value); /* check if we have a string value */ str = g_value_get_string (&transformed); if (G_UNLIKELY (str == NULL)) { g_value_unset (&transformed); return TRUE; } /* normalize the string and the key */ normalized_string = g_utf8_normalize (str, -1, G_NORMALIZE_ALL); normalized_key = g_utf8_normalize (key, -1, G_NORMALIZE_ALL); /* check if we have normalized both string */ if (G_LIKELY (normalized_string != NULL && normalized_key != NULL)) { case_normalized_string = g_utf8_casefold (normalized_string, -1); case_normalized_key = g_utf8_casefold (normalized_key, -1); /* compare the casefolded strings */ if (strncmp (case_normalized_key, case_normalized_string, strlen (case_normalized_key)) == 0) retval = FALSE; } /* cleanup */ g_free (case_normalized_string); g_free (case_normalized_key); g_value_unset (&transformed); g_free (normalized_string); g_free (normalized_key); return retval; } static void exo_icon_view_search_position_func (ExoIconView *icon_view, GtkWidget *search_dialog, gpointer user_data) { GtkRequisition requisition; GdkRectangle monitor; GdkWindow *view_window = gtk_widget_get_window (GTK_WIDGET (icon_view)); GdkScreen *screen = gdk_window_get_screen (view_window); gint view_width, view_height; gint view_x, view_y; gint monitor_num; gint x, y; /* determine the monitor geometry */ monitor_num = gdk_screen_get_monitor_at_window (screen, view_window); gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); /* make sure the search dialog is realized */ gtk_widget_realize (search_dialog); gdk_window_get_origin (view_window, &view_x, &view_y); #if GTK_CHECK_VERSION(2, 24, 0) view_width = gdk_window_get_width (view_window); view_height = gdk_window_get_height (view_window); #else gdk_drawable_get_size (view_window, &view_width, &view_height); #endif #if GTK_CHECK_VERSION(3, 0, 0) gtk_widget_get_preferred_size (search_dialog, NULL, &requisition); #else gtk_widget_size_request (search_dialog, &requisition); #endif if (view_x + view_width > gdk_screen_get_width (screen)) x = gdk_screen_get_width (screen) - requisition.width; else if (view_x + view_width - requisition.width < 0) x = 0; else x = view_x + view_width - requisition.width; if (view_y + view_height + requisition.height > gdk_screen_get_height (screen)) y = gdk_screen_get_height (screen) - requisition.height; else if (view_y + view_height < 0) /* isn't really possible ... */ y = 0; else y = view_y + view_height; gtk_window_move (GTK_WINDOW (search_dialog), x, y); } static gboolean exo_icon_view_search_button_press_event (GtkWidget *widget, GdkEventButton *event, ExoIconView *icon_view) { _exo_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); _exo_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); /* hide the search dialog */ exo_icon_view_search_dialog_hide (widget, icon_view); if (event->window == icon_view->priv->bin_window) exo_icon_view_button_press_event (GTK_WIDGET (icon_view), event); return TRUE; } static gboolean exo_icon_view_search_delete_event (GtkWidget *widget, GdkEventAny *event, ExoIconView *icon_view) { _exo_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); _exo_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); /* hide the search dialog */ exo_icon_view_search_dialog_hide (widget, icon_view); return TRUE; } static gboolean exo_icon_view_search_key_press_event (GtkWidget *widget, GdkEventKey *event, ExoIconView *icon_view) { gboolean retval = FALSE; _exo_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); _exo_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); /* close window and cancel the search */ if (event->keyval == GDK_KEY_Escape || event->keyval == GDK_KEY_Tab) { exo_icon_view_search_dialog_hide (widget, icon_view); return TRUE; } /* select previous matching iter */ if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_KP_Up) { exo_icon_view_search_move (widget, icon_view, TRUE); retval = TRUE; } if (((event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) && (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) { exo_icon_view_search_move (widget, icon_view, TRUE); retval = TRUE; } /* select next matching iter */ if (event->keyval == GDK_KEY_Down || event->keyval == GDK_KEY_KP_Down) { exo_icon_view_search_move (widget, icon_view, FALSE); retval = TRUE; } if (((event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) == GDK_CONTROL_MASK) && (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) { exo_icon_view_search_move (widget, icon_view, FALSE); retval = TRUE; } /* renew the flush timeout */ if (retval && (icon_view->priv->search_timeout_id != 0)) { /* drop the previous timeout */ g_source_remove (icon_view->priv->search_timeout_id); /* schedule a new timeout */ icon_view->priv->search_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, EXO_ICON_VIEW_SEARCH_DIALOG_TIMEOUT, exo_icon_view_search_timeout, icon_view, exo_icon_view_search_timeout_destroy); } return retval; } static gboolean exo_icon_view_search_scroll_event (GtkWidget *widget, GdkEventScroll *event, ExoIconView *icon_view) { gboolean retval = TRUE; _exo_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); _exo_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE); if (event->direction == GDK_SCROLL_UP) exo_icon_view_search_move (widget, icon_view, TRUE); else if (event->direction == GDK_SCROLL_DOWN) exo_icon_view_search_move (widget, icon_view, FALSE); else retval = FALSE; return retval; } static gboolean exo_icon_view_search_timeout (gpointer user_data) { ExoIconView *icon_view = EXO_ICON_VIEW (user_data); if(!g_source_is_destroyed(g_main_current_source())) exo_icon_view_search_dialog_hide (icon_view->priv->search_window, icon_view); return FALSE; } static void exo_icon_view_search_timeout_destroy (gpointer user_data) { EXO_ICON_VIEW (user_data)->priv->search_timeout_id = 0; } /* Accessibility Support */ static gpointer accessible_parent_class; static gpointer accessible_item_parent_class; static GQuark accessible_private_data_quark = 0; #define EXO_TYPE_ICON_VIEW_ITEM_ACCESSIBLE (exo_icon_view_item_accessible_get_type ()) #define EXO_ICON_VIEW_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXO_TYPE_ICON_VIEW_ITEM_ACCESSIBLE, ExoIconViewItemAccessible)) #define EXO_IS_ICON_VIEW_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EXO_TYPE_ICON_VIEW_ITEM_ACCESSIBLE)) static GType exo_icon_view_item_accessible_get_type (void); enum { ACTION_ACTIVATE, LAST_ACTION }; typedef struct { AtkObject parent; ExoIconViewItem *item; GtkWidget *widget; AtkStateSet *state_set; gchar *text; GtkTextBuffer *text_buffer; gchar *action_descriptions[LAST_ACTION]; gchar *image_description; guint action_idle_handler; } ExoIconViewItemAccessible; static const gchar *const exo_icon_view_item_accessible_action_names[] = { "activate", NULL }; static const gchar *const exo_icon_view_item_accessible_action_descriptions[] = { "Activate item", NULL }; typedef struct _ExoIconViewItemAccessibleClass { AtkObjectClass parent_class; } ExoIconViewItemAccessibleClass; static gboolean exo_icon_view_item_accessible_is_showing (ExoIconViewItemAccessible *item); static gboolean exo_icon_view_item_accessible_idle_do_action (gpointer data) { ExoIconViewItemAccessible *item; ExoIconView *icon_view; GtkTreePath *path; if(g_source_is_destroyed(g_main_current_source())) return FALSE; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (data); item->action_idle_handler = 0; if (item->widget != NULL) { icon_view = EXO_ICON_VIEW (item->widget); path = gtk_tree_path_new_from_indices (item->item->index, -1); exo_icon_view_item_activated (icon_view, path); gtk_tree_path_free (path); } return FALSE; } static gboolean exo_icon_view_item_accessible_action_do_action (AtkAction *action, gint i) { ExoIconViewItemAccessible *item; if (i < 0 || i >= LAST_ACTION) return FALSE; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (action); if (!EXO_IS_ICON_VIEW (item->widget)) return FALSE; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return FALSE; switch (i) { case ACTION_ACTIVATE: if (!item->action_idle_handler) item->action_idle_handler = gdk_threads_add_idle (exo_icon_view_item_accessible_idle_do_action, item); break; default: g_assert_not_reached (); return FALSE; } return TRUE; } static gint exo_icon_view_item_accessible_action_get_n_actions (AtkAction *action) { return LAST_ACTION; } static const gchar * exo_icon_view_item_accessible_action_get_description (AtkAction *action, gint i) { ExoIconViewItemAccessible *item; if (i < 0 || i >= LAST_ACTION) return NULL; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (action); if (item->action_descriptions[i]) return item->action_descriptions[i]; else return exo_icon_view_item_accessible_action_descriptions[i]; } static const gchar * exo_icon_view_item_accessible_action_get_name (AtkAction *action, gint i) { if (i < 0 || i >= LAST_ACTION) return NULL; return exo_icon_view_item_accessible_action_names[i]; } static gboolean exo_icon_view_item_accessible_action_set_description (AtkAction *action, gint i, const gchar *description) { ExoIconViewItemAccessible *item; if (i < 0 || i >= LAST_ACTION) return FALSE; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (action); g_free (item->action_descriptions[i]); item->action_descriptions[i] = g_strdup (description); return TRUE; } static void atk_action_item_interface_init (AtkActionIface *iface) { iface->do_action = exo_icon_view_item_accessible_action_do_action; iface->get_n_actions = exo_icon_view_item_accessible_action_get_n_actions; iface->get_description = exo_icon_view_item_accessible_action_get_description; iface->get_name = exo_icon_view_item_accessible_action_get_name; iface->set_description = exo_icon_view_item_accessible_action_set_description; } static const gchar * exo_icon_view_item_accessible_image_get_image_description (AtkImage *image) { ExoIconViewItemAccessible *item; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (image); return item->image_description; } static gboolean exo_icon_view_item_accessible_image_set_image_description (AtkImage *image, const gchar *description) { ExoIconViewItemAccessible *item; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (image); g_free (item->image_description); item->image_description = g_strdup (description); return TRUE; } static gboolean get_pixbuf_box (ExoIconView *icon_view, ExoIconViewItem *item, GdkRectangle *box) { GList *l; for (l = icon_view->priv->cell_list; l; l = l->next) { ExoIconViewCellInfo *info = l->data; if (GTK_IS_CELL_RENDERER_PIXBUF (info->cell)) { if (info->position < item->n_cells) *box = item->box[info->position]; return TRUE; } } return FALSE; } static gchar * get_text (ExoIconView *icon_view, ExoIconViewItem *item) { GList *l; gchar *text; for (l = icon_view->priv->cell_list; l; l = l->next) { ExoIconViewCellInfo *info = l->data; if (GTK_IS_CELL_RENDERER_TEXT (info->cell)) { g_object_get (info->cell, "text", &text, NULL); return text; } } return NULL; } static void exo_icon_view_item_accessible_image_get_image_size (AtkImage *image, gint *width, gint *height) { ExoIconViewItemAccessible *item; GdkRectangle box; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (image); if (!EXO_IS_ICON_VIEW (item->widget)) return; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return; if (get_pixbuf_box (EXO_ICON_VIEW (item->widget), item->item, &box)) { *width = box.width; *height = box.height; } } static void exo_icon_view_item_accessible_image_get_image_position (AtkImage *image, gint *x, gint *y, AtkCoordType coord_type) { ExoIconViewItemAccessible *item; AtkObject *parent_obj; GdkRectangle box; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (image); if (!EXO_IS_ICON_VIEW (item->widget)) return; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return; parent_obj = gtk_widget_get_accessible (item->widget); atk_component_get_extents (ATK_COMPONENT (parent_obj), x, y, NULL, NULL, coord_type); if (get_pixbuf_box (EXO_ICON_VIEW (item->widget), item->item, &box)) { *x+= box.x - item->item->area.x; *y+= box.y - item->item->area.y; } } static void atk_image_item_interface_init (AtkImageIface *iface) { iface->get_image_description = exo_icon_view_item_accessible_image_get_image_description; iface->set_image_description = exo_icon_view_item_accessible_image_set_image_description; iface->get_image_size = exo_icon_view_item_accessible_image_get_image_size; iface->get_image_position = exo_icon_view_item_accessible_image_get_image_position; } static gchar * exo_icon_view_item_accessible_text_get_text (AtkText *text, gint start_pos, gint end_pos) { ExoIconViewItemAccessible *item; GtkTextIter start, end; GtkTextBuffer *buffer; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return NULL; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return NULL; buffer = item->text_buffer; gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos); if (end_pos < 0) gtk_text_buffer_get_end_iter (buffer, &end); else gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos); return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); } static gunichar exo_icon_view_item_accessible_text_get_character_at_offset (AtkText *text, gint offset) { ExoIconViewItemAccessible *item; GtkTextIter start, end; GtkTextBuffer *buffer; gchar *string; gunichar unichar; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return '\0'; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return '\0'; buffer = item->text_buffer; if (offset >= gtk_text_buffer_get_char_count (buffer)) return '\0'; gtk_text_buffer_get_iter_at_offset (buffer, &start, offset); end = start; gtk_text_iter_forward_char (&end); string = gtk_text_buffer_get_slice (buffer, &start, &end, FALSE); unichar = g_utf8_get_char (string); g_free(string); return unichar; } static gchar* exo_icon_view_item_accessible_text_get_text_before_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) { ExoIconViewItemAccessible *item; GtkTextIter start, end; GtkTextBuffer *buffer; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return NULL; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return NULL; buffer = item->text_buffer; if (!gtk_text_buffer_get_char_count (buffer)) { *start_offset = 0; *end_offset = 0; return g_strdup (""); } gtk_text_buffer_get_iter_at_offset (buffer, &start, offset); end = start; switch (boundary_type) { case ATK_TEXT_BOUNDARY_CHAR: gtk_text_iter_backward_char(&start); break; case ATK_TEXT_BOUNDARY_WORD_START: if (!gtk_text_iter_starts_word (&start)) gtk_text_iter_backward_word_start (&start); end = start; gtk_text_iter_backward_word_start(&start); break; case ATK_TEXT_BOUNDARY_WORD_END: if (gtk_text_iter_inside_word (&start) && !gtk_text_iter_starts_word (&start)) gtk_text_iter_backward_word_start (&start); while (!gtk_text_iter_ends_word (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } end = start; gtk_text_iter_backward_word_start(&start); while (!gtk_text_iter_ends_word (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } break; case ATK_TEXT_BOUNDARY_SENTENCE_START: if (!gtk_text_iter_starts_sentence (&start)) gtk_text_iter_backward_sentence_start (&start); end = start; gtk_text_iter_backward_sentence_start (&start); break; case ATK_TEXT_BOUNDARY_SENTENCE_END: if (gtk_text_iter_inside_sentence (&start) && !gtk_text_iter_starts_sentence (&start)) gtk_text_iter_backward_sentence_start (&start); while (!gtk_text_iter_ends_sentence (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } end = start; gtk_text_iter_backward_sentence_start (&start); while (!gtk_text_iter_ends_sentence (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } break; case ATK_TEXT_BOUNDARY_LINE_START: case ATK_TEXT_BOUNDARY_LINE_END: break; } *start_offset = gtk_text_iter_get_offset (&start); *end_offset = gtk_text_iter_get_offset (&end); return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); } static gchar* exo_icon_view_item_accessible_text_get_text_at_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) { ExoIconViewItemAccessible *item; GtkTextIter start, end; GtkTextBuffer *buffer; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return NULL; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return NULL; buffer = item->text_buffer; if (!gtk_text_buffer_get_char_count (buffer)) { *start_offset = 0; *end_offset = 0; return g_strdup (""); } gtk_text_buffer_get_iter_at_offset (buffer, &start, offset); end = start; switch (boundary_type) { case ATK_TEXT_BOUNDARY_CHAR: gtk_text_iter_forward_char (&end); break; case ATK_TEXT_BOUNDARY_WORD_START: if (!gtk_text_iter_starts_word (&start)) gtk_text_iter_backward_word_start (&start); if (gtk_text_iter_inside_word (&end)) gtk_text_iter_forward_word_end (&end); while (!gtk_text_iter_starts_word (&end)) { if (!gtk_text_iter_forward_char (&end)) break; } break; case ATK_TEXT_BOUNDARY_WORD_END: if (gtk_text_iter_inside_word (&start) && !gtk_text_iter_starts_word (&start)) gtk_text_iter_backward_word_start (&start); while (!gtk_text_iter_ends_word (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } gtk_text_iter_forward_word_end (&end); break; case ATK_TEXT_BOUNDARY_SENTENCE_START: if (!gtk_text_iter_starts_sentence (&start)) gtk_text_iter_backward_sentence_start (&start); if (gtk_text_iter_inside_sentence (&end)) gtk_text_iter_forward_sentence_end (&end); while (!gtk_text_iter_starts_sentence (&end)) { if (!gtk_text_iter_forward_char (&end)) break; } break; case ATK_TEXT_BOUNDARY_SENTENCE_END: if (gtk_text_iter_inside_sentence (&start) && !gtk_text_iter_starts_sentence (&start)) gtk_text_iter_backward_sentence_start (&start); while (!gtk_text_iter_ends_sentence (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } gtk_text_iter_forward_sentence_end (&end); break; case ATK_TEXT_BOUNDARY_LINE_START: case ATK_TEXT_BOUNDARY_LINE_END: break; } *start_offset = gtk_text_iter_get_offset (&start); *end_offset = gtk_text_iter_get_offset (&end); return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); } static gchar* exo_icon_view_item_accessible_text_get_text_after_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) { ExoIconViewItemAccessible *item; GtkTextIter start, end; GtkTextBuffer *buffer; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return NULL; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return NULL; buffer = item->text_buffer; if (!gtk_text_buffer_get_char_count (buffer)) { *start_offset = 0; *end_offset = 0; return g_strdup (""); } gtk_text_buffer_get_iter_at_offset (buffer, &start, offset); end = start; switch (boundary_type) { case ATK_TEXT_BOUNDARY_CHAR: gtk_text_iter_forward_char(&start); gtk_text_iter_forward_chars(&end, 2); break; case ATK_TEXT_BOUNDARY_WORD_START: if (gtk_text_iter_inside_word (&end)) gtk_text_iter_forward_word_end (&end); while (!gtk_text_iter_starts_word (&end)) { if (!gtk_text_iter_forward_char (&end)) break; } start = end; if (!gtk_text_iter_is_end (&end)) { gtk_text_iter_forward_word_end (&end); while (!gtk_text_iter_starts_word (&end)) { if (!gtk_text_iter_forward_char (&end)) break; } } break; case ATK_TEXT_BOUNDARY_WORD_END: gtk_text_iter_forward_word_end (&end); start = end; if (!gtk_text_iter_is_end (&end)) gtk_text_iter_forward_word_end (&end); break; case ATK_TEXT_BOUNDARY_SENTENCE_START: if (gtk_text_iter_inside_sentence (&end)) gtk_text_iter_forward_sentence_end (&end); while (!gtk_text_iter_starts_sentence (&end)) { if (!gtk_text_iter_forward_char (&end)) break; } start = end; if (!gtk_text_iter_is_end (&end)) { gtk_text_iter_forward_sentence_end (&end); while (!gtk_text_iter_starts_sentence (&end)) { if (!gtk_text_iter_forward_char (&end)) break; } } break; case ATK_TEXT_BOUNDARY_SENTENCE_END: gtk_text_iter_forward_sentence_end (&end); start = end; if (!gtk_text_iter_is_end (&end)) gtk_text_iter_forward_sentence_end (&end); break; case ATK_TEXT_BOUNDARY_LINE_START: case ATK_TEXT_BOUNDARY_LINE_END: break; } *start_offset = gtk_text_iter_get_offset (&start); *end_offset = gtk_text_iter_get_offset (&end); return gtk_text_buffer_get_text (buffer, &start, &end, FALSE); } static gint exo_icon_view_item_accessible_text_get_character_count (AtkText *text) { ExoIconViewItemAccessible *item; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return 0; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return 0; return gtk_text_buffer_get_char_count (item->text_buffer); } static void exo_icon_view_item_accessible_text_get_character_extents (AtkText *text, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type) { ExoIconViewItemAccessible *item; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return; } static gint exo_icon_view_item_accessible_text_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coord_type) { ExoIconViewItemAccessible *item; gint offset = 0; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (text); if (!EXO_IS_ICON_VIEW (item->widget)) return -1; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return -1; return offset; } static void atk_text_item_interface_init (AtkTextIface *iface) { iface->get_text = exo_icon_view_item_accessible_text_get_text; iface->get_character_at_offset = exo_icon_view_item_accessible_text_get_character_at_offset; iface->get_text_before_offset = exo_icon_view_item_accessible_text_get_text_before_offset; iface->get_text_at_offset = exo_icon_view_item_accessible_text_get_text_at_offset; iface->get_text_after_offset = exo_icon_view_item_accessible_text_get_text_after_offset; iface->get_character_count = exo_icon_view_item_accessible_text_get_character_count; iface->get_character_extents = exo_icon_view_item_accessible_text_get_character_extents; iface->get_offset_at_point = exo_icon_view_item_accessible_text_get_offset_at_point; } static void exo_icon_view_item_accessible_get_extents (AtkComponent *component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type) { ExoIconViewItemAccessible *item; AtkObject *parent_obj; gint l_x, l_y; g_return_if_fail (EXO_IS_ICON_VIEW_ITEM_ACCESSIBLE (component)); item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (component); if (!GTK_IS_WIDGET (item->widget)) return; if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT)) return; *width = item->item->area.width; *height = item->item->area.height; if (exo_icon_view_item_accessible_is_showing (item)) { parent_obj = gtk_widget_get_accessible (item->widget); atk_component_get_extents (ATK_COMPONENT (parent_obj), &l_x, &l_y, NULL, NULL, coord_type); *x = l_x + item->item->area.x; *y = l_y + item->item->area.y; } else { *x = G_MININT; *y = G_MININT; } } static gboolean exo_icon_view_item_accessible_grab_focus (AtkComponent *component) { ExoIconViewItemAccessible *item; GtkWidget *toplevel; g_return_val_if_fail (EXO_IS_ICON_VIEW_ITEM_ACCESSIBLE (component), FALSE); item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (component); if (!GTK_IS_WIDGET (item->widget)) return FALSE; gtk_widget_grab_focus (item->widget); exo_icon_view_set_cursor_item (EXO_ICON_VIEW (item->widget), item->item, -1); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (item->widget)); if (gtk_widget_is_toplevel (toplevel)) gtk_window_present (GTK_WINDOW (toplevel)); return TRUE; } static void atk_component_item_interface_init (AtkComponentIface *iface) { iface->get_extents = exo_icon_view_item_accessible_get_extents; iface->grab_focus = exo_icon_view_item_accessible_grab_focus; } static gboolean exo_icon_view_item_accessible_add_state (ExoIconViewItemAccessible *item, AtkStateType state_type, gboolean emit_signal) { gboolean rc; rc = atk_state_set_add_state (item->state_set, state_type); /* * The signal should only be generated if the value changed, * not when the item is set up. So states that are set * initially should pass FALSE as the emit_signal argument. */ if (emit_signal) { atk_object_notify_state_change (ATK_OBJECT (item), state_type, TRUE); /* If state_type is ATK_STATE_VISIBLE, additional notification */ if (state_type == ATK_STATE_VISIBLE) g_signal_emit_by_name (item, "visible-data-changed"); } return rc; } static gboolean exo_icon_view_item_accessible_remove_state (ExoIconViewItemAccessible *item, AtkStateType state_type, gboolean emit_signal) { if (atk_state_set_contains_state (item->state_set, state_type)) { gboolean rc; rc = atk_state_set_remove_state (item->state_set, state_type); /* * The signal should only be generated if the value changed, * not when the item is set up. So states that are set * initially should pass FALSE as the emit_signal argument. */ if (emit_signal) { atk_object_notify_state_change (ATK_OBJECT (item), state_type, FALSE); /* If state_type is ATK_STATE_VISIBLE, additional notification */ if (state_type == ATK_STATE_VISIBLE) g_signal_emit_by_name (item, "visible-data-changed"); } return rc; } else return FALSE; } static gboolean exo_icon_view_item_accessible_is_showing (ExoIconViewItemAccessible *item) { ExoIconView *icon_view; GtkAllocation allocation; GdkRectangle visible_rect; gboolean is_showing; /* * An item is considered "SHOWING" if any part of the item is in the * visible rectangle. */ if (!EXO_IS_ICON_VIEW (item->widget)) return FALSE; if (item->item == NULL) return FALSE; gtk_widget_get_allocation (item->widget, &allocation); icon_view = EXO_ICON_VIEW (item->widget); visible_rect.x = 0; if (icon_view->priv->hadjustment) visible_rect.x += gtk_adjustment_get_value (icon_view->priv->hadjustment); visible_rect.y = 0; if (icon_view->priv->hadjustment) visible_rect.y += gtk_adjustment_get_value (icon_view->priv->vadjustment); visible_rect.width = allocation.width; visible_rect.height = allocation.height; if (((item->item->area.x + item->item->area.width) < visible_rect.x) || ((item->item->area.y + item->item->area.height) < (visible_rect.y)) || (item->item->area.x > (visible_rect.x + visible_rect.width)) || (item->item->area.y > (visible_rect.y + visible_rect.height))) is_showing = FALSE; else is_showing = TRUE; return is_showing; } static gboolean exo_icon_view_item_accessible_set_visibility (ExoIconViewItemAccessible *item, gboolean emit_signal) { if (exo_icon_view_item_accessible_is_showing (item)) return exo_icon_view_item_accessible_add_state (item, ATK_STATE_SHOWING, emit_signal); else return exo_icon_view_item_accessible_remove_state (item, ATK_STATE_SHOWING, emit_signal); } static void exo_icon_view_item_accessible_object_init (ExoIconViewItemAccessible *item) { gint i; item->state_set = atk_state_set_new (); atk_state_set_add_state (item->state_set, ATK_STATE_ENABLED); atk_state_set_add_state (item->state_set, ATK_STATE_FOCUSABLE); atk_state_set_add_state (item->state_set, ATK_STATE_SENSITIVE); atk_state_set_add_state (item->state_set, ATK_STATE_SELECTABLE); atk_state_set_add_state (item->state_set, ATK_STATE_VISIBLE); for (i = 0; i < LAST_ACTION; i++) item->action_descriptions[i] = NULL; item->image_description = NULL; item->action_idle_handler = 0; } static void exo_icon_view_item_accessible_finalize (GObject *object) { ExoIconViewItemAccessible *item; gint i; g_return_if_fail (EXO_IS_ICON_VIEW_ITEM_ACCESSIBLE (object)); item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (object); if (item->widget) g_object_remove_weak_pointer (G_OBJECT (item->widget), (gpointer) &item->widget); if (item->state_set) g_object_unref (item->state_set); if (item->text_buffer) g_object_unref (item->text_buffer); for (i = 0; i < LAST_ACTION; i++) g_free (item->action_descriptions[i]); g_free (item->image_description); if (item->action_idle_handler) { g_source_remove (item->action_idle_handler); item->action_idle_handler = 0; } G_OBJECT_CLASS (accessible_item_parent_class)->finalize (object); } static AtkObject* exo_icon_view_item_accessible_get_parent (AtkObject *obj) { ExoIconViewItemAccessible *item; g_return_val_if_fail (EXO_IS_ICON_VIEW_ITEM_ACCESSIBLE (obj), NULL); item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (obj); if (item->widget) return gtk_widget_get_accessible (item->widget); else return NULL; } static gint exo_icon_view_item_accessible_get_index_in_parent (AtkObject *obj) { ExoIconViewItemAccessible *item; g_return_val_if_fail (EXO_IS_ICON_VIEW_ITEM_ACCESSIBLE (obj), 0); item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (obj); return item->item->index; } static AtkStateSet * exo_icon_view_item_accessible_ref_state_set (AtkObject *obj) { ExoIconViewItemAccessible *item; ExoIconView *icon_view; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (obj); g_return_val_if_fail (item->state_set, NULL); if (!item->widget) return NULL; icon_view = EXO_ICON_VIEW (item->widget); if (icon_view->priv->cursor_item == item->item) atk_state_set_add_state (item->state_set, ATK_STATE_FOCUSED); else atk_state_set_remove_state (item->state_set, ATK_STATE_FOCUSED); if (item->item->selected) atk_state_set_add_state (item->state_set, ATK_STATE_SELECTED); else atk_state_set_remove_state (item->state_set, ATK_STATE_SELECTED); return g_object_ref (item->state_set); } static void exo_icon_view_item_accessible_class_init (AtkObjectClass *klass) { GObjectClass *gobject_class; accessible_item_parent_class = g_type_class_peek_parent (klass); gobject_class = (GObjectClass *)klass; gobject_class->finalize = exo_icon_view_item_accessible_finalize; klass->get_index_in_parent = exo_icon_view_item_accessible_get_index_in_parent; klass->get_parent = exo_icon_view_item_accessible_get_parent; klass->ref_state_set = exo_icon_view_item_accessible_ref_state_set; } static GType exo_icon_view_item_accessible_get_type (void) { static GType type = 0; if (!type) { const GTypeInfo tinfo = { sizeof (ExoIconViewItemAccessibleClass), (GBaseInitFunc) NULL, /* base init */ (GBaseFinalizeFunc) NULL, /* base finalize */ (GClassInitFunc) exo_icon_view_item_accessible_class_init, /* class init */ (GClassFinalizeFunc) NULL, /* class finalize */ NULL, /* class data */ sizeof (ExoIconViewItemAccessible), /* instance size */ 0, /* nb preallocs */ (GInstanceInitFunc) exo_icon_view_item_accessible_object_init, /* instance init */ NULL /* value table */ }; const GInterfaceInfo atk_component_info = { (GInterfaceInitFunc) atk_component_item_interface_init, (GInterfaceFinalizeFunc) NULL, NULL }; const GInterfaceInfo atk_action_info = { (GInterfaceInitFunc) atk_action_item_interface_init, (GInterfaceFinalizeFunc) NULL, NULL }; const GInterfaceInfo atk_image_info = { (GInterfaceInitFunc) atk_image_item_interface_init, (GInterfaceFinalizeFunc) NULL, NULL }; const GInterfaceInfo atk_text_info = { (GInterfaceInitFunc) atk_text_item_interface_init, (GInterfaceFinalizeFunc) NULL, NULL }; type = g_type_register_static (ATK_TYPE_OBJECT, I_("ExoIconViewItemAccessible"), &tinfo, 0); g_type_add_interface_static (type, ATK_TYPE_COMPONENT, &atk_component_info); g_type_add_interface_static (type, ATK_TYPE_ACTION, &atk_action_info); g_type_add_interface_static (type, ATK_TYPE_IMAGE, &atk_image_info); g_type_add_interface_static (type, ATK_TYPE_TEXT, &atk_text_info); } return type; } #define EXO_TYPE_ICON_VIEW_ACCESSIBLE (exo_icon_view_accessible_get_type ()) #define EXO_ICON_VIEW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXO_TYPE_ICON_VIEW_ACCESSIBLE, ExoIconViewAccessible)) #define EXO_IS_ICON_VIEW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EXO_TYPE_ICON_VIEW_ACCESSIBLE)) static GType exo_icon_view_accessible_get_type (void); typedef struct { AtkObject parent; } ExoIconViewAccessible; typedef struct { AtkObject *item; gint index; } ExoIconViewItemAccessibleInfo; typedef struct { GList *items; GtkAdjustment *old_hadj; GtkAdjustment *old_vadj; GtkTreeModel *model; } ExoIconViewAccessiblePrivate; static ExoIconViewAccessiblePrivate * exo_icon_view_accessible_get_priv (AtkObject *accessible) { return g_object_get_qdata (G_OBJECT (accessible), accessible_private_data_quark); } static void exo_icon_view_item_accessible_info_new (AtkObject *accessible, AtkObject *item, gint index) { ExoIconViewItemAccessibleInfo *info; ExoIconViewItemAccessibleInfo *tmp_info; ExoIconViewAccessiblePrivate *priv; GList *items; info = g_new (ExoIconViewItemAccessibleInfo, 1); info->item = item; info->index = index; priv = exo_icon_view_accessible_get_priv (accessible); items = priv->items; while (items) { tmp_info = items->data; if (tmp_info->index > index) break; items = items->next; } priv->items = g_list_insert_before (priv->items, items, info); priv->old_hadj = NULL; priv->old_vadj = NULL; } static gint exo_icon_view_accessible_get_n_children (AtkObject *accessible) { ExoIconView *icon_view; GtkWidget *widget; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); if (!widget) return 0; icon_view = EXO_ICON_VIEW (widget); return g_list_length (icon_view->priv->items); } static AtkObject * exo_icon_view_accessible_find_child (AtkObject *accessible, gint index) { ExoIconViewAccessiblePrivate *priv; ExoIconViewItemAccessibleInfo *info; GList *items; priv = exo_icon_view_accessible_get_priv (accessible); items = priv->items; while (items) { info = items->data; if (info->index == index) return info->item; items = items->next; } return NULL; } static AtkObject * exo_icon_view_accessible_ref_child (AtkObject *accessible, gint index) { ExoIconView *icon_view; GtkWidget *widget; GList *icons; AtkObject *obj; ExoIconViewItemAccessible *a11y_item; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); if (!widget) return NULL; icon_view = EXO_ICON_VIEW (widget); icons = g_list_nth (icon_view->priv->items, index); obj = NULL; if (icons) { ExoIconViewItem *item = icons->data; g_return_val_if_fail (item->index == index, NULL); obj = exo_icon_view_accessible_find_child (accessible, index); if (!obj) { gchar *text; obj = g_object_new (exo_icon_view_item_accessible_get_type (), NULL); exo_icon_view_item_accessible_info_new (accessible, obj, index); obj->role = ATK_ROLE_ICON; a11y_item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (obj); a11y_item->item = item; a11y_item->widget = widget; a11y_item->text_buffer = gtk_text_buffer_new (NULL); exo_icon_view_set_cell_data (icon_view, item); text = get_text (icon_view, item); if (text) { gtk_text_buffer_set_text (a11y_item->text_buffer, text, -1); g_free (text); } exo_icon_view_item_accessible_set_visibility (a11y_item, FALSE); g_object_add_weak_pointer (G_OBJECT (widget), (gpointer) &(a11y_item->widget)); } g_object_ref (obj); } return obj; } static void exo_icon_view_accessible_traverse_items (ExoIconViewAccessible *view, GList *list) { ExoIconViewAccessiblePrivate *priv; ExoIconViewItemAccessibleInfo *info; ExoIconViewItemAccessible *item; GList *items; priv = exo_icon_view_accessible_get_priv (ATK_OBJECT (view)); if (priv->items) { GtkWidget *widget; gboolean act_on_item; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (view)); if (widget == NULL) return; items = priv->items; act_on_item = (list == NULL); while (items) { info = (ExoIconViewItemAccessibleInfo *)items->data; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (info->item); if (act_on_item == FALSE && list == items) act_on_item = TRUE; if (act_on_item) exo_icon_view_item_accessible_set_visibility (item, TRUE); items = items->next; } } } static void exo_icon_view_accessible_adjustment_changed (GtkAdjustment *adjustment, ExoIconView *icon_view) { AtkObject *obj; ExoIconViewAccessible *view; /* * The scrollbars have changed */ obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view)); view = EXO_ICON_VIEW_ACCESSIBLE (obj); exo_icon_view_accessible_traverse_items (view, NULL); } static void exo_icon_view_accessible_set_scroll_adjustments (GtkWidget *widget, GtkAdjustment *hadj, GtkAdjustment *vadj) { AtkObject *atk_obj; ExoIconViewAccessiblePrivate *priv; atk_obj = gtk_widget_get_accessible (widget); priv = exo_icon_view_accessible_get_priv (atk_obj); if (priv->old_hadj != hadj) { if (priv->old_hadj) { g_object_remove_weak_pointer (G_OBJECT (priv->old_hadj), (gpointer *)&priv->old_hadj); g_signal_handlers_disconnect_by_func (priv->old_hadj, (gpointer) exo_icon_view_accessible_adjustment_changed, widget); } priv->old_hadj = hadj; if (priv->old_hadj) { g_object_add_weak_pointer (G_OBJECT (priv->old_hadj), (gpointer *)&priv->old_hadj); g_signal_connect (hadj, "value-changed", G_CALLBACK (exo_icon_view_accessible_adjustment_changed), widget); } } if (priv->old_vadj != vadj) { if (priv->old_vadj) { g_object_remove_weak_pointer (G_OBJECT (priv->old_vadj), (gpointer *)&priv->old_vadj); g_signal_handlers_disconnect_by_func (priv->old_vadj, (gpointer) exo_icon_view_accessible_adjustment_changed, widget); } priv->old_vadj = vadj; if (priv->old_vadj) { g_object_add_weak_pointer (G_OBJECT (priv->old_vadj), (gpointer *)&priv->old_vadj); g_signal_connect (vadj, "value-changed", G_CALLBACK (exo_icon_view_accessible_adjustment_changed), widget); } } } static void exo_icon_view_accessible_model_row_changed (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { AtkObject *atk_obj; gint index; GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; //ExoIconViewAccessible *a11y_view; ExoIconViewItemAccessible *a11y_item; const gchar *name; gchar *text; atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data)); //a11y_view = EXO_ICON_VIEW_ACCESSIBLE (atk_obj); index = gtk_tree_path_get_indices(path)[0]; a11y_item = EXO_ICON_VIEW_ITEM_ACCESSIBLE ( exo_icon_view_accessible_find_child (atk_obj, index)); if (a11y_item) { widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_obj)); icon_view = EXO_ICON_VIEW (widget); item = a11y_item->item; name = atk_object_get_name (ATK_OBJECT (a11y_item)); if (!name || strcmp (name, "") == 0) { exo_icon_view_set_cell_data (icon_view, item); text = get_text (icon_view, item); if (text) { gtk_text_buffer_set_text (a11y_item->text_buffer, text, -1); g_free (text); } } } g_signal_emit_by_name (atk_obj, "visible-data-changed"); return; } static void exo_icon_view_accessible_model_row_inserted (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { ExoIconViewAccessiblePrivate *priv; ExoIconViewItemAccessibleInfo *info; ExoIconViewAccessible *view; ExoIconViewItemAccessible *item; GList *items; GList *tmp_list; AtkObject *atk_obj; gint index; index = gtk_tree_path_get_indices(path)[0]; atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data)); view = EXO_ICON_VIEW_ACCESSIBLE (atk_obj); priv = exo_icon_view_accessible_get_priv (atk_obj); items = priv->items; tmp_list = NULL; while (items) { info = items->data; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (info->item); if (info->index != item->item->index) { if (info->index < index) g_warning ("Unexpected index value on insertion %d %d", index, info->index); if (tmp_list == NULL) tmp_list = items; info->index = item->item->index; } items = items->next; } exo_icon_view_accessible_traverse_items (view, tmp_list); g_signal_emit_by_name (atk_obj, "children-changed::add", index, NULL, NULL); return; } static void exo_icon_view_accessible_model_row_deleted (GtkTreeModel *tree_model, GtkTreePath *path, gpointer user_data) { ExoIconViewAccessiblePrivate *priv; ExoIconViewItemAccessibleInfo *info; ExoIconViewAccessible *view; ExoIconViewItemAccessible *item; GList *items; GList *tmp_list; GList *deleted_item; AtkObject *atk_obj; gint index; index = gtk_tree_path_get_indices(path)[0]; atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data)); view = EXO_ICON_VIEW_ACCESSIBLE (atk_obj); priv = exo_icon_view_accessible_get_priv (atk_obj); items = priv->items; tmp_list = NULL; deleted_item = NULL; info = NULL; while (items) { info = items->data; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (info->item); if (info->index == index) { deleted_item = items; } if (info->index != item->item->index) { if (tmp_list == NULL) tmp_list = items; info->index = item->item->index; } items = items->next; } exo_icon_view_accessible_traverse_items (view, tmp_list); if (deleted_item) { info = deleted_item->data; exo_icon_view_item_accessible_add_state (EXO_ICON_VIEW_ITEM_ACCESSIBLE (info->item), ATK_STATE_DEFUNCT, TRUE); g_signal_emit_by_name (atk_obj, "children-changed::remove", index, NULL, NULL); priv->items = g_list_remove_link (priv->items, deleted_item); g_free (info); } return; } static gint exo_icon_view_accessible_item_compare (ExoIconViewItemAccessibleInfo *i1, ExoIconViewItemAccessibleInfo *i2) { return i1->index - i2->index; } static void exo_icon_view_accessible_model_rows_reordered (GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gint *new_order, gpointer user_data) { ExoIconViewAccessiblePrivate *priv; ExoIconViewItemAccessibleInfo *info; ExoIconView *icon_view; ExoIconViewItemAccessible *item; GList *items; AtkObject *atk_obj; gint *order; gint length, i; atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data)); icon_view = EXO_ICON_VIEW (user_data); priv = exo_icon_view_accessible_get_priv (atk_obj); length = gtk_tree_model_iter_n_children (tree_model, NULL); order = g_new (gint, length); for (i = 0; i < length; i++) order [new_order[i]] = i; items = priv->items; while (items) { info = items->data; item = EXO_ICON_VIEW_ITEM_ACCESSIBLE (info->item); info->index = order[info->index]; item->item = g_list_nth_data (icon_view->priv->items, info->index); items = items->next; } g_free (order); priv->items = g_list_sort (priv->items, (GCompareFunc)exo_icon_view_accessible_item_compare); return; } static void exo_icon_view_accessible_disconnect_model_signals (GtkTreeModel *model, GtkWidget *widget) { GObject *obj; obj = G_OBJECT (model); g_signal_handlers_disconnect_by_func (obj, (gpointer) exo_icon_view_accessible_model_row_changed, widget); g_signal_handlers_disconnect_by_func (obj, (gpointer) exo_icon_view_accessible_model_row_inserted, widget); g_signal_handlers_disconnect_by_func (obj, (gpointer) exo_icon_view_accessible_model_row_deleted, widget); g_signal_handlers_disconnect_by_func (obj, (gpointer) exo_icon_view_accessible_model_rows_reordered, widget); } static void exo_icon_view_accessible_connect_model_signals (ExoIconView *icon_view) { GObject *obj; obj = G_OBJECT (icon_view->priv->model); g_signal_connect_data (obj, "row-changed", (GCallback) exo_icon_view_accessible_model_row_changed, icon_view, NULL, 0); g_signal_connect_data (obj, "row-inserted", (GCallback) exo_icon_view_accessible_model_row_inserted, icon_view, NULL, G_CONNECT_AFTER); g_signal_connect_data (obj, "row-deleted", (GCallback) exo_icon_view_accessible_model_row_deleted, icon_view, NULL, G_CONNECT_AFTER); g_signal_connect_data (obj, "rows-reordered", (GCallback) exo_icon_view_accessible_model_rows_reordered, icon_view, NULL, G_CONNECT_AFTER); } static void exo_icon_view_accessible_clear_cache (ExoIconViewAccessiblePrivate *priv) { ExoIconViewItemAccessibleInfo *info; GList *items; items = priv->items; while (items) { info = (ExoIconViewItemAccessibleInfo *) items->data; g_object_unref (info->item); g_free (items->data); items = items->next; } g_list_free (priv->items); priv->items = NULL; } static void exo_icon_view_accessible_notify_gtk (GObject *obj, GParamSpec *pspec) { ExoIconView *icon_view; GtkWidget *widget; AtkObject *atk_obj; ExoIconViewAccessiblePrivate *priv; if (strcmp (pspec->name, "model") == 0) { widget = GTK_WIDGET (obj); atk_obj = gtk_widget_get_accessible (widget); priv = exo_icon_view_accessible_get_priv (atk_obj); if (priv->model) { g_object_remove_weak_pointer (G_OBJECT (priv->model), (gpointer *)&priv->model); exo_icon_view_accessible_disconnect_model_signals (priv->model, widget); } exo_icon_view_accessible_clear_cache (priv); icon_view = EXO_ICON_VIEW (obj); priv->model = icon_view->priv->model; /* If there is no model the ExoIconView is probably being destroyed */ if (priv->model) { g_object_add_weak_pointer (G_OBJECT (priv->model), (gpointer *)&priv->model); exo_icon_view_accessible_connect_model_signals (icon_view); } } return; } static void exo_icon_view_accessible_initialize (AtkObject *accessible, gpointer data) { ExoIconViewAccessiblePrivate *priv; ExoIconView *icon_view; if (ATK_OBJECT_CLASS (accessible_parent_class)->initialize) ATK_OBJECT_CLASS (accessible_parent_class)->initialize (accessible, data); priv = g_new0 (ExoIconViewAccessiblePrivate, 1); g_object_set_qdata (G_OBJECT (accessible), accessible_private_data_quark, priv); icon_view = EXO_ICON_VIEW (data); if (icon_view->priv->hadjustment) { priv->old_hadj = icon_view->priv->hadjustment; g_object_add_weak_pointer (G_OBJECT (priv->old_hadj), (gpointer *)&priv->old_hadj); g_signal_connect (icon_view->priv->hadjustment, "value-changed", G_CALLBACK (exo_icon_view_accessible_adjustment_changed), icon_view); } if (icon_view->priv->vadjustment) { priv->old_vadj = icon_view->priv->vadjustment; g_object_add_weak_pointer (G_OBJECT (priv->old_vadj), (gpointer *)&priv->old_vadj); g_signal_connect (icon_view->priv->vadjustment, "value-changed", G_CALLBACK (exo_icon_view_accessible_adjustment_changed), icon_view); } g_signal_connect_after (data, "set-scroll-adjustments", G_CALLBACK (exo_icon_view_accessible_set_scroll_adjustments), NULL); g_signal_connect (data, "notify", G_CALLBACK (exo_icon_view_accessible_notify_gtk), NULL); priv->model = icon_view->priv->model; if (priv->model) { g_object_add_weak_pointer (G_OBJECT (priv->model), (gpointer *)&priv->model); exo_icon_view_accessible_connect_model_signals (icon_view); } accessible->role = ATK_ROLE_LAYERED_PANE; } static void exo_icon_view_accessible_finalize (GObject *object) { ExoIconViewAccessiblePrivate *priv; priv = exo_icon_view_accessible_get_priv (ATK_OBJECT (object)); exo_icon_view_accessible_clear_cache (priv); g_free (priv); G_OBJECT_CLASS (accessible_parent_class)->finalize (object); } #if !GTK_CHECK_VERSION(3, 0, 0) static void exo_icon_view_accessible_destroyed (GtkWidget *widget, GtkAccessible *accessible) { AtkObject *atk_obj; ExoIconViewAccessiblePrivate *priv; atk_obj = ATK_OBJECT (accessible); priv = exo_icon_view_accessible_get_priv (atk_obj); if (priv->old_hadj) { g_object_remove_weak_pointer (G_OBJECT (priv->old_hadj), (gpointer *)&priv->old_hadj); g_signal_handlers_disconnect_by_func (priv->old_hadj, (gpointer) exo_icon_view_accessible_adjustment_changed, widget); priv->old_hadj = NULL; } if (priv->old_vadj) { g_object_remove_weak_pointer (G_OBJECT (priv->old_vadj), (gpointer *)&priv->old_vadj); g_signal_handlers_disconnect_by_func (priv->old_vadj, (gpointer) exo_icon_view_accessible_adjustment_changed, widget); priv->old_vadj = NULL; } } static void exo_icon_view_accessible_connect_widget_destroyed (GtkAccessible *accessible) { if (gtk_accessible_get_widget (accessible)) { g_signal_connect_after (accessible->widget, "destroy", G_CALLBACK (exo_icon_view_accessible_destroyed), accessible); } GTK_ACCESSIBLE_CLASS (accessible_parent_class)->connect_widget_destroyed (accessible); } #endif static void exo_icon_view_accessible_class_init (AtkObjectClass *klass) { GObjectClass *gobject_class; #if !GTK_CHECK_VERSION(3, 0, 0) GtkAccessibleClass *accessible_class; #endif accessible_parent_class = g_type_class_peek_parent (klass); gobject_class = (GObjectClass *)klass; gobject_class->finalize = exo_icon_view_accessible_finalize; klass->get_n_children = exo_icon_view_accessible_get_n_children; klass->ref_child = exo_icon_view_accessible_ref_child; klass->initialize = exo_icon_view_accessible_initialize; #if !GTK_CHECK_VERSION(3, 0, 0) accessible_class = (GtkAccessibleClass *)klass; accessible_class->connect_widget_destroyed = exo_icon_view_accessible_connect_widget_destroyed; #endif accessible_private_data_quark = g_quark_from_static_string ("icon_view-accessible-private-data"); } static AtkObject* exo_icon_view_accessible_ref_accessible_at_point (AtkComponent *component, gint x, gint y, AtkCoordType coord_type) { GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; gint x_pos, y_pos; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component)); if (widget == NULL) /* State is defunct */ return NULL; icon_view = EXO_ICON_VIEW (widget); atk_component_get_extents (component, &x_pos, &y_pos, NULL, NULL, coord_type); item = exo_icon_view_get_item_at_coords (icon_view, x - x_pos, y - y_pos, TRUE, NULL); if (item) return exo_icon_view_accessible_ref_child (ATK_OBJECT (component), item->index); return NULL; } static void atk_component_interface_init (AtkComponentIface *iface) { iface->ref_accessible_at_point = exo_icon_view_accessible_ref_accessible_at_point; } static gboolean exo_icon_view_accessible_add_selection (AtkSelection *selection, gint i) { GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return FALSE; icon_view = EXO_ICON_VIEW (widget); item = g_list_nth_data (icon_view->priv->items, i); if (!item) return FALSE; exo_icon_view_select_item (icon_view, item); return TRUE; } static gboolean exo_icon_view_accessible_clear_selection (AtkSelection *selection) { GtkWidget *widget; ExoIconView *icon_view; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return FALSE; icon_view = EXO_ICON_VIEW (widget); exo_icon_view_unselect_all (icon_view); return TRUE; } static AtkObject* exo_icon_view_accessible_ref_selection (AtkSelection *selection, gint i) { GList *l; GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return NULL; icon_view = EXO_ICON_VIEW (widget); l = icon_view->priv->items; while (l) { item = l->data; if (item->selected) { if (i == 0) return atk_object_ref_accessible_child (gtk_widget_get_accessible (widget), item->index); else i--; } l = l->next; } return NULL; } static gint exo_icon_view_accessible_get_selection_count (AtkSelection *selection) { GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; GList *l; gint count; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return 0; icon_view = EXO_ICON_VIEW (widget); l = icon_view->priv->items; count = 0; while (l) { item = l->data; if (item->selected) count++; l = l->next; } return count; } static gboolean exo_icon_view_accessible_is_child_selected (AtkSelection *selection, gint i) { GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return FALSE; icon_view = EXO_ICON_VIEW (widget); item = g_list_nth_data (icon_view->priv->items, i); if (!item) return FALSE; return item->selected; } static gboolean exo_icon_view_accessible_remove_selection (AtkSelection *selection, gint i) { GtkWidget *widget; ExoIconView *icon_view; ExoIconViewItem *item; GList *l; gint count; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return FALSE; icon_view = EXO_ICON_VIEW (widget); l = icon_view->priv->items; count = 0; while (l) { item = l->data; if (item->selected) { if (count == i) { exo_icon_view_unselect_item (icon_view, item); return TRUE; } count++; } l = l->next; } return FALSE; } static gboolean exo_icon_view_accessible_select_all_selection (AtkSelection *selection) { GtkWidget *widget; ExoIconView *icon_view; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection)); if (widget == NULL) return FALSE; icon_view = EXO_ICON_VIEW (widget); exo_icon_view_select_all (icon_view); return TRUE; } static void exo_icon_view_accessible_selection_interface_init (AtkSelectionIface *iface) { iface->add_selection = exo_icon_view_accessible_add_selection; iface->clear_selection = exo_icon_view_accessible_clear_selection; iface->ref_selection = exo_icon_view_accessible_ref_selection; iface->get_selection_count = exo_icon_view_accessible_get_selection_count; iface->is_child_selected = exo_icon_view_accessible_is_child_selected; iface->remove_selection = exo_icon_view_accessible_remove_selection; iface->select_all_selection = exo_icon_view_accessible_select_all_selection; } static GType exo_icon_view_accessible_get_type (void) { static GType type = 0; if (!type) { GTypeInfo tinfo = { 0, /* class size */ (GBaseInitFunc) NULL, /* base init */ (GBaseFinalizeFunc) NULL, /* base finalize */ (GClassInitFunc) exo_icon_view_accessible_class_init, (GClassFinalizeFunc) NULL, /* class finalize */ NULL, /* class data */ 0, /* instance size */ 0, /* nb preallocs */ (GInstanceInitFunc) NULL, /* instance init */ NULL /* value table */ }; const GInterfaceInfo atk_component_info = { (GInterfaceInitFunc) atk_component_interface_init, (GInterfaceFinalizeFunc) NULL, NULL }; const GInterfaceInfo atk_selection_info = { (GInterfaceInitFunc) exo_icon_view_accessible_selection_interface_init, (GInterfaceFinalizeFunc) NULL, NULL }; /* * Figure out the size of the class and instance * we are deriving from */ AtkObjectFactory *factory; GType derived_type; GTypeQuery query; GType derived_atk_type; derived_type = g_type_parent (EXO_TYPE_ICON_VIEW); factory = atk_registry_get_factory (atk_get_default_registry (), derived_type); derived_atk_type = atk_object_factory_get_accessible_type (factory); g_type_query (derived_atk_type, &query); tinfo.class_size = query.class_size; tinfo.instance_size = query.instance_size; type = g_type_register_static (derived_atk_type, I_("ExoIconViewAccessible"), &tinfo, 0); g_type_add_interface_static (type, ATK_TYPE_COMPONENT, &atk_component_info); g_type_add_interface_static (type, ATK_TYPE_SELECTION, &atk_selection_info); } return type; } static AtkObject *exo_icon_view_accessible_new (GObject *obj) { AtkObject *accessible; g_return_val_if_fail (GTK_IS_WIDGET (obj), NULL); accessible = g_object_new (exo_icon_view_accessible_get_type (), NULL); atk_object_initialize (accessible, obj); return accessible; } static GType exo_icon_view_accessible_factory_get_accessible_type (void) { return exo_icon_view_accessible_get_type (); } static AtkObject* exo_icon_view_accessible_factory_create_accessible (GObject *obj) { return exo_icon_view_accessible_new (obj); } static void exo_icon_view_accessible_factory_class_init (AtkObjectFactoryClass *klass) { klass->create_accessible = exo_icon_view_accessible_factory_create_accessible; klass->get_accessible_type = exo_icon_view_accessible_factory_get_accessible_type; } static GType exo_icon_view_accessible_factory_get_type (void) { static GType type = 0; if (!type) { const GTypeInfo tinfo = { sizeof (AtkObjectFactoryClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) exo_icon_view_accessible_factory_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AtkObjectFactory), 0, /* n_preallocs */ NULL, NULL }; type = g_type_register_static (ATK_TYPE_OBJECT_FACTORY, I_("ExoIconViewAccessibleFactory"), &tinfo, 0); } return type; } static AtkObject *exo_icon_view_get_accessible (GtkWidget *widget) { static gboolean first_time = TRUE; if (first_time) { AtkObjectFactory *factory; AtkRegistry *registry; GType derived_type; GType derived_atk_type; /* * Figure out whether accessibility is enabled by looking at the * type of the accessible object which would be created for * the parent type of ExoIconView. */ derived_type = g_type_parent (EXO_TYPE_ICON_VIEW); registry = atk_get_default_registry (); factory = atk_registry_get_factory (registry, derived_type); derived_atk_type = atk_object_factory_get_accessible_type (factory); if (g_type_is_a (derived_atk_type, GTK_TYPE_ACCESSIBLE)) atk_registry_set_factory_type (registry, EXO_TYPE_ICON_VIEW, exo_icon_view_accessible_factory_get_type ()); first_time = FALSE; } return GTK_WIDGET_CLASS (exo_icon_view_parent_class)->get_accessible (widget); } /* #define __EXO_ICON_VIEW_C__ #include */ libfm-1.4.0/src/gtk/exo/exo-icon-view.h000066400000000000000000000500051475513661000176260ustar00rootroot00000000000000/*- * Copyright (c) 2004-2006 os-cillation e.K. * Copyright (c) 2002,2004 Anders Carlsson * Copyright 2024 Ingo Brückl * * Written by Benedikt Meurer . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Modified by Hong Jen Yee (PCMan) * on 2009-08-30 for use in libfm */ /* #if !defined (EXO_INSIDE_EXO_H) && !defined (EXO_COMPILATION) #error "Only can be included directly, this file may disappear or change contents." #endif */ #ifndef __EXO_ICON_VIEW_H__ #define __EXO_ICON_VIEW_H__ #include G_BEGIN_DECLS typedef struct _ExoIconViewPrivate ExoIconViewPrivate; typedef struct _ExoIconViewClass ExoIconViewClass; typedef struct _ExoIconView ExoIconView; #define EXO_TYPE_ICON_VIEW (exo_icon_view_get_type ()) #define EXO_ICON_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXO_TYPE_ICON_VIEW, ExoIconView)) #define EXO_ICON_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EXO_TYPE_ICON_VIEW, ExoIconViewClass)) #define EXO_IS_ICON_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EXO_TYPE_ICON_VIEW)) #define EXO_IS_ICON_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EXO_TYPE_ICON_VIEW)) #define EXO_ICON_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EXO_TYPE_ICON_VIEW, ExoIconViewClass)) /** * ExoIconViewForeachFunc: * @icon_view : an #ExoIconView. * @path : the current path. * @user_data : the user data supplied to exo_icon_view_selected_foreach(). * * Callback function prototype, invoked for every selected path in the * @icon_view. See exo_icon_view_selected_foreach() for details. **/ typedef void (*ExoIconViewForeachFunc) (ExoIconView *icon_view, GtkTreePath *path, gpointer user_data); /** * ExoIconViewSearchEqualFunc: * @model : the #GtkTreeModel being searched. * @column : the search column set by exo_icon_view_set_search_column(). * @key : the key string to compare with. * @iter : the #GtkTreeIter of the current item. * @search_data : user data from exo_icon_view_set_search_equal_func(). * * A function used for checking whether a row in @model matches a search key string * entered by the user. Note the return value is reversed from what you would normally * expect, though it has some similarity to strcmp() returning 0 for equal strings. * * Return value: %FALSE if the row matches, %TRUE otherwise. **/ typedef gboolean (*ExoIconViewSearchEqualFunc) (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data); /** * ExoIconViewSearchPositionFunc: * @icon_view : an #ExoIconView. * @search_dialog : the search dialog window to place. * @user_data : user data from exo_icon_view_set_search_position_func(). * * A function used to place the @search_dialog for the @icon_view. **/ typedef void (*ExoIconViewSearchPositionFunc) (ExoIconView *icon_view, GtkWidget *search_dialog, gpointer user_data); /** * ExoIconViewDropPosition: * @EXO_ICON_VIEW_NO_DROP : no drop indicator. * @EXO_ICON_VIEW_DROP_INTO : drop indicator on an item. * @EXO_ICON_VIEW_DROP_LEFT : drop indicator on the left of an item. * @EXO_ICON_VIEW_DROP_RIGHT : drop indicator on the right of an item. * @EXO_ICON_VIEW_DROP_ABOVE : drop indicator above an item. * @EXO_ICON_VIEW_DROP_BELOW : drop indicator below an item. * * Specifies whether to display the drop indicator, * i.e. where to drop into the icon view. **/ typedef enum { EXO_ICON_VIEW_NO_DROP, EXO_ICON_VIEW_DROP_INTO, EXO_ICON_VIEW_DROP_LEFT, EXO_ICON_VIEW_DROP_RIGHT, EXO_ICON_VIEW_DROP_ABOVE, EXO_ICON_VIEW_DROP_BELOW } ExoIconViewDropPosition; /** * ExoIconViewLayoutMode: * @EXO_ICON_VIEW_LAYOUT_ROWS : layout items in rows. * @EXO_ICON_VIEW_LAYOUT_COLS : layout items in columns. * * Specifies the layouting mode of an #ExoIconView. @EXO_ICON_VIEW_LAYOUT_ROWS * is the default, which lays out items vertically in rows from top to bottom. * @EXO_ICON_VIEW_LAYOUT_COLS lays out items horizontally in columns from left * to right. **/ typedef enum { EXO_ICON_VIEW_LAYOUT_ROWS, EXO_ICON_VIEW_LAYOUT_COLS } ExoIconViewLayoutMode; struct _ExoIconView { GtkContainer __parent__; /*< private >*/ ExoIconViewPrivate *priv; }; struct _ExoIconViewClass { GtkContainerClass __parent__; #if !GTK_CHECK_VERSION(3, 0, 0) /* virtual methods */ void (*set_scroll_adjustments) (ExoIconView *icon_view, GtkAdjustment *hadjustment, GtkAdjustment *vadjustment); #endif /* signals */ void (*item_activated) (ExoIconView *icon_view, GtkTreePath *path); void (*selection_changed) (ExoIconView *icon_view); /* Key binding signals */ void (*select_all) (ExoIconView *icon_view); void (*unselect_all) (ExoIconView *icon_view); void (*select_cursor_item) (ExoIconView *icon_view); void (*toggle_cursor_item) (ExoIconView *icon_view); gboolean (*move_cursor) (ExoIconView *icon_view, GtkMovementStep step, gint count); gboolean (*activate_cursor_item) (ExoIconView *icon_view); gboolean (*start_interactive_search) (ExoIconView *icon_view); /*< private >*/ void (*reserved0) (void); void (*reserved1) (void); void (*reserved2) (void); void (*reserved3) (void); void (*reserved4) (void); void (*reserved5) (void); void (*reserved6) (void); void (*reserved7) (void); void (*reserved8) (void); void (*reserved9) (void); }; GType exo_icon_view_get_type (void) G_GNUC_CONST; GtkWidget *exo_icon_view_new (void); GtkWidget *exo_icon_view_new_with_model (GtkTreeModel *model); GtkTreeModel *exo_icon_view_get_model (const ExoIconView *icon_view); void exo_icon_view_set_model (ExoIconView *icon_view, GtkTreeModel *model); GtkOrientation exo_icon_view_get_orientation (const ExoIconView *icon_view); void exo_icon_view_set_orientation (ExoIconView *icon_view, GtkOrientation orientation); gint exo_icon_view_get_columns (const ExoIconView *icon_view); void exo_icon_view_set_columns (ExoIconView *icon_view, gint columns); gint exo_icon_view_get_item_width (const ExoIconView *icon_view); void exo_icon_view_set_item_width (ExoIconView *icon_view, gint item_width); gint exo_icon_view_get_spacing (const ExoIconView *icon_view); void exo_icon_view_set_spacing (ExoIconView *icon_view, gint spacing); gint exo_icon_view_get_row_spacing (const ExoIconView *icon_view); void exo_icon_view_set_row_spacing (ExoIconView *icon_view, gint row_spacing); gint exo_icon_view_get_column_spacing (const ExoIconView *icon_view); void exo_icon_view_set_column_spacing (ExoIconView *icon_view, gint column_spacing); gint exo_icon_view_get_margin (const ExoIconView *icon_view); void exo_icon_view_set_margin (ExoIconView *icon_view, gint margin); GtkSelectionMode exo_icon_view_get_selection_mode (const ExoIconView *icon_view); void exo_icon_view_set_selection_mode (ExoIconView *icon_view, GtkSelectionMode mode); ExoIconViewLayoutMode exo_icon_view_get_layout_mode (const ExoIconView *icon_view); void exo_icon_view_set_layout_mode (ExoIconView *icon_view, ExoIconViewLayoutMode layout_mode); gboolean exo_icon_view_get_single_click (const ExoIconView *icon_view); void exo_icon_view_set_single_click (ExoIconView *icon_view, gboolean single_click); guint exo_icon_view_get_single_click_timeout (const ExoIconView *icon_view); void exo_icon_view_set_single_click_timeout (ExoIconView *icon_view, guint single_click_timeout); gboolean exo_icon_view_get_middle_click (const ExoIconView *icon_view); void exo_icon_view_set_middle_click (ExoIconView *icon_view, gboolean middle_click); void exo_icon_view_widget_to_icon_coords (const ExoIconView *icon_view, gint wx, gint wy, gint *ix, gint *iy); void exo_icon_view_icon_to_widget_coords (const ExoIconView *icon_view, gint ix, gint iy, gint *wx, gint *wy); GtkTreePath *exo_icon_view_get_path_at_pos (const ExoIconView *icon_view, gint x, gint y); gboolean exo_icon_view_get_item_at_pos (const ExoIconView *icon_view, gint x, gint y, GtkTreePath **path, GtkCellRenderer **cell); gboolean exo_icon_view_get_visible_range (const ExoIconView *icon_view, GtkTreePath **start_path, GtkTreePath **end_path); void exo_icon_view_selected_foreach (ExoIconView *icon_view, ExoIconViewForeachFunc func, gpointer data); void exo_icon_view_select_path (ExoIconView *icon_view, GtkTreePath *path); void exo_icon_view_unselect_path (ExoIconView *icon_view, GtkTreePath *path); gboolean exo_icon_view_path_is_selected (const ExoIconView *icon_view, GtkTreePath *path); GList *exo_icon_view_get_selected_items (const ExoIconView *icon_view); gint exo_icon_view_count_selected_items (const ExoIconView *icon_view); void exo_icon_view_select_all (ExoIconView *icon_view); void exo_icon_view_unselect_all (ExoIconView *icon_view); void exo_icon_view_item_activated (ExoIconView *icon_view, GtkTreePath *path); gboolean exo_icon_view_get_cursor (const ExoIconView *icon_view, GtkTreePath **path, GtkCellRenderer **cell); void exo_icon_view_set_cursor (ExoIconView *icon_view, GtkTreePath *path, GtkCellRenderer *cell, gboolean start_editing); void exo_icon_view_scroll_to_path (ExoIconView *icon_view, GtkTreePath *path, gboolean use_align, gfloat row_align, gfloat col_align); /* Drag-and-Drop support */ void exo_icon_view_enable_model_drag_source (ExoIconView *icon_view, GdkModifierType start_button_mask, const GtkTargetEntry *targets, gint n_targets, GdkDragAction actions); void exo_icon_view_enable_model_drag_dest (ExoIconView *icon_view, const GtkTargetEntry *targets, gint n_targets, GdkDragAction actions); void exo_icon_view_unset_model_drag_source (ExoIconView *icon_view); void exo_icon_view_unset_model_drag_dest (ExoIconView *icon_view); void exo_icon_view_set_reorderable (ExoIconView *icon_view, gboolean reorderable); gboolean exo_icon_view_get_reorderable (ExoIconView *icon_view); /* These are useful to implement your own custom stuff. */ void exo_icon_view_set_drag_dest_item (ExoIconView *icon_view, GtkTreePath *path, ExoIconViewDropPosition pos); void exo_icon_view_get_drag_dest_item (ExoIconView *icon_view, GtkTreePath **path, ExoIconViewDropPosition *pos); gboolean exo_icon_view_get_dest_item_at_pos (ExoIconView *icon_view, gint drag_x, gint drag_y, GtkTreePath **path, ExoIconViewDropPosition *pos); GdkPixbuf *exo_icon_view_create_drag_icon (ExoIconView *icon_view, GtkTreePath *path); /* Interactive search support */ gboolean exo_icon_view_get_enable_search (const ExoIconView *icon_view); void exo_icon_view_set_enable_search (ExoIconView *icon_view, gboolean enable_search); gint exo_icon_view_get_search_column (const ExoIconView *icon_view); void exo_icon_view_set_search_column (ExoIconView *icon_view, gint search_column); ExoIconViewSearchEqualFunc exo_icon_view_get_search_equal_func (const ExoIconView *icon_view); void exo_icon_view_set_search_equal_func (ExoIconView *icon_view, ExoIconViewSearchEqualFunc search_equal_func, gpointer search_equal_data, GDestroyNotify search_equal_destroy); ExoIconViewSearchPositionFunc exo_icon_view_get_search_position_func (const ExoIconView *icon_view); void exo_icon_view_set_search_position_func (ExoIconView *icon_view, ExoIconViewSearchPositionFunc search_position_func, gpointer search_position_data, GDestroyNotify search_position_destroy); G_END_DECLS #endif /* __EXO_ICON_VIEW_H__ */ libfm-1.4.0/src/gtk/exo/exo-marshal.c000066400000000000000000000335671475513661000173660ustar00rootroot00000000000000/* * exo-marshal.c * * Written by Benedikt Meurer . * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /* Modified by Hong Jen Yee (PCMan) * on 2009-08-30 for use in libfm */ #include #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_char (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_long #define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* VOID:INT,INT (exo-marshal.list:1) */ void _exo_marshal_VOID__INT_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__INT_INT) (gpointer data1, gint arg_1, gint arg_2, gpointer data2); register GMarshalFunc_VOID__INT_INT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__INT_INT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_int (param_values + 2), data2); } /* VOID:OBJECT,OBJECT (exo-marshal.list:2) */ void _exo_marshal_VOID__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer data1, gpointer arg_1, gpointer arg_2, gpointer data2); register GMarshalFunc_VOID__OBJECT_OBJECT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), data2); } /* STRING:POINTER (exo-marshal.list:3) */ void _exo_marshal_STRING__POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef gchar* (*GMarshalFunc_STRING__POINTER) (gpointer data1, gpointer arg_1, gpointer data2); register GMarshalFunc_STRING__POINTER callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gchar* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_STRING__POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_pointer (param_values + 1), data2); g_value_take_string (return_value, v_return); } /* STRING:STRING,STRING (exo-marshal.list:4) */ void _exo_marshal_STRING__STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef gchar* (*GMarshalFunc_STRING__STRING_STRING) (gpointer data1, gpointer arg_1, gpointer arg_2, gpointer data2); register GMarshalFunc_STRING__STRING_STRING callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gchar* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_STRING__STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), data2); g_value_take_string (return_value, v_return); } /* BOOLEAN:VOID (exo-marshal.list:5) */ void _exo_marshal_BOOLEAN__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__VOID) (gpointer data1, gpointer data2); register GMarshalFunc_BOOLEAN__VOID callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_set_boolean (return_value, v_return); } /* BOOLEAN:ENUM,INT (exo-marshal.list:6) */ void _exo_marshal_BOOLEAN__ENUM_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__ENUM_INT) (gpointer data1, gint arg_1, gint arg_2, gpointer data2); register GMarshalFunc_BOOLEAN__ENUM_INT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__ENUM_INT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_enum (param_values + 1), g_marshal_value_peek_int (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } /* BOOLEAN:INT,ENUM,BOOLEAN,ENUM,BOOLEAN (exo-marshal.list:7) */ void _exo_marshal_BOOLEAN__INT_ENUM_BOOLEAN_ENUM_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__INT_ENUM_BOOLEAN_ENUM_BOOLEAN) (gpointer data1, gint arg_1, gint arg_2, gboolean arg_3, gint arg_4, gboolean arg_5, gpointer data2); register GMarshalFunc_BOOLEAN__INT_ENUM_BOOLEAN_ENUM_BOOLEAN callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 6); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__INT_ENUM_BOOLEAN_ENUM_BOOLEAN) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_enum (param_values + 2), g_marshal_value_peek_boolean (param_values + 3), g_marshal_value_peek_enum (param_values + 4), g_marshal_value_peek_boolean (param_values + 5), data2); g_value_set_boolean (return_value, v_return); } libfm-1.4.0/src/gtk/exo/exo-marshal.h000066400000000000000000000107641475513661000173650ustar00rootroot00000000000000/* * exo-marshal.h * * Written by Benedikt Meurer . * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /* Modified by Hong Jen Yee (PCMan) * on 2009-08-30 for use in libfm */ #ifndef ___exo_marshal_MARSHAL_H__ #define ___exo_marshal_MARSHAL_H__ #include G_BEGIN_DECLS /* VOID:INT,INT (exo-marshal.list:1) */ extern void _exo_marshal_VOID__INT_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,OBJECT (exo-marshal.list:2) */ extern void _exo_marshal_VOID__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* STRING:POINTER (exo-marshal.list:3) */ extern void _exo_marshal_STRING__POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* STRING:STRING,STRING (exo-marshal.list:4) */ extern void _exo_marshal_STRING__STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:VOID (exo-marshal.list:5) */ extern void _exo_marshal_BOOLEAN__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:ENUM,INT (exo-marshal.list:6) */ extern void _exo_marshal_BOOLEAN__ENUM_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:INT,ENUM,BOOLEAN,ENUM,BOOLEAN (exo-marshal.list:7) */ extern void _exo_marshal_BOOLEAN__INT_ENUM_BOOLEAN_ENUM_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); G_END_DECLS #endif /* ___exo_marshal_MARSHAL_H__ */ libfm-1.4.0/src/gtk/exo/exo-private.c000066400000000000000000000104731475513661000174000ustar00rootroot00000000000000/*- * Copyright (c) 2004-2006 os-cillation e.K. * * Written by Benedikt Meurer . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_LIBINTL_H #include #endif #ifdef HAVE_LOCALE_H #include #endif #include "exo-private.h" #include "exo-string.h" #define I_(string) g_intern_static_string(string) /* void _exo_i18n_init (void) { static gboolean inited = FALSE; if (G_UNLIKELY (!inited)) { inited = TRUE; bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); #ifdef HAVE_BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif } } */ void _exo_gtk_widget_send_focus_change (GtkWidget *widget, gboolean in) { GdkEvent *fevent; #if !GTK_CHECK_VERSION(2, 22, 0) g_object_ref (G_OBJECT (widget)); #endif gtk_widget_set_can_focus (widget, in); fevent = gdk_event_new (GDK_FOCUS_CHANGE); fevent->focus_change.type = GDK_FOCUS_CHANGE; fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget)); fevent->focus_change.in = in; #if GTK_CHECK_VERSION(2, 22, 0) gtk_widget_send_focus_change (widget, fevent); #else if (in) GTK_OBJECT_FLAGS (widget) |= GTK_HAS_FOCUS; else GTK_OBJECT_FLAGS (widget) &= ~(GTK_HAS_FOCUS); gtk_widget_event (widget, fevent); g_object_notify (G_OBJECT (widget), "has-focus"); g_object_unref (G_OBJECT (widget)); #endif gdk_event_free (fevent); } /** * _exo_g_type_register_simple: * @type_parent : the parent #GType. * @type_name_static : the name of the new #GType, must reside in static * storage and remain unchanged during the lifetime * of the process. * @class_size : the size of the class structure in bytes. * @class_init : the class init function or %NULL. * @instance_size : the size of the instance structure in bytes. * @instance_init : the constructor function or %NULL. * * Simple wrapper for g_type_register_static(), which takes the most * important aspects of the type as parameters to avoid relocations * when using static constant #GTypeInfos. * * Return value: the newly registered #GType. **/ GType _exo_g_type_register_simple (GType type_parent, const gchar *type_name_static, guint class_size, gpointer class_init, guint instance_size, gpointer instance_init) { /* generate the type info (on the stack) */ GTypeInfo info = { class_size, NULL, NULL, class_init, NULL, NULL, instance_size, 0, instance_init, NULL, }; /* register the static type */ return g_type_register_static (type_parent, I_(type_name_static), &info, 0); } /** * _exo_g_type_add_interface_simple: * @instance_type : the #GType which should implement the @interface_type. * @interface_type : the #GType of the interface. * @interface_init_func : initialization function for the interface. * * Simple wrapper for g_type_add_interface_static(), which helps to avoid unnecessary * relocations for the #GInterfaceInfos. **/ void _exo_g_type_add_interface_simple (GType instance_type, GType interface_type, GInterfaceInitFunc interface_init_func) { GInterfaceInfo info = { interface_init_func, NULL, NULL, }; g_type_add_interface_static (instance_type, interface_type, &info); } libfm-1.4.0/src/gtk/exo/exo-private.h000066400000000000000000000112331475513661000174000ustar00rootroot00000000000000/* $Id: exo-private.h 22884 2006-08-26 12:40:43Z benny $ */ /*- * Copyright (c) 2004-2006 os-cillation e.K. * * Written by Benedikt Meurer . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* #if !defined (EXO_COMPILATION) #error "Only can be included directly, this file is not part of the public API." #endif */ #ifndef __EXO_PRIVATE_H__ #define __EXO_PRIVATE_H__ #include #include G_BEGIN_DECLS; /* support macros for debugging */ #ifndef NDEBUG #define _exo_assert(expr) g_assert (expr) #define _exo_assert_not_reached() g_assert_not_reached () #define _exo_return_if_fail(expr) g_return_if_fail (expr) #define _exo_return_val_if_fail(expr, val) g_return_val_if_fail (expr, (val)) #else #define _exo_assert(expr) G_STMT_START{ (void)0; }G_STMT_END #define _exo_assert_not_reached() G_STMT_START{ (void)0; }G_STMT_END #define _exo_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END #define _exo_return_val_if_fail(expr, val) G_STMT_START{ (void)0; }G_STMT_END #endif /* support macros for the slice allocator */ #define _exo_slice_alloc(block_size) (g_slice_alloc ((block_size))) #define _exo_slice_alloc0(block_size) (g_slice_alloc0 ((block_size))) #define _exo_slice_free1(block_size, mem_block) G_STMT_START{ g_slice_free1 ((block_size), (mem_block)); }G_STMT_END #define _exo_slice_new(type) (g_slice_new (type)) #define _exo_slice_new0(type) (g_slice_new0 (type)) #define _exo_slice_free(type, ptr) G_STMT_START{ g_slice_free (type, (ptr)); }G_STMT_END /* avoid trivial g_value_get_*() function calls */ #ifdef NDEBUG #define g_value_get_boolean(v) (((const GValue *) (v))->data[0].v_int) #define g_value_get_char(v) (((const GValue *) (v))->data[0].v_int) #define g_value_get_uchar(v) (((const GValue *) (v))->data[0].v_uint) #define g_value_get_int(v) (((const GValue *) (v))->data[0].v_int) #define g_value_get_uint(v) (((const GValue *) (v))->data[0].v_uint) #define g_value_get_long(v) (((const GValue *) (v))->data[0].v_long) #define g_value_get_ulong(v) (((const GValue *) (v))->data[0].v_ulong) #define g_value_get_int64(v) (((const GValue *) (v))->data[0].v_int64) #define g_value_get_uint64(v) (((const GValue *) (v))->data[0].v_uint64) #define g_value_get_enum(v) (((const GValue *) (v))->data[0].v_long) #define g_value_get_flags(v) (((const GValue *) (v))->data[0].v_ulong) #define g_value_get_float(v) (((const GValue *) (v))->data[0].v_float) #define g_value_get_double(v) (((const GValue *) (v))->data[0].v_double) #define g_value_get_string(v) (((const GValue *) (v))->data[0].v_pointer) #define g_value_get_param(v) (((const GValue *) (v))->data[0].v_pointer) #define g_value_get_boxed(v) (((const GValue *) (v))->data[0].v_pointer) #define g_value_get_pointer(v) (((const GValue *) (v))->data[0].v_pointer) #define g_value_get_object(v) (((const GValue *) (v))->data[0].v_pointer) #endif void _exo_i18n_init (void) G_GNUC_INTERNAL; void _exo_gtk_widget_send_focus_change (GtkWidget *widget, gboolean in) G_GNUC_INTERNAL; GType _exo_g_type_register_simple (GType type_parent, const gchar *type_name_static, guint class_size, gpointer class_init, guint instance_size, gpointer instance_init) G_GNUC_INTERNAL; void _exo_g_type_add_interface_simple (GType instance_type, GType interface_type, GInterfaceInitFunc interface_init_func) G_GNUC_INTERNAL; G_END_DECLS; #endif /* !__EXO_PRIVATE_H__ */ libfm-1.4.0/src/gtk/exo/exo-string.c000066400000000000000000000061401475513661000172300ustar00rootroot00000000000000/* $Id: exo-string.c 47 2006-01-30 02:32:10Z pcmanx $ */ /*- * Copyright (c) 2004 os-cillation e.K. * * Written by Benedikt Meurer . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_MEMORY_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "exo-string.h" /** * exo_str_elide_underscores: * @text : A zero terminated string. * * Returns a copy of @text with all mnemonic underscores * stripped off. * * Return value: A copy of @text without underscores. The * returned string must be freed when no * longer required. **/ gchar* exo_str_elide_underscores (const gchar *text) { const gchar *s; gboolean last_underscore = FALSE; gchar *result; gchar *t; g_return_val_if_fail (text != NULL, NULL); result = g_malloc (strlen (text) + 1); for (s = text, t = result; *s != '\0'; ++s) if (!last_underscore && *s == '_') { last_underscore = TRUE; } else { last_underscore = FALSE; *t++ = *s; } *t = '\0'; return result; } /** * exo_str_is_equal: * @a : A pointer to first string or %NULL. * @b : A pointer to second string or %NULL. * * %NULL-safe string comparison. Returns %TRUE if both @a and @b are * %NULL or if @a and @b refer to valid strings which are equal. * * You should always prefer this function over strcmp(). * * Return value: %TRUE if @a equals @b, else %FALSE. **/ gboolean exo_str_is_equal (const gchar *a, const gchar *b) { if (a == NULL && b == NULL) return TRUE; else if (a == NULL || b == NULL) return FALSE; while (*a == *b++) if (*a++ == '\0') return TRUE; return FALSE; } /** * exo_strndupv: * @strv : String vector to duplicate. * @num : Number of strings in @strv to * duplicate. * * Creates a new string vector containing the * first @n elements of @strv. * * Return value: The new string vector. Should be * freed using g_strfreev() when no * longer needed. **/ gchar** exo_strndupv (gchar **strv, gint num) { gchar **result; g_return_val_if_fail (strv != NULL, NULL); g_return_val_if_fail (num >= 0, NULL); result = g_new (gchar *, num + 1); result[num--] = NULL; for (; num >= 0; --num) result[num] = g_strdup (strv[num]); return result; } libfm-1.4.0/src/gtk/exo/exo-string.h000066400000000000000000000025651475513661000172440ustar00rootroot00000000000000/* $Id: exo-string.h 47 2006-01-30 02:32:10Z pcmanx $ */ /*- * Copyright (c) 2004 os-cillation e.K. * * Written by Benedikt Meurer . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* 2006.01.23 modified by Hong Jen Yee (PCMan) to used in PCMan File Manager */ #ifndef __EXO_STRING_H__ #define __EXO_STRING_H__ #include G_BEGIN_DECLS; gchar *exo_str_elide_underscores (const gchar *text); gboolean exo_str_is_equal (const gchar *a, const gchar *b); gchar **exo_strndupv (gchar **strv, gint num); G_END_DECLS; #endif /* !__EXO_STRING_H__ */ libfm-1.4.0/src/gtk/exo/exo-tree-view.c000066400000000000000000001143011475513661000176300ustar00rootroot00000000000000/*- * Copyright (c) 2004-2006 Benedikt Meurer * Copyright 2024 Ingo Brückl * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Modified by Hong Jen Yee (PCMan) * on 2008.05.11 for use in PCManFM */ #ifdef HAVE_CONFIG_H #include #endif #include #include "exo-tree-view.h" #include "exo-string.h" #include "exo-marshal.h" #include "exo-private.h" /* libfm specific */ #include "gtk-compat.h" #define I_(string) g_intern_static_string(string) #if defined(G_PARAM_STATIC_NAME) && defined(G_PARAM_STATIC_NICK) && defined(G_PARAM_STATIC_BLURB) #define EXO_PARAM_READABLE (G_PARAM_READABLE \ | G_PARAM_STATIC_NAME \ | G_PARAM_STATIC_NICK \ | G_PARAM_STATIC_BLURB) #define EXO_PARAM_WRITABLE (G_PARAM_WRITABLE \ | G_PARAM_STATIC_NAME \ | G_PARAM_STATIC_NICK \ | G_PARAM_STATIC_BLURB) #define EXO_PARAM_READWRITE (G_PARAM_READWRITE \ | G_PARAM_STATIC_NAME \ | G_PARAM_STATIC_NICK \ | G_PARAM_STATIC_BLURB) #else #define EXO_PARAM_READABLE (G_PARAM_READABLE) #define EXO_PARAM_WRITABLE (G_PARAM_WRITABLE) #define EXO_PARAM_READWRITE (G_PARAM_READWRITE) #endif #define exo_noop_false gtk_false /* #include #include #include #include #include #include */ #define EXO_TREE_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EXO_TYPE_TREE_VIEW, ExoTreeViewPrivate)) /* Property identifiers */ enum { PROP_0, PROP_SINGLE_CLICK, PROP_SINGLE_CLICK_TIMEOUT, PROP_MIDDLE_CLICK, }; static void exo_tree_view_class_init (ExoTreeViewClass *klass); static void exo_tree_view_init (ExoTreeView *tree_view); static void exo_tree_view_finalize (GObject *object); static void exo_tree_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void exo_tree_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static gboolean exo_tree_view_button_press_event (GtkWidget *widget, GdkEventButton *event); static gboolean exo_tree_view_button_release_event (GtkWidget *widget, GdkEventButton *event); static gboolean exo_tree_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event); static gboolean exo_tree_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event); static void exo_tree_view_drag_begin (GtkWidget *widget, GdkDragContext *context); static gboolean exo_tree_view_move_cursor (GtkTreeView *view, GtkMovementStep step, gint count); static gboolean exo_tree_view_single_click_timeout (gpointer user_data); static void exo_tree_view_single_click_timeout_destroy (gpointer user_data); struct _ExoTreeViewPrivate { /* whether the next button-release-event should emit "row-activate" */ guint button_release_activates : 1; /* whether drag and drop must be re-enabled on button-release-event (rubberbanding active) */ guint button_release_unblocks_dnd : 1; /* whether rubberbanding must be re-enabled on button-release-event (drag and drop active) */ guint button_release_enables_rubber_banding : 1; /* single click mode */ guint single_click : 1; guint single_click_timeout; gint single_click_timeout_id; guint single_click_timeout_state; /* middle click mode */ guint middle_click : 1; /* the path below the pointer or NULL */ GtkTreePath *hover_path; /* the column which is the only activable */ GtkTreeViewColumn* activable_column; }; static GObjectClass *exo_tree_view_parent_class; GType exo_tree_view_get_type (void) { static GType type = G_TYPE_INVALID; if (G_UNLIKELY (type == G_TYPE_INVALID)) { type = _exo_g_type_register_simple (GTK_TYPE_TREE_VIEW, "ExoTreeView", sizeof (ExoTreeViewClass), exo_tree_view_class_init, sizeof (ExoTreeView), exo_tree_view_init); } return type; } static void exo_tree_view_class_init (ExoTreeViewClass *klass) { GtkTreeViewClass *gtktree_view_class; GtkWidgetClass *gtkwidget_class; GObjectClass *gobject_class; /* add our private data to the class */ g_type_class_add_private (klass, sizeof (ExoTreeViewPrivate)); /* determine our parent type class */ exo_tree_view_parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = exo_tree_view_finalize; gobject_class->get_property = exo_tree_view_get_property; gobject_class->set_property = exo_tree_view_set_property; gtkwidget_class = GTK_WIDGET_CLASS (klass); gtkwidget_class->button_press_event = exo_tree_view_button_press_event; gtkwidget_class->button_release_event = exo_tree_view_button_release_event; gtkwidget_class->motion_notify_event = exo_tree_view_motion_notify_event; gtkwidget_class->leave_notify_event = exo_tree_view_leave_notify_event; gtkwidget_class->drag_begin = exo_tree_view_drag_begin; gtktree_view_class = GTK_TREE_VIEW_CLASS (klass); gtktree_view_class->move_cursor = exo_tree_view_move_cursor; /* initialize the library's i18n support */ /* _exo_i18n_init (); */ /** * ExoTreeView:single-click: * * %TRUE to activate items using a single click instead of a * double click. * * Since: 0.3.1.3 **/ g_object_class_install_property (gobject_class, PROP_SINGLE_CLICK, g_param_spec_boolean ("single-click", _("Single Click"), _("Whether the items in the view can be activated with single clicks"), FALSE, EXO_PARAM_READWRITE)); /** * ExoTreeView:single-click-timeout: * * The amount of time in milliseconds after which the hover row (the row * which is hovered by the mouse cursor) will be selected automatically * in single-click mode. A value of %0 disables the automatic selection. * * Since: 0.3.1.5 **/ g_object_class_install_property (gobject_class, PROP_SINGLE_CLICK_TIMEOUT, g_param_spec_uint ("single-click-timeout", _("Single Click Timeout"), _("The amount of time after which the item under the mouse cursor will be selected automatically in single click mode"), 0, G_MAXUINT, 0, EXO_PARAM_READWRITE)); /** * ExoTreeView:middle-click: * * %TRUE to activate items using a middle click instead of a * double click. * * Since: 1.4.0 **/ g_object_class_install_property (gobject_class, PROP_MIDDLE_CLICK, g_param_spec_boolean ("middle-click", _("Middle Click"), _("Whether the items in the view can be activated with middle clicks"), FALSE, EXO_PARAM_READWRITE)); } static void exo_tree_view_init (ExoTreeView *tree_view) { /* grab a pointer on the private data */ tree_view->priv = EXO_TREE_VIEW_GET_PRIVATE (tree_view); tree_view->priv->single_click_timeout_id = -1; } static void exo_tree_view_finalize (GObject *object) { ExoTreeView *tree_view = EXO_TREE_VIEW (object); /* be sure to cancel any single-click timeout */ if (G_UNLIKELY (tree_view->priv->single_click_timeout_id >= 0)) g_source_remove (tree_view->priv->single_click_timeout_id); /* be sure to release the hover path */ if (G_UNLIKELY (tree_view->priv->hover_path == NULL)) gtk_tree_path_free (tree_view->priv->hover_path); (*G_OBJECT_CLASS (exo_tree_view_parent_class)->finalize) (object); } static void exo_tree_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ExoTreeView *tree_view = EXO_TREE_VIEW (object); switch (prop_id) { case PROP_SINGLE_CLICK: g_value_set_boolean (value, exo_tree_view_get_single_click (tree_view)); break; case PROP_SINGLE_CLICK_TIMEOUT: g_value_set_uint (value, exo_tree_view_get_single_click_timeout (tree_view)); break; case PROP_MIDDLE_CLICK: g_value_set_boolean (value, exo_tree_view_get_middle_click (tree_view)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void exo_tree_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ExoTreeView *tree_view = EXO_TREE_VIEW (object); switch (prop_id) { case PROP_SINGLE_CLICK: exo_tree_view_set_single_click (tree_view, g_value_get_boolean (value)); break; case PROP_SINGLE_CLICK_TIMEOUT: exo_tree_view_set_single_click_timeout (tree_view, g_value_get_uint (value)); break; case PROP_MIDDLE_CLICK: exo_tree_view_set_middle_click (tree_view, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean exo_tree_view_button_press_event (GtkWidget *widget, GdkEventButton *event) { GtkTreeSelection *selection; ExoTreeView *tree_view = EXO_TREE_VIEW (widget); GtkTreePath *path = NULL; gboolean result; GList *selected_paths = NULL; GList *lp; GtkTreeViewColumn* col; gboolean treat_as_blank = FALSE; /* by default we won't emit "row-activated" on button-release-events */ tree_view->priv->button_release_activates = FALSE; /* grab the tree selection */ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); /* be sure to cancel any pending single-click timeout */ if (G_UNLIKELY (tree_view->priv->single_click_timeout_id >= 0)) g_source_remove (tree_view->priv->single_click_timeout_id); /* check if the button press was on the internal tree view window */ if (G_LIKELY (event->window == gtk_tree_view_get_bin_window (GTK_TREE_VIEW (tree_view)))) { /* determine the path at the event coordinates */ if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view), event->x, event->y, &path, &col, NULL, NULL)) path = NULL; if( tree_view->priv->activable_column && col != tree_view->priv->activable_column ) { treat_as_blank = TRUE; if( path ) { gtk_tree_path_free( path ); path = NULL; } } /* we unselect all selected items if the user clicks on an empty * area of the tree view and no modifier key is active. */ if (path == NULL && (event->state & gtk_accelerator_get_default_mod_mask ()) == 0) gtk_tree_selection_unselect_all (selection); /* completely ignore double-clicks in single-click mode */ if (tree_view->priv->single_click && event->type == GDK_2BUTTON_PRESS) { /* make sure we ignore the GDK_BUTTON_RELEASE * event for this GDK_2BUTTON_PRESS event. */ gtk_tree_path_free (path); return TRUE; } /* check if the next button-release-event should activate the selected row (single click support) */ tree_view->priv->button_release_activates = (tree_view->priv->single_click && event->type == GDK_BUTTON_PRESS && event->button == 1 && (event->state & gtk_accelerator_get_default_mod_mask ()) == 0); } /* unfortunately GtkTreeView will unselect rows except the clicked one, * which makes dragging from a GtkTreeView problematic. That's why we * remember the selected paths here and restore them later. */ if (event->type == GDK_BUTTON_PRESS && (event->state & gtk_accelerator_get_default_mod_mask ()) == 0 && path != NULL && gtk_tree_selection_path_is_selected (selection, path)) { /* if no custom select function is set, we simply use exo_noop_false here, * to tell the tree view that it may not alter the selection. */ if (G_LIKELY (gtk_tree_selection_get_select_function (selection) != (GtkTreeSelectionFunc) exo_noop_false)) gtk_tree_selection_set_select_function (selection, (GtkTreeSelectionFunc) exo_noop_false, NULL, NULL); else selected_paths = gtk_tree_selection_get_selected_rows (selection, NULL); } #if GTK_CHECK_VERSION(2,9,0) /* Rubberbanding in GtkTreeView 2.9.0 and above is rather buggy, unfortunately, and * doesn't interact properly with GTKs own DnD mechanism. So we need to block all * dragging here when pressing the mouse button on a not yet selected row if * rubberbanding is active, or disable rubberbanding when starting a drag. */ if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_MULTIPLE && gtk_tree_view_get_rubber_banding (GTK_TREE_VIEW (tree_view)) && event->button == 1 && event->type == GDK_BUTTON_PRESS) { /* check if clicked on empty area or on a not yet selected row */ /* bugs #3008979 and #3526139 => rubber-banding on rows should be disabled */ if (G_UNLIKELY (path == NULL)) { /* need to disable drag and drop because we're rubberbanding now */ gpointer drag_data = g_object_get_data (G_OBJECT (tree_view), I_("gtk-site-data")); if (G_LIKELY (drag_data != NULL)) { g_signal_handlers_block_matched (G_OBJECT (tree_view), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, drag_data); } /* remember to re-enable drag and drop later */ tree_view->priv->button_release_unblocks_dnd = TRUE; /* don't unselect this row if we doing rubberbanding now */ treat_as_blank = FALSE; } else { /* need to disable rubberbanding because we're dragging now */ gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (tree_view), FALSE); /* remember to re-enable rubberbanding later */ tree_view->priv->button_release_enables_rubber_banding = TRUE; } } #endif /* call the parent's button press handler */ result = (*GTK_WIDGET_CLASS (exo_tree_view_parent_class)->button_press_event) (widget, event); /* button press could start a widget destroy so refresh selection and test it */ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); if (G_UNLIKELY(selection == NULL)) goto _out; if( treat_as_blank ) gtk_tree_selection_unselect_all( selection ); /* restore previous selection if the path is still selected */ if (event->type == GDK_BUTTON_PRESS && (event->state & gtk_accelerator_get_default_mod_mask ()) == 0 && path != NULL && gtk_tree_selection_path_is_selected (selection, path)) { /* check if we have to restore paths */ if (G_LIKELY (gtk_tree_selection_get_select_function (selection) != (GtkTreeSelectionFunc) exo_noop_false)) { /* select all previously selected paths */ for (lp = selected_paths; lp != NULL; lp = lp->next) gtk_tree_selection_select_path (selection, lp->data); } } /* see bug http://bugzilla.xfce.org/show_bug.cgi?id=6230 for more information */ if (G_LIKELY (gtk_tree_selection_get_select_function (selection) == (GtkTreeSelectionFunc) exo_noop_false)) { /* just reset the select function (previously set to exo_noop_false), * there's no clean way to do this, so what the heck. */ gtk_tree_selection_set_select_function (selection, (GtkTreeSelectionFunc) gtk_true, NULL, NULL); } _out: /* release the path (if any) */ if (G_LIKELY (path != NULL)) gtk_tree_path_free (path); /* release the selected paths list */ g_list_foreach (selected_paths, (GFunc) gtk_tree_path_free, NULL); g_list_free (selected_paths); return result; } static gboolean exo_tree_view_button_release_event (GtkWidget *widget, GdkEventButton *event) { GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkTreePath *path; ExoTreeView *tree_view = EXO_TREE_VIEW (widget); /* verify that the release event is for the internal tree view window */ if (G_LIKELY (event->window == gtk_tree_view_get_bin_window (GTK_TREE_VIEW (tree_view)))) { /* check if we're in single-click mode and the button-release-event should emit a "row-activate" */ if (G_UNLIKELY (tree_view->priv->single_click && tree_view->priv->button_release_activates)) { /* reset the "release-activates" flag */ tree_view->priv->button_release_activates = FALSE; /* determine the path to the row that should be activated */ if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view), event->x, event->y, &path, &column, NULL, NULL)) { /* emit row-activated for the determined row */ if( ! tree_view->priv->activable_column || tree_view->priv->activable_column == column ) gtk_tree_view_row_activated (GTK_TREE_VIEW (tree_view), path, column); /* cleanup */ gtk_tree_path_free (path); } } else if ((event->state & gtk_accelerator_get_default_mod_mask ()) == 0 && !tree_view->priv->button_release_unblocks_dnd) { /* determine the path on which the button was released and select only this row, this way * the user is still able to alter the selection easily if all rows are selected. */ if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view), event->x, event->y, &path, &column, NULL, NULL)) { /* check if the path is selected */ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); if (gtk_tree_selection_path_is_selected (selection, path)) { /* unselect all rows */ gtk_tree_selection_unselect_all (selection); /* select the row and place the cursor on it */ gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), path, column, FALSE); } /* cleanup */ gtk_tree_path_free (path); } } } #if GTK_CHECK_VERSION(2,9,0) /* check if we need to re-enable drag and drop */ if (G_LIKELY (tree_view->priv->button_release_unblocks_dnd)) { gpointer drag_data = g_object_get_data (G_OBJECT (tree_view), I_("gtk-site-data")); if (G_LIKELY (drag_data != NULL)) { g_signal_handlers_unblock_matched (G_OBJECT (tree_view), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, drag_data); } tree_view->priv->button_release_unblocks_dnd = FALSE; } /* check if we need to re-enable rubberbanding */ if (G_UNLIKELY (tree_view->priv->button_release_enables_rubber_banding)) { gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (tree_view), TRUE); tree_view->priv->button_release_enables_rubber_banding = FALSE; } #endif /* call the parent's button release handler */ return (*GTK_WIDGET_CLASS (exo_tree_view_parent_class)->button_release_event) (widget, event); } static gboolean exo_tree_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { ExoTreeView *tree_view = EXO_TREE_VIEW (widget); GtkTreePath *path; GdkCursor *cursor; GtkTreeViewColumn *column; /* check if the event occurred on the tree view internal window and we are in single-click mode */ if (event->window == gtk_tree_view_get_bin_window (GTK_TREE_VIEW (tree_view)) && tree_view->priv->single_click) { #if GTK_CHECK_VERSION(2,9,0) /* check if we're doing a rubberband selection right now (which means DnD is blocked) */ if (G_UNLIKELY (tree_view->priv->button_release_unblocks_dnd)) { /* we're doing a rubberband selection, so don't activate anything */ tree_view->priv->button_release_activates = FALSE; /* also be sure to reset the cursor */ gdk_window_set_cursor (event->window, NULL); } else #endif { /* determine the path at the event coordinates */ if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (tree_view), event->x, event->y, &path, &column, NULL, NULL)) path = NULL; /* determine if the column is activable */ if( tree_view->priv->activable_column && column != tree_view->priv->activable_column ) { if(path) { gtk_tree_path_free(path); path = NULL; } } /* check if we have a new path */ if ((path == NULL && tree_view->priv->hover_path != NULL) || (path != NULL && tree_view->priv->hover_path == NULL) || (path != NULL && tree_view->priv->hover_path != NULL && gtk_tree_path_compare (path, tree_view->priv->hover_path) != 0)) { /* release the previous hover path */ if (tree_view->priv->hover_path != NULL) gtk_tree_path_free (tree_view->priv->hover_path); /* setup the new path */ tree_view->priv->hover_path = path; /* check if we're over a row right now */ if (G_LIKELY (path != NULL)) { /* setup the hand cursor to indicate that the row at the pointer can be activated with a single click */ cursor = gdk_cursor_new (GDK_HAND2); gdk_window_set_cursor (event->window, cursor); gdk_cursor_unref (cursor); } else { /* reset the cursor to its default */ gdk_window_set_cursor (event->window, NULL); } /* check if autoselection is enabled and the pointer is over a row */ if (G_LIKELY (tree_view->priv->single_click_timeout > 0 && tree_view->priv->hover_path != NULL)) { /* cancel any previous single-click timeout */ if (G_LIKELY (tree_view->priv->single_click_timeout_id >= 0)) g_source_remove (tree_view->priv->single_click_timeout_id); /* remember the current event state */ tree_view->priv->single_click_timeout_state = event->state; /* schedule a new single-click timeout */ tree_view->priv->single_click_timeout_id = gdk_threads_add_timeout_full (G_PRIORITY_LOW, tree_view->priv->single_click_timeout, exo_tree_view_single_click_timeout, tree_view, exo_tree_view_single_click_timeout_destroy); } } else { /* release the path resources */ if (path != NULL) gtk_tree_path_free (path); } } } /* call the parent's motion notify handler */ return (*GTK_WIDGET_CLASS (exo_tree_view_parent_class)->motion_notify_event) (widget, event); } static gboolean exo_tree_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event) { ExoTreeView *tree_view = EXO_TREE_VIEW (widget); /* be sure to cancel any pending single-click timeout */ if (G_UNLIKELY (tree_view->priv->single_click_timeout_id >= 0)) g_source_remove (tree_view->priv->single_click_timeout_id); /* release and reset the hover path (if any) */ if (tree_view->priv->hover_path != NULL) { gtk_tree_path_free (tree_view->priv->hover_path); tree_view->priv->hover_path = NULL; } /* reset the cursor for the tree view internal window */ if (gtk_widget_get_realized (GTK_WIDGET (tree_view))) gdk_window_set_cursor (gtk_tree_view_get_bin_window (GTK_TREE_VIEW (tree_view)), NULL); /* the next button-release-event should not activate */ tree_view->priv->button_release_activates = FALSE; /* call the parent's leave notify handler */ return (*GTK_WIDGET_CLASS (exo_tree_view_parent_class)->leave_notify_event) (widget, event); } static void exo_tree_view_drag_begin (GtkWidget *widget, GdkDragContext *context) { ExoTreeView *tree_view = EXO_TREE_VIEW (widget); /* the next button-release-event should not activate */ tree_view->priv->button_release_activates = FALSE; /* call the parent's drag begin handler */ (*GTK_WIDGET_CLASS (exo_tree_view_parent_class)->drag_begin) (widget, context); } static gboolean exo_tree_view_move_cursor (GtkTreeView *view, GtkMovementStep step, gint count) { ExoTreeView *tree_view = EXO_TREE_VIEW (view); /* be sure to cancel any pending single-click timeout */ if (G_UNLIKELY (tree_view->priv->single_click_timeout_id >= 0)) g_source_remove (tree_view->priv->single_click_timeout_id); /* release and reset the hover path (if any) */ if (tree_view->priv->hover_path != NULL) { gtk_tree_path_free (tree_view->priv->hover_path); tree_view->priv->hover_path = NULL; } /* reset the cursor for the tree view internal window */ if (gtk_widget_get_realized (GTK_WIDGET (tree_view))) gdk_window_set_cursor (gtk_tree_view_get_bin_window (GTK_TREE_VIEW (tree_view)), NULL); /* call the parent's handler */ return (*GTK_TREE_VIEW_CLASS (exo_tree_view_parent_class)->move_cursor) (view, step, count); } static gboolean exo_tree_view_single_click_timeout (gpointer user_data) { GtkTreeViewColumn *cursor_column; GtkTreeSelection *selection; GtkTreeModel *model; GtkTreePath *cursor_path; GtkTreeIter iter; ExoTreeView *tree_view = EXO_TREE_VIEW (user_data); gboolean hover_path_selected; GList *rows; GList *lp; /* ensure that source isn't removed yet */ if(!g_source_is_destroyed(g_main_current_source())) /* verify that we are in single-click mode, have focus and a hover path */ if (gtk_widget_has_focus (GTK_WIDGET (tree_view)) && tree_view->priv->single_click && tree_view->priv->hover_path != NULL) { /* transform the hover_path to a tree iterator */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); if (model != NULL && gtk_tree_model_get_iter (model, &iter, tree_view->priv->hover_path)) { /* determine the current cursor path/column */ gtk_tree_view_get_cursor (GTK_TREE_VIEW (tree_view), &cursor_path, &cursor_column); /* be sure the row is fully visible */ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (tree_view), tree_view->priv->hover_path, cursor_column, FALSE, 0.0f, 0.0f); /* determine the selection and change it appropriately */ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); if (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE) { /* just place the cursor on the row */ gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), tree_view->priv->hover_path, cursor_column, FALSE); } else if ((tree_view->priv->single_click_timeout_state & GDK_SHIFT_MASK) != 0 && gtk_tree_selection_get_mode (selection) == GTK_SELECTION_MULTIPLE) { /* check if the item is not already selected (otherwise do nothing) */ if (!gtk_tree_selection_path_is_selected (selection, tree_view->priv->hover_path)) { /* unselect all previously selected items */ gtk_tree_selection_unselect_all (selection); /* since we cannot access the anchor of a GtkTreeView, we * use the cursor instead which is usually the same row. */ if (G_UNLIKELY (cursor_path == NULL)) { /* place the cursor on the new row */ gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), tree_view->priv->hover_path, cursor_column, FALSE); } else { /* select all between the cursor and the current row */ gtk_tree_selection_select_range (selection, tree_view->priv->hover_path, cursor_path); } } } else { /* remember the previously selected rows as set_cursor() clears the selection */ rows = gtk_tree_selection_get_selected_rows (selection, NULL); /* check if the hover path is selected (as it will be selected after the set_cursor() call) */ hover_path_selected = gtk_tree_selection_path_is_selected (selection, tree_view->priv->hover_path); /* place the cursor on the hover row */ gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), tree_view->priv->hover_path, cursor_column, FALSE); /* restore the previous selection */ for (lp = rows; lp != NULL; lp = lp->next) { gtk_tree_selection_select_path (selection, lp->data); gtk_tree_path_free (lp->data); } g_list_free (rows); /* check what to do */ if ((gtk_tree_selection_get_mode (selection) == GTK_SELECTION_MULTIPLE || (gtk_tree_selection_get_mode (selection) == GTK_SELECTION_SINGLE && hover_path_selected)) && (tree_view->priv->single_click_timeout_state & GDK_CONTROL_MASK) != 0) { /* toggle the selection state of the row */ if (G_UNLIKELY (hover_path_selected)) gtk_tree_selection_unselect_path (selection, tree_view->priv->hover_path); else gtk_tree_selection_select_path (selection, tree_view->priv->hover_path); } else if (G_UNLIKELY (!hover_path_selected)) { /* unselect all other rows */ gtk_tree_selection_unselect_all (selection); /* select only the hover row */ gtk_tree_selection_select_path (selection, tree_view->priv->hover_path); } } /* cleanup */ if (G_LIKELY (cursor_path != NULL)) gtk_tree_path_free (cursor_path); } } return FALSE; } static void exo_tree_view_single_click_timeout_destroy (gpointer user_data) { EXO_TREE_VIEW (user_data)->priv->single_click_timeout_id = -1; } /** * exo_tree_view_new: * * Allocates a new #ExoTreeView instance. * * Return value: the newly allocated #ExoTreeView. * * Since: 0.3.1.3 **/ GtkWidget* exo_tree_view_new (void) { return g_object_new (EXO_TYPE_TREE_VIEW, NULL); } /** * exo_tree_view_get_single_click: * @tree_view : an #ExoTreeView. * * Returns %TRUE if @tree_view is in single-click mode, else %FALSE. * * Return value: whether @tree_view is in single-click mode. * * Since: 0.3.1.3 **/ gboolean exo_tree_view_get_single_click (const ExoTreeView *tree_view) { g_return_val_if_fail (EXO_IS_TREE_VIEW (tree_view), FALSE); return tree_view->priv->single_click; } /** * exo_tree_view_set_single_click: * @tree_view : an #ExoTreeView. * @single_click : %TRUE to use single-click for @tree_view, %FALSE otherwise. * * If @single_click is %TRUE, @tree_view will use single-click mode, else * the default double-click mode will be used. * * Since: 0.3.1.3 **/ void exo_tree_view_set_single_click (ExoTreeView *tree_view, gboolean single_click) { g_return_if_fail (EXO_IS_TREE_VIEW (tree_view)); if (tree_view->priv->single_click != !!single_click) { tree_view->priv->single_click = !!single_click; g_object_notify (G_OBJECT (tree_view), "single-click"); } } /** * exo_tree_view_get_single_click_timeout: * @tree_view : a #ExoTreeView. * * Returns the amount of time in milliseconds after which the * item under the mouse cursor will be selected automatically * in single click mode. A value of %0 means that the behavior * is disabled and the user must alter the selection manually. * * Return value: the single click autoselect timeout or %0 if * the behavior is disabled. * * Since: 0.3.1.5 **/ guint exo_tree_view_get_single_click_timeout (const ExoTreeView *tree_view) { g_return_val_if_fail (EXO_IS_TREE_VIEW (tree_view), 0u); return tree_view->priv->single_click_timeout; } /** * exo_tree_view_set_single_click_timeout: * @tree_view : a #ExoTreeView. * @single_click_timeout : the new timeout or %0 to disable. * * If @single_click_timeout is a value greater than zero, it specifies * the amount of time in milliseconds after which the item under the * mouse cursor will be selected automatically in single click mode. * A value of %0 for @single_click_timeout disables the autoselection * for @tree_view. * * This setting does not have any effect unless the @tree_view is in * single-click mode, see exo_tree_view_set_single_click(). * * Since: 0.3.1.5 **/ void exo_tree_view_set_single_click_timeout (ExoTreeView *tree_view, guint single_click_timeout) { g_return_if_fail (EXO_IS_TREE_VIEW (tree_view)); /* check if we have a new setting */ if (tree_view->priv->single_click_timeout != single_click_timeout) { /* apply the new setting */ tree_view->priv->single_click_timeout = single_click_timeout; /* be sure to cancel any pending single click timeout */ if (G_UNLIKELY (tree_view->priv->single_click_timeout_id >= 0)) g_source_remove (tree_view->priv->single_click_timeout_id); /* notify listeners */ g_object_notify (G_OBJECT (tree_view), "single-click-timeout"); } } /** * exo_tree_view_get_middle_click: * @tree_view : an #ExoTreeView. * * Returns %TRUE if @tree_view is in middle-click mode, else %FALSE. * * Return value: whether @tree_view is in middle-click mode. * * Since: 1.4.0 **/ gboolean exo_tree_view_get_middle_click (const ExoTreeView *tree_view) { g_return_val_if_fail (EXO_IS_TREE_VIEW (tree_view), FALSE); return tree_view->priv->middle_click; } /** * exo_tree_view_set_middle_click: * @tree_view : an #ExoTreeView. * @middle_click : %TRUE to use middle-click for @tree_view, %FALSE otherwise. * * If @middle_click is %TRUE, @tree_view will use middle-click mode, else * the default double-click mode will be used. * * Since: 1.4.0 **/ void exo_tree_view_set_middle_click (ExoTreeView *tree_view, gboolean middle_click) { g_return_if_fail (EXO_IS_TREE_VIEW (tree_view)); if (tree_view->priv->middle_click != !!middle_click) { tree_view->priv->middle_click = !!middle_click; g_object_notify (G_OBJECT (tree_view), "middle-click"); } } /* 2008.07.16 added by Hong Jen Yee for PCManFM. * If activable column is set, only the specified column can be activated. * Other columns are viewed as blank area and won't receive mouse clicks. */ GtkTreeViewColumn* exo_tree_view_get_activable_column( ExoTreeView *tree_view ) { return tree_view->priv->activable_column; } void exo_tree_view_set_activable_column( ExoTreeView *tree_view, GtkTreeViewColumn* column ) { tree_view->priv->activable_column = column; } /* #define __EXO_TREE_VIEW_C__ #include */ libfm-1.4.0/src/gtk/exo/exo-tree-view.h000066400000000000000000000074201475513661000176400ustar00rootroot00000000000000/* $Id: exo-tree-view.h 20828 2006-04-09 17:16:48Z benny $ */ /*- * Copyright (c) 2004-2006 Benedikt Meurer * Copyright 2024 Ingo Brückl * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Modified by Hong Jen Yee (PCMan) * on 2008.07.13 for use in PCManFM */ /* #if !defined (EXO_INSIDE_EXO_H) && !defined (EXO_COMPILATION) #error "Only can be included directly, this file may disappear or change contents." #endif */ #ifndef __EXO_TREE_VIEW_H__ #define __EXO_TREE_VIEW_H__ #include G_BEGIN_DECLS; typedef struct _ExoTreeViewPrivate ExoTreeViewPrivate; typedef struct _ExoTreeViewClass ExoTreeViewClass; typedef struct _ExoTreeView ExoTreeView; #define EXO_TYPE_TREE_VIEW (exo_tree_view_get_type ()) #define EXO_TREE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXO_TYPE_TREE_VIEW, ExoTreeView)) #define EXO_TREE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EXO_TYPE_TREE_VIEW, ExoTreeViewClass)) #define EXO_IS_TREE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EXO_TYPE_TREE_VIEW)) #define EXO_IS_TREE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EXO_TYPE_TREE_VIEW)) #define EXO_TREE_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EXO_TYPE_TREE_VIEW, ExoTreeViewClass)) struct _ExoTreeViewClass { /*< private >*/ GtkTreeViewClass __parent__; /*< private >*/ /* void (*reserved1) (void); void (*reserved2) (void); void (*reserved3) (void); void (*reserved4) (void); void (*reserved5) (void); void (*reserved6) (void); void (*reserved7) (void); void (*reserved8) (void); */ }; struct _ExoTreeView { /*< private >*/ GtkTreeView __parent__; /*< private >*/ ExoTreeViewPrivate *priv; }; GType exo_tree_view_get_type (void) G_GNUC_CONST; GtkWidget *exo_tree_view_new (void) G_GNUC_MALLOC; gboolean exo_tree_view_get_single_click (const ExoTreeView *tree_view); void exo_tree_view_set_single_click (ExoTreeView *tree_view, gboolean single_click); guint exo_tree_view_get_single_click_timeout (const ExoTreeView *tree_view); void exo_tree_view_set_single_click_timeout (ExoTreeView *tree_view, guint single_click_timeout); gboolean exo_tree_view_get_middle_click (const ExoTreeView *tree_view); void exo_tree_view_set_middle_click (ExoTreeView *tree_view, gboolean middle_click); /* 2008.07.16 added by Hong Jen Yee for PCManFM. * If activable column is set, only the specified column can be activated. * Other columns are viewed as blank area and won't receive mouse clicks. */ GtkTreeViewColumn* exo_tree_view_get_activable_column( ExoTreeView *tree_view ); void exo_tree_view_set_activable_column( ExoTreeView *tree_view, GtkTreeViewColumn* column ); G_END_DECLS; #endif /* !__EXO_TREE_VIEW_H__ */ libfm-1.4.0/src/gtk/exo/test.c000066400000000000000000000026621475513661000161150ustar00rootroot00000000000000#include #include "exo-icon-view.h" int main(int argc, char** argv) { gtk_init( &argc, &argv ); GtkWidget* win = gtk_window_new( GTK_WINDOW_TOPLEVEL ); GtkListStore* list = gtk_list_store_new( 2, GDK_TYPE_PIXBUF, G_TYPE_STRING ); ExoIconView* view = exo_icon_view_new_with_model( list ); GtkTreeIter it; GdkPixbuf* pix = gtk_icon_theme_load_icon( gtk_icon_theme_get_default(), "folder", 48, 0, NULL ); GtkWidget* scroll = gtk_scrolled_window_new(NULL, NULL); gtk_list_store_insert_with_values( list, &it, 0, 0, pix, 1, "Test", -1 ); gtk_list_store_insert_with_values( list, &it, 1, 0, pix, 1, "Test", -1 ); gtk_list_store_insert_with_values( list, &it, 2, 0, pix, 1, "Test", -1 ); gtk_list_store_insert_with_values( list, &it, 3, 0, pix, 1, "Test", -1 ); g_object_unref( pix ); exo_icon_view_set_text_column( view, 1 ); exo_icon_view_set_pixbuf_column( view, 0 ); exo_icon_view_set_orientation( view, GTK_ORIENTATION_HORIZONTAL ); exo_icon_view_set_layout_mode( view, EXO_ICON_VIEW_LAYOUT_COLS ); exo_icon_view_set_columns( view, -1 ); exo_icon_view_set_item_width( view, 128 ); exo_icon_view_set_single_click(view, TRUE); exo_icon_view_set_selection_mode( view, GTK_SELECTION_MULTIPLE ); gtk_container_add( scroll, view ); gtk_container_add( win, scroll ); gtk_widget_show_all( win ); gtk_main(); gtk_widget_destroy( win ); return 0; } libfm-1.4.0/src/gtk/fm-app-chooser-combo-box.c000066400000000000000000000235621475513661000210500ustar00rootroot00000000000000/* * fm-app-chooser-combo-box.c * * Copyright 2010 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-app-chooser-combo-box * @short_description: Combo box for application selection dialogs. * @title: Application chooser combobox * * @include: libfm/fm-gtk.h * * The fm_app_chooser_combo_box_setup() allows to create a widget where * applications are represented as a tree to choose from it. The dialog * itself is represented by fm_app_chooser_dlg_new(). */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm-app-chooser-combo-box.h" #include "fm-app-chooser-dlg.h" #include "fm.h" typedef struct _FmAppChooserComboBoxData FmAppChooserComboBoxData; struct _FmAppChooserComboBoxData { FmMimeType* mime_type; GtkTreeIter initial_sel_iter; GtkTreeIter prev_sel_iter; GAppInfo* initial_sel_app; GtkTreeIter separator_iter; GtkTreeIter other_apps_iter; GList* custom_apps; }; static gboolean is_row_separator(GtkTreeModel* model, GtkTreeIter* it, gpointer user_data) { FmAppChooserComboBoxData* data = (FmAppChooserComboBoxData*)user_data; /* FIXME: this is dirty but it works! */ return data->separator_iter.user_data == it->user_data; } static void on_app_selected(GtkComboBox* cb, FmAppChooserComboBoxData* data) { GtkTreeIter it; GtkTreeModel* model; if( !gtk_combo_box_get_active_iter(cb, &it) ) return; model = gtk_combo_box_get_model(cb); /* if the user chooses "Customize..." */ if(it.user_data == data->other_apps_iter.user_data) { /* let the user choose an app or add custom actions here. */ GtkWidget* parent = gtk_widget_get_toplevel(GTK_WIDGET(cb)); GAppInfo* app = fm_choose_app_for_mime_type(GTK_WINDOW(parent), data->mime_type, FALSE); if(app) { gboolean found = FALSE; /* see if it's already in the list to prevent duplication */ if(gtk_tree_model_get_iter_first(model, &it)) { GAppInfo *_app; do { gtk_tree_model_get(model, &it, 2, &_app, -1); if(_app) { found = g_app_info_equal(app, _app); g_object_unref(_app); } if(found) break; }while(gtk_tree_model_iter_next(model, &it)); } /* if it's already in the list, select it */ if(found) { gtk_combo_box_set_active_iter(cb, &it); } else /* if it's not found, add it to the list */ { gtk_list_store_insert_before(GTK_LIST_STORE(model), &it, &data->separator_iter); gtk_list_store_set(GTK_LIST_STORE(model), &it, 0, g_app_info_get_icon(app), 1, g_app_info_get_name(app), 2, app, -1); data->prev_sel_iter = it; gtk_combo_box_set_active_iter(cb, &it); /* add to custom apps list */ data->custom_apps = g_list_prepend(data->custom_apps, g_object_ref(app)); } g_object_unref(app); } else { if(!data->prev_sel_iter.user_data) gtk_tree_model_get_iter_first(model, &data->prev_sel_iter); gtk_combo_box_set_active_iter(cb, &data->prev_sel_iter); } } else /* an application in the list is selected */ data->prev_sel_iter = it; } static void free_data(gpointer user_data) { FmAppChooserComboBoxData* data = (FmAppChooserComboBoxData*)user_data; if(data->initial_sel_app) g_object_unref(data->initial_sel_app); if(data->mime_type) fm_mime_type_unref(data->mime_type); if(data->custom_apps) { g_list_foreach(data->custom_apps, (GFunc)g_object_unref, NULL); g_list_free(data->custom_apps); } g_slice_free(FmAppChooserComboBoxData, data); } /** * fm_app_chooser_combo_box_setup * @combo: a #GtkComboBox * @mime_type: (allow-none): a #FmMimeType to select application * @apps: (allow-none) (element-type GAppInfo): custom list of applications * @sel: (allow-none): a selected application in @apps * * Setups a combobox for selecting default application either for * specified mime-type or from a list of pre-defined applications. * If @mime_type is %NULL, and @sel is provided and found in the @apps, * then it will be selected. If @mime_type is not %NULL then default * application for the @mime_type will be selected. * When set up, the combobox will contain a list of available applications. * * Since: 0.1.5 */ void fm_app_chooser_combo_box_setup(GtkComboBox* combo, FmMimeType* mime_type, GList* apps, GAppInfo* sel) { FmAppChooserComboBoxData* data = g_slice_new0(FmAppChooserComboBoxData); GtkListStore* store = gtk_list_store_new(3, G_TYPE_ICON, G_TYPE_STRING, G_TYPE_APP_INFO); GtkTreeIter it; GList* l; GtkCellRenderer* render; gtk_cell_layout_clear(GTK_CELL_LAYOUT(combo)); render = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), render, "gicon", 0); render = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), render, "text", 1); if(mime_type) { data->mime_type = fm_mime_type_ref(mime_type); apps = g_app_info_get_all_for_type(fm_mime_type_get_type(data->mime_type)); sel = g_app_info_get_default_for_type(fm_mime_type_get_type(data->mime_type), FALSE); } for(l = apps; l; l = l->next) { GAppInfo* app = G_APP_INFO(l->data); gtk_list_store_insert_with_values(store, &it, -1, 0, g_app_info_get_icon(app), 1, g_app_info_get_name(app), 2, app, -1); if(sel && g_app_info_equal(app, sel)) { /* this is the initially selected app */ data->initial_sel_iter = it; data->initial_sel_app = (GAppInfo*)g_object_ref(app); } } if(mime_type) /* if this list is retrived with g_app_info_get_all_for_type() */ { if(apps) { g_list_foreach(apps, (GFunc)g_object_unref, NULL); g_list_free(apps); } if(sel) g_object_unref(sel); } gtk_list_store_append(store, &it); /* separator */ data->separator_iter = it; /* other applications */ gtk_list_store_insert_with_values(store, &it, -1, 0, NULL, 1, _("Customize"), // FIXME: should be "Customize..." 2, NULL, -1); data->other_apps_iter = it; gtk_combo_box_set_model(combo, GTK_TREE_MODEL(store)); if(data->initial_sel_iter.user_data) /* intital selection is set */ { data->prev_sel_iter = data->initial_sel_iter; gtk_combo_box_set_active_iter(combo, &data->initial_sel_iter); } gtk_combo_box_set_row_separator_func(combo, is_row_separator, data, NULL); g_object_unref(store); g_signal_connect(combo, "changed", G_CALLBACK(on_app_selected), data); g_object_set_qdata_full(G_OBJECT(combo), fm_qdata_id, data, free_data); } /** * fm_app_chooser_combo_box_dup_selected_app * @combo: a #GtkComboBox * @is_sel_changed: (out) (allow-none): location to store %TRUE if selection was changed * * Retrieves the currently selected app. @is_sel_changed (can be %NULL) will get a * boolean value which tells you if the currently selected app is different from the one * initially selected in the combobox. * The returned #GAppInfo needs to be freed with g_object_unref() * * Before 1.0.0 this call had name fm_app_chooser_combo_box_get_selected. * * Returns: selected application. * * Since: 0.1.5 */ GAppInfo* fm_app_chooser_combo_box_dup_selected_app(GtkComboBox* combo, gboolean* is_sel_changed) { GtkTreeIter it; if(gtk_combo_box_get_active_iter(combo, &it)) { GAppInfo* app; GtkTreeModel* model = gtk_combo_box_get_model(combo); gtk_tree_model_get(model, &it, 2, &app, -1); if(is_sel_changed) { FmAppChooserComboBoxData* data = (FmAppChooserComboBoxData*)g_object_get_qdata(G_OBJECT(combo), fm_qdata_id); *is_sel_changed = (it.user_data != data->initial_sel_iter.user_data); } return app; } return NULL; } /** * fm_app_chooser_combo_box_get_custom_apps * @combo: a #GtkComboBox * * Retrieves a list of custom apps added with app-chooser. * The returned #GList is owned by the combo box and shouldn't be freed. * * Returns: (transfer none) (element-type GAppInfo): list of applications * * Since: 0.1.5 */ const GList* fm_app_chooser_combo_box_get_custom_apps(GtkComboBox* combo) { FmAppChooserComboBoxData* data = (FmAppChooserComboBoxData*)g_object_get_qdata(G_OBJECT(combo), fm_qdata_id); return data->custom_apps; } libfm-1.4.0/src/gtk/fm-app-chooser-combo-box.h000066400000000000000000000056001475513661000210460ustar00rootroot00000000000000/* * fm-app-chooser-combo-box.h * * Copyright 2010 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_APP_CHOOSER_COMBO_BOX_H__ #define __FM_APP_CHOOSER_COMBO_BOX_H__ #include #include #include "fm-mime-type.h" G_BEGIN_DECLS void fm_app_chooser_combo_box_setup(GtkComboBox* combo, FmMimeType* mime_type, GList* apps, GAppInfo* sel); /** * fm_app_chooser_combo_box_setup_for_mime_type * @combo: a #GtkComboBox * @mime_type: a #FmMimeType to select application * * Setups a combobox for selecting default application for specified mime-type. * after set up, the combobox will contain a list of available applications for * this mime-type, and the default application of the mime-type will get selected. * * Since: 0.1.5 */ #define fm_app_chooser_combo_box_setup_for_mime_type(combo, mime_type) \ fm_app_chooser_combo_box_setup(combo, mime_type, NULL, NULL) /** * fm_app_chooser_combo_box_setup_custom * @combo: a #GtkComboBox * @apps: (element-type GAppInfo): custom #GList of applications * @sel: (allow-none): a selected application in @apps * * Setups a combobox for selecting from a list of pre-defined applications. * after set up, the combobox will contain a list of available applications the caller * provides, and if @sel if found in the list, it will be selected. * * Since: 0.1.5 */ #define fm_app_chooser_combo_box_setup_custom(combo, apps, sel) \ fm_app_chooser_combo_box_setup(combo, NULL, apps, sel) /* returns the currently selected app. is_sel_changed (can be NULL) will retrive a * boolean value which tells you if the currently selected app is different from the one * initially selected in the combobox. * the returned GAppInfo needs to be freed with g_object_unref() */ GAppInfo* fm_app_chooser_combo_box_dup_selected_app(GtkComboBox* combo, gboolean* is_sel_changed); /* get a list of custom apps added with app-chooser. * the returned GList is owned by the combo box and shouldn't be freed. */ const GList* fm_app_chooser_combo_box_get_custom_apps(GtkComboBox* combo); G_END_DECLS #endif /* __FM_APP_CHOOSER_COMBO_BOX_H__ */ libfm-1.4.0/src/gtk/fm-app-chooser-dlg.c000066400000000000000000000532641475513661000177330ustar00rootroot00000000000000/* * fm-app-chooser-dlg.c * * Copyright 2010 Hong Jen Yee (PCMan) * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2024 Ingo Brückl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-app-chooser-dlg * @short_description: Dialog for application selection. * @title: Application chooser dialog * * @include: libfm/fm-gtk.h * * The dialog to choose application from tree of known applications. * Also allows user to create custom one. * The tree itself is represented by fm_app_menu_view_new(). */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "fm.h" #include "fm-app-chooser-dlg.h" #include "fm-app-menu-view.h" #include "fm-gtk-utils.h" #include #include /* support for libmenu-cache 0.4.x */ #ifndef MENU_CACHE_CHECK_VERSION # ifdef HAVE_MENU_CACHE_DIR_LIST_CHILDREN # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) (_a == 0 && _b < 5) /* < 0.5.0 */ # else # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) 0 /* not even 0.4.0 */ # endif #endif typedef struct _AppChooserData AppChooserData; struct _AppChooserData { GtkDialog* dlg; GtkNotebook* notebook; GtkTreeView* apps_view; GtkEntry* cmdline; GtkToggleButton* set_default; GtkToggleButton* use_terminal; GtkToggleButton* keep_open; GtkEntry* app_name; GtkWidget* browse_btn; FmMimeType* mime_type; }; static void on_temp_appinfo_destroy(gpointer data, GObject *objptr) { char *filename = data; if(g_unlink(filename) < 0) g_critical("failed to remove %s", filename); /* else g_debug("temp file %s removed", filename); */ g_free(filename); } static GAppInfo* app_info_create_from_commandline(const char *commandline, const char *application_name, const char *bin_name, const char *mime_type, gboolean terminal, gboolean keep) { GAppInfo* app = NULL; char* dirname = g_build_filename (g_get_user_data_dir (), "applications", NULL); const char* app_basename = strrchr(bin_name, '/'); if(app_basename) app_basename++; else app_basename = bin_name; if(g_mkdir_with_parents(dirname, 0700) == 0) { char *filename = NULL; int fd; #if GLIB_CHECK_VERSION(2, 37, 6) if (mime_type && application_name[0]) { /* SF bug #871: new GLib has ids cached so we do a trick here: we create a dummy app before really creating the file */ app = g_app_info_create_from_commandline(commandline, app_basename, 0, NULL); if (app) { g_app_info_remove_supports_type(app, mime_type, NULL); filename = g_strdup(g_desktop_app_info_get_filename(G_DESKTOP_APP_INFO(app))); g_object_unref(app); app = NULL; } } if (filename) fd = g_open(filename, O_RDWR, 0); else #endif { filename = g_strdup_printf ("%s/userapp-%s-XXXXXX.desktop", dirname, app_basename); fd = g_mkstemp (filename); } if(fd != -1) { GString* content = g_string_sized_new(256); g_string_printf(content, "[" G_KEY_FILE_DESKTOP_GROUP "]\n" G_KEY_FILE_DESKTOP_KEY_TYPE "=" G_KEY_FILE_DESKTOP_TYPE_APPLICATION "\n" G_KEY_FILE_DESKTOP_KEY_NAME "=%s\n" G_KEY_FILE_DESKTOP_KEY_EXEC "=%s\n" G_KEY_FILE_DESKTOP_KEY_CATEGORIES "=Other;\n" G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY "=true\n", application_name, commandline ); if(mime_type) g_string_append_printf(content, G_KEY_FILE_DESKTOP_KEY_MIME_TYPE "=%s\n", mime_type); g_string_append_printf(content, G_KEY_FILE_DESKTOP_KEY_TERMINAL "=%s\n", terminal ? "true" : "false"); if(terminal) g_string_append_printf(content, "X-KeepTerminal=%s\n", keep ? "true" : "false"); close(fd); /* g_file_set_contents() may fail creating duplicate */ if(g_file_set_contents(filename, content->str, content->len, NULL)) { char *fbname = g_path_get_basename(filename); app = G_APP_INFO(g_desktop_app_info_new(fbname)); g_free(fbname); if (app == NULL) { g_warning("failed to load %s as an application", filename); g_unlink(filename); } /* if there is mime_type set then created application will be saved for the mime type (see fm_choose_app_for_mime_type() below) but if not then we should remove this temp. file */ else if (!mime_type || !application_name[0]) /* save the name so this file will be removed later */ g_object_weak_ref(G_OBJECT(app), on_temp_appinfo_destroy, g_strdup(filename)); } else g_unlink(filename); g_string_free(content, TRUE); } g_free(filename); } g_free(dirname); return app; } static void on_dlg_destroy(AppChooserData* data, GObject* dlg) { if(data->mime_type) fm_mime_type_unref(data->mime_type); g_slice_free(AppChooserData, data); } static void on_switch_page(GtkNotebook* nb, GtkWidget* page, gint num, AppChooserData* data) { if(num == 0) /* list of installed apps */ { gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, fm_app_menu_view_is_app_selected(data->apps_view)); } else /* custom app */ { const char* cmd = gtk_entry_get_text(data->cmdline); gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, (cmd && cmd[0])); } } static void on_apps_view_sel_changed(GtkTreeSelection* tree_sel, AppChooserData* data) { if(gtk_notebook_get_current_page(data->notebook) == 0) { gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, fm_app_menu_view_is_app_selected(data->apps_view)); } } static void on_cmdline_changed(GtkEditable* cmdline, AppChooserData* data) { if(gtk_notebook_get_current_page(data->notebook) == 1) { const char* cmd = gtk_entry_get_text(data->cmdline); gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, (cmd && cmd[0])); } } static gboolean exec_filter_func(const GtkFileFilterInfo *filter_info, gpointer data) { if(g_content_type_can_be_executable(filter_info->mime_type)) return TRUE; return FALSE; } static void on_browse_btn_clicked(GtkButton* btn, AppChooserData* data) { FmPath* file; GtkFileFilter* filter = gtk_file_filter_new(); char* binary; gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME|GTK_FILE_FILTER_MIME_TYPE, exec_filter_func, NULL, NULL); gtk_file_filter_set_name(filter, _("Executable files")); file = fm_select_file(GTK_WINDOW(data->dlg), NULL, "/usr/bin", TRUE, FALSE, filter, NULL); if (file == NULL) return; binary = fm_path_to_str(file); if (g_str_has_suffix(fm_path_get_basename(file), ".desktop")) { GKeyFile *kf = g_key_file_new(); GDesktopAppInfo *info; if (g_key_file_load_from_file(kf, binary, 0, NULL) && (info = g_desktop_app_info_new_from_keyfile(kf)) != NULL) /* it is a valid desktop entry */ { /* FIXME: it will duplicate the file, how to avoid that? */ gtk_entry_set_text(data->cmdline, g_app_info_get_commandline(G_APP_INFO(info))); gtk_entry_set_text(data->app_name, g_app_info_get_name(G_APP_INFO(info))); gtk_toggle_button_set_active(data->use_terminal, g_key_file_get_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, NULL)); gtk_toggle_button_set_active(data->keep_open, g_key_file_get_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, "X-KeepTerminal", NULL)); g_object_unref(info); g_key_file_free(kf); fm_path_unref(file); return; } g_key_file_free(kf); } gtk_entry_set_text(data->cmdline, binary); g_free(binary); fm_path_unref(file); } static void on_use_terminal_changed(GtkToggleButton* btn, AppChooserData* data) { if(data->keep_open) gtk_widget_set_sensitive(GTK_WIDGET(data->keep_open), gtk_toggle_button_get_active(btn)); } /** * fm_app_chooser_dlg_new * @mime_type: (allow-none): MIME type for list creation * @can_set_default: %TRUE if widget can set selected item as default for @mime_type * * Creates a widget for choosing an application either from tree of * existing ones or also allows to set up own command for it. * * Returns: (transfer full): a widget. * * Since: 0.1.0 */ GtkDialog *fm_app_chooser_dlg_new(FmMimeType* mime_type, gboolean can_set_default) { GtkContainer* scroll; GtkLabel *file_type, *file_type_header; GtkTreeSelection* tree_sel; GtkBuilder* builder = gtk_builder_new(); AppChooserData* data = g_slice_new0(AppChooserData); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/app-chooser.ui", NULL); data->dlg = GTK_DIALOG(gtk_builder_get_object(builder, "dlg")); data->notebook = GTK_NOTEBOOK(gtk_builder_get_object(builder, "notebook")); scroll = GTK_CONTAINER(gtk_builder_get_object(builder, "apps_scroll")); file_type = GTK_LABEL(gtk_builder_get_object(builder, "file_type")); file_type_header = GTK_LABEL(gtk_builder_get_object(builder, "file_type_header")); data->cmdline = GTK_ENTRY(gtk_builder_get_object(builder, "cmdline")); data->set_default = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "set_default")); data->use_terminal = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "use_terminal")); data->keep_open = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "keep_open")); data->browse_btn = GTK_WIDGET(gtk_builder_get_object(builder, "browse_btn")); data->app_name = GTK_ENTRY(gtk_builder_get_object(builder, "app_name")); /* FIXME: shouldn't verify if app-chooser.ui was correct? */ if(mime_type) data->mime_type = fm_mime_type_ref(mime_type); gtk_dialog_set_alternative_button_order(data->dlg, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); if(!can_set_default) gtk_widget_hide(GTK_WIDGET(data->set_default)); if(mime_type && fm_mime_type_get_desc(mime_type)) { if (file_type_header) { char *text = g_strdup_printf(_("Select an application to open \"%s\" files"), fm_mime_type_get_desc(mime_type)); gtk_label_set_markup(file_type_header, text); g_free(text); } else gtk_label_set_text(file_type, fm_mime_type_get_desc(mime_type)); } else { GtkWidget* hbox = GTK_WIDGET(gtk_builder_get_object(builder, "file_type_hbox")); gtk_widget_destroy(hbox); gtk_widget_hide(GTK_WIDGET(data->set_default)); } data->apps_view = fm_app_menu_view_new(); gtk_tree_view_set_headers_visible(data->apps_view, FALSE); gtk_widget_show(GTK_WIDGET(data->apps_view)); gtk_container_add(scroll, GTK_WIDGET(data->apps_view)); gtk_widget_grab_focus(GTK_WIDGET(data->apps_view)); g_object_unref(builder); g_signal_connect(data->browse_btn, "clicked", G_CALLBACK(on_browse_btn_clicked), data); g_object_set_qdata_full(G_OBJECT(data->dlg), fm_qdata_id, data, (GDestroyNotify)on_dlg_destroy); g_signal_connect(data->notebook, "switch-page", G_CALLBACK(on_switch_page), data); on_switch_page(data->notebook, NULL, 0, data); tree_sel = gtk_tree_view_get_selection(data->apps_view); g_signal_connect(tree_sel, "changed", G_CALLBACK(on_apps_view_sel_changed), data); g_signal_connect(data->cmdline, "changed", G_CALLBACK(on_cmdline_changed), data); g_signal_connect(data->use_terminal, "toggled", G_CALLBACK(on_use_terminal_changed), data); gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, FALSE); return data->dlg; } inline static char* get_binary(const char* cmdline, gboolean* arg_found) { /* see if command line contains %f, %F, %u, or %U. */ const char* p = strstr(cmdline, " %"); if(p) { if( !strchr("fFuU", *(p + 2)) ) p = NULL; } if(arg_found) *arg_found = (p != NULL); if(p) return g_strndup(cmdline, p - cmdline); else return g_strdup(cmdline); } /** * fm_app_chooser_dlg_dup_selected_app * @dlg: a widget * @set_default: location to get value that was used for fm_app_chooser_dlg_new() * * Retrieves a currently selected application from @dlg. * * Before 1.0.0 this call had name fm_app_chooser_dlg_get_selected_app. * * Returns: (transfer full): selected application. * * Since: 0.1.0 */ GAppInfo* fm_app_chooser_dlg_dup_selected_app(GtkDialog* dlg, gboolean* set_default) { GAppInfo* app = NULL; AppChooserData* data = (AppChooserData*)g_object_get_qdata(G_OBJECT(dlg), fm_qdata_id); switch( gtk_notebook_get_current_page(data->notebook) ) { case 0: /* all applications */ app = fm_app_menu_view_dup_selected_app(data->apps_view); break; case 1: /* custom cmd line */ { const char* cmdline = gtk_entry_get_text(data->cmdline); const char* app_name = gtk_entry_get_text(data->app_name); if(cmdline && cmdline[0]) { char* _cmdline = NULL; gboolean arg_found = FALSE; char* bin1 = get_binary(cmdline, &arg_found); g_debug("bin1 = %s", bin1); /* see if command line contains %f, %F, %u, or %U. */ if(!arg_found) /* append %f if no %f, %F, %u, or %U was found. */ cmdline = _cmdline = g_strconcat(cmdline, " %f", NULL); /* FIXME: is there any better way to do this? this is quite dirty, whole cmdline should be tested instead */ /* We need to ensure that no duplicated items are added */ if (app_name && app_name[0] && data->mime_type) { MenuCache* menu_cache; /* see if the command is already in the list of known apps for this mime-type */ GList* apps = g_app_info_get_all_for_type(fm_mime_type_get_type(data->mime_type)); GList* l; for(l=apps;l;l=l->next) { GAppInfo* app2 = G_APP_INFO(l->data); const char* cmd = g_app_info_get_commandline(app2); char* bin2 = get_binary(cmd, NULL); if(g_strcmp0(bin1, bin2) == 0) { app = G_APP_INFO(g_object_ref(app2)); g_debug("found in app list"); g_free(bin2); break; } g_free(bin2); } g_list_foreach(apps, (GFunc)g_object_unref, NULL); g_list_free(apps); if(app) goto _out; /* see if this command can be found in menu cache */ menu_cache = menu_cache_lookup_sync("applications.menu"); if(menu_cache) { #if MENU_CACHE_CHECK_VERSION(0, 4, 0) MenuCacheDir *root_dir = menu_cache_dup_root_dir(menu_cache); if(root_dir) #else if(menu_cache_get_root_dir(menu_cache)) #endif { GSList* all_apps = menu_cache_list_all_apps(menu_cache); GSList* l; for(l=all_apps;l;l=l->next) { MenuCacheApp* ma = MENU_CACHE_APP(l->data); const char *exec = menu_cache_app_get_exec(ma); char* bin2; if (exec == NULL) { g_warning("application %s has no Exec statement", menu_cache_item_get_id(MENU_CACHE_ITEM(ma))); continue; } bin2 = get_binary(exec, NULL); if(g_strcmp0(bin1, bin2) == 0) { app = G_APP_INFO(g_desktop_app_info_new(menu_cache_item_get_id(MENU_CACHE_ITEM(ma)))); g_debug("found in menu cache"); menu_cache_item_unref(MENU_CACHE_ITEM(ma)); g_free(bin2); break; } menu_cache_item_unref(MENU_CACHE_ITEM(ma)); g_free(bin2); } g_slist_free(all_apps); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) menu_cache_item_unref(MENU_CACHE_ITEM(root_dir)); #endif } menu_cache_unref(menu_cache); } if(app) goto _out; } /* FIXME: g_app_info_create_from_commandline force the use of %f or %u, so this is not we need */ app = app_info_create_from_commandline(cmdline, app_name ? app_name : "", bin1, data->mime_type ? fm_mime_type_get_type(data->mime_type) : NULL, gtk_toggle_button_get_active(data->use_terminal), data->keep_open && gtk_toggle_button_get_active(data->keep_open)); _out: g_free(bin1); g_free(_cmdline); } } break; } if(set_default) *set_default = gtk_toggle_button_get_active(data->set_default); return app; } /** * fm_choose_app_for_mime_type * @parent: (allow-none): a parent window * @mime_type: (allow-none): MIME type for list creation * @can_set_default: %TRUE if widget can set selected item as default for @mime_type * * Creates a dialog to choose application for @mime_type, lets user to * choose then returns the chosen application. * * If user creates custom application and @mime_type isn't %NULL then this * custom application will be added to list of supporting the @mime_type. * Otherwise that custom application file will be deleted after usage. * * Returns: user choise. * * Since: 0.1.0 */ GAppInfo* fm_choose_app_for_mime_type(GtkWindow* parent, FmMimeType* mime_type, gboolean can_set_default) { GAppInfo* app = NULL; GtkDialog* dlg = fm_app_chooser_dlg_new(mime_type, can_set_default); if(parent) gtk_window_set_transient_for(GTK_WINDOW(dlg), parent); if(gtk_dialog_run(dlg) == GTK_RESPONSE_OK) { gboolean set_default; app = fm_app_chooser_dlg_dup_selected_app(dlg, &set_default); if(app && mime_type && fm_mime_type_get_type(mime_type) && g_app_info_get_name(app)[0]) /* don't add empty name */ { GError* err = NULL; /* add this app to the mime-type */ #if GLIB_CHECK_VERSION(2, 27, 6) if(!g_app_info_set_as_last_used_for_type(app, #else if(!g_app_info_add_supports_type(app, #endif fm_mime_type_get_type(mime_type), &err)) { g_debug("error: %s", err->message); g_error_free(err); } /* if need to set default */ if(set_default) g_app_info_set_as_default_for_type(app, fm_mime_type_get_type(mime_type), NULL); } } gtk_widget_destroy(GTK_WIDGET(dlg)); return app; } libfm-1.4.0/src/gtk/fm-app-chooser-dlg.h000066400000000000000000000025721475513661000177340ustar00rootroot00000000000000/* * fm-app-chooser-dlg.h * * Copyright 2010 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_APP_CHOOSER_DLG_H__ #define __FM_APP_CHOOSER_DLG_H__ #include #include #include "fm-mime-type.h" G_BEGIN_DECLS GtkDialog* fm_app_chooser_dlg_new(FmMimeType* mime_type, gboolean can_set_default); GAppInfo* fm_app_chooser_dlg_dup_selected_app(GtkDialog* dlg, gboolean* set_default); GAppInfo* fm_choose_app_for_mime_type(GtkWindow* parent, FmMimeType* mime_type, gboolean can_set_default); G_END_DECLS #endif /* __FM_APP_CHOOSER_DLG_H__ */ libfm-1.4.0/src/gtk/fm-app-menu-view.c000066400000000000000000000267431475513661000174430ustar00rootroot00000000000000/* * fm-app-menu-view.c * * Copyright 2010 - 2012 Hong Jen Yee (PCMan) * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-app-menu-view * @short_description: Applications tree for application selection dialogs. * @title: Application chooser tree * * @include: libfm/fm-gtk.h * * The widget to represent known applications as a tree. */ #ifdef HAVE_CONFIG_H #include #endif #include "../glib-compat.h" #include "fm-app-menu-view.h" #include "fm-icon.h" #include #include #include #include /* support for libmenu-cache 0.4.x */ #ifndef MENU_CACHE_CHECK_VERSION # ifdef HAVE_MENU_CACHE_DIR_LIST_CHILDREN # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) (_a == 0 && _b < 5) /* < 0.5.0 */ # else # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) 0 /* not even 0.4.0 */ # endif #endif enum { COL_ICON, COL_TITLE, COL_ITEM, N_COLS }; static GtkTreeStore* store = NULL; static MenuCache* menu_cache = NULL; static gpointer menu_cache_reload_notify = NULL; static void destroy_store(gpointer user_data, GObject *obj) { menu_cache_remove_reload_notify(menu_cache, menu_cache_reload_notify); menu_cache_reload_notify = NULL; menu_cache_unref(menu_cache); menu_cache = NULL; store = NULL; } /* called with lock held */ static void add_menu_items(GtkTreeIter* parent_it, MenuCacheDir* dir) { GtkTreeIter it; GSList * l; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) GSList *list; #endif GIcon* gicon; /* Iterate over all menu items in this directory. */ #if MENU_CACHE_CHECK_VERSION(0, 4, 0) for (l = list = menu_cache_dir_list_children(dir); l != NULL; l = l->next) #else for (l = menu_cache_dir_get_children(dir); l != NULL; l = l->next) #endif { /* Get the menu item. */ MenuCacheItem* item = MENU_CACHE_ITEM(l->data); switch(menu_cache_item_get_type(item)) { case MENU_CACHE_TYPE_NONE: case MENU_CACHE_TYPE_SEP: break; case MENU_CACHE_TYPE_APP: case MENU_CACHE_TYPE_DIR: if(menu_cache_item_get_icon(item)) gicon = G_ICON(fm_icon_from_name(menu_cache_item_get_icon(item))); else gicon = NULL; gtk_tree_store_append(store, &it, parent_it); gtk_tree_store_set(store, &it, COL_ICON, gicon, COL_TITLE, menu_cache_item_get_name(item), COL_ITEM, item, -1); if(gicon) g_object_unref(gicon); if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) add_menu_items(&it, MENU_CACHE_DIR(item)); break; } } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref); #endif } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) static void on_menu_cache_reload(MenuCache* mc, gpointer user_data) #else static void on_menu_cache_reload(gpointer mc, gpointer user_data) #endif { g_return_if_fail(store); gtk_tree_store_clear(store); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) MenuCacheDir* dir = menu_cache_dup_root_dir(mc); #else MenuCacheDir* dir = menu_cache_get_root_dir(menu_cache); #endif /* FIXME: preserve original selection */ if(dir) { add_menu_items(NULL, dir); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) menu_cache_item_unref(MENU_CACHE_ITEM(dir)); #endif } } /** * fm_app_menu_view_new * * Creates new application tree widget. * * Returns: (transfer full): a new widget. * * Since: 0.1.0 */ GtkTreeView *fm_app_menu_view_new(void) { GtkTreeView* view; GtkTreeViewColumn* col; GtkCellRenderer* render; if(!store) { static GType menu_cache_item_type = 0; char* oldenv; if(G_UNLIKELY(!menu_cache_item_type)) menu_cache_item_type = g_boxed_type_register_static("MenuCacheItem", (GBoxedCopyFunc)menu_cache_item_ref, (GBoxedFreeFunc)menu_cache_item_unref); store = gtk_tree_store_new(N_COLS, G_TYPE_ICON, /*GDK_TYPE_PIXBUF, */G_TYPE_STRING, menu_cache_item_type); g_object_weak_ref(G_OBJECT(store), destroy_store, NULL); /* ensure that we're using lxmenu-data */ oldenv = g_strdup(g_getenv("XDG_MENU_PREFIX")); g_setenv("XDG_MENU_PREFIX", "lxde-", TRUE); menu_cache = menu_cache_lookup("applications.menu"); if(oldenv) { g_setenv("XDG_MENU_PREFIX", oldenv, TRUE); g_free(oldenv); } else g_unsetenv("XDG_MENU_PREFIX"); if(menu_cache) { #if MENU_CACHE_CHECK_VERSION(0, 4, 0) MenuCacheDir* dir = menu_cache_dup_root_dir(menu_cache); #else MenuCacheDir* dir = menu_cache_get_root_dir(menu_cache); #endif menu_cache_reload_notify = menu_cache_add_reload_notify(menu_cache, on_menu_cache_reload, NULL); if(dir) /* content of menu is already loaded */ { add_menu_items(NULL, dir); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) menu_cache_item_unref(MENU_CACHE_ITEM(dir)); #endif } } } else g_object_ref(store); view = (GtkTreeView*)gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); render = gtk_cell_renderer_pixbuf_new(); col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, _("Installed Applications")); gtk_tree_view_column_pack_start(col, render, FALSE); gtk_tree_view_column_set_attributes(col, render, "gicon", COL_ICON, NULL); render = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, render, TRUE); gtk_tree_view_column_set_attributes(col, render, "text", COL_TITLE, NULL); gtk_tree_view_append_column(view, col); g_object_unref(store); return view; } /** * fm_app_menu_view_dup_selected_app * @view: a widget * * Retrieves selected application from the widget. * The returned data should be freed with g_object_unref() after usage. * * Before 1.0.0 this call had name fm_app_menu_view_get_selected_app. * * Returns: (transfer full): selected application descriptor. * * Since: 0.1.0 */ GAppInfo* fm_app_menu_view_dup_selected_app(GtkTreeView* view) { char* id = fm_app_menu_view_dup_selected_app_desktop_id(view); if(id) { GDesktopAppInfo* app = g_desktop_app_info_new(id); g_free(id); return G_APP_INFO(app); } return NULL; } /** * fm_app_menu_view_dup_selected_app_desktop_id * @view: a widget * * Retrieves name of selected application from the widget. * The returned data should be freed with g_free() after usage. * * Before 1.0.0 this call had name fm_app_menu_view_get_selected_app_desktop_id. * * Returns: (transfer full): selected application name. * * Since: 0.1.0 */ char* fm_app_menu_view_dup_selected_app_desktop_id(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); /* FIXME: this should be checked if it's exactly app menu tree! */ char* id = NULL; if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) id = g_strdup(menu_cache_item_get_id(item)); } return id; } /** * fm_app_menu_view_dup_selected_app_desktop_file_path * @view: a widget * * Retrieves file path to selected application from the widget. * The returned data should be freed with g_free() after usage. * * Before 1.0.0 this call had name fm_app_menu_view_get_selected_app_desktop_file. * * Returns: (transfer full): path to selected application file. * * Since: 0.1.0 */ char* fm_app_menu_view_dup_selected_app_desktop_file_path(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); /* FIXME: this should be checked if it's exactly app menu tree! */ if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { char* path = menu_cache_item_get_file_path(item); return path; } } return NULL; } /** * fm_app_menu_view_dup_selected_app_desktop_path * @view: a widget * * Retrieves #FmPath to selected application from the widget as a child * below fm_path_get_apps_menu() root path. Return %NULL if there is no * application selected. * The returned data should be freed with fm_path_unref() after usage. * * Returns: (transfer full): path to selected application file. * * Since: 1.2.0 */ FmPath * fm_app_menu_view_dup_selected_app_desktop_path(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); /* FIXME: this should be checked if it's exactly app menu tree! */ if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { char *mpath = menu_cache_dir_make_path(MENU_CACHE_DIR(item)); FmPath *path = fm_path_new_relative(fm_path_get_apps_menu(), mpath+13 /* skip "/Applications" */); g_free(mpath); return path; } } return NULL; } /** * fm_app_menu_view_is_item_app * @view: a widget * @it: tree iterator * * Checks if item at @it is an application. * * Returns: %TRUE if item is an application. * * Since: 0.1.0 */ gboolean fm_app_menu_view_is_item_app(GtkTreeView* view, GtkTreeIter* it) { MenuCacheItem* item; /* FIXME: this should be checked if it's exactly app menu tree! */ gboolean ret = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(store), it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) ret = TRUE; return ret; } /** * fm_app_menu_view_is_app_selected * @view: a widget * * Checks if there is an application selected in @view. * * Returns: %TRUE if there is an application selected. * * Since: 0.1.0 */ gboolean fm_app_menu_view_is_app_selected(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); if(gtk_tree_selection_get_selected(sel, NULL, &it)) return fm_app_menu_view_is_item_app(view, &it); return FALSE; } libfm-1.4.0/src/gtk/fm-app-menu-view.h000066400000000000000000000030331475513661000174330ustar00rootroot00000000000000/* * fm-app-menu-view.h * * Copyright 2010 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_APP_MENU_VIEW_H__ #define __FM_APP_MENU_VIEW_H__ #include #include "fm-path.h" G_BEGIN_DECLS GtkTreeView* fm_app_menu_view_new(void); GAppInfo* fm_app_menu_view_dup_selected_app(GtkTreeView* view); char* fm_app_menu_view_dup_selected_app_desktop_id(GtkTreeView* view); char* fm_app_menu_view_dup_selected_app_desktop_file_path(GtkTreeView* view); FmPath * fm_app_menu_view_dup_selected_app_desktop_path(GtkTreeView* view); gboolean fm_app_menu_view_is_app_selected(GtkTreeView* view); gboolean fm_app_menu_view_is_item_app(GtkTreeView* view, GtkTreeIter* it); G_END_DECLS #endif /* __FM_APP_MENU_VIEW_H__ */ libfm-1.4.0/src/gtk/fm-cell-renderer-pixbuf.c000066400000000000000000000317011475513661000207550ustar00rootroot00000000000000/* * fm-cell-renderer-pixbuf.c * * Copyright 2010 PCMan * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-cell-renderer-pixbuf * @short_description: Extended pixbuf cell renderer. * @title: FmCellRendererPixbuf * * @include: libfm/fm-gtk.h * * The #FmCellRendererPixbuf is extended version of #GtkCellRendererPixbuf * which adds small link picture if corresponding file is symbolic link. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-config.h" #include "fm-cell-renderer-pixbuf.h" static void fm_cell_renderer_pixbuf_dispose (GObject *object); static void fm_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell, GtkWidget *widget, #if GTK_CHECK_VERSION(3, 0, 0) const #endif GdkRectangle *rectangle, gint *x_offset, gint *y_offset, gint *width, gint *height); #if GTK_CHECK_VERSION(3, 0, 0) static void fm_cell_renderer_pixbuf_render(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags); #else static void fm_cell_renderer_pixbuf_render (GtkCellRenderer *cell, GdkDrawable *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags); #endif static void fm_cell_renderer_pixbuf_get_property ( GObject *object, guint param_id, GValue *value, GParamSpec *pspec ); static void fm_cell_renderer_pixbuf_set_property ( GObject *object, guint param_id, const GValue *value, GParamSpec *pspec ); enum { PROP_INFO = 1, N_PROPS }; G_DEFINE_TYPE(FmCellRendererPixbuf, fm_cell_renderer_pixbuf, GTK_TYPE_CELL_RENDERER_PIXBUF); static GdkPixbuf* link_icon = NULL; /* GdkPixbuf RGBA C-Source image dump */ #ifdef __SUNPRO_C #pragma align 4 (link_icon_data) #endif #ifdef __GNUC__ static const guint8 link_icon_data[] __attribute__ ((__aligned__ (4))) = #else static const guint8 link_icon_data[] = #endif { "" /* Pixbuf magic (0x47646b50) */ "GdkP" /* length: header (24) + pixel_data (400) */ "\0\0\1\250" /* pixdata_type (0x1010002) */ "\1\1\0\2" /* rowstride (40) */ "\0\0\0(" /* width (10) */ "\0\0\0\12" /* height (10) */ "\0\0\0\12" /* pixel_data: */ "\200\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200" "\200\200\377\200\200\200\377\200\200\200\377\200\200\200\377\200\200" "\200\377\0\0\0\377\200\200\200\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\0\0\0\377\200\200\200\377\377\377\377\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\377\377" "\377\377\377\0\0\0\377\200\200\200\377\377\377\377\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377" "\377\0\0\0\377\200\200\200\377\377\377\377\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\377" "\200\200\200\377\377\377\377\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\377\200\200\200\377\377" "\377\377\377\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0" "\0\377\0\0\0\377\377\377\377\377\0\0\0\377\200\200\200\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0" "\377\0\0\0\377\377\377\377\377\0\0\0\377\200\200\200\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377" }; static void fm_cell_renderer_pixbuf_class_init(FmCellRendererPixbufClass *klass) { GObjectClass *g_object_class = G_OBJECT_CLASS(klass); GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(klass); g_object_class->dispose = fm_cell_renderer_pixbuf_dispose; g_object_class->get_property = fm_cell_renderer_pixbuf_get_property; g_object_class->set_property = fm_cell_renderer_pixbuf_set_property; cell_class->get_size = fm_cell_renderer_pixbuf_get_size; cell_class->render = fm_cell_renderer_pixbuf_render; /** * FmCellRendererPixbuf:info: * * The #FmCellRendererPixbuf:info property is the #FmFileInfo * of file that this object corresponds to. */ g_object_class_install_property ( g_object_class, PROP_INFO, g_param_spec_pointer ( "info", "File info", "File info", G_PARAM_READWRITE ) ); } static void fm_cell_renderer_pixbuf_dispose(GObject *object) { FmCellRendererPixbuf *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_CELL_RENDERER_PIXBUF(object)); self = FM_CELL_RENDERER_PIXBUF(object); if( self->fi ) { fm_file_info_unref(self->fi); self->fi = NULL; } if(self->icon) { g_object_unref(self->icon); self->icon = NULL; } G_OBJECT_CLASS(fm_cell_renderer_pixbuf_parent_class)->dispose(object); } static void fm_cell_renderer_pixbuf_init(FmCellRendererPixbuf *self) { if( !link_icon ) { link_icon = gdk_pixbuf_new_from_inline( sizeof(link_icon_data), link_icon_data, FALSE, NULL ); g_object_add_weak_pointer(G_OBJECT(link_icon), (gpointer)&link_icon); self->icon = link_icon; } else self->icon = g_object_ref(link_icon); } /** * fm_cell_renderer_pixbuf_new * * Creates new #FmCellRendererPixbuf object. * * Returns: (transfer full): a new #FmCellRendererPixbuf object. * * Since: 0.1.0 */ FmCellRendererPixbuf *fm_cell_renderer_pixbuf_new(void) { return g_object_new(FM_TYPE_CELL_RENDERER_PIXBUF, NULL); } static void fm_cell_renderer_pixbuf_get_property ( GObject *object, guint param_id, GValue *value, GParamSpec *psec ) { FmCellRendererPixbuf* renderer = FM_CELL_RENDERER_PIXBUF(object); switch( param_id ) { case PROP_INFO: g_value_set_pointer(value, renderer->fi ? fm_file_info_ref(renderer->fi) : NULL); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID ( object, param_id, psec ); break; } } static void fm_cell_renderer_pixbuf_set_property ( GObject *object, guint param_id, const GValue *value, GParamSpec *psec ) { FmCellRendererPixbuf* renderer = FM_CELL_RENDERER_PIXBUF(object); FmFileInfo *fi; switch ( param_id ) { case PROP_INFO: if( renderer->fi ) fm_file_info_unref(renderer->fi); fi = FM_FILE_INFO(g_value_get_pointer(value)); if (fi) fm_file_info_ref(fi); renderer->fi = fi; break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID ( object, param_id, psec ); break; } } /** * fm_cell_renderer_pixbuf_set_fixed_size * @render: the renderer object * @w: new fixed width * @h: new fixed height * * Sets fixed width and height for rendered object. * * Since: 0.1.0 */ void fm_cell_renderer_pixbuf_set_fixed_size(FmCellRendererPixbuf* render, gint w, gint h) { render->fixed_w = w; render->fixed_h = h; } static void fm_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell, GtkWidget *widget, #if GTK_CHECK_VERSION(3, 0, 0) const #endif GdkRectangle *rectangle, gint *x_offset, gint *y_offset, gint *width, gint *height) { FmCellRendererPixbuf* render = FM_CELL_RENDERER_PIXBUF(cell); if(render->fixed_w > 0 && render->fixed_h > 0) { *width = render->fixed_w; *height = render->fixed_h; } else { GTK_CELL_RENDERER_CLASS(fm_cell_renderer_pixbuf_parent_class)->get_size(cell, widget, rectangle, x_offset, y_offset, width, height); } } #if GTK_CHECK_VERSION(3, 0, 0) static void fm_cell_renderer_pixbuf_render(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) #else static void fm_cell_renderer_pixbuf_render (GtkCellRenderer *cell, GdkDrawable *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags) #endif { FmCellRendererPixbuf* render = FM_CELL_RENDERER_PIXBUF(cell); FmFileInfo *info = NULL; if(fm_config->shadow_hidden) { g_object_get(render, "info", &info, NULL); // FIXME: is info certainly FmFileInfo? gtk_cell_renderer_set_sensitive(cell, !(info && fm_file_info_is_hidden(info))); } #if GTK_CHECK_VERSION(3, 0, 0) GTK_CELL_RENDERER_CLASS(fm_cell_renderer_pixbuf_parent_class)->render(cell, cr, widget, background_area, cell_area, flags); #else /* we don't need to follow state for prelit items */ if(flags & GTK_CELL_RENDERER_PRELIT) flags &= ~GTK_CELL_RENDERER_PRELIT; GTK_CELL_RENDERER_CLASS(fm_cell_renderer_pixbuf_parent_class)->render(cell, window, widget, background_area, cell_area, expose_area, flags); #endif /* FIXME: this should be handled by fm_pixbuf_* and the model instead */ if(render->fi && G_UNLIKELY(fm_file_info_is_symlink(render->fi) || fm_file_info_is_shortcut(render->fi))) { GdkPixbuf* pix; g_object_get(render, "pixbuf", &pix, NULL); if(pix) { #if !GTK_CHECK_VERSION(3, 0, 0) cairo_t *cr = gdk_cairo_create(window); #endif int x = cell_area->x + (cell_area->width - gdk_pixbuf_get_width(pix))/2; int y = cell_area->y + (cell_area->height - gdk_pixbuf_get_height(pix))/2; if (cell_area->width >= 20 && render->fixed_w >= 20) gdk_cairo_set_source_pixbuf(cr, link_icon, x, y); else { gint scale_width = MIN(cell_area->width, render->fixed_w) / 2 + 1; GdkPixbuf *scaled = gdk_pixbuf_scale_simple(link_icon, scale_width, scale_width, GDK_INTERP_TILES); gdk_cairo_set_source_pixbuf(cr, scaled, x, y); g_object_unref(scaled); } cairo_paint(cr); #if !GTK_CHECK_VERSION(3, 0, 0) cairo_destroy(cr); #endif g_object_unref(pix); } } } libfm-1.4.0/src/gtk/fm-cell-renderer-pixbuf.h000066400000000000000000000045521475513661000207660ustar00rootroot00000000000000/* * fm-cell-renderer-pixbuf.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_CELL_RENDERER_PIXBUF_H__ #define __FM_CELL_RENDERER_PIXBUF_H__ #include #include "fm-file-info.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_CELL_RENDERER_PIXBUF (fm_cell_renderer_pixbuf_get_type()) #define FM_CELL_RENDERER_PIXBUF(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_CELL_RENDERER_PIXBUF, FmCellRendererPixbuf)) #define FM_CELL_RENDERER_PIXBUF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_CELL_RENDERER_PIXBUF, FmCellRendererPixbufClass)) #define FM_IS_CELL_RENDERER_PIXBUF(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_CELL_RENDERER_PIXBUF)) #define FM_IS_CELL_RENDERER_PIXBUF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_CELL_RENDERER_PIXBUF)) typedef struct _FmCellRendererPixbuf FmCellRendererPixbuf; typedef struct _FmCellRendererPixbufClass FmCellRendererPixbufClass; struct _FmCellRendererPixbuf { /*< private >*/ GtkCellRendererPixbuf parent; FmFileInfo* FM_SEAL(fi); GdkPixbuf* FM_SEAL(icon); gint FM_SEAL(fixed_w); gint FM_SEAL(fixed_h); gint _reserved1; gint _reserved2; }; struct _FmCellRendererPixbufClass { /*< private >*/ GtkCellRendererPixbufClass parent_class; gpointer _reserved1; }; GType fm_cell_renderer_pixbuf_get_type (void); FmCellRendererPixbuf* fm_cell_renderer_pixbuf_new (void); void fm_cell_renderer_pixbuf_set_fixed_size(FmCellRendererPixbuf* render, gint w, gint h); G_END_DECLS #endif /* __FM_CELL_RENDERER_PIXBUF_H__ */ libfm-1.4.0/src/gtk/fm-cell-renderer-text.c000066400000000000000000000420331475513661000204440ustar00rootroot00000000000000/* * fm-cell-renderer-text.c * * Copyright 2009 PCMan * Copyright 2012-2016 Andriy Grytsenko (LStranger) * Copyright 2015 Mamoru TASAKA * Copyright 2020 wb9688 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-cell-renderer-text * @short_description: An implementation of cell text renderer. * @title: FmCellRendererText * * @include: libfm/fm-gtk.h * * The #FmCellRendererText can be used to render text in cell. */ #include "fm-cell-renderer-text.h" static void fm_cell_renderer_text_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *psec); static void fm_cell_renderer_text_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *psec); enum { PROP_HEIGHT = 1, N_PROPS }; G_DEFINE_TYPE(FmCellRendererText, fm_cell_renderer_text, GTK_TYPE_CELL_RENDERER_TEXT); static void fm_cell_renderer_text_get_size(GtkCellRenderer *cell, GtkWidget *widget, #if GTK_CHECK_VERSION(3, 0, 0) const #endif GdkRectangle *rectangle, gint *x_offset, gint *y_offset, gint *width, gint *height); #if GTK_CHECK_VERSION(3, 0, 0) static void fm_cell_renderer_text_render(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags); #else static void fm_cell_renderer_text_render(GtkCellRenderer *cell, GdkDrawable *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags); #endif #if GTK_CHECK_VERSION(3, 0, 0) static void fm_cell_renderer_text_get_preferred_width(GtkCellRenderer *cell, GtkWidget *widget, gint *minimum_size, gint *natural_size); static void fm_cell_renderer_text_get_preferred_height(GtkCellRenderer *cell, GtkWidget *widget, gint *minimum_size, gint *natural_size); static void fm_cell_renderer_text_get_preferred_height_for_width(GtkCellRenderer *cell, GtkWidget *widget, gint width, gint *minimum_height, gint *natural_height); #endif static void fm_cell_renderer_text_class_init(FmCellRendererTextClass *klass) { GObjectClass *g_object_class = G_OBJECT_CLASS(klass); GtkCellRendererClass* render_class = GTK_CELL_RENDERER_CLASS(klass); g_object_class->get_property = fm_cell_renderer_text_get_property; g_object_class->set_property = fm_cell_renderer_text_set_property; render_class->render = fm_cell_renderer_text_render; render_class->get_size = fm_cell_renderer_text_get_size; #if GTK_CHECK_VERSION(3, 0, 0) render_class->get_preferred_width = fm_cell_renderer_text_get_preferred_width; render_class->get_preferred_height = fm_cell_renderer_text_get_preferred_height; render_class->get_preferred_height_for_width = fm_cell_renderer_text_get_preferred_height_for_width; #endif /** * FmCellRendererText:max-height: * * The #FmCellRendererText:max-height property is the maximum height * of text that will be rendered. If text doesn't fit in that height * then text will be ellipsized. The value of -1 means unlimited * height. * * Since: 1.0.2 */ g_object_class_install_property(g_object_class, PROP_HEIGHT, g_param_spec_int("max-height", "Maximum_height", "Maximum height", -1, 2048, -1, G_PARAM_READWRITE)); } static void fm_cell_renderer_text_init(FmCellRendererText *self) { self->height = -1; } /** * fm_cell_renderer_text_new * * Creates new #GtkCellRenderer object for #FmCellRendererText. * * Returns: a new #GtkCellRenderer object. * * Since: 0.1.0 */ GtkCellRenderer *fm_cell_renderer_text_new(void) { return (GtkCellRenderer*)g_object_new(FM_CELL_RENDERER_TEXT_TYPE, NULL); } static void fm_cell_renderer_text_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *psec) { FmCellRendererText *self = FM_CELL_RENDERER_TEXT(object); switch(param_id) { case PROP_HEIGHT: g_value_set_int(value, self->height); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, psec); break; } } static void fm_cell_renderer_text_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *psec) { FmCellRendererText *self = FM_CELL_RENDERER_TEXT(object); switch(param_id) { case PROP_HEIGHT: self->height = g_value_get_int(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, psec); break; } } static void _get_size(GtkCellRenderer *cell, GtkWidget *widget, PangoLayout *layout, gchar *text, const GdkRectangle *cell_area, gint *text_width, gint *text_height, gint *xpad, gint *ypad, gint *x_offset, gint *y_offset, gint *x_align_offset) { FmCellRendererText *self = FM_CELL_RENDERER_TEXT(cell); PangoWrapMode wrap_mode; gint wrap_width; PangoAlignment alignment; gfloat xalign, yalign; gint a_width, a_height; gint a_xpad, a_ypad; if (layout) g_object_ref(layout); else layout = pango_layout_new(gtk_widget_get_pango_context(widget)); g_object_get(G_OBJECT(cell), "wrap-mode" , &wrap_mode, "wrap-width", &wrap_width, "alignment" , &alignment, NULL); pango_layout_set_alignment(layout, alignment); /* Setup the wrapping. */ if (wrap_width < 0) { pango_layout_set_width(layout, -1); pango_layout_set_wrap(layout, PANGO_WRAP_CHAR); } else { pango_layout_set_width(layout, wrap_width * PANGO_SCALE); pango_layout_set_wrap(layout, wrap_mode); if(self->height > 0) { /* FIXME: add custom ellipsize from object? */ pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); pango_layout_set_height(layout, self->height * PANGO_SCALE); } else pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); } pango_layout_set_text(layout, text, -1); pango_layout_set_auto_dir(layout, TRUE); if (!text_width) text_width = &a_width; if (!text_height) text_height = &a_height; pango_layout_get_pixel_size(layout, text_width, text_height); if (wrap_width > 0) *text_width = wrap_width; gtk_cell_renderer_get_alignment(cell, &xalign, &yalign); if (!xpad) xpad = &a_xpad; if (!ypad) ypad = &a_ypad; gtk_cell_renderer_get_padding(cell, xpad, ypad); /* Calculate the real x and y offsets. */ if (x_offset) { *x_offset = ((gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL) ? (1.0 - xalign) : xalign) * (cell_area->width - *text_width - (2 * *xpad)); *x_offset = MAX(*x_offset, 0); } if (y_offset) { *y_offset = yalign * (cell_area->height - *text_height - (2 * *ypad)); *y_offset = MAX (*y_offset, 0); } /* FIXME: this hack is ugly, need to rewrite this later */ if (x_align_offset) *x_align_offset = (alignment == PANGO_ALIGN_CENTER) ? (wrap_width - *text_width) / 2 : 0; g_object_unref(layout); } #if GTK_CHECK_VERSION(3, 0, 0) static void fm_cell_renderer_text_render(GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) #else static void fm_cell_renderer_text_render(GtkCellRenderer *cell, GdkDrawable *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags) #endif { #if GTK_CHECK_VERSION(3, 0, 0) GtkStyleContext* style; GtkStateFlags state; #else GtkStyle* style; GtkStateType state; #endif gchar* text; gint text_width; gint text_height; gint x_offset; gint y_offset; gint x_align_offset; GdkRectangle rect; gint xpad, ypad; /* FIXME: this is time-consuming since it invokes pango_layout. * if we want to fix this, we must implement the whole cell * renderer ourselves instead of derived from GtkCellRendererText. */ PangoContext* context = gtk_widget_get_pango_context(widget); PangoLayout* layout = pango_layout_new(context); g_object_get(G_OBJECT(cell), "text", &text, NULL); _get_size(cell, widget, layout, text, cell_area, &text_width, &text_height, &xpad, &ypad, &x_offset, &y_offset, &x_align_offset); if(flags & (GTK_CELL_RENDERER_SELECTED|GTK_CELL_RENDERER_FOCUSED)) { rect.x = cell_area->x + x_offset; rect.y = cell_area->y + y_offset; rect.width = text_width + (2 * xpad); rect.height = text_height + (2 * ypad); } #if GTK_CHECK_VERSION(3, 0, 0) style = gtk_widget_get_style_context(widget); gtk_style_context_save(style); gtk_style_context_add_class(style, GTK_STYLE_CLASS_VIEW); #else style = gtk_widget_get_style(widget); #endif if(flags & GTK_CELL_RENDERER_SELECTED) /* item is selected */ { #if GTK_CHECK_VERSION(3, 0, 0) GdkRGBA clr; if(flags & GTK_CELL_RENDERER_INSENSITIVE) /* insensitive */ state = GTK_STATE_FLAG_INSENSITIVE; else state = GTK_STATE_FLAG_SELECTED; gtk_style_context_get_background_color(style, state, &clr); gdk_cairo_rectangle(cr, &rect); gdk_cairo_set_source_rgba(cr, &clr); #else cairo_t *cr = gdk_cairo_create (window); GdkColor clr; if(flags & GTK_CELL_RENDERER_INSENSITIVE) /* insensitive */ state = GTK_STATE_INSENSITIVE; else state = GTK_STATE_SELECTED; clr = style->bg[state]; /* paint the background */ if(expose_area) { gdk_cairo_rectangle(cr, expose_area); cairo_clip(cr); } gdk_cairo_rectangle(cr, &rect); cairo_set_source_rgb(cr, clr.red / 65535., clr.green / 65535., clr.blue / 65535.); #endif cairo_fill (cr); #if !GTK_CHECK_VERSION(3, 0, 0) cairo_destroy (cr); #endif } #if !GTK_CHECK_VERSION(3, 0, 0) else state = GTK_STATE_NORMAL; #endif #if GTK_CHECK_VERSION(3, 0, 0) gtk_render_layout(style, cr, cell_area->x + x_offset + xpad - x_align_offset, cell_area->y + y_offset + ypad, layout); #else gtk_paint_layout(style, window, state, TRUE, expose_area, widget, "cellrenderertext", cell_area->x + x_offset + xpad - x_align_offset, cell_area->y + y_offset + ypad, layout); #endif g_object_unref(layout); if(G_UNLIKELY( flags & GTK_CELL_RENDERER_FOCUSED) ) /* focused */ { #if GTK_CHECK_VERSION(3, 0, 0) gtk_render_focus(style, cr, rect.x, rect.y, rect.width, rect.height); #else gtk_paint_focus(style, window, state, background_area, widget, "cellrenderertext", rect.x, rect.y, rect.width, rect.height); #endif } if(flags & GTK_CELL_RENDERER_PRELIT) /* hovered */ g_object_set(G_OBJECT(widget), "tooltip-text", text, NULL); else g_object_set(G_OBJECT(widget), "tooltip-text", NULL, NULL); g_free(text); #if GTK_CHECK_VERSION(3, 0, 0) gtk_style_context_restore(style); #endif } static void fm_cell_renderer_text_get_size(GtkCellRenderer *cell, GtkWidget *widget, #if GTK_CHECK_VERSION(3, 0, 0) const #endif GdkRectangle *rectangle, gint *x_offset, gint *y_offset, gint *width, gint *height) { char *text; g_object_get(G_OBJECT(cell), "text", &text, NULL); _get_size(cell, widget, NULL, text, rectangle, width, height, NULL, NULL, x_offset, y_offset, NULL); g_free(text); } #if GTK_CHECK_VERSION(3, 0, 0) static void fm_cell_renderer_text_get_preferred_width(GtkCellRenderer *cell, GtkWidget *widget, gint *minimum_size, gint *natural_size) { gint wrap_width; g_object_get(G_OBJECT(cell), "wrap-width", &wrap_width, NULL); if(wrap_width > 0) { if(minimum_size) *minimum_size = wrap_width; if(natural_size) *natural_size = wrap_width; } else GTK_CELL_RENDERER_CLASS(fm_cell_renderer_text_parent_class)->get_preferred_width(cell, widget, minimum_size, natural_size); } static void fm_cell_renderer_text_get_preferred_height(GtkCellRenderer *cell, GtkWidget *widget, gint *minimum_size, gint *natural_size) { char *text; gint height; g_object_get(G_OBJECT(cell), "text", &text, NULL); _get_size(cell, widget, NULL, text, NULL, NULL, &height, NULL, NULL, NULL, NULL, NULL); g_free(text); if(natural_size) *natural_size = height; if(minimum_size) *minimum_size = height; } static void fm_cell_renderer_text_get_preferred_height_for_width(GtkCellRenderer *cell, GtkWidget *widget, gint width, gint *minimum_height, gint *natural_height) { fm_cell_renderer_text_get_preferred_height(cell, widget, minimum_height, natural_height); } #endif libfm-1.4.0/src/gtk/fm-cell-renderer-text.h000066400000000000000000000041701475513661000204510ustar00rootroot00000000000000/* * fm-cell-renderer-text.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_CELL_RENDERER_TEXT_H__ #define __FM_CELL_RENDERER_TEXT_H__ #include G_BEGIN_DECLS #define FM_CELL_RENDERER_TEXT_TYPE (fm_cell_renderer_text_get_type()) #define FM_CELL_RENDERER_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_CELL_RENDERER_TEXT_TYPE, FmCellRendererText)) #define FM_CELL_RENDERER_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_CELL_RENDERER_TEXT_TYPE, FmCellRendererTextClass)) #define FM_IS_CELL_RENDERER_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_CELL_RENDERER_TEXT_TYPE)) #define FM_IS_CELL_RENDERER_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_CELL_RENDERER_TEXT_TYPE)) typedef struct _FmCellRendererText FmCellRendererText; typedef struct _FmCellRendererTextClass FmCellRendererTextClass; struct _FmCellRendererText { GtkCellRendererText parent; /* add your public declarations here */ /*< private >*/ gpointer _reserved1; gint height; /* "max-height" - height in pixels */ }; struct _FmCellRendererTextClass { /*< private >*/ GtkCellRendererTextClass parent_class; gpointer _reserved1; }; GType fm_cell_renderer_text_get_type (void); GtkCellRenderer* fm_cell_renderer_text_new (void); G_END_DECLS #endif /* __FM_CELL_RENDERER_TEXT_H__ */ libfm-1.4.0/src/gtk/fm-clipboard.c000066400000000000000000000234211475513661000166760ustar00rootroot00000000000000/* * fm-clipboard.c * * Copyright 2009 PCMan * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-clipboard * @short_description: Clipboard operations handler for files. * @title: Clipboard operations * * @include: libfm/fm-gtk.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "gtk-compat.h" #include "fm-clipboard.h" #include "fm-gtk-utils.h" enum { URI_LIST = 1, GNOME_COPIED_FILES, KDE_CUT_SEL, UTF8_STRING, N_CLIPBOARD_TARGETS }; static GtkTargetEntry targets[]= { {"text/uri-list", 0, URI_LIST}, {"x-special/gnome-copied-files", 0, GNOME_COPIED_FILES}, {"application/x-kde-cutselection", 0, KDE_CUT_SEL}/*, { "UTF8_STRING", 0, UTF8_STRING }*/ }; static GdkAtom target_atom[N_CLIPBOARD_TARGETS]; static gboolean got_atoms = FALSE; static gboolean is_cut = FALSE; static inline void check_atoms(void) { if(!got_atoms) { guint i; for(i = 0; i < N_CLIPBOARD_TARGETS; i++) target_atom[i] = GDK_NONE; for(i = 0; i < G_N_ELEMENTS(targets); i++) target_atom[targets[i].info] = gdk_atom_intern_static_string(targets[i].target); got_atoms = TRUE; } } static void get_data(GtkClipboard *clip, GtkSelectionData *sel, guint info, gpointer user_data) { FmPathList* files = (FmPathList*)user_data; GString* uri_list; GList *l; GdkAtom target = gtk_selection_data_get_target(sel); if(info == KDE_CUT_SEL) { /* set application/kde-cutselection data */ if(is_cut) gtk_selection_data_set(sel, target, 8, (guchar*)"1", 2); return; } uri_list = g_string_sized_new(4096); if(info == GNOME_COPIED_FILES) { g_string_append(uri_list, is_cut ? "cut\n" : "copy\n"); fm_path_list_write_uri_list(files, uri_list); } /* FIXME: this is invalid, UTF8_STRING means this is plain text not file list */ else if(info == UTF8_STRING) { for (l = fm_path_list_peek_head_link(files); l; l = l->next) { FmPath* path = (FmPath*)l->data; char* str = fm_path_to_str(path); g_string_append(uri_list, str); g_string_append_c(uri_list, '\n'); g_free(str); } } else/* text/uri-list format */ { for (l = fm_path_list_peek_head_link(files); l; l = l->next) { FmPath *path = (FmPath*)l->data; char *str = fm_path_to_uri(path); g_string_append(uri_list, str); g_free(str); if (l->next) g_string_append(uri_list, "\r\n"); } } gtk_selection_data_set(sel, target, 8, (guchar*)uri_list->str, uri_list->len + 1); g_string_free(uri_list, TRUE); if(is_cut && info == GNOME_COPIED_FILES) { /* info about is_cut is already on clipboard so reset it */ gtk_clipboard_clear(clip); is_cut = FALSE; } } static void clear_data(GtkClipboard* clip, gpointer user_data) { FmPathList* files = (FmPathList*)user_data; fm_path_list_unref(files); is_cut = FALSE; } /** * fm_clipboard_cut_or_copy_files * @src_widget: widget where files were taken * @files: files to place on clipboard * @_is_cut: %TRUE if operation is 'Cut', %FALSE if 'Copy' * * Places files onto system clipboard. * * Returns: %TRUE if operation was successful. * * Since: 0.1.0 */ gboolean fm_clipboard_cut_or_copy_files(GtkWidget* src_widget, FmPathList* files, gboolean _is_cut) { GdkDisplay* dpy = src_widget ? gtk_widget_get_display(src_widget) : gdk_display_get_default(); GtkClipboard* clip = gtk_clipboard_get_for_display(dpy, GDK_SELECTION_CLIPBOARD); gboolean ret; ret = gtk_clipboard_set_with_data(clip, targets, G_N_ELEMENTS(targets), get_data, clear_data, fm_path_list_ref(files)); is_cut = _is_cut; return ret; } static gboolean check_kde_curselection(GtkClipboard* clip) { /* Check application/x-kde-cutselection: * If the content of this format is string "1", that means the * file is cut in KDE (Dolphin). */ gboolean ret = FALSE; GtkSelectionData* data; check_atoms(); data = gtk_clipboard_wait_for_contents(clip, target_atom[KDE_CUT_SEL]); if(data) { gint length, format; const gchar* pdata; pdata = (const gchar*)gtk_selection_data_get_data_with_length(data, &length); format = gtk_selection_data_get_format(data); if(length > 0 && format == 8 && pdata[0] == '1') ret = TRUE; gtk_selection_data_free(data); } return ret; } /** * fm_clipboard_paste_files * @dest_widget: widget where to paste files * @dest_dir: directory to place files * * Copies or moves files from system clipboard into @dest_dir. * * Returns: %TRUE if operation was successful. * * Since: 0.1.0 */ gboolean fm_clipboard_paste_files(GtkWidget* dest_widget, FmPath* dest_dir) { GdkDisplay* dpy; GtkClipboard* clip; FmPathList* files; char** uris; int type = 0; GdkAtom *avail_targets; int n, i; gboolean _is_cut; /* safeguard this API call */ if (dest_dir == NULL) { g_warning("fm_clipboard_paste_files() for NULL destination"); return FALSE; } /* get all available targets currently in the clipboard. */ dpy = dest_widget ? gtk_widget_get_display(dest_widget) : gdk_display_get_default(); clip = gtk_clipboard_get_for_display(dpy, GDK_SELECTION_CLIPBOARD); if( !gtk_clipboard_wait_for_targets(clip, &avail_targets, &n) ) return FALSE; /* check gnome and xfce compatible format first */ check_atoms(); for(i = 0; i < n; ++i) { if(avail_targets[i] == target_atom[GNOME_COPIED_FILES]) { type = GNOME_COPIED_FILES; break; } } if( 0 == type ) /* x-special/gnome-copied-files is not found. */ { /* check uri-list */ for(i = 0; i < n; ++i) { if(avail_targets[i] == target_atom[URI_LIST]) { type = URI_LIST; break; } } if( 0 == type ) /* text/uri-list is not found. */ { /* finally, fallback to UTF-8 string */ for(i = 0; i < n; ++i) { if(avail_targets[i] == target_atom[UTF8_STRING]) { type = UTF8_STRING; break; } } } } g_free(avail_targets); if( type ) { GtkSelectionData* data; const gchar* pdata; gint length; data = gtk_clipboard_wait_for_contents(clip, target_atom[type]); pdata = (const gchar*)gtk_selection_data_get_data_with_length(data, &length); _is_cut = FALSE; switch(type) { case GNOME_COPIED_FILES: _is_cut = g_str_has_prefix(pdata, "cut\n"); while(length) { register gchar ch = *pdata++; length--; if(ch == '\n') break; } uris = g_uri_list_extract_uris(pdata); break; case URI_LIST: uris = g_uri_list_extract_uris(pdata); _is_cut = check_kde_curselection(clip); break; case UTF8_STRING: default: /* FIXME: how should we treat UTF-8 strings? URIs or filenames? */ /* FIXME: this is invalid, UTF8_STRING means this is plain text not file list. We should save text into file instead. */ uris = g_uri_list_extract_uris(pdata); break; } gtk_selection_data_free(data); if(uris) { GtkWidget* parent; if(dest_widget) parent = gtk_widget_get_toplevel(dest_widget); else parent = NULL; files = fm_path_list_new_from_uris(uris); g_strfreev(uris); if(!fm_path_list_is_empty(files)) { if( _is_cut ) fm_move_files(GTK_WINDOW(parent), files, dest_dir); else fm_copy_files(GTK_WINDOW(parent), files, dest_dir); } fm_path_list_unref(files); return TRUE; } } return FALSE; } /** * fm_clipboard_have_files * @dest_widget: (allow-none): widget to paste files * * Checks if clipboard have data available for paste. * * Returns: %TRUE if the clipboard have data that can be handled. * * Since: 1.0.1 */ gboolean fm_clipboard_have_files(GtkWidget* dest_widget) { GdkDisplay* dpy = dest_widget ? gtk_widget_get_display(dest_widget) : gdk_display_get_default(); GtkClipboard* clipboard = gtk_clipboard_get_for_display(dpy, GDK_SELECTION_CLIPBOARD); guint i; check_atoms(); for(i = 1; i < N_CLIPBOARD_TARGETS; i++) if(target_atom[i] != GDK_NONE && gtk_clipboard_wait_is_target_available(clipboard, target_atom[i])) return TRUE; return FALSE; } libfm-1.4.0/src/gtk/fm-clipboard.h000066400000000000000000000027501475513661000167050ustar00rootroot00000000000000/* * fm-clipboard.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_CLIPBOARD_H__ #define __FM_CLIPBOARD_H__ #include #include "fm-path.h" G_BEGIN_DECLS #define fm_clipboard_cut_files(src_widget, files) \ fm_clipboard_cut_or_copy_files(src_widget, files, TRUE) #define fm_clipboard_copy_files(src_widget, files) \ fm_clipboard_cut_or_copy_files(src_widget, files, FALSE) gboolean fm_clipboard_cut_or_copy_files(GtkWidget* src_widget, FmPathList* files, gboolean _is_cut); gboolean fm_clipboard_paste_files(GtkWidget* dest_widget, FmPath* dest_dir); gboolean fm_clipboard_have_files(GtkWidget* dest_widget); G_END_DECLS #endif /* __FM_CLIPBOARD_H__ */ libfm-1.4.0/src/gtk/fm-dir-tree-model.c000066400000000000000000001267471475513661000175670ustar00rootroot00000000000000// fm-dir-tree-model.c // // Copyright 2010 Hong Jen Yee (PCMan) // Copyright 2012-2014 Andriy Grytsenko (LStranger) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. /** * SECTION:fm-dir-tree-model * @short_description: A model for directory tree view * @title: FmDirTreeModel * * @include: libfm/fm-gtk.h * * The #FmDirTreeModel represents tree of folders which can be used by * #FmDirTreeView to create tree-like expandable list of directories. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-dir-tree-model.h" #include "fm-folder.h" #include "fm-icon-pixbuf.h" #include "fm-config.h" #include #include typedef struct _FmDirTreeItem FmDirTreeItem; struct _FmDirTreeItem { FmDirTreeModel* model; /* FIXME: storing model pointer in every item is a waste */ FmFileInfo* fi; FmFolder* folder; GdkPixbuf* icon; gboolean expanded; gboolean loaded; GList* parent; /* parent node */ GList* children; /* child items */ GList* hidden_children; }; static GType column_types[N_FM_DIR_TREE_MODEL_COLS]; enum { ROW_LOADED, N_SIGNALS }; static guint signals[N_SIGNALS]; static void fm_dir_tree_model_dispose (GObject *object); static void fm_dir_tree_model_tree_model_init(GtkTreeModelIface *iface); static GtkTreePath *fm_dir_tree_model_get_path ( GtkTreeModel *tree_model, GtkTreeIter *iter ); static inline void item_to_tree_iter(FmDirTreeModel* model, GList* item_l, GtkTreeIter* it); static inline GtkTreePath* item_to_tree_path(FmDirTreeModel* model, GList* item_l); G_DEFINE_TYPE_WITH_CODE( FmDirTreeModel, fm_dir_tree_model, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, fm_dir_tree_model_tree_model_init) /* G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_DRAG_SOURCE, fm_dir_tree_model_drag_source_init) G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_DRAG_DEST, fm_dir_tree_model_drag_dest_init) */ ) /* a varient of g_list_foreach which does the same thing, but pass GList* element * itself as the first parameter to func(), not the element data. */ static inline void _g_list_foreach_l(GList* list, GFunc func, gpointer user_data) { while (list) { GList *next = list->next; (*func)(list, user_data); list = next; } } /* FIXME: this is convenience to have expanders actualized but it may be expensive static void item_queue_subdir_check(FmDirTreeModel* model, GList* item_l); */ static void item_reload_icon(FmDirTreeModel* model, GList* item_l, GtkTreePath* tp) { GtkTreeIter it; GList* l; FmDirTreeItem *item, *child; g_return_if_fail(item_l && tp); item = item_l->data; g_return_if_fail(item); if(item->icon) { g_object_unref(item->icon); item->icon = NULL; item_to_tree_iter(model, item_l, &it); gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &it); } if(item->children) { gtk_tree_path_append_index(tp, 0); for(l = item->children; l; l=l->next) { child = (FmDirTreeItem*)l->data; item_reload_icon(model, l, tp); gtk_tree_path_next(tp); } gtk_tree_path_up(tp); } for(l = item->hidden_children; l; l=l->next) { child = (FmDirTreeItem*)l->data; if(child->icon) { g_object_unref(child->icon); child->icon = NULL; } } } static void fm_dir_tree_model_class_init(FmDirTreeModelClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_dir_tree_model_dispose; /* use finalize from parent class */ /** * FmDirTreeModel::row-loaded: * @model: dir tree model instance that received the signal * @row: path to folder row that is ready * * The #FmDirTreeModel::row-loaded signal is emitted when content of * folder @row is completely retrieved. It may happen either * after call to fm_dir_tree_model_load_row() * or in time of that call (in case if the folder was already cached in * memory). * * See also: fm_dir_tree_model_unload_row(). * * Since: 1.0.0 */ signals[ROW_LOADED] = g_signal_new("row-loaded", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmDirTreeModelClass, row_loaded), NULL, NULL, g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GTK_TYPE_TREE_PATH); } static inline FmDirTreeItem* fm_dir_tree_item_new(FmDirTreeModel* model, GList* parent_l) { FmDirTreeItem* item = g_slice_new0(FmDirTreeItem); item->model = model; item->parent = parent_l; return item; } static inline void item_free_folder(FmFolder* item, gpointer item_l); static void fm_dir_tree_item_free_l(GList* item_l); /* Note: item_l below may be already freed so unusable as GList */ static inline void fm_dir_tree_item_free(FmDirTreeItem* item, gpointer item_l) { if(item->folder) item_free_folder(item->folder, item_l); if(item->fi) fm_file_info_unref(item->fi); if(item->icon) g_object_unref(item->icon); if(item->children) { _g_list_foreach_l(item->children, (GFunc)fm_dir_tree_item_free_l, NULL); g_list_free(item->children); } if(item->hidden_children) { _g_list_foreach_l(item->hidden_children, (GFunc)fm_dir_tree_item_free_l, NULL); g_list_free(item->hidden_children); } g_slice_free(FmDirTreeItem, item); } /* Free the GList* element along with its associated FmDirTreeItem */ static void fm_dir_tree_item_free_l(GList* item_l) { FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; if(!item) /* is it possible? */ return; fm_dir_tree_item_free(item, item_l); } static inline void item_to_tree_iter(FmDirTreeModel* model, GList* item_l, GtkTreeIter* it) { it->stamp = model->stamp; /* We simply store a GList pointer in the iter */ it->user_data = item_l; it->user_data2 = it->user_data3 = NULL; } static inline GtkTreePath* item_to_tree_path(FmDirTreeModel* model, GList* item_l) { GtkTreeIter it; item_to_tree_iter(model, item_l, &it); return fm_dir_tree_model_get_path((GtkTreeModel*)model, &it); } static void on_theme_changed(GtkIconTheme* theme, FmDirTreeModel* model) { GList* l; GtkTreePath* tp = gtk_tree_path_new_first(); for(l = model->roots; l; l=l->next) { item_reload_icon(model, l, tp); gtk_tree_path_next(tp); } gtk_tree_path_free(tp); } static void fm_dir_tree_model_dispose(GObject *object) { FmDirTreeModel *model; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DIR_TREE_MODEL(object)); model = (FmDirTreeModel*)object; g_signal_handlers_disconnect_by_func(gtk_icon_theme_get_default(), on_theme_changed, model); if(model->roots) { _g_list_foreach_l(model->roots, (GFunc)fm_dir_tree_item_free_l, NULL); g_list_free(model->roots); model->roots = NULL; } /* TODO: g_object_unref(model->subdir_cancellable); */ G_OBJECT_CLASS(fm_dir_tree_model_parent_class)->dispose(object); } static void fm_dir_tree_model_init(FmDirTreeModel *model) { g_signal_connect(gtk_icon_theme_get_default(), "changed", G_CALLBACK(on_theme_changed), model); model->icon_size = 16; model->stamp = g_random_int(); /* TODO: g_queue_init(&model->subdir_checks); model->subdir_checks_mutex = g_mutex_new(); model->subdir_cancellable = g_cancellable_new(); */ } static GtkTreeModelFlags fm_dir_tree_model_get_flags (GtkTreeModel *tree_model) { return GTK_TREE_MODEL_ITERS_PERSIST; } static gint fm_dir_tree_model_get_n_columns(GtkTreeModel *tree_model) { return N_FM_DIR_TREE_MODEL_COLS; } static GType fm_dir_tree_model_get_column_type(GtkTreeModel *tree_model, gint index) { g_return_val_if_fail( index >= 0 && (guint)index < G_N_ELEMENTS(column_types), G_TYPE_INVALID ); return column_types[index]; } static gboolean fm_dir_tree_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path ) { FmDirTreeModel *model; gint *indices, i, depth; GList *children, *child = NULL; g_assert(FM_IS_DIR_TREE_MODEL(tree_model)); g_assert(path!=NULL); model = (FmDirTreeModel*)tree_model; if( G_UNLIKELY(!model || !model->roots) ) return FALSE; indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); children = model->roots; for( i = 0; i < depth; ++i ) { FmDirTreeItem* item; child = g_list_nth(children, indices[i]); if( !child ) return FALSE; item = (FmDirTreeItem*)child->data; children = item->children; } item_to_tree_iter(model, child, iter); return TRUE; } static GtkTreePath *fm_dir_tree_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter ) { GList* item_l; GList* children; FmDirTreeItem* item; GtkTreePath* path; int i; FmDirTreeModel* model; g_return_val_if_fail (FM_IS_DIR_TREE_MODEL(tree_model), NULL); model = (FmDirTreeModel*)tree_model; g_return_val_if_fail (iter->stamp == model->stamp, NULL); g_return_val_if_fail (iter != NULL, NULL); g_return_val_if_fail (iter->user_data != NULL, NULL); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; if(item->parent == NULL) /* root item */ { i = g_list_position(model->roots, item_l); path = gtk_tree_path_new_first(); gtk_tree_path_get_indices(path)[0] = i; } else { path = gtk_tree_path_new(); do { FmDirTreeItem* parent_item = (FmDirTreeItem*)item->parent->data; children = parent_item->children; i = g_list_position(children, item_l); if(G_UNLIKELY(i == -1)) /* bug? the item is not a child of its parent? */ { gtk_tree_path_free(path); return NULL; } /* FIXME: gtk_tree_path_prepend_index() is inefficient */ gtk_tree_path_prepend_index(path, i); item_l = item->parent; /* go up a level */ item = (FmDirTreeItem*)item_l->data; }while(G_UNLIKELY(item->parent)); /* we're not at toplevel yet */ /* we have reached toplevel */ children = model->roots; i = g_list_position(children, item_l); gtk_tree_path_prepend_index(path, i); } return path; } static void fm_dir_tree_model_get_value ( GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value ) { FmDirTreeModel* model; GList* item_l; FmDirTreeItem* item; FmIcon* icon; g_return_if_fail (FM_IS_DIR_TREE_MODEL(tree_model)); model = (FmDirTreeModel*)tree_model; g_return_if_fail (iter->stamp == model->stamp); g_value_init (value, column_types[column] ); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; switch((FmDirTreeModelCol)column) { case FM_DIR_TREE_MODEL_COL_ICON: if(item->fi && (icon = fm_file_info_get_icon(item->fi))) { if(!item->icon) /* FIXME: use "emblem-symbolic-link" if file is some kind of link */ item->icon = fm_pixbuf_from_icon(icon, model->icon_size); g_value_set_object(value, item->icon); } else g_value_set_object(value, NULL); break; case FM_DIR_TREE_MODEL_COL_DISP_NAME: if(item->fi) g_value_set_string( value, fm_file_info_get_disp_name(item->fi)); else /* this is a place holder item */ { /* parent is always non NULL. otherwise it's a bug. */ FmDirTreeItem* parent = (FmDirTreeItem*)item->parent->data; if(parent->folder && fm_folder_is_loaded(parent->folder)) g_value_set_string( value, _("")); else g_value_set_string( value, _("Loading...")); } break; case FM_DIR_TREE_MODEL_COL_INFO: g_value_set_pointer(value, item->fi); break; case FM_DIR_TREE_MODEL_COL_PATH: g_value_set_pointer(value, item->fi ? fm_file_info_get_path(item->fi) : NULL); break; case FM_DIR_TREE_MODEL_COL_FOLDER: g_value_set_pointer(value, item->folder); break; case N_FM_DIR_TREE_MODEL_COLS: ; /* not a column */ } } static gboolean fm_dir_tree_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter) { FmDirTreeModel* model; GList* item_l; g_return_val_if_fail (FM_IS_DIR_TREE_MODEL (tree_model), FALSE); if (iter == NULL || iter->user_data == NULL) return FALSE; item_l = (GList*)iter->user_data; /* Is this the last child in the parent node? */ item_l = item_l->next; if(!item_l) return FALSE; model = (FmDirTreeModel*)tree_model; item_to_tree_iter(model, item_l, iter); return TRUE; } static gboolean fm_dir_tree_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { FmDirTreeModel* model; GList *first_child; g_return_val_if_fail(parent == NULL || parent->user_data != NULL, FALSE); g_return_val_if_fail(FM_IS_DIR_TREE_MODEL(tree_model), FALSE); model = (FmDirTreeModel*)tree_model; if(parent) { GList* parent_l = (GList*)parent->user_data; FmDirTreeItem *parent_item = (FmDirTreeItem*)parent_l->data; first_child = parent_item->children; } else /* toplevel item */ { /* parent == NULL is a special case; we need to return the first top-level row */ first_child = model->roots; } if(!first_child) return FALSE; /* Set iter to first item in model */ item_to_tree_iter(model, first_child, iter); return TRUE; } static gboolean fm_dir_tree_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter) { GList* item_l; FmDirTreeItem* item; g_return_val_if_fail( iter != NULL, FALSE ); g_return_val_if_fail( iter->stamp == FM_DIR_TREE_MODEL(tree_model)->stamp, FALSE ); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; return (item->children != NULL); } static gint fm_dir_tree_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter) { FmDirTreeModel* model; GList* children; g_return_val_if_fail(FM_IS_DIR_TREE_MODEL(tree_model), -1); model = (FmDirTreeModel*)tree_model; /* special case: if iter == NULL, return number of top-level rows */ if(!iter) children = model->roots; else { GList* item_l = (GList*)iter->user_data; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; children = item->children; } return g_list_length(children); } static gboolean fm_dir_tree_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n) { FmDirTreeModel *model; GList* children; GList *child_l; g_return_val_if_fail (FM_IS_DIR_TREE_MODEL (tree_model), FALSE); model = (FmDirTreeModel*)tree_model; if(G_LIKELY(parent)) { GList* parent_l = (GList*)parent->user_data; FmDirTreeItem* item = (FmDirTreeItem*)parent_l->data; children = item->children; } else /* special case: if parent == NULL, set iter to n-th top-level row */ children = model->roots; child_l = g_list_nth(children, n); if(!child_l) return FALSE; item_to_tree_iter(model, child_l, iter); return TRUE; } static gboolean fm_dir_tree_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) { GList* child_l; FmDirTreeItem* child_item; FmDirTreeModel* model; g_return_val_if_fail( iter != NULL && child != NULL, FALSE ); model = FM_DIR_TREE_MODEL( tree_model ); child_l = (GList*)child->user_data; child_item = (FmDirTreeItem*)child_l->data; if(G_LIKELY(child_item->parent)) { item_to_tree_iter(model, child_item->parent, iter); return TRUE; } return FALSE; } static void fm_dir_tree_model_tree_model_init(GtkTreeModelIface *iface) { iface->get_flags = fm_dir_tree_model_get_flags; iface->get_n_columns = fm_dir_tree_model_get_n_columns; iface->get_column_type = fm_dir_tree_model_get_column_type; iface->get_iter = fm_dir_tree_model_get_iter; iface->get_path = fm_dir_tree_model_get_path; iface->get_value = fm_dir_tree_model_get_value; iface->iter_next = fm_dir_tree_model_iter_next; iface->iter_children = fm_dir_tree_model_iter_children; iface->iter_has_child = fm_dir_tree_model_iter_has_child; iface->iter_n_children = fm_dir_tree_model_iter_n_children; iface->iter_nth_child = fm_dir_tree_model_iter_nth_child; iface->iter_parent = fm_dir_tree_model_iter_parent; column_types[FM_DIR_TREE_MODEL_COL_ICON] = GDK_TYPE_PIXBUF; column_types[FM_DIR_TREE_MODEL_COL_DISP_NAME] = G_TYPE_STRING; column_types[FM_DIR_TREE_MODEL_COL_INFO] = G_TYPE_POINTER; column_types[FM_DIR_TREE_MODEL_COL_PATH] = G_TYPE_POINTER; column_types[FM_DIR_TREE_MODEL_COL_FOLDER] = G_TYPE_POINTER; } /** * fm_dir_tree_model_new * * Creates new #FmDirTreeModel instance. * * Returns: a new #FmDirTreeModel object. * * Since: 0.1.16 */ FmDirTreeModel *fm_dir_tree_model_new(void) { return (FmDirTreeModel*)g_object_new(FM_TYPE_DIR_TREE_MODEL, NULL); } static void add_place_holder_child_item(FmDirTreeModel* model, GList* parent_l, GtkTreePath* parent_tp, gboolean emit_signal) { FmDirTreeItem* parent_item = (FmDirTreeItem*)parent_l->data; FmDirTreeItem* item = fm_dir_tree_item_new(model, parent_l); parent_item->children = g_list_prepend(parent_item->children, item); if(emit_signal) { GtkTreeIter it; GtkTreePath* ph_tp; item_to_tree_iter(model, parent_item->children, &it); ph_tp = gtk_tree_path_copy(parent_tp); gtk_tree_path_append_index(ph_tp, 0); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), ph_tp, &it); gtk_tree_path_free(ph_tp); } } /* Add a new node to parent node to proper position. * GtkTreePath tp is the tree path of parent node. * Returns GList item where new_item is incapsulated */ static GList* insert_item(FmDirTreeModel* model, GList* parent_l, GtkTreePath* tp, FmDirTreeItem* new_item) { GList* new_item_l; FmDirTreeItem* parent_item = (FmDirTreeItem*)parent_l->data; const char* new_key = fm_file_info_get_collate_key(new_item->fi); GList* item_l, *last_l = NULL; GtkTreePath* new_tp; GtkTreeIter it; int n = 0; for(item_l = parent_item->children; item_l; item_l=item_l->next, ++n) { FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; const char* key; last_l = item_l; if( G_UNLIKELY(!item->fi) ) continue; key = fm_file_info_get_collate_key(item->fi); if(strcmp(new_key, key) <= 0) break; } parent_item->children = g_list_insert_before(parent_item->children, item_l, new_item); /* get the GList* of the newly inserted item */ if(!item_l) /* the new item becomes the last item of the list */ new_item_l = last_l ? last_l->next : parent_item->children; else /* the new item is just previous item of its sibling. */ new_item_l = item_l->prev; g_assert( new_item->fi != NULL ); g_assert( new_item == new_item_l->data ); g_assert( ((FmDirTreeItem*)new_item_l->data)->fi != NULL ); /* emit row-inserted signal for the new item */ item_to_tree_iter(model, new_item_l, &it); new_tp = gtk_tree_path_copy(tp); gtk_tree_path_append_index(new_tp, n); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), new_tp, &it); /* add a placeholder child item to make the node expandable */ if(!fm_config->no_child_non_expandable || fm_file_info_is_accessible(new_item->fi)) add_place_holder_child_item(model, new_item_l, new_tp, TRUE); gtk_tree_path_free(new_tp); /* TODO: check if the dir has subdirs and make it expandable if needed. */ /* item_queue_subdir_check(model, new_item_l); */ return new_item_l; } /* Add file info to parent node to proper position. * GtkTreePath tp is the tree path of parent node. */ static GList* insert_file_info(FmDirTreeModel* model, GList* parent_l, GtkTreePath* tp, FmFileInfo* fi) { GList* item_l; FmDirTreeItem* parent_item = (FmDirTreeItem*)parent_l->data; FmDirTreeItem* item = fm_dir_tree_item_new(model, parent_l); item->fi = fm_file_info_ref(fi); if(!model->show_hidden && fm_file_info_is_hidden(fi)) /* hidden folder */ { parent_item->hidden_children = g_list_prepend(parent_item->hidden_children, item); item_l = parent_item->hidden_children; } else item_l = insert_item(model, parent_l, tp, item); return item_l; } /* deletes item from lists but not frees data */ static void remove_item_l(FmDirTreeModel* model, GList* item_l) { GtkTreePath* tp; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; g_return_if_fail(item != NULL); tp = item_to_tree_path(model, item_l); if(item->parent) { FmDirTreeItem* parent_item = item->parent->data; parent_item->children = g_list_delete_link(parent_item->children, item_l); /* signal the view that we removed the item. */ gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), tp); /* If the item being removed is the last child item of parent_item, * we need to insert a place holder item to keep it expandable. */ if(parent_item->children == NULL) { GList* parent_l = item->parent; gtk_tree_path_up(tp); if(fm_config->no_child_non_expandable) { GtkTreeIter it; item_to_tree_iter(model, parent_l, &it); /* signal the view to redraw row removing expander */ gtk_tree_model_row_has_child_toggled(GTK_TREE_MODEL(model), tp, &it); } else add_place_holder_child_item(model, parent_l, tp, TRUE); } } else /* root item */ { /* FIXME: this needs more testing. */ model->roots = g_list_delete_link(model->roots, item_l); /* signal the view that we removed the item. */ gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), tp); } gtk_tree_path_free(tp); } /* deletes and frees item with data */ static void remove_item(FmDirTreeModel* model, GList* item_l) { FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; remove_item_l(model, item_l); fm_dir_tree_item_free(item, item_l); /* item_l is freed already */ } /* find child item by filename, and retrive its index if idx is not NULL. */ static GList* children_by_name(FmDirTreeModel* model, GList* children, const char* name, int* idx) { GList* l; int i = 0; for(l = children; l; l=l->next, ++i) { FmDirTreeItem* item = (FmDirTreeItem*)l->data; FmPath* path; if(G_LIKELY(item->fi) && G_LIKELY((path = fm_file_info_get_path(item->fi))) && G_UNLIKELY(strcmp(fm_path_get_basename(path), name) == 0)) { if(idx) *idx = i; return l; } } return NULL; } static void remove_all_children(FmDirTreeModel* model, GList* item_l, GtkTreePath* tp) { FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; if(G_UNLIKELY(!item->children)) return; gtk_tree_path_append_index(tp, 0); /* FIXME: How to improve performance? * TODO: study the horrible source code of GtkTreeView */ while(item->children) { fm_dir_tree_item_free_l(item->children); item->children = g_list_delete_link(item->children, item->children); /* signal the view that we removed the placeholder item. */ gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), tp); /* everytime we remove the first item, its next item became the * first item, so there is no need to update tp. */ } if(item->hidden_children) { _g_list_foreach_l(item->hidden_children, (GFunc)fm_dir_tree_item_free_l, NULL); g_list_free(item->hidden_children); item->hidden_children = NULL; } gtk_tree_path_up(tp); } /** * fm_dir_tree_model_add_root * @model: the model instance * @root: a root path to add * @iter: (allow-none): pointer to iterator to set * * Adds a root node for file @root into @model. If @iter is not %NULL * then on return it will be set to new row data. * * Since: 0.1.16 */ void fm_dir_tree_model_add_root(FmDirTreeModel* model, FmFileInfo* root, GtkTreeIter* iter) { GtkTreeIter it; GtkTreePath* tp; GList* item_l; FmDirTreeItem* item = fm_dir_tree_item_new(model, NULL); item->fi = fm_file_info_ref(root); model->roots = g_list_append(model->roots, item); item_l = g_list_last(model->roots); /* FIXME: this is inefficient */ add_place_holder_child_item(model, item_l, NULL, FALSE); /* emit row-inserted signal for the new root item */ item_to_tree_iter(model, item_l, &it); tp = item_to_tree_path(model, item_l); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), tp, &it); if(iter) *iter = it; gtk_tree_path_free(tp); } static void on_folder_finish_loading(FmFolder* folder, GList* item_l) { FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; FmDirTreeModel* model = item->model; GList* place_holder_l; GtkTreePath* tp = item_to_tree_path(model, item_l); /* set 'loaded' flag beforehand as callback may check it */ item->loaded = TRUE; place_holder_l = item->children; /* don't leave expanders if not stated in config */ /* if we have loaded sub dirs, remove the place holder */ if(fm_config->no_child_non_expandable || !place_holder_l || place_holder_l->next) { /* remove the fake placeholder item showing "Loading..." */ /* #3614965: crash after removing only child from existing directory: after reload first item may be absent or may be not a placeholder, if no_child_non_expandable is unset, place_holder_l cannot be NULL */ if (place_holder_l && ((FmDirTreeItem*)place_holder_l->data)->fi == NULL) remove_item(model, place_holder_l); /* in case if no_child_non_expandable was unset while reloading, it may be still place_holder_l is NULL but let leave empty folder still */ } else /* if we have no sub dirs, leave the place holder and let it show "Empty" */ { GtkTreeIter it; item_to_tree_iter(model, place_holder_l, &it); /* if the folder is empty, the place holder item * shows "" instead of "Loading..." */ gtk_tree_path_append_index(tp, 0); gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &it); gtk_tree_path_up(tp); } g_signal_emit(model, signals[ROW_LOADED], 0, tp); gtk_tree_path_free(tp); /* FIXME: should we really cease monitoring non-expandable folder? */ // if(!item->children) // { // item_free_folder(item->folder, item_l); // item->folder = NULL; // item->expanded = FALSE; // item->loaded = FALSE; // } } static void on_folder_files_added(FmFolder* folder, GSList* files, GList* item_l) { GSList* l; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; FmDirTreeModel* model = item->model; GtkTreePath* tp = item_to_tree_path(model, item_l); for(l = files; l; l = l->next) { FmFileInfo* fi = FM_FILE_INFO(l->data); if(fm_file_info_is_dir(fi)) /* FIXME: maybe adding files can be allowed later */ { /* Ideally FmFolder should not emit files-added signals for files that * already exists. So there is no need to check for duplication here. */ insert_file_info(model, item_l, tp, fi); } } gtk_tree_path_free(tp); } static void on_folder_files_removed(FmFolder* folder, GSList* files, GList* item_l) { GSList* l; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; FmDirTreeModel* model = item->model; for(l = files; l; l = l->next) { FmFileInfo* fi = FM_FILE_INFO(l->data); FmPath* path = fm_file_info_get_path(fi); GList* rm_item_l = children_by_name(model, item->children, fm_path_get_basename(path), NULL); if(rm_item_l) remove_item(model, rm_item_l); } } static void on_folder_files_changed(FmFolder* folder, GSList* files, GList* item_l) { GSList* l; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; FmDirTreeModel* model = item->model; GtkTreePath* tp = item_to_tree_path(model, item_l); /* g_debug("files changed!!"); */ for(l = files; l; l = l->next) { FmFileInfo* fi = FM_FILE_INFO(l->data); int idx; FmPath* path = fm_file_info_get_path(fi); GList* changed_item_l = children_by_name(model, item->children, fm_path_get_basename(path), &idx); /* g_debug("changed file: %s", fi->path->name); */ if(changed_item_l) { FmDirTreeItem* changed_item = (FmDirTreeItem*)changed_item_l->data; GtkTreeIter it; if(changed_item->fi) fm_file_info_unref(changed_item->fi); changed_item->fi = fm_file_info_ref(fi); /* inform gtk tree view about the change */ item_to_tree_iter(model, changed_item_l, &it); gtk_tree_path_append_index(tp, idx); gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &it); gtk_tree_path_up(tp); /* FIXME and TODO: check if we have sub folder */ /* item_queue_subdir_check(model, changed_item_l); */ } } gtk_tree_path_free(tp); } static inline void item_free_folder(FmFolder* folder, gpointer item_l) { g_signal_handlers_disconnect_by_func(folder, on_folder_finish_loading, item_l); g_signal_handlers_disconnect_by_func(folder, on_folder_files_added, item_l); g_signal_handlers_disconnect_by_func(folder, on_folder_files_removed, item_l); g_signal_handlers_disconnect_by_func(folder, on_folder_files_changed, item_l); g_object_unref(folder); } /** * fm_dir_tree_model_load_row * @model: the model instance * @it: iterator of row to load * @tp: path of row to load * * If row with iterator @it has its children already retrieved then * does nothing. Else starts retrieving of list of children for row * with iterator @it and path @tp. When children are loaded then a * #FmDirTreeModel::row-loaded signal will be emitted. The folder * associated with the row will be monitored for changes in children * after that. * This API is used when the row is expanded in the view. * * Before 1.0.0 this API had name fm_dir_tree_model_expand_row. * * See also: fm_dir_tree_row_is_loaded(), fm_dir_tree_model_unload_row(). * * Since: 0.1.16 */ void fm_dir_tree_model_load_row(FmDirTreeModel* model, GtkTreeIter* it, GtkTreePath* tp) { GList* item_l = (GList*)it->user_data; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; g_return_if_fail(item != NULL); if(!item->expanded) { /* dynamically load content of the folder. */ FmFolder* folder = fm_folder_from_path(fm_file_info_get_path(item->fi)); item->folder = folder; /* g_debug("fm_dir_tree_model_load_row()"); */ /* associate the data with loaded handler */ g_signal_connect(folder, "finish-loading", G_CALLBACK(on_folder_finish_loading), item_l); g_signal_connect(folder, "files-added", G_CALLBACK(on_folder_files_added), item_l); g_signal_connect(folder, "files-removed", G_CALLBACK(on_folder_files_removed), item_l); g_signal_connect(folder, "files-changed", G_CALLBACK(on_folder_files_changed), item_l); if(!item->children) add_place_holder_child_item(model, item_l, tp, TRUE); /* set 'expanded' flag beforehand as callback may check it */ item->expanded = TRUE; /* if the folder is already loaded, call "loaded" handler ourselves */ if(fm_folder_is_loaded(folder)) /* already loaded */ { FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; FmDirTreeModel* model = item->model; GList* file_l; FmFileInfoList* files = fm_folder_get_files(folder); for(file_l = fm_file_info_list_peek_head_link(files); file_l; file_l = file_l->next) { FmFileInfo* fi = file_l->data; if(fm_file_info_is_dir(fi)) { /* FIXME: later we can try to support adding * files to the tree, too so this model * can be even more useful. */ insert_file_info(model, item_l, tp, fi); /* g_debug("insert: %s", fi->path->name); */ } } on_folder_finish_loading(folder, item_l); } } } /** * fm_dir_tree_model_unload_row * @model: the model instance * @it: iterator of row to unload * @tp: path of row to unload * * If children of row with iterator @it are retrieved or monitored * then stops monitoring the folder and forgets children of the row. * This API is used when the row is collapsed in the view. * * Before 1.0.0 this API had name fm_dir_tree_model_collapse_row. * * Since: 0.1.16 */ void fm_dir_tree_model_unload_row(FmDirTreeModel* model, GtkTreeIter* it, GtkTreePath* tp) { GList* item_l = (GList*)it->user_data; FmDirTreeItem* item = (FmDirTreeItem*)item_l->data; g_return_if_fail(item != NULL); if(item->expanded) /* do some cleanup */ { GList* had_children = item->children; /* remove all children, and replace them with a dummy child * item to keep expander in the tree view around. */ remove_all_children(model, item_l, tp); /* now, GtkTreeView think that we have no child since all * child items are removed. So we add a place holder child * item to keep the expander around. */ /* don't leave expanders if not stated in config */ if(had_children) add_place_holder_child_item(model, item_l, tp, TRUE); /* deactivate folder since it will be reactivated on expand */ item_free_folder(item->folder, item_l); item->folder = NULL; item->expanded = FALSE; item->loaded = FALSE; /* g_debug("fm_dir_tree_model_unload_row()"); */ } } /** * fm_dir_tree_model_set_icon_size * @model: the model instance * @icon_size: new preferrable icon size * * Sets size of icons which are associated with rows. * * Since: 0.1.16 */ void fm_dir_tree_model_set_icon_size(FmDirTreeModel* model, guint icon_size) { if(model->icon_size != icon_size) { /* reload existing icons */ GtkTreePath* tp = gtk_tree_path_new_first(); GList* l; for(l = model->roots; l; l=l->next) { item_reload_icon(model, l, tp); gtk_tree_path_next(tp); } gtk_tree_path_free(tp); } } /** * fm_dir_tree_model_get_icon_size * @model: the model instance * * Retrieves size of icons which are associated with rows. * * Before 1.0.0 this API had name fm_dir_tree_get_icon_size. * * Returns: preferrable icom size for the @model. * * Since: 0.1.16 */ guint fm_dir_tree_model_get_icon_size(FmDirTreeModel* model) { return model->icon_size; } /** * fm_dir_tree_row_get_icon * @model: the model instance * @iter: the iterator of row to retrieve data * * Retrieves an icon associated with row of @iter in @model. Returned * data are owned by @model and should be not freed by caller. * * Returns: (transfer none): the icon for the row. * * Since: 1.0.0 */ GdkPixbuf* fm_dir_tree_row_get_icon(FmDirTreeModel* model, GtkTreeIter* iter) { GList* item_l; FmDirTreeItem *item; FmIcon* icon; g_return_val_if_fail (iter->stamp == model->stamp, NULL); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; if(item->icon) return item->icon; if(item->fi && (icon = fm_file_info_get_icon(item->fi))) /* FIXME: use "emblem-symbolic-link" if file is some kind of link */ item->icon = fm_pixbuf_from_icon(icon, model->icon_size); return item->icon; } /** * fm_dir_tree_row_get_file_info * @model: the model instance * @iter: the iterator of row to retrieve data * * Retrieves info for file associated with row of @iter in @model. * Returned data are owned by @model and should be not freed by caller. * * Returns: (transfer none): the file info for the row. * * Since: 1.0.0 */ FmFileInfo* fm_dir_tree_row_get_file_info(FmDirTreeModel* model, GtkTreeIter* iter) { GList* item_l; FmDirTreeItem *item; g_return_val_if_fail (iter->stamp == model->stamp, NULL); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; return item->fi; } /** * fm_dir_tree_row_get_file_path * @model: the model instance * @iter: the iterator of row to retrieve data * * Retrieves #FmPath for file associated with row of @iter in @model. * Returned data are owned by @model and should be not freed by caller. * * Returns: (transfer none): the file path for the row. * * Since: 1.0.0 */ FmPath* fm_dir_tree_row_get_file_path(FmDirTreeModel* model, GtkTreeIter* iter) { GList* item_l; FmDirTreeItem *item; g_return_val_if_fail (iter->stamp == model->stamp, NULL); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; return item->fi ? fm_file_info_get_path(item->fi) : NULL; } /** * fm_dir_tree_row_get_disp_name * @model: the model instance * @iter: the iterator of row to retrieve data * * Retrieves display name of file associated with row of @iter in @model. * Returned data are owned by @model and should be not freed by caller. * * Returns: (transfer none): the file display name for the row. * * Since: 1.0.0 */ const char* fm_dir_tree_row_get_disp_name(FmDirTreeModel* model, GtkTreeIter* iter) { GList* item_l; FmDirTreeItem *item, *parent; g_return_val_if_fail (iter->stamp == model->stamp, NULL); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; if(item->fi) return fm_file_info_get_disp_name(item->fi); /* else this is a place holder item */ /* parent is always non NULL. otherwise it's a bug. */ parent = (FmDirTreeItem*)item->parent->data; if(parent->folder && fm_folder_is_loaded(parent->folder)) return _(""); return _("Loading..."); } /** * fm_dir_tree_row_is_loaded * @model: the model instance * @iter: the iterator of row to inspect * * Checks if the row has its children already retrieved. This check may * need be done since any duplicate calls to fm_dir_tree_model_load_row() * will not emit any duplicate #FmDirTreeModel::row-loaded signal. * * Returns: %TRUE if the row has children already loaded. * * Since: 1.0.0 */ gboolean fm_dir_tree_row_is_loaded(FmDirTreeModel* model, GtkTreeIter* iter) { GList* item_l; FmDirTreeItem *item; g_return_val_if_fail (iter->stamp == model->stamp, FALSE); item_l = (GList*)iter->user_data; item = (FmDirTreeItem*)item_l->data; return item->loaded; } static void item_hide_hidden_children(FmDirTreeModel *model, GList *item_l) { FmDirTreeItem *item = (FmDirTreeItem*)item_l->data; FmDirTreeItem *child; GList *child_l, *next; if (item) for (child_l = item->children; child_l; child_l = next) { next = child_l->next; child = child_l->data; if (G_UNLIKELY(child->fi == NULL)) /* placeholder */ continue; if (fm_file_info_is_hidden(child->fi)) { /* remove from visibility in model */ remove_item_l(model, child_l); /* do cleanup on item data */ if (child->folder) item_free_folder(child->folder, child_l); child->folder = NULL; child->expanded = FALSE; child->loaded = FALSE; if(child->children) { _g_list_foreach_l(child->children, (GFunc)fm_dir_tree_item_free_l, NULL); g_list_free(child->children); child->children = NULL; } if(child->hidden_children) { _g_list_foreach_l(child->hidden_children, (GFunc)fm_dir_tree_item_free_l, NULL); g_list_free(child->hidden_children); child->hidden_children = NULL; } /* item is clean so can be added to hidden children */ item->hidden_children = g_list_prepend(item->hidden_children, child); } else item_hide_hidden_children(model, child_l); /* do recursion */ } } static void item_show_hidden_children(FmDirTreeModel *model, GList *item_l) { FmDirTreeItem *item = (FmDirTreeItem*)item_l->data; FmDirTreeItem *child; GtkTreePath *tp; GList *child_l; tp = item_to_tree_path(model, item_l); for (child_l = item->children; child_l; child_l = child_l->next) item_show_hidden_children(model, child_l); /* do recursion */ while (item->hidden_children) { /* isolate child */ child = item->hidden_children->data; item->hidden_children = g_list_delete_link(item->hidden_children, item->hidden_children); /* insert it into visible list */ insert_item(model, item_l, tp, child); } gtk_tree_path_free(tp); } void fm_dir_tree_model_set_show_hidden(FmDirTreeModel* model, gboolean show_hidden) { GList *l; if(show_hidden != model->show_hidden) { /* filter the model to hide hidden folders */ if(model->show_hidden) for (l = model->roots; l; l = l->next) item_hide_hidden_children(model, l); /* filter the model to show hidden folders */ else for (l = model->roots; l; l = l->next) item_show_hidden_children(model, l); model->show_hidden = show_hidden; } } gboolean fm_dir_tree_model_get_show_hidden(FmDirTreeModel* model) { return model->show_hidden; } #if 0 /* TODO: */ void fm_dir_tree_model_reload(FmDirTreeModel* model) { } #endif libfm-1.4.0/src/gtk/fm-dir-tree-model.h000066400000000000000000000103241475513661000175530ustar00rootroot00000000000000// fm-dir-tree-model.h // // Copyright 2010 Hong Jen Yee (PCMan) // Copyright 2012 Andriy Grytsenko (LStranger) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __FM_DIR_TREE_MODEL_H__ #define __FM_DIR_TREE_MODEL_H__ #include #include #include "fm-file-info.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_DIR_TREE_MODEL (fm_dir_tree_model_get_type()) #define FM_DIR_TREE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_DIR_TREE_MODEL, FmDirTreeModel)) #define FM_DIR_TREE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_DIR_TREE_MODEL, FmDirTreeModelClass)) #define FM_IS_DIR_TREE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_DIR_TREE_MODEL)) #define FM_IS_DIR_TREE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_DIR_TREE_MODEL)) #define FM_DIR_TREE_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ FM_TYPE_DIR_TREE_MODEL, FmDirTreeModelClass)) /** * FmDirTreeModelCol: * @FM_DIR_TREE_MODEL_COL_ICON: (#GdkPixbuf *) icon * @FM_DIR_TREE_MODEL_COL_DISP_NAME: (#char *) displayed name * @FM_DIR_TREE_MODEL_COL_INFO: (#FmFileInfo *) file info * @FM_DIR_TREE_MODEL_COL_PATH: (#FmPath *) file path * @FM_DIR_TREE_MODEL_COL_FOLDER: (#FmFolder *) folder object * * Columns of dir tree model */ typedef enum { FM_DIR_TREE_MODEL_COL_ICON, FM_DIR_TREE_MODEL_COL_DISP_NAME, FM_DIR_TREE_MODEL_COL_INFO, FM_DIR_TREE_MODEL_COL_PATH, FM_DIR_TREE_MODEL_COL_FOLDER, /**/ N_FM_DIR_TREE_MODEL_COLS } FmDirTreeModelCol; typedef struct _FmDirTreeModel FmDirTreeModel; typedef struct _FmDirTreeModelClass FmDirTreeModelClass; struct _FmDirTreeModel { GObject parent; /**/ GList* FM_SEAL(roots); gint FM_SEAL(stamp); guint FM_SEAL(icon_size); gboolean FM_SEAL(show_hidden); gpointer _reserved1; gpointer _reserved2; }; /** * FmDirTreeModelClass: * @parent_class: the parent class * @row_loaded: the class closure for the #FmDirTreeModel::row-loaded signal */ struct _FmDirTreeModelClass { GObjectClass parent_class; void (*row_loaded)(FmDirTreeModel* model, GtkTreePath* row); /**/ gpointer _reserved1; }; GType fm_dir_tree_model_get_type(void); FmDirTreeModel* fm_dir_tree_model_new(void); void fm_dir_tree_model_add_root(FmDirTreeModel* model, FmFileInfo* root, GtkTreeIter* iter); void fm_dir_tree_model_load_row(FmDirTreeModel* model, GtkTreeIter* it, GtkTreePath* tp); void fm_dir_tree_model_unload_row(FmDirTreeModel* model, GtkTreeIter* it, GtkTreePath* tp); void fm_dir_tree_model_set_icon_size(FmDirTreeModel* model, guint icon_size); guint fm_dir_tree_model_get_icon_size(FmDirTreeModel* model); gboolean fm_dir_tree_row_is_loaded(FmDirTreeModel* model, GtkTreeIter* iter); GdkPixbuf* fm_dir_tree_row_get_icon(FmDirTreeModel* model, GtkTreeIter* iter); FmFileInfo* fm_dir_tree_row_get_file_info(FmDirTreeModel* model, GtkTreeIter* iter); FmPath* fm_dir_tree_row_get_file_path(FmDirTreeModel* model, GtkTreeIter* iter); const char* fm_dir_tree_row_get_disp_name(FmDirTreeModel* model, GtkTreeIter* iter); void fm_dir_tree_model_set_show_hidden(FmDirTreeModel* model, gboolean show_hidden); gboolean fm_dir_tree_model_get_show_hidden(FmDirTreeModel* model); /* void fm_dir_tree_model_reload(FmDirTreeModel* model); */ G_END_DECLS #endif /* __FM_DIR_TREE_MODEL_H__ */ libfm-1.4.0/src/gtk/fm-dir-tree-view.c000066400000000000000000000577411475513661000174360ustar00rootroot00000000000000// fm-dir-tree-view.c // // Copyright 2011 Hong Jen Yee (PCMan) // Copyright 2012-2014 Andriy Grytsenko (LStranger) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. /** * SECTION:fm-dir-tree-view * @short_description: A directory tree view widget. * @title: FmDirTreeView * * @include: libfm/fm-gtk.h * * The #FmDirTreeView represents view of filesystem as ierarchical tree * of folders where each node can be expanded or collapsed when required. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include #include "fm-dir-tree-view.h" #include "fm-dir-tree-model.h" #include "fm-cell-renderer-pixbuf.h" #include "fm-file-menu.h" #include "fm-gtk-marshal.h" #include "../gtk-compat.h" #include #include enum { PROP_0, PROP_SHOW_HIDDEN }; enum { CHDIR, ITEM_POPUP, N_SIGNALS }; static guint signals[N_SIGNALS]; static void fm_dir_tree_view_dispose (GObject *object); static void on_row_loaded(FmDirTreeModel*, GtkTreePath*, FmDirTreeView*); G_DEFINE_TYPE(FmDirTreeView, fm_dir_tree_view, GTK_TYPE_TREE_VIEW) static void fm_dir_tree_view_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GtkTreeView *tree_view; FmDirTreeModel *model; gboolean show_hidden; switch( prop_id ) { case PROP_SHOW_HIDDEN: tree_view = GTK_TREE_VIEW(object); model = FM_DIR_TREE_MODEL(gtk_tree_view_get_model(tree_view)); show_hidden = g_value_get_boolean(value); if (show_hidden != fm_dir_tree_model_get_show_hidden(model)) fm_dir_tree_model_set_show_hidden(model, show_hidden); /* FIXME: queue scroll to selection after the change */ break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void fm_dir_tree_view_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GtkTreeView *tree_view; FmDirTreeModel *model; switch( prop_id ) { case PROP_SHOW_HIDDEN: tree_view = GTK_TREE_VIEW(object); model = FM_DIR_TREE_MODEL(gtk_tree_view_get_model(tree_view)); g_value_set_boolean(value, fm_dir_tree_model_get_show_hidden(model)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void cancel_pending_chdir(GtkTreeModel* model, FmDirTreeView *view) { if(view->paths_to_expand) { GtkTreePath *tp; GtkTreeIter it; g_slist_foreach(view->paths_to_expand, (GFunc)fm_path_unref, NULL); g_slist_free(view->paths_to_expand); view->paths_to_expand = NULL; if (view->current_row == NULL) return; /* it can be NULL if we got into hidden row */ g_signal_handlers_disconnect_by_func(model, on_row_loaded, view); /* unload current row if it's not expanded, so cancel its loading */ tp = gtk_tree_row_reference_get_path(view->current_row); if(tp != NULL && !gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), tp) && gtk_tree_model_get_iter(model, &it, tp)) fm_dir_tree_model_unload_row(FM_DIR_TREE_MODEL(model), &it, tp); if(tp != NULL) gtk_tree_path_free(tp); gtk_tree_row_reference_free(view->current_row); view->current_row = NULL; } } static gboolean on_test_expand_row(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path) { FmDirTreeModel* model = FM_DIR_TREE_MODEL(gtk_tree_view_get_model(tree_view)); fm_dir_tree_model_load_row(model, iter, path); return FALSE; } static gboolean find_iter_by_path(GtkTreeModel* model, GtkTreeIter* it, GtkTreePath* tp, FmPath* path) { GtkTreeIter parent; /* tp NULL means we need to find some root path */ if(tp) gtk_tree_model_get_iter(model, &parent, tp); if(gtk_tree_model_iter_children(model, it, tp ? &parent : NULL)) { do{ FmPath* path2; path2 = fm_dir_tree_row_get_file_path(FM_DIR_TREE_MODEL(model), it); if(path2 && fm_path_equal(path, path2)) return TRUE; }while(gtk_tree_model_iter_next(model, it)); } return FALSE; } /* static void on_row_expanded(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path) { FmDirTreeView* view = FM_DIR_TREE_VIEW(tree_view); } */ static void on_row_collapsed(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path) { FmDirTreeModel* model = FM_DIR_TREE_MODEL(gtk_tree_view_get_model(tree_view)); fm_dir_tree_model_unload_row(model, iter, path); } static void on_row_activated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *col) { if(gtk_tree_view_row_expanded(tree_view, path)) gtk_tree_view_collapse_row(tree_view, path); else gtk_tree_view_expand_row(tree_view, path, FALSE); } static void fm_dir_tree_view_item_popup(GtkWidget *widget, GtkTreeModel *model, GtkTreeIter *it, guint32 time) { FmFileInfo *file; FmFileInfoList *file_list; FmFileMenu *menu; GtkUIManager *ui; GtkAction *act; GtkWidget *win = gtk_widget_get_toplevel(widget); if (!gtk_widget_is_toplevel(win)) /* no parent window! is it possible? */ return; file = fm_dir_tree_row_get_file_info(FM_DIR_TREE_MODEL(model), it); file_list = fm_file_info_list_new(); fm_file_info_list_push_tail(file_list, file); /* use FmFileMenu here, just without extensions and disable all Open/Cut/Copy/Del stuff */ menu = fm_file_menu_new_for_files(GTK_WINDOW(win), file_list, NULL, TRUE); fm_file_info_list_unref(file_list); ui = fm_file_menu_get_ui(menu); act = gtk_ui_manager_get_action(ui, "/popup/Open"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Cut"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Copy"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Del"); gtk_action_set_visible(act, FALSE); /* send the signal so popup can be altered by application */ g_signal_emit(widget, signals[ITEM_POPUP], 0, ui, fm_file_menu_get_action_group(menu), file); gtk_ui_manager_ensure_update(ui); gtk_menu_popup(fm_file_menu_get_menu(menu), NULL, NULL, NULL, NULL, 3, time); } static gboolean on_key_press_event(GtkWidget* widget, GdkEventKey* evt) { GtkTreeView* tree_view = GTK_TREE_VIEW(widget); GtkTreeSelection* tree_sel; GtkTreeModel* model; GtkTreeIter it; GtkTreePath* tp; // int modifier = (evt->state & gtk_accelerator_get_default_mod_mask()); switch(evt->keyval) { case GDK_KEY_Left: tree_sel = gtk_tree_view_get_selection(tree_view); if(gtk_tree_selection_get_selected(tree_sel, &model, &it)) { tp = gtk_tree_model_get_path(model, &it); if(gtk_tree_view_row_expanded(tree_view, tp)) gtk_tree_view_collapse_row(tree_view, tp); else { gtk_tree_path_up(tp); gtk_tree_view_set_cursor(tree_view, tp, NULL, FALSE); gtk_tree_selection_select_path(tree_sel, tp); } gtk_tree_path_free(tp); } break; case GDK_KEY_Right: tree_sel = gtk_tree_view_get_selection(tree_view); if(gtk_tree_selection_get_selected(tree_sel, &model, &it)) { tp = gtk_tree_model_get_path(model, &it); gtk_tree_view_expand_row(tree_view, tp, FALSE); gtk_tree_path_free(tp); } break; #if 0 /* if we support Menu key then we should also position the menu right at item */ case GDK_KEY_Menu: if (modifier) break; tree_sel = gtk_tree_view_get_selection(tree_view); if(gtk_tree_selection_get_selected(tree_sel, &model, &it)) fm_dir_tree_view_item_popup(widget, model, &it, evt->time); break; case GDK_KEY_F10: if (modifier != GDK_SHIFT_MASK) break; tree_sel = gtk_tree_view_get_selection(tree_view); if(gtk_tree_selection_get_selected(tree_sel, &model, &it)) fm_dir_tree_view_item_popup(widget, model, &it, evt->time); break; #endif } return GTK_WIDGET_CLASS(fm_dir_tree_view_parent_class)->key_press_event(widget, evt); } static gboolean on_button_press_event(GtkWidget* widget, GdkEventButton* evt) { GtkTreeView *tree_view = GTK_TREE_VIEW(widget); GtkTreeModel *model; GtkTreePath *path; GtkTreeIter it; if (evt->button == 3) /* we handle only right-click here */ { /* Get tree path for row that was clicked */ if (gtk_tree_view_get_path_at_pos(tree_view, (gint)evt->x, (gint)evt->y, &path, NULL, NULL, NULL)) { model = gtk_tree_view_get_model(tree_view); if (model && gtk_tree_model_get_iter(model, &it, path)) { /* FIXME: may it be not a directory item? */ fm_dir_tree_view_item_popup(widget, model, &it, evt->time); } gtk_tree_path_free(path); return TRUE; } } return GTK_WIDGET_CLASS(fm_dir_tree_view_parent_class)->button_press_event(widget, evt); } static gboolean on_drag_motion(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time) { GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreeModel *model = gtk_tree_view_get_model(view); FmDndDest *dd; FmFileInfo *file_info = NULL; GtkTreePath *tp; GtkTreeViewDropPosition pos; GtkTreeIter it; GdkAtom target; GdkDragAction action = 0; g_return_val_if_fail(FM_IS_DIR_TREE_VIEW(view), FALSE); g_return_val_if_fail(FM_IS_DIR_TREE_MODEL(model), FALSE); gtk_tree_view_get_dest_row_at_pos(view, x, y, &tp, &pos); if(tp && (pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE || pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER) && gtk_tree_model_get_iter(model, &it, tp)) /* dragged into item */ gtk_tree_model_get(model, &it, FM_DIR_TREE_MODEL_COL_INFO, &file_info, -1); dd = ((FmDirTreeView*)widget)->dd; fm_dnd_dest_set_dest_file(dd, file_info); if(file_info != NULL) /* in drop zone */ { target = fm_dnd_dest_find_target(dd, drag_context); if(target != GDK_NONE && fm_dnd_dest_is_target_supported(dd, target)) action = fm_dnd_dest_get_default_action(dd, drag_context, target); } gdk_drag_status(drag_context, action, time); if(action != 0) gtk_tree_view_set_drag_dest_row(view, tp, pos); else gtk_tree_view_set_drag_dest_row(view, NULL, 0); if(tp) gtk_tree_path_free(tp); return (action != 0); } static void on_drag_data_received(GtkWidget *dest_widget, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *sel_data, guint info, guint time) { /* nothing to do but we have to override GtkTreeView default handler */ } static void fm_dir_tree_view_class_init(FmDirTreeViewClass *klass) { GObjectClass *g_object_class = G_OBJECT_CLASS(klass); GtkTreeViewClass* tree_view_class = GTK_TREE_VIEW_CLASS(klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); g_object_class->dispose = fm_dir_tree_view_dispose; /* use finalize from parent class */ g_object_class->get_property = fm_dir_tree_view_get_property; g_object_class->set_property = fm_dir_tree_view_set_property; widget_class->key_press_event = on_key_press_event; widget_class->button_press_event = on_button_press_event; widget_class->drag_motion = on_drag_motion; widget_class->drag_data_received = on_drag_data_received; tree_view_class->test_expand_row = on_test_expand_row; tree_view_class->row_collapsed = on_row_collapsed; /* tree_view_class->row_expanded = on_row_expanded; */ tree_view_class->row_activated = on_row_activated; /** * FmDirTreeView:show-hidden: * * The #FmDirTreeView:show-hidden property defines whether any hidden * files be shown in the tree or not * * Since: 1.2.0 */ g_object_class_install_property(g_object_class, PROP_SHOW_HIDDEN, g_param_spec_boolean("show-hidden", "Show hidden", "Should hidden files be shown or not", FALSE, G_PARAM_READWRITE)); /** * FmDirTreeView::chdir: * @view: a view instance that emitted the signal * @button: always is 1 * @path: (#FmPath *) new directory path * * The #FmDirTreeView::chdir signal is emitted when current selected * directory in view is changed. * * Since: 0.1.0 */ signals[CHDIR] = g_signal_new("chdir", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmDirTreeViewClass, chdir), NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER); /** * FmDirTreeView::item-popup: * @view: a view instance that emitted the signal * @ui: the #GtkUIManager using to create the menu * @act_grp: (#GtkActionGroup *) the menu actions group * @fi: (#FmFileInfo *) the item where menu popup is activated * * The #FmDirTreeView::item-popup signal is emitted when context menu * is created for any directory in the view. Handler can modify the * menu by adding or removing elements. * * Since: 1.2.0 */ signals[ITEM_POPUP] = g_signal_new("item-popup", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmDirTreeViewClass, item_popup), NULL, NULL, fm_marshal_VOID__OBJECT_OBJECT_POINTER, G_TYPE_NONE, 3, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_POINTER); } /* note: cancel_pending_chdir() should be called before this! */ static void emit_chdir_if_needed(FmDirTreeView* view, GtkTreeSelection* tree_sel, guint button) { GtkTreeIter it; GtkTreeModel* model; if(gtk_tree_selection_get_selected(tree_sel, &model, &it)) { FmFileInfo *fi = fm_dir_tree_row_get_file_info(FM_DIR_TREE_MODEL(model), &it); FmPath *path; GtkTreePath *tp; if(fi == NULL) return; path = fm_file_info_get_path(fi); if(path && view->cwd && fm_path_equal(path, view->cwd)) return; if(!fm_file_info_is_accessible(fi)) return; if(view->cwd) fm_path_unref(view->cwd); view->cwd = G_LIKELY(path) ? fm_path_ref(path) : NULL; g_signal_emit(view, signals[CHDIR], 0, button, view->cwd); /* preload row if it is not expanded, it will actualize expander too */ tp = gtk_tree_model_get_path(model, &it); fm_dir_tree_model_load_row(FM_DIR_TREE_MODEL(model), &it, tp); view->current_row = gtk_tree_row_reference_new(model, tp); gtk_tree_path_free(tp); } } static void on_sel_changed(GtkTreeSelection* tree_sel, FmDirTreeView* view) { GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); /* if a pending selection via previous call to chdir is in progress, cancel it. */ cancel_pending_chdir(model, view); emit_chdir_if_needed(view, tree_sel, 1); } static void fm_dir_tree_view_dispose(GObject *object) { FmDirTreeView *view; GtkTreeModel *model; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DIR_TREE_VIEW(object)); view = (FmDirTreeView*)object; /* free view->paths_to_expand and view->current_row */ model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); if (model != NULL) cancel_pending_chdir(model, view); if(view->cwd) { fm_path_unref(view->cwd); view->cwd = NULL; } if(view->dd) { g_object_unref(view->dd); view->dd = NULL; } G_OBJECT_CLASS(fm_dir_tree_view_parent_class)->dispose(object); } static gboolean _fm_dir_tree_view_select_function(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data) { GtkTreeIter it; if(!gtk_tree_model_get_iter(model, &it, path)) return FALSE; return (fm_dir_tree_row_get_file_info(FM_DIR_TREE_MODEL(model), &it) != NULL); } static void fm_dir_tree_view_init(FmDirTreeView *view) { GtkTreeSelection* tree_sel; GtkTreeViewColumn* col; GtkCellRenderer* render; AtkObject *obj; gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); /* gtk_tree_view_set_enable_tree_lines(view, TRUE); */ col = gtk_tree_view_column_new(); render = (GtkCellRenderer*)fm_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(col, render, FALSE); gtk_tree_view_column_set_attributes(col, render, "pixbuf", FM_DIR_TREE_MODEL_COL_ICON, "info", FM_DIR_TREE_MODEL_COL_INFO, NULL); render = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col, render, TRUE); gtk_tree_view_column_set_attributes(col, render, "text", FM_DIR_TREE_MODEL_COL_DISP_NAME, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_set_mode(tree_sel, GTK_SELECTION_BROWSE); gtk_tree_selection_set_select_function(tree_sel, _fm_dir_tree_view_select_function, view, NULL); g_signal_connect(tree_sel, "changed", G_CALLBACK(on_sel_changed), view); view->dd = fm_dnd_dest_new_with_handlers(GTK_WIDGET(view)); obj = gtk_widget_get_accessible(GTK_WIDGET(view)); atk_object_set_description(obj, _("Shows tree of directories in sidebar")); } /** * fm_dir_tree_view_new * * Creates new #FmDirTreeView widget. * * Returns: a new #FmDirTreeView object. * * Since: 0.1.0 */ FmDirTreeView *fm_dir_tree_view_new(void) { return g_object_new(FM_TYPE_DIR_TREE_VIEW, NULL); } /** * fm_dir_tree_view_get_cwd * @view: the widget to retrieve info * * Retrieves current selected directory. Returned data are owned by @view * and should not be freed by caller. * * Returns: (transfer none): current directory path. * * Since: 0.1.0 */ FmPath* fm_dir_tree_view_get_cwd(FmDirTreeView* view) { return view->cwd; } static void expand_pending_path(FmDirTreeView* view, GtkTreeModel* model, GtkTreePath* tp) { FmPath* path; GtkTreeIter it; g_return_if_fail(view->paths_to_expand); path = FM_PATH(view->paths_to_expand->data); gtk_tree_row_reference_free(view->current_row); if(find_iter_by_path(model, &it, tp, path)) { /* after being expanded, the row now owns a FmFolder object. */ g_signal_connect(model, "row-loaded", G_CALLBACK(on_row_loaded), view); tp = gtk_tree_model_get_path(model, &it); /* it now points to the item */ view->current_row = gtk_tree_row_reference_new(model, tp); /* the path may be already expanded so "row-loaded" may never happen */ if(!fm_dir_tree_row_is_loaded(FM_DIR_TREE_MODEL(model), &it)) fm_dir_tree_model_load_row(FM_DIR_TREE_MODEL(model), &it, tp); else on_row_loaded(FM_DIR_TREE_MODEL(model), tp, view); /* recursion! */ gtk_tree_path_free(tp); } else { GtkTreeSelection* ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); view->current_row = NULL; gtk_tree_selection_unselect_all(ts); /* since we never get it loaded we need to update cwd here */ if(view->cwd) fm_path_unref(view->cwd); view->cwd = fm_path_ref(path); } } static void on_row_loaded(FmDirTreeModel* fm_model, GtkTreePath* tp, FmDirTreeView* view) { GtkTreeModel* model = GTK_TREE_MODEL(fm_model); GtkTreePath* ctp; g_return_if_fail(view->current_row); ctp = gtk_tree_row_reference_get_path(view->current_row); if(gtk_tree_path_compare(tp, ctp) != 0) { /* is it delayed previous expand? */ gtk_tree_path_free(ctp); return; } gtk_tree_path_free(ctp); /* disconnect the handler since we only need it once */ g_signal_handlers_disconnect_by_func(model, on_row_loaded, view); /* after the folder is loaded, the files should have been added to * the tree model */ gtk_tree_view_expand_row(GTK_TREE_VIEW(view), tp, FALSE); /* remove the expanded path from pending list */ fm_path_unref(FM_PATH(view->paths_to_expand->data)); view->paths_to_expand = g_slist_delete_link(view->paths_to_expand, view->paths_to_expand); if(view->paths_to_expand) { /* continue expanding next pending path */ expand_pending_path(view, model, tp); } else /* this is the last one and we're done, select the item */ { GtkTreeSelection* ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_select_path(ts, tp); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(view), tp, NULL, TRUE, 0.5, 0.5); gtk_tree_view_set_cursor(GTK_TREE_VIEW(view), tp, NULL, FALSE); } } /** * fm_dir_tree_view_chdir * @view: the widget to change * @path: new directory * * Queries change selected directory in the @view to new @path. The * widget will expand nodes in the tree if that will be needed to * reach requested path. * * Since: 0.1.0 */ void fm_dir_tree_view_chdir(FmDirTreeView* view, FmPath* path) { GtkTreeIter it; GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); FmPath* root; /* bug SF#847: if we go to some dir then back while dir isn't loaded we leave that dir still pending and therefore false chdir later, so we have to check view->paths_to_expand here too */ if(!model || (fm_path_equal(view->cwd, path) && view->paths_to_expand == NULL)) return; if(!gtk_tree_model_get_iter_first(model, &it)) return; /* find a root item containing this path */ do{ root = fm_dir_tree_row_get_file_path(FM_DIR_TREE_MODEL(model), &it); if(fm_path_has_prefix(path, root)) break; root = NULL; }while(gtk_tree_model_iter_next(model, &it)); /* root item is found */ /* cancel previous pending tree expansion */ cancel_pending_chdir(model, view); do { /* add path elements one by one to a list */ view->paths_to_expand = g_slist_prepend(view->paths_to_expand, fm_path_ref(path)); if(fm_path_equal(path, root)) break; path = fm_path_get_parent(path); }while(path); expand_pending_path(view, model, NULL); } libfm-1.4.0/src/gtk/fm-dir-tree-view.h000066400000000000000000000056641475513661000174400ustar00rootroot00000000000000// fm-dir-tree-view.h // // Copyright 2011 Hong Jen Yee (PCMan) // Copyright 2012-2013 Andriy Grytsenko (LStranger) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __FM_DIR_TREE_VIEW_H__ #define __FM_DIR_TREE_VIEW_H__ #include #include "fm-path.h" #include "fm-dnd-dest.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_DIR_TREE_VIEW (fm_dir_tree_view_get_type()) #define FM_DIR_TREE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_DIR_TREE_VIEW, FmDirTreeView)) #define FM_DIR_TREE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_DIR_TREE_VIEW, FmDirTreeViewClass)) #define FM_IS_DIR_TREE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_DIR_TREE_VIEW)) #define FM_IS_DIR_TREE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_DIR_TREE_VIEW)) #define FM_DIR_TREE_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ FM_TYPE_DIR_TREE_VIEW, FmDirTreeViewClass)) typedef struct _FmDirTreeView FmDirTreeView; typedef struct _FmDirTreeViewClass FmDirTreeViewClass; struct _FmDirTreeView { GtkTreeView parent; FmPath* FM_SEAL(cwd); /* */ FmDndDest* FM_SEAL(dd); gpointer _reserved1; /* used for chdir */ GSList* FM_SEAL(paths_to_expand); GtkTreeRowReference* FM_SEAL(current_row); }; /** * FmDirTreeViewClass: * @parent_class: the parent class * @chdir: the class closure for the #FmDirTreeView::chdir signal. * @item_popup: the class closure for the #FmDirTreeView::item-popup signal. */ struct _FmDirTreeViewClass { GtkTreeViewClass parent_class; void (*chdir)(FmDirTreeView* view, guint button, FmPath* path); void (*item_popup)(FmDirTreeView* view, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfo* file); /*< private >*/ gpointer _reserved1; }; GType fm_dir_tree_view_get_type (void); FmDirTreeView* fm_dir_tree_view_new (void); FmPath* fm_dir_tree_view_get_cwd(FmDirTreeView* view); void fm_dir_tree_view_chdir(FmDirTreeView* view, FmPath* path); G_END_DECLS #endif /* __FM_DIR_TREE_VIEW_H__ */ libfm-1.4.0/src/gtk/fm-dnd-auto-scroll.c000066400000000000000000000172611475513661000177530ustar00rootroot00000000000000/* * fm-dnd-auto-scroll.c * * Copyright 2010 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-dnd-auto-scroll * @short_description: Autoscroll when dragged out of widget. * @title: Drag and drop autoscrolling * * @include: libfm/fm-gtk.h * */ #include "fm-dnd-auto-scroll.h" #include "gtk-compat.h" #define SCROLL_EDGE_SIZE 15 typedef struct _FmDndAutoScroll FmDndAutoScroll; struct _FmDndAutoScroll { GtkWidget* widget; guint timeout; GtkAdjustment* hadj; GtkAdjustment* vadj; }; static GQuark data_id = 0; static gboolean on_auto_scroll(gpointer user_data) { FmDndAutoScroll* as = (FmDndAutoScroll*)user_data; int x, y; GtkAdjustment* va = as->vadj; GtkAdjustment* ha = as->hadj; GtkWidget* widget = as->widget; GtkAllocation allocation; if(g_source_is_destroyed(g_main_current_source())) return FALSE; gdk_window_get_device_position (gtk_widget_get_window(widget), gdk_device_manager_get_client_pointer( gdk_display_get_device_manager( gdk_window_get_display( gtk_widget_get_window(widget)))), &x, &y, NULL); gtk_widget_get_allocation(widget, &allocation); /* HACK. Sometimes we do not get drag-leave signal. (Why?) This check prevents infinite scrolling. */ if (y < 0 || y > allocation.height || x < 0 || x > allocation.width) { as->timeout = 0; return FALSE; } if(va) { if(y < SCROLL_EDGE_SIZE) /* scroll up */ { gdouble value = gtk_adjustment_get_value(va); gdouble lower = gtk_adjustment_get_lower(va); if(value > lower) { value -= gtk_adjustment_get_step_increment(va); if(value < lower) value = lower; gtk_adjustment_set_value(va, value); } } else if(y > (allocation.height - SCROLL_EDGE_SIZE)) { gdouble value = gtk_adjustment_get_value(va); gdouble upper = gtk_adjustment_get_upper(va) - gtk_adjustment_get_page_size(va); /* scroll down */ if(value < upper) { value += gtk_adjustment_get_step_increment(va); if(value > upper) value = upper; gtk_adjustment_set_value(va, value); } } gtk_adjustment_value_changed(va); } if(ha) { if(x < SCROLL_EDGE_SIZE) /* scroll to left */ { gdouble value = gtk_adjustment_get_value(ha); gdouble lower = gtk_adjustment_get_lower(ha); if(value > lower) { value -= gtk_adjustment_get_step_increment(ha); if(value < lower) value = lower; gtk_adjustment_set_value(ha, value); } } else if(x > (allocation.width - SCROLL_EDGE_SIZE)) { gdouble value = gtk_adjustment_get_value(ha); gdouble upper = gtk_adjustment_get_upper(ha) - gtk_adjustment_get_page_size(ha); /* scroll to right */ if(value < upper) { value += gtk_adjustment_get_step_increment(ha); if(value > upper) value = upper; gtk_adjustment_set_value(ha, value); } } gtk_adjustment_value_changed(ha); } return TRUE; } static gboolean on_drag_motion(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, gpointer user_data) { FmDndAutoScroll* as = (FmDndAutoScroll*)user_data; /* FIXME: this is a dirty hack for GTK_TREE_MODEL_ROW. When dragging GTK_TREE_MODEL_ROW * we cannot receive "drag-leave" message. So weied! Is it a gtk+ bug? */ GdkAtom target = gtk_drag_dest_find_target(widget, drag_context, NULL); if(target == GDK_NONE) return FALSE; if(0 == as->timeout) /* install a scroll timeout if needed */ { as->timeout = gdk_threads_add_timeout(150, on_auto_scroll, as); } return FALSE; } static void on_drag_leave(GtkWidget *widget, GdkDragContext *drag_context, guint time, gpointer user_data) { FmDndAutoScroll* as = (FmDndAutoScroll*)user_data; if(as->timeout) { g_source_remove(as->timeout); as->timeout = 0; } } static void fm_dnd_auto_scroll_free(gpointer user_data) { FmDndAutoScroll* as = (FmDndAutoScroll*)user_data; if(as->timeout) g_source_remove(as->timeout); if(as->hadj) g_object_unref(as->hadj); if(as->vadj) g_object_unref(as->vadj); g_signal_handlers_disconnect_by_func(as->widget, on_drag_motion, as); g_signal_handlers_disconnect_by_func(as->widget, on_drag_leave, as); g_slice_free(FmDndAutoScroll, as); } /** * fm_dnd_set_dest_auto_scroll * @drag_dest_widget: a drag destination widget * @hadj: horizontal GtkAdjustment * @vadj: vertical GtkAdjustment * * This function installs a "drag-motion" handler to the dest widget * to support auto-scroll when the dragged item is near the margin * of the destination widget. For example, when a user drags an item * over the bottom of a GtkTreeView, the desired behavior should be * to scroll up the content of the tree view and to expose the items * below currently visible region. So the user can drop on them. */ void fm_dnd_set_dest_auto_scroll(GtkWidget* drag_dest_widget, GtkAdjustment* hadj, GtkAdjustment* vadj) { FmDndAutoScroll* as; if(G_UNLIKELY(data_id == 0)) data_id = g_quark_from_static_string("FmDndAutoScroll"); if(G_UNLIKELY(!hadj && !vadj)) { g_object_set_qdata_full(G_OBJECT(drag_dest_widget), data_id, NULL, NULL); return; } as = g_slice_new(FmDndAutoScroll); as->widget = drag_dest_widget; /* no g_object_ref is needed here */ as->timeout = 0; as->hadj = hadj ? GTK_ADJUSTMENT(g_object_ref(hadj)) : NULL; as->vadj = vadj ? GTK_ADJUSTMENT(g_object_ref(vadj)) : NULL; g_object_set_qdata_full(G_OBJECT(drag_dest_widget), data_id, as, fm_dnd_auto_scroll_free); g_signal_connect(drag_dest_widget, "drag-motion", G_CALLBACK(on_drag_motion), as); g_signal_connect(drag_dest_widget, "drag-leave", G_CALLBACK(on_drag_leave), as); } /** * fm_dnd_unset_dest_auto_scroll * @drag_dest_widget: drag destination widget. * * Unsets what has been done by fm_dnd_set_dest_auto_scroll() */ void fm_dnd_unset_dest_auto_scroll(GtkWidget* drag_dest_widget) { if(G_UNLIKELY(data_id == 0)) data_id = g_quark_from_static_string("FmDndAutoScroll"); g_object_set_qdata_full(G_OBJECT(drag_dest_widget), data_id, NULL, NULL); } libfm-1.4.0/src/gtk/fm-dnd-auto-scroll.h000066400000000000000000000023421475513661000177520ustar00rootroot00000000000000/* * fm-dnd-auto-scroll.h * * Copyright 2010 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_DND_AUTO_SCROLL_H__ #define __FM_DND_AUTO_SCROLL_H__ #include G_BEGIN_DECLS void fm_dnd_set_dest_auto_scroll(GtkWidget* drag_dest_widget, GtkAdjustment* hadj, GtkAdjustment* vadj); void fm_dnd_unset_dest_auto_scroll(GtkWidget* drag_dest_widget); G_END_DECLS #endif /* __FM_DND_AUTO_SCROLL_H__ */ libfm-1.4.0/src/gtk/fm-dnd-dest.c000066400000000000000000001126611475513661000164460ustar00rootroot00000000000000/* * fm-dnd-dest.c * * Copyright 2009 PCMan * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2024-2025 Ingo Brückl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-dnd-dest * @short_description: Libfm support for drag&drop destination. * @title: FmDndDest * * @include: libfm/fm-gtk.h * * The #FmDndDest can be used by some widget to provide support for Drop * operations onto that widget. * * To use #FmDndDest the widget should create it - the simplest API for * this is fm_dnd_dest_new_with_handlers(). When #FmDndDest is created * some drop data types ("targets") are set for the widget. The widget * can extend the list by adding own targets to the list and connecting * own handlers to the #GtkWidget::drag-leave, #GtkWidget::drag-drop, * and #GtkWidget::drag-data-received signals. * * The #GtkWidget::drag-motion signal should be always handled by the * widget. The handler should check if drop can be performed. And if * #FmDndDest can accept the drop then widget should inform #FmDndDest * object about #FmFileInfo object the mouse pointer targets at that * moment by calling fm_dnd_dest_set_dest_file(). The #FmDndDest uses a * little different sequence for collecting dragged data - it queries * data in time of drag motion and uses when data are dropped therefore * widget should always call API fm_dnd_dest_get_default_action() from * handler of the #GtkWidget::drag-motion signal for any target which * #FmDndDest supports. * * Sample Usage * * { * widget->dd = fm_dnd_dest_new_with_handlers(widget); * g_signal_connect(widget, "drag-motion", G_CALLBACK(on_drag_motion), dd); * * ... * } * * static void on_object_finalize(MyWidget *widget) * { * ... * * g_object_unref(G_OBJECT(widget->dd)); * } * * static gboolean on_drag_motion(MyWidget *widget, GdkDragContext *drag_context, * gint x, gint y, guint time, FmDndDest *dd) * { * GdkAtom target; * GdkDragAction action = 0; * FmFileInfo *file_info; * * file_info = my_widget_find_file_at_coords(widget, x, y); * fm_dnd_dest_set_dest_file(widget->dd, file_info); * if (file_info == NULL) * return FALSE; /* not in drop zone */ * target = fm_dnd_dest_find_target(widget->dd, drag_context); * if (target != GDK_NONE && fm_dnd_dest_is_target_supported(widget->dd, target)) * action = fm_dnd_dest_get_default_action(widget->dd, drag_context, target); * if (action == 0) * return FALSE; /* cannot drop on that destination */ * gdk_drag_status(drag_context, action, time); * return TRUE; * } * * */ #ifdef HAVE_CONFIG_H #include #endif #include "gtk-compat.h" #include "fm-dnd-dest.h" #include "fm-gtk-utils.h" #include "fm-gtk-marshal.h" #include "fm-file-info-job.h" #include "fm-gtk-file-launcher.h" #include "fm-config.h" #include #include struct _FmDndDest { GObject parent; GtkWidget* widget; int info_type; /* type of src_files */ FmPathList* src_files; GdkDragContext* context; guint32 src_dev; /* UNIX dev of source fs */ const char* src_fs_id; /* filesystem id of source fs */ FmFileInfo* dest_file; gboolean waiting_data; gboolean has_handlers; gboolean can_copy; }; enum { // QUERY_INFO, FILES_DROPPED, N_SIGNALS }; GtkTargetEntry fm_default_dnd_dest_targets[] = { {"application/x-fmlist-ptr", GTK_TARGET_SAME_APP, FM_DND_DEST_TARGET_FM_LIST}, {"text/uri-list", 0, FM_DND_DEST_TARGET_URI_LIST}, /* text/uri-list */ {"XdndDirectSave0", 0, FM_DND_DEST_TARGET_XDS} /* X direct save */ /* TODO: add more targets to support: text types, _NETSCAPE_URL, property/bgimage ... */ }; static GdkAtom dest_target_atom[N_FM_DND_DEST_DEFAULT_TARGETS]; static void fm_dnd_dest_dispose (GObject *object); static gboolean fm_dnd_dest_files_dropped(FmDndDest* dd, int x, int y, guint action, guint info_type, FmPathList* files); static void clear_src_cache(FmDndDest* dd); static void on_drag_leave(GtkWidget *widget, GdkDragContext *drag_context, guint time, FmDndDest* dd); static gboolean on_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, FmDndDest* dd); static void on_drag_data_received(GtkWidget *w, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info, guint time, FmDndDest* dd); static guint signals[N_SIGNALS]; G_DEFINE_TYPE(FmDndDest, fm_dnd_dest, G_TYPE_OBJECT); static void fm_dnd_dest_class_init(FmDndDestClass *klass) { GObjectClass *g_object_class; FmDndDestClass *dnd_dest_class; guint i; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_dnd_dest_dispose; dnd_dest_class = FM_DND_DEST_CLASS(klass); dnd_dest_class->files_dropped = fm_dnd_dest_files_dropped; /** * FmDndDest::files-dropped: * @dd: the object which emitted the signal * @x: horisontal position of drop * @y: vertical position of drop * @action: (#GdkDragAction) action requested on drop * @info_type: (#FmDndDestTargetType) type of data that are dropped * @files: (#FmPathList *) list of files that are dropped * * The #FmDndDest::files-dropped signal is emitted when @files are * dropped on the destination widget. If handler connected to this * signal returns %TRUE then further emission of the signal will be * stopped. * * Return value: %TRUE if action can be performed. * * Since: 0.1.0 */ signals[ FILES_DROPPED ] = g_signal_new("files-dropped", G_TYPE_FROM_CLASS( klass ), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET ( FmDndDestClass, files_dropped ), g_signal_accumulator_true_handled, NULL, fm_marshal_BOOL__INT_INT_UINT_UINT_POINTER, G_TYPE_BOOLEAN, 5, G_TYPE_INT, G_TYPE_INT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_POINTER); for(i = 0; i < N_FM_DND_DEST_DEFAULT_TARGETS; i++) dest_target_atom[i] = GDK_NONE; for(i = 0; i < G_N_ELEMENTS(fm_default_dnd_dest_targets); i++) dest_target_atom[fm_default_dnd_dest_targets[i].info] = gdk_atom_intern_static_string(fm_default_dnd_dest_targets[i].target); } static void fm_dnd_dest_dispose(GObject *object) { FmDndDest *dd; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DND_DEST(object)); dd = (FmDndDest*)object; fm_dnd_dest_set_widget(dd, NULL); clear_src_cache(dd); G_OBJECT_CLASS(fm_dnd_dest_parent_class)->dispose(object); } static void fm_dnd_dest_init(FmDndDest *self) { } /** * fm_dnd_dest_new * @w: a widget that probably is drop destination * * Creates new drag destination descriptor and sets a widget as a * potential drop destination. Caller should connect handlers for the * Gtk+ Drag and Drop signals to the widget: #GtkWidget::drag-leave, * #GtkWidget::drag-motion, #GtkWidget::drag-drop, and * #GtkWidget::drag-data-received. * * Before 1.0.1 this API didn't set drop destination on widget so caller * should set it itself. Access to fm_default_dnd_dest_targets outside * of this API considered unsecure so that behavior was changed. * * See also: fm_dnd_dest_new_with_handlers(). * * Returns: (transfer full): a new #FmDndDest object. * * Since: 0.1.0 */ FmDndDest *fm_dnd_dest_new(GtkWidget* w) { FmDndDest* dd = (FmDndDest*)g_object_new(FM_TYPE_DND_DEST, NULL); dd->has_handlers = FALSE; fm_dnd_dest_set_widget(dd, w); return dd; } /** * fm_dnd_dest_new_with_handlers * @w: a widget that probably is drop destination * * Creates new drag destination descriptor, sets a widget as a potential * drop destination, and connects handlers for the Gtk+ Drag and Drop * signals: #GtkWidget::drag-leave, #GtkWidget::drag-drop, and * #GtkWidget::drag-data-received. Caller should connect own handler for * the #GtkWidget::drag-motion signal to the widget to complete the * support. * * See also: fm_dnd_dest_new(). * * Returns: (transfer full): a new #FmDndDest object. * * Since: 1.0.1 */ FmDndDest *fm_dnd_dest_new_with_handlers(GtkWidget* w) { FmDndDest* dd = (FmDndDest*)g_object_new(FM_TYPE_DND_DEST, NULL); dd->has_handlers = TRUE; fm_dnd_dest_set_widget(dd, w); return dd; } /** * fm_dnd_dest_set_widget * @dd: a drag destination descriptor * @w: a widget that probably is drop destination * * Updates link to widget that probably is drop destination and setups * widget with drop targets supported by FmDndDest. * * Before 1.0.1 this API didn't update drop destination on widget so caller * should set and unset it itself. Access to fm_default_dnd_dest_targets * outside of this API considered unsecure so that behavior was changed. * * See also: fm_dnd_dest_new(), fm_dnd_dest_new_with_handlers(). * * Since: 0.1.0 */ void fm_dnd_dest_set_widget(FmDndDest* dd, GtkWidget* w) { if(w == dd->widget) return; if(dd->widget) { if(dd->has_handlers) { g_signal_handlers_disconnect_by_func(dd->widget, on_drag_drop, dd); g_signal_handlers_disconnect_by_func(dd->widget, on_drag_leave, dd); g_signal_handlers_disconnect_by_func(dd->widget, on_drag_data_received, dd); } gtk_drag_dest_unset(dd->widget); g_object_remove_weak_pointer(G_OBJECT(dd->widget), (gpointer*)&dd->widget); } dd->widget = w; if( w ) { g_object_add_weak_pointer(G_OBJECT(w), (gpointer*)&dd->widget); gtk_drag_dest_set(w, 0, fm_default_dnd_dest_targets, G_N_ELEMENTS(fm_default_dnd_dest_targets), GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_LINK|GDK_ACTION_ASK); if(dd->has_handlers) { g_signal_connect(w, "drag-drop", G_CALLBACK(on_drag_drop), dd); g_signal_connect(w, "drag-leave", G_CALLBACK(on_drag_leave), dd); g_signal_connect(w, "drag-data-received", G_CALLBACK(on_drag_data_received), dd); } } } /* returns -1 if we drop into the same dir, 0 of cannot dropm 1 if can */ static int fm_dnd_dest_can_receive_drop(FmFileInfo* dest_fi, FmPath* dest, FmPath* src) { /* g_debug("fm_dnd_dest_can_receive_drop: src %p(%s) dest %p(%s)", src, fm_path_get_basename(src), dest, fm_path_get_basename(dest)); */ if(!dest) return 0; /* we can drop only onto directory or desktop entry */ if(fm_file_info_is_desktop_entry(dest_fi)) return 1; if(!fm_file_info_is_dir(dest_fi) || !fm_file_info_is_accessible(dest_fi)) return 0; /* check if target FS is R/O, we cannot drop anything into R/O place */ if (!fm_file_info_is_writable_directory(dest_fi)) return 0; /* check if we drop directory onto itself */ if(!src || fm_path_equal(src, dest)) return 0; /* check if source and destination directories are the same */ if (fm_path_equal(fm_path_get_parent(src), dest)) return -1; return 1; } /* Part of this code was taken from GTK sources for gtk_dialog_run() */ typedef struct { GtkMenu *menu; GdkDragAction action; GMainLoop *loop; gboolean destroyed; } RunInfo; static void shutdown_loop(RunInfo *ri) { if (g_main_loop_is_running(ri->loop)) g_main_loop_quit(ri->loop); } static void run_unmap_handler(GtkWidget *menu, RunInfo *ri) { shutdown_loop (ri); } static void run_destroy_handler(GtkWidget *menu, RunInfo *ri) { /* shutdown_loop will be called by run_unmap_handler */ ri->destroyed = TRUE; } static void on_cancel_sel(GtkAction *act, RunInfo *ri) { /* nothing to select */ } static void on_copy_sel(GtkAction *act, RunInfo *ri) { ri->action = GDK_ACTION_COPY; } static void on_move_sel(GtkAction *act, RunInfo *ri) { ri->action = GDK_ACTION_MOVE; } static void on_link_sel(GtkAction *act, RunInfo *ri) { ri->action = GDK_ACTION_LINK; } static const char drop_menu_xml[]= "" "" "" "" "" ""; static GtkActionEntry drop_menu_actions[]= { {"Cancel", NULL, N_("_Cancel"), NULL, NULL, G_CALLBACK(on_cancel_sel)}, {"Copy", NULL, N_("C_opy Here"), NULL, NULL, G_CALLBACK(on_copy_sel)}, {"Move", NULL, N_("_Move Here"), NULL, NULL, G_CALLBACK(on_move_sel)}, /* Note to translators: Link in not noun but verb here */ {"Link", NULL, N_("_Link Here"), NULL, NULL, G_CALLBACK(on_link_sel)} }; static GdkDragAction _ask_action_on_drop(GtkWidget *widget, GdkDragContext *drag_context, gboolean link_only) { RunInfo ri = { NULL, GDK_ACTION_DEFAULT, NULL, FALSE }; gulong unmap_handler; gulong destroy_handler; GtkUIManager* ui = gtk_ui_manager_new(); GtkActionGroup* act_grp = gtk_action_group_new("Popup"); GtkAction *act; GdkDragAction actions; gtk_action_group_set_translation_domain(act_grp, GETTEXT_PACKAGE); gtk_action_group_add_actions(act_grp, drop_menu_actions, G_N_ELEMENTS(drop_menu_actions), &ri); gtk_ui_manager_add_ui_from_string(ui, drop_menu_xml, -1, NULL); gtk_ui_manager_insert_action_group(ui, act_grp, 0); if (link_only) { /* we cannot move file but can link or copy */ act = gtk_ui_manager_get_action(ui, "/popup/Move"); gtk_action_set_visible(act, FALSE); } if (drag_context) { actions = gdk_drag_context_get_actions(drag_context); if ((actions & GDK_ACTION_COPY) == 0) { act = gtk_ui_manager_get_action(ui, "/popup/Copy"); gtk_action_set_sensitive(act, FALSE); } if ((actions & GDK_ACTION_MOVE) == 0) { act = gtk_ui_manager_get_action(ui, "/popup/Move"); gtk_action_set_sensitive(act, FALSE); } if ((actions & GDK_ACTION_LINK) == 0) { act = gtk_ui_manager_get_action(ui, "/popup/Link"); gtk_action_set_sensitive(act, FALSE); } } ri.menu = GTK_MENU(g_object_ref(gtk_ui_manager_get_widget(ui, "/popup"))); g_signal_connect(ri.menu, "selection-done", G_CALLBACK(gtk_widget_destroy), NULL); unmap_handler = g_signal_connect(ri.menu, "unmap", G_CALLBACK(run_unmap_handler), &ri); destroy_handler = g_signal_connect(ri.menu, "destroy", G_CALLBACK(run_destroy_handler), &ri); g_object_unref(act_grp); g_object_unref(ui); gtk_menu_attach_to_widget(ri.menu, widget, NULL); gtk_menu_popup(ri.menu, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time()); ri.loop = g_main_loop_new(NULL, FALSE); GDK_THREADS_LEAVE (); g_main_loop_run(ri.loop); GDK_THREADS_ENTER (); g_main_loop_unref(ri.loop); ri.loop = NULL; gtk_menu_detach(ri.menu); if (!ri.destroyed) { g_signal_handler_disconnect(ri.menu, unmap_handler); g_signal_handler_disconnect(ri.menu, destroy_handler); } g_object_unref(ri.menu); return ri.action; } /* own handler for "files-dropped" signal */ static gboolean fm_dnd_dest_files_dropped(FmDndDest* dd, int x, int y, guint action, guint info_type, FmPathList* files) { FmPath* dest; GtkWidget* parent; int can_drop; dest = fm_dnd_dest_get_dest_path(dd); g_debug("%d files-dropped!, info_type: %d", fm_path_list_get_length(files), info_type); can_drop = fm_dnd_dest_can_receive_drop(dd->dest_file, dest, fm_path_list_peek_head(files)); if (can_drop == 0) return FALSE; if (action != GDK_ACTION_ASK && can_drop < 0) /* drop into itself only if ask */ return FALSE; if(fm_file_info_is_desktop_entry(dd->dest_file)) { if(action != GDK_ACTION_COPY) return FALSE; parent = gtk_widget_get_toplevel(dd->widget); return fm_launch_desktop_entry_simple(GTK_WINDOW(parent), NULL, dd->dest_file, files); } parent = gtk_widget_get_toplevel(dd->widget); if (action == GDK_ACTION_ASK) /* special handling for ask */ action = _ask_action_on_drop(dd->widget, dd->context, can_drop < 0); switch((GdkDragAction)action) { case GDK_ACTION_MOVE: if(fm_path_is_trash_root(dest)) fm_trash_files(GTK_WINDOW(parent), files); else fm_move_files(GTK_WINDOW(parent), files, dest); break; case GDK_ACTION_COPY: fm_copy_files(GTK_WINDOW(parent), files, dest); break; case GDK_ACTION_LINK: fm_link_files(GTK_WINDOW(parent), files, dest); break; case GDK_ACTION_ASK: case GDK_ACTION_PRIVATE: default: /* invalid combination */ return FALSE; } return TRUE; } static void clear_src_cache(FmDndDest* dd) { /* free cached source files */ if(dd->context) { g_object_unref(dd->context); dd->context = NULL; } if(dd->src_files) { fm_path_list_unref(dd->src_files); dd->src_files = NULL; } if(dd->dest_file) { fm_file_info_unref(dd->dest_file); dd->dest_file = NULL; } dd->src_dev = 0; dd->src_fs_id = NULL; dd->info_type = 0; dd->waiting_data = FALSE; } /** * fm_dnd_dest_get_dest_file * @dd: a drag destination descriptor * * Retrieves file info of drag destination. Returned data are owned by @dd and * should not be freed by caller. * * Returns: (transfer none): file info of drag destination. * * Since: 0.1.0 */ FmFileInfo* fm_dnd_dest_get_dest_file(FmDndDest* dd) { return dd->dest_file; } /** * fm_dnd_dest_get_dest_path * @dd: a drag destination descriptor * * Retrieves file path of drag destination. Returned data are owned by @dd and * should not be freed by caller. * * Returns: (transfer none): file path of drag destination. * * Since: 0.1.0 */ FmPath* fm_dnd_dest_get_dest_path(FmDndDest* dd) { return dd->dest_file ? fm_file_info_get_path(dd->dest_file) : NULL; } /** * fm_dnd_dest_set_dest_file * @dd: a drag destination descriptor * @dest_file: file info of drag destination * * Sets drag destination for @dd. * * Since: 0.1.0 */ void fm_dnd_dest_set_dest_file(FmDndDest* dd, FmFileInfo* dest_file) { if(dd->dest_file == dest_file) return; if(dd->dest_file) fm_file_info_unref(dd->dest_file); dd->dest_file = dest_file ? fm_file_info_ref(dest_file) : NULL; } /** * fm_dnd_dest_drag_data_received * @dd: a drag destination descriptor * @drag_context: the drag context * @x: horisontal position of drop * @y: vertical position of drop * @sel_data: selection data that are dragged * @info: (#FmDndDestTargetType) type of data that are dragged * @time: timestamp of operation * * A common handler for signals that emitted when information about * dragged data is received, such as "drag-data-received". * * If the @dd was created with fm_dnd_dest_new_with_handlers() then this * API should be never used by the widget. * * Returns: %TRUE if dropping data is accepted for processing. * * Since: 0.1.17 */ static inline gboolean _on_drag_data_received(FmDndDest* dd, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *sel_data, guint info, guint time) { FmPathList* files = NULL; gint length, format; const gchar* data; data = (const gchar*)gtk_selection_data_get_data_with_length(sel_data, &length); format = gtk_selection_data_get_format(sel_data); dd->can_copy = FALSE; if(info == FM_DND_DEST_TARGET_FM_LIST) { if((length == sizeof(gpointer)) && (format==8)) { /* get the pointer */ FmFileInfoList* file_infos = *(FmFileInfoList**)data; if(file_infos) { FmFileInfo* fi = fm_file_info_list_peek_head(fm_file_info_list_ref(file_infos)); /* FIXME: how can it be? it should be checked beforehand */ if(fi == NULL) ; /* get the device of the first dragged source file */ else if(fm_path_is_native(fm_file_info_get_path(fi))) { if (fm_path_get_parent(fm_file_info_get_path(fi)) != fm_path_get_home()) dd->can_copy = TRUE; dd->src_dev = fm_file_info_get_dev(fi); } else dd->src_fs_id = fm_file_info_get_fs_id(fi); files = fm_path_list_new_from_file_info_list(file_infos); fm_file_info_list_unref(file_infos); } } } else if(info == FM_DND_DEST_TARGET_URI_LIST) { if((length >= 0) && (format==8)) { gchar **uris; uris = gtk_selection_data_get_uris( sel_data ); files = fm_path_list_new_from_uris(uris); g_free(uris); if(files && !fm_path_list_is_empty(files)) { GFileInfo* inf; FmPath* path = fm_path_list_peek_head(files); GFile* gf = fm_path_to_gfile(path); const char* attr = fm_path_is_native(path) ? G_FILE_ATTRIBUTE_UNIX_DEVICE : G_FILE_ATTRIBUTE_ID_FILESYSTEM; inf = g_file_query_info(gf, attr, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL); g_object_unref(gf); if(fm_path_is_native(path)) { if (fm_path_get_parent(path) != fm_path_get_home()) dd->can_copy = TRUE; if (inf) dd->src_dev = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_DEVICE); else dd->src_dev = 0; } else if (inf) dd->src_fs_id = g_intern_string(g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_ID_FILESYSTEM)); else dd->src_fs_id = NULL; if (inf) g_object_unref(inf); } } } else if(info == FM_DND_DEST_TARGET_XDS) /* X direct save */ { gboolean success = FALSE; if(format == 8 && length == 1 && data[0] == 'F') { GdkWindow *source_window; source_window = gdk_drag_context_get_source_window(drag_context); gdk_property_change(source_window, dest_target_atom[FM_DND_DEST_TARGET_XDS], gdk_atom_intern_static_string("text/plain"), 8, GDK_PROP_MODE_REPLACE, (const guchar *)"", 0); } else if(format == 8 && length == 1 && data[0] == 'S') { success = TRUE; } gtk_drag_finish(drag_context, success, gdk_drag_context_get_selected_action(drag_context) == GDK_ACTION_MOVE, time); return TRUE; } /* remove previously cached source files. */ if(G_UNLIKELY(dd->src_files)) fm_path_list_unref(dd->src_files); if(files && fm_path_list_is_empty(files)) { g_warning("drag-data-received with empty list"); fm_path_list_unref(files); files = NULL; } dd->src_files = files; dd->waiting_data = FALSE; dd->info_type = info; /* keep context to verify if it's changed */ if(G_UNLIKELY(dd->context)) g_object_unref(dd->context); dd->context = g_object_ref(drag_context); return (files != NULL); } gboolean fm_dnd_dest_drag_data_received(FmDndDest* dd, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *sel_data, guint info, guint time) { return _on_drag_data_received(dd, drag_context, x, y, sel_data, info, time); } static void on_drag_data_received(GtkWidget *w, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info, guint time, FmDndDest* dd) { _on_drag_data_received(dd, drag_context, x, y, data, info, time); } /** * fm_dnd_dest_find_target * @dd: a drag destination descriptor * @drag_context: the drag context * * Finds target type that is supported for @drag_context. * * Returns: supported target type or %GDK_NONE if none found. * * Since: 0.1.17 */ GdkAtom fm_dnd_dest_find_target(FmDndDest* dd, GdkDragContext *drag_context) { guint i; for(i = 1; i < N_FM_DND_DEST_DEFAULT_TARGETS; i++) { GdkAtom target = dest_target_atom[i]; if(G_LIKELY(target != GDK_NONE) && fm_drag_context_has_target(drag_context, target) /* accept FM_DND_DEST_TARGET_FM_LIST only from the same application */ && (i != FM_DND_DEST_TARGET_FM_LIST || gtk_drag_get_source_widget(drag_context))) return target; } return GDK_NONE; } /** * fm_dnd_dest_is_target_supported * @dd: a drag destination descriptor * @target: target type * * Checks if @target is supported by libfm. * * Returns: %TRUE if drop to @target is supported by libfm. * * Since: 0.1.17 */ gboolean fm_dnd_dest_is_target_supported(FmDndDest* dd, GdkAtom target) { guint i; if(G_LIKELY(target != GDK_NONE)) for(i = 1; i < N_FM_DND_DEST_DEFAULT_TARGETS; i++) if(dest_target_atom[i] == target) return TRUE; return FALSE; } /** * fm_dnd_dest_drag_drop * @dd: a drag destination descriptor * @drag_context: the drag context * @target: target type * @x: horisontal position of drop * @y: vertical position of drop * @time: timestamp of operation * * A common handler for signals that emitted when dragged data are * dropped onto destination, "drag-drop". Prepares data and emits the * #FmDndDest::files-dropped signal if drop is supported. * * If the @dd was created with fm_dnd_dest_new_with_handlers() then this * API should be never used by the widget. * * Returns: %TRUE if drop to @target is supported by libfm. * * Since: 0.1.17 */ static inline gboolean _on_drag_drop(FmDndDest* dd, GdkDragContext *drag_context, GdkAtom target, int x, int y, guint time) { gboolean ret = FALSE; GtkWidget* dest_widget = dd->widget; guint i; if(G_LIKELY(target != GDK_NONE)) for(i = 1; i < N_FM_DND_DEST_DEFAULT_TARGETS; i++) if(dest_target_atom[i] == target) { ret = TRUE; break; } if(ret) /* we support this kind of target */ { if(i == FM_DND_DEST_TARGET_XDS) /* if this is XDS */ { guchar *data = NULL; GdkWindow *source_window; gint len = 0; GdkAtom text_atom = gdk_atom_intern_static_string("text/plain"); /* get filename from the source window */ source_window = gdk_drag_context_get_source_window(drag_context); if(gdk_property_get(source_window, target, text_atom, 0, 1024, FALSE, NULL, NULL, &len, &data) && data) { FmFileInfo* dest = fm_dnd_dest_get_dest_file(dd); if( dest && fm_file_info_is_dir(dest) ) { data = g_realloc(data, len + 1); data[len] = 0; FmPath* path = fm_path_new_child(fm_file_info_get_path(dest), (gchar*)data); char* uri = fm_path_to_uri(path); /* setup the property */ gdk_property_change(source_window, target, text_atom, 8, GDK_PROP_MODE_REPLACE, (const guchar *)uri, strlen(uri)); fm_path_unref(path); g_free(uri); } } else { fm_show_error(GTK_WINDOW(gtk_widget_get_toplevel(dest_widget)), NULL, _("XDirectSave failed.")); gdk_property_change(source_window, target, text_atom, 8, GDK_PROP_MODE_REPLACE, (const guchar *)"", 0); } g_free(data); gtk_drag_get_data(dest_widget, drag_context, target, time); /* we should call gtk_drag_finish later in data-received callback. */ return TRUE; } /* see if the dragged files are cached by "drag-motion" handler */ if(dd->src_files && drag_context == dd->context) { GdkDragAction action = gdk_drag_context_get_selected_action(drag_context); /* emit files-dropped signal */ g_signal_emit(dd, signals[FILES_DROPPED], 0, x, y, action, dd->info_type, dd->src_files, &ret); } else /* we don't have the data */ { if(dd->waiting_data) /* if we're still waiting for the data */ { /* FIXME: how to handle this? */ ret = FALSE; } else ret = FALSE; } gtk_drag_finish(drag_context, ret, FALSE, time); clear_src_cache(dd); } return ret; } gboolean fm_dnd_dest_drag_drop(FmDndDest* dd, GdkDragContext *drag_context, GdkAtom target, int x, int y, guint time) { return _on_drag_drop(dd, drag_context, target, x, y, time); } static gboolean on_drag_drop(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, FmDndDest* dd) { GdkAtom target = fm_dnd_dest_find_target(dd, drag_context); if(G_UNLIKELY(target == GDK_NONE)) return FALSE; return _on_drag_drop(dd, drag_context, target, x, y, time); } /** * fm_dnd_dest_get_default_action * @dd: object which will receive data * @drag_context: the drag context * @target: #GdkAtom of the target data type * * Returns: the default action to take for the dragged files. * * Since: 0.1.17 */ GdkDragAction fm_dnd_dest_get_default_action(FmDndDest* dd, GdkDragContext* drag_context, GdkAtom target) { GdkDragAction action; FmFileInfo* dest = dd->dest_file; FmPath* dest_path; int can_drop; /* this is XDirectSave */ if(target == dest_target_atom[FM_DND_DEST_TARGET_XDS]) return gdk_drag_context_get_suggested_action(drag_context); if(!dest || !(dest_path = fm_file_info_get_path(dest))) /* query drag sources in any case */ goto query_sources; /* special support for dropping onto desktop entry */ if(fm_file_info_is_desktop_entry(dest)) { GdkModifierType mask = 0; gdk_window_get_device_position (gtk_widget_get_window(dd->widget), gdk_drag_context_get_device(drag_context), NULL, NULL, &mask); mask &= gtk_accelerator_get_default_mod_mask(); if ((mask & ~GDK_CONTROL_MASK) != 0) /* only "copy" action is allowed */ return 0; if(!dd->src_files || dd->context != drag_context) { /* we have no valid data, query it now */ clear_src_cache(dd); if(!dd->waiting_data) /* we're still waiting for "drag-data-received" signal */ { /* retrieve the source files */ gtk_drag_get_data(dd->widget, drag_context, target, time(NULL)); dd->waiting_data = TRUE; } return 0; } return GDK_ACTION_COPY; } /* we have no valid data, query it now */ if(!dd->src_files || dd->context != drag_context) { query_sources: if (dd->context != drag_context) clear_src_cache(dd); action = 0; if(!dd->waiting_data) /* we're still waiting for "drag-data-received" signal */ { /* retrieve the source files */ gtk_drag_get_data(dd->widget, drag_context, target, time(NULL)); dd->waiting_data = TRUE; } } else /* we have got drag source files */ { FmPath *src_path = fm_path_list_peek_head(dd->src_files); /* dest is an ordinary path, check if drop on it is supported */ can_drop = fm_dnd_dest_can_receive_drop(dest, dest_path, src_path); if (can_drop < 0 && fm_config->drop_default_action == FM_DND_DEST_DROP_ASK) return GDK_ACTION_ASK; /* we are dropping into the same place */ else if (can_drop <= 0) action = 0; else { /* determine if the dragged files are on the same device as destination file */ /* Here we only check the first dragged file since checking all of them can * make the operation very slow. */ gboolean same_fs; GdkModifierType mask = 0; gdk_window_get_device_position (gtk_widget_get_window(dd->widget), gdk_drag_context_get_device(drag_context), NULL, NULL, &mask); mask &= gtk_accelerator_get_default_mod_mask(); if(fm_path_is_trash(dest_path)) { if((mask & ~GDK_SHIFT_MASK) == 0 && /* no modifiers or shift */ fm_path_is_trash_root(dest_path)) /* we can only move files to trash can */ action = GDK_ACTION_MOVE; else /* files inside trash are read only */ action = 0; } else if (fm_path_is_trash(src_path)) { if ((mask & ~GDK_SHIFT_MASK) == 0) /* no modifiers or shift */ /* bug #3615258: only do move files from trash can */ action = GDK_ACTION_MOVE; else /* we should not do anything else */ action = 0; } /* use Shift for Move, Ctrl for Copy, Ctrl+Shift for Link, Alt for Ask */ else if(mask == (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) action = GDK_ACTION_LINK; else if(mask == GDK_SHIFT_MASK) action = GDK_ACTION_MOVE; else if(mask == GDK_CONTROL_MASK) action = GDK_ACTION_COPY; else if(mask == GDK_MOD1_MASK) action = GDK_ACTION_ASK; else if(mask != 0) /* another modifier key was pressed */ action = 0; /* make decision based on config: Auto / Copy / Move / Ask */ else switch((FmDndDestDropAction)fm_config->drop_default_action) { case FM_DND_DEST_DROP_MOVE: action = GDK_ACTION_MOVE; break; case FM_DND_DEST_DROP_COPY: action = GDK_ACTION_COPY; break; case FM_DND_DEST_DROP_ASK: return GDK_ACTION_ASK; default: /* FM_DND_DEST_DROP_AUTO or invalid values */ if(!dd->src_dev && !dd->src_fs_id) /* we don't know on which device the dragged source files are. */ same_fs = FALSE; /* fallback to copy then */ /* compare the device/filesystem id against that of destination file */ else if(fm_path_is_native(dest_path)) same_fs = dd->src_dev && (dd->src_dev == fm_file_info_get_dev(dest)); else /* fs_id is interned string */ same_fs = dd->src_fs_id && (dd->src_fs_id == fm_file_info_get_fs_id(dest)); /* prefer to make shortcuts on Desktop instead of copy/move files */ if (fm_config->smart_desktop_autodrop && !dd->can_copy && fm_path_equal(dest_path, fm_path_get_desktop())) /* it is either some directory under $HOME or some remote URI (http:// for example) */ action = GDK_ACTION_LINK; else action = same_fs ? GDK_ACTION_MOVE : GDK_ACTION_COPY; } } } if( action && 0 == (gdk_drag_context_get_actions(drag_context) & action) ) action = gdk_drag_context_get_suggested_action(drag_context); return action; } /** * fm_dnd_dest_drag_leave * @dd: a drag destination descriptor * @drag_context: the drag context * @time: timestamp of operation * * A common handler for signals that emitted when drag leaves the destination * widget, such as "drag-leave". * * If the @dd was created with fm_dnd_dest_new_with_handlers() then this * API should be never used by the widget. * * Since: 0.1.17 */ void fm_dnd_dest_drag_leave(FmDndDest* dd, GdkDragContext* drag_context, guint time) { } static void on_drag_leave(GtkWidget *widget, GdkDragContext *drag_context, guint time, FmDndDest* dd) { } libfm-1.4.0/src/gtk/fm-dnd-dest.h000066400000000000000000000107661475513661000164560ustar00rootroot00000000000000/* * fm-dnd-dest.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_DND_DEST_H__ #define __FM_DND_DEST_H__ #include #include "fm-file-info.h" G_BEGIN_DECLS #define FM_TYPE_DND_DEST (fm_dnd_dest_get_type()) #define FM_DND_DEST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_DND_DEST, FmDndDest)) #define FM_DND_DEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_DND_DEST, FmDndDestClass)) #define FM_IS_DND_DEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_DND_DEST)) #define FM_IS_DND_DEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_DND_DEST)) /** * FmDndDestTargetType * @FM_DND_DEST_TARGET_FM_LIST: direct pointer of #FmList * @FM_DND_DEST_TARGET_URI_LIST: "text/uri-list" * @FM_DND_DEST_TARGET_XDS: X direct save * @N_FM_DND_DEST_DEFAULT_TARGETS: widget's target indices should start from this * * default droppable targets supported by #FmDndDest */ typedef enum { FM_DND_DEST_TARGET_FM_LIST = 1, FM_DND_DEST_TARGET_URI_LIST, FM_DND_DEST_TARGET_XDS, /*< private >*/ FM_DND_DEST_RESERVED1, FM_DND_DEST_RESERVED2, FM_DND_DEST_RESERVED3, FM_DND_DEST_RESERVED4, FM_DND_DEST_RESERVED5, /*< public >*/ N_FM_DND_DEST_DEFAULT_TARGETS } FmDndDestTargetType; typedef struct _FmDndDest FmDndDest; typedef struct _FmDndDestClass FmDndDestClass; /** * FmDndDestClass * @parent_class: the parent class * @files_dropped: the class closure for the #FmDndDest::files-dropped signal */ struct _FmDndDestClass { GObjectClass parent_class; gboolean (*files_dropped)(FmDndDest* dd, int x, int y, guint action, guint info_type, FmPathList* files); /*< private >*/ gpointer _reserved1; }; GType fm_dnd_dest_get_type (void); FmDndDest* fm_dnd_dest_new (GtkWidget* w); FmDndDest* fm_dnd_dest_new_with_handlers (GtkWidget* w); void fm_dnd_dest_set_widget(FmDndDest* dd, GtkWidget* w); void fm_dnd_dest_set_dest_file(FmDndDest* dd, FmFileInfo* dest_file); FmFileInfo* fm_dnd_dest_get_dest_file(FmDndDest* dd); FmPath* fm_dnd_dest_get_dest_path(FmDndDest* dd); #if !GTK_CHECK_VERSION(2, 22, 0) # define gdk_drag_context_list_targets(ctx) ctx->targets #endif #define fm_drag_context_has_target(ctx, target) \ (g_list_find(gdk_drag_context_list_targets(ctx), target) != NULL) #define fm_drag_context_has_target_name(ctx, name) \ fm_drag_context_has_target(ctx, gdk_atom_intern_static_string(name)) gboolean fm_dnd_dest_drag_data_received(FmDndDest* dd, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *sel_data, guint info, guint time); gboolean fm_dnd_dest_is_target_supported(FmDndDest* dd, GdkAtom target); GdkAtom fm_dnd_dest_find_target(FmDndDest* dd, GdkDragContext *drag_context); gboolean fm_dnd_dest_drag_drop(FmDndDest* dd, GdkDragContext *drag_context, GdkAtom target, int x, int y, guint time); GdkDragAction fm_dnd_dest_get_default_action(FmDndDest* dd, GdkDragContext* drag_context, GdkAtom target); void fm_dnd_dest_drag_leave(FmDndDest* dd, GdkDragContext* drag_context, guint time); /** * fm_dnd_dest_add_targets * @widget: #GtkWidget to add targets * @targets: pointer to array of #GtkTargetEntry to add * @n: number of targets to add * * Adds drop destination targets to existing list for @widget. Convenience API. * * Since: 1.0.1 */ #define fm_dnd_dest_add_targets(widget,targets,n) \ gtk_target_list_add_table(gtk_drag_dest_get_target_list(widget), \ targets, n) G_END_DECLS #endif /* __FM_DND_DEST_H__ */ libfm-1.4.0/src/gtk/fm-dnd-src.c000066400000000000000000000255451475513661000163020ustar00rootroot00000000000000/* * fm-dnd-src.c * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-dnd-src * @short_description: Libfm support for drag&drop source. * @title: FmDndSrc * * @include: libfm/fm-gtk.h * * The #FmDndSrc can be used by some widget to provide support for drag * operations on #FmFileInfo objects that are represented in that widget. * * To use #FmDndSrc the widget should create it with fm_dnd_src_new() and * connect to the #FmDndSrc::data-get signal of the created #FmDndSrc * object. * * Sample Usage * * { * widget->ds = fm_dnd_src_new(widget); * g_signal_connect(widget->ds, "data-get", G_CALLBACK(on_data_get), widget); * * ... * } * * static void on_object_finalize(MyWidget *widget) * { * ... * * g_signal_handlers_disconnect_by_data(widget->ds, widget); * g_object_unref(G_OBJECT(widget->ds)); * } * * static void on_data_get(FmDndSrc *ds, MyWidget *widget) * { * FmFileInfo *file = widget->selected_file; * * fm_dnd_src_set_file(ds, file); * } * * * The #FmDndSrc will set drag activation for the widget by left mouse * button so if widget wants to use mouse movement with left button * pressed for something else (rubberbanding for example) then it should * disable Gtk drag handlers when needs (by blocking handlers that match * object data "gtk-site-data" usually). * * If widget wants to handle some types of data other than #FmFileInfo * objects it should do it the usual way by connecting handlers for the * #GtkWidget::drag-data-get, #GtkWidget::drag-begin, and #GtkWidget::drag-end * signals and adding own targets to widget's drag source target list. To * exclude conflicts the widget's specific handlers should use info * indices starting from N_FM_DND_SRC_DEFAULT_TARGETS. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-dnd-src.h" #include "fm-icon-pixbuf.h" GtkTargetEntry fm_default_dnd_src_targets[] = { /* bug #3614629: the "text/uri-list" should be primary target */ {"text/uri-list", 0, FM_DND_SRC_TARGET_URI_LIST}, {"application/x-fmlist-ptr", GTK_TARGET_SAME_APP, FM_DND_SRC_TARGET_FM_LIST} }; enum { DATA_GET, N_SIGNALS }; static void fm_dnd_src_dispose (GObject *object); static void on_drag_data_get ( GtkWidget *src_widget, GdkDragContext *drag_context, GtkSelectionData *sel_data, guint info, guint time, FmDndSrc* ds ); static void on_drag_begin ( GtkWidget *src_widget, GdkDragContext *drag_context, FmDndSrc* ds ); static void on_drag_end ( GtkWidget *src_widget, GdkDragContext *drag_context, FmDndSrc* ds ); static guint signals[N_SIGNALS]; G_DEFINE_TYPE(FmDndSrc, fm_dnd_src, G_TYPE_OBJECT); static void fm_dnd_src_class_init(FmDndSrcClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_dnd_src_dispose; /** * FmDndSrc::data-get: * @object: the object which emitted the signal * * The #FmDndSrc::data-get signal is emitted when information of * source files is needed. Handler of the signal should then call * fm_dnd_src_set_files() to provide info of dragged source files. * * Since: 0.1.0 */ signals[ DATA_GET ] = g_signal_new ( "data-get", G_TYPE_FROM_CLASS( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmDndSrcClass, data_get ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 ); } static void fm_dnd_src_dispose(GObject *object) { FmDndSrc *ds; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DND_SRC(object)); ds = (FmDndSrc*)object; if(ds->files) { fm_file_info_list_unref(ds->files); ds->files = NULL; } fm_dnd_src_set_widget(ds, NULL); G_OBJECT_CLASS(fm_dnd_src_parent_class)->dispose(object); } static void fm_dnd_src_init(FmDndSrc *self) { } /** * fm_dnd_src_new * @w: (allow-none): the widget where source files are selected * * Creates new drag source descriptor. * * Before 1.0.1 this API didn't update drag source on widget so caller * should set it itself. Since access to fm_default_dnd_src_targets * outside of this API considered unsecure, that behavior was changed. * * Returns: (transfer full): a new #FmDndSrc object. * * Since: 0.1.0 */ FmDndSrc *fm_dnd_src_new(GtkWidget* w) { FmDndSrc* ds = (FmDndSrc*)g_object_new(FM_TYPE_DND_SRC, NULL); fm_dnd_src_set_widget(ds, w); return ds; } /** * fm_dnd_src_set_widget * @ds: the drag source descriptor * @w: (allow-none): the widget where source files are selected * * Resets drag source widget in @ds. * * Before 1.0.1 this API didn't update drag source on widget so caller * should set and unset it itself. Access to fm_default_dnd_src_targets * outside of this API considered unsecure so that behavior was changed. * * Since: 0.1.0 */ void fm_dnd_src_set_widget(FmDndSrc* ds, GtkWidget* w) { if(w == ds->widget) return; if(ds->widget) /* there is an old widget connected */ { gtk_drag_source_unset(ds->widget); g_object_remove_weak_pointer(G_OBJECT(ds->widget), (gpointer*)&ds->widget); g_signal_handlers_disconnect_by_func(ds->widget, on_drag_data_get, ds); g_signal_handlers_disconnect_by_func(ds->widget, on_drag_begin, ds); g_signal_handlers_disconnect_by_func(ds->widget, on_drag_end, ds); } ds->widget = w; if( w ) { GtkTargetList *targets; gtk_drag_source_set(w, GDK_BUTTON1_MASK, fm_default_dnd_src_targets, G_N_ELEMENTS(fm_default_dnd_src_targets), GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_ASK); targets = gtk_drag_source_get_target_list(w); gtk_target_list_add_text_targets(targets, FM_DND_SRC_TARGET_TEXT); g_object_add_weak_pointer(G_OBJECT(w), (gpointer*)&ds->widget); g_signal_connect(w, "drag-data-get", G_CALLBACK(on_drag_data_get), ds); g_signal_connect(w, "drag-begin", G_CALLBACK(on_drag_begin), ds); g_signal_connect_after(w, "drag-end", G_CALLBACK(on_drag_end), ds); } } /** * fm_dnd_src_set_files * @ds: the drag source descriptor * @files: list of files to set * * Sets @files as selection list in the source descriptor. * * Since: 0.1.0 */ void fm_dnd_src_set_files(FmDndSrc* ds, FmFileInfoList* files) { if(ds->files) fm_file_info_list_unref(ds->files); ds->files = fm_file_info_list_ref(files); } /** * fm_dnd_src_set_file * @ds: the drag source descriptor * @file: files to set * * Sets @file as selection in the source descriptor. * * Since: 0.1.0 */ void fm_dnd_src_set_file(FmDndSrc* ds, FmFileInfo* file) { FmFileInfoList* files = fm_file_info_list_new(); fm_file_info_list_push_tail(files, file); if(ds->files) fm_file_info_list_unref(ds->files); ds->files = files; } static void on_drag_data_get ( GtkWidget *src_widget, GdkDragContext *drag_context, GtkSelectionData *sel_data, guint info, guint time, FmDndSrc* ds ) { GdkAtom type; if(info == 0 || info >= N_FM_DND_SRC_DEFAULT_TARGETS) return; type = gtk_selection_data_get_target(sel_data); switch( info ) { case FM_DND_SRC_TARGET_FM_LIST: /* just store the pointer in GtkSelection since this is used * within the same app. */ gtk_selection_data_set(sel_data, type, 8, (guchar*)&ds->files, sizeof(gpointer)); break; case FM_DND_SRC_TARGET_URI_LIST: case FM_DND_SRC_TARGET_TEXT: { gchar* uri; GString* uri_list = g_string_sized_new( 8192 ); GList* l; FmFileInfo* file; for( l = fm_file_info_list_peek_head_link(ds->files); l; l=l->next ) { file = FM_FILE_INFO(l->data); uri = fm_path_to_uri(fm_file_info_get_path(file)); g_string_append( uri_list, uri ); g_free( uri ); /* #3614629: text/uri-list should be ended with \r\n */ g_string_append( uri_list, "\r\n" ); } if(info == FM_DND_SRC_TARGET_URI_LIST) gtk_selection_data_set(sel_data, type, 8, (guchar*)uri_list->str, uri_list->len); else /* FM_DND_SRC_TARGET_TEXT */ gtk_selection_data_set_text(sel_data, uri_list->str, uri_list->len); g_string_free( uri_list, TRUE ); } break; } } static void on_drag_begin ( GtkWidget *src_widget, GdkDragContext *drag_context, FmDndSrc* ds ) { gtk_drag_set_icon_default( drag_context ); /* ask drag source to provide list of source files. */ g_signal_emit(ds, signals[DATA_GET], 0); /* set icon if it's single file and it's possible to obtain it */ if (ds->files && fm_file_info_list_get_length(ds->files) == 1) { FmFileInfo *fi = fm_file_info_list_peek_head(ds->files); FmIcon *icon = fm_file_info_get_icon(fi); if (icon) #if GTK_CHECK_VERSION(3, 2, 0) gtk_drag_set_icon_gicon(drag_context, fm_icon_get_gicon(icon), 0, 0); #else { gint w; GdkPixbuf *pix; gtk_icon_size_lookup(GTK_ICON_SIZE_DND, &w, NULL); pix = fm_pixbuf_from_icon(icon, w); if (pix) { gtk_drag_set_icon_pixbuf(drag_context, pix, 0, 0); g_object_unref(pix); } } #endif } else if (ds->files) gtk_drag_set_icon_stock(drag_context, GTK_STOCK_DND_MULTIPLE, 0, 0); } static void on_drag_end ( GtkWidget *src_widget, GdkDragContext *drag_context, FmDndSrc* ds ) { } libfm-1.4.0/src/gtk/fm-dnd-src.h000066400000000000000000000064131475513661000163000ustar00rootroot00000000000000/* * fm-dnd-src.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_DND_SRC_H__ #define __FM_DND_SRC_H__ #include #include "fm-file-info.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_DND_SRC (fm_dnd_src_get_type()) #define FM_DND_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_DND_SRC, FmDndSrc)) #define FM_DND_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_DND_SRC, FmDndSrcClass)) #define FM_IS_DND_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_DND_SRC)) #define FM_IS_DND_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_DND_SRC)) /** * FmDndSrcTarget * @FM_DND_SRC_TARGET_FM_LIST: direct pointer of FmList * @FM_DND_SRC_TARGET_URI_LIST: "text/uri-list" * @FM_DND_SRC_TARGET_TEXT: Gtk+ default text targets * @N_FM_DND_SRC_DEFAULT_TARGETS: widget's target indices should start from this * * default targets of drag source */ typedef enum { FM_DND_SRC_TARGET_FM_LIST = 1, FM_DND_SRC_TARGET_URI_LIST, FM_DND_SRC_TARGET_TEXT, /*< private >*/ FM_DND_SRC_RESERVED2, FM_DND_SRC_RESERVED3, FM_DND_SRC_RESERVED4, FM_DND_SRC_RESERVED5, /*< public >*/ N_FM_DND_SRC_DEFAULT_TARGETS } FmDndSrcTarget; typedef struct _FmDndSrc FmDndSrc; typedef struct _FmDndSrcClass FmDndSrcClass; struct _FmDndSrc { GObject parent; GtkWidget* FM_SEAL(widget); FmFileInfoList* FM_SEAL(files); /*< private >*/ gpointer _reserved1; }; /** * FmDndSrcClass * @parent_class: the parent class * @data_get: the class closure for the #FmDndSrc::data-get signal */ struct _FmDndSrcClass { GObjectClass parent_class; void (*data_get)(FmDndSrc*); /*< private >*/ gpointer _reserved1; }; GType fm_dnd_src_get_type (void); FmDndSrc* fm_dnd_src_new (GtkWidget* w); void fm_dnd_src_set_widget(FmDndSrc* ds, GtkWidget* w); /* FmFileInfoList* fm_dnd_src_get_files(FmDndSrc* ds); */ void fm_dnd_src_set_files(FmDndSrc* ds, FmFileInfoList* files); void fm_dnd_src_set_file(FmDndSrc* ds, FmFileInfo* file); /** * fm_dnd_src_add_targets * @widget: #GtkWidget to add targets * @targets: pointer to array of #GtkTargetEntry to add * @n: number of targets to add * * Adds drag source targets to existing list for @widget. Convenience API. * * Since: 1.0.1 */ #define fm_dnd_src_add_targets(widget,targets,n) \ gtk_target_list_add_table(gtk_drag_source_get_target_list(widget), \ targets, n) G_END_DECLS #endif /* __FM_DND_SRC_H__ */ libfm-1.4.0/src/gtk/fm-file-menu.c000066400000000000000000000745311475513661000166300ustar00rootroot00000000000000/* * fm-file-menu.c * * Copyright 2009 PCMan * Copyright 2013-2018 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-file-menu * @short_description: Simple context menu for files. * @title: FmFileMenu * * @include: libfm/fm-gtk.h * * The #FmFileMenu can be used to create context menu on some file(s). * * The menu consists of items: * |[ * Open * <placeholder name='ph1'/> * ------------------------ * <placeholder name='ph2'/> * ------------------------ * AddBookmark * <placeholder name='SendToCategory'/> * ------------------------ * Cut * Copy * Paste * Del * CopyPath * <placeholder name='MoveCategory'/> * ------------------------ * Rename * ------------------------ * <placeholder name='ph3'/> * ------------------------ * Prop * ]| * You can modity the menu replacing placeholders. Note that internally * the menu constructor also puts some conditional elements into those * placeholders: * - ph2: 'OpenWith' list+selector (optionally in submenu 'OpenWithMenu'); * - SendToCategory: elements of category 'Send To': * * 'Compress' if there is archiver defined; * * 'Extract' if this is an archive * - MoveCategory: 'Hide' or 'Unhide' if the attribute is changeable. * * Element 'AddBookmark' is visible only if menu is created for one directory. * Element 'Rename' is hidden if menu is created for more than one file or * if that file cannot be renamed. * Element 'Paste' is visible only if menu is created for one directory * and that directory is writable. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "../gtk-compat.h" #include "fm.h" #include "fm-file-menu.h" #include "fm-clipboard.h" #include "fm-file-properties.h" #include "fm-gtk-utils.h" #include "fm-app-chooser-dlg.h" #include "fm-gtk-file-launcher.h" struct _FmFileMenu { FmFileInfoList* file_infos; gboolean same_type : 1; gboolean can_trash : 1; //gboolean disable_archiving : 1; gboolean shift_pressed : 1; GtkUIManager* ui; GtkActionGroup* act_grp; GtkMenu* menu; FmLaunchFolderFunc folder_func; gpointer folder_func_data; FmPath* cwd; }; static void on_open(GtkAction* action, gpointer user_data); static void on_open_with_app(GtkAction* action, gpointer user_data); static void on_open_with(GtkAction* action, gpointer user_data); static void on_cut(GtkAction* action, gpointer user_data); static void on_copy(GtkAction* action, gpointer user_data); static void on_paste(GtkAction* action, gpointer user_data); static void on_delete(GtkAction* action, gpointer user_data); static void on_copy_path(GtkAction* action, gpointer user_data); static void on_hide(GtkAction* action, FmFileMenu* menu); static void on_unhide(GtkAction* action, FmFileMenu* menu); static void on_add_bookmark(GtkAction* action, FmFileMenu* menu); static void on_rename(GtkAction* action, gpointer user_data); static void on_compress(GtkAction* action, gpointer user_data); static void on_extract_here(GtkAction* action, gpointer user_data); static void on_extract_to(GtkAction* action, gpointer user_data); static void on_prop(GtkAction* action, gpointer user_data); const char base_menu_xml[]= "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""; /* FIXME: how to show accel keys in the popup menu? */ GtkActionEntry base_menu_actions[]= { {"Open", GTK_STOCK_OPEN, N_("_Open"), NULL, NULL, G_CALLBACK(on_open)}, {"OpenWith", NULL, N_("Open _With..."), NULL, NULL, G_CALLBACK(on_open_with)}, {"OpenWithMenu", NULL, N_("Open _With"), NULL, NULL, NULL}, {"Cut", GTK_STOCK_CUT, NULL, NULL, NULL, G_CALLBACK(on_cut)}, {"Copy", GTK_STOCK_COPY, NULL, NULL, NULL, G_CALLBACK(on_copy)}, {"Paste", GTK_STOCK_PASTE, NULL, NULL, NULL, G_CALLBACK(on_paste)}, {"Del", GTK_STOCK_DELETE, NULL, NULL, NULL, G_CALLBACK(on_delete)}, {"CopyPath", NULL, N_("Copy Pa_th(s)"), NULL, NULL, G_CALLBACK(on_copy_path)}, {"Hide", NULL, N_("H_ide"), NULL, NULL, G_CALLBACK(on_hide)}, {"Unhide", NULL, N_("Unh_ide"), NULL, NULL, G_CALLBACK(on_unhide)}, {"AddBookmark", GTK_STOCK_ADD, N_("_Add to Bookmarks"), NULL, NULL, G_CALLBACK(on_add_bookmark)}, {"Rename", NULL, N_("_Rename..."), NULL, NULL, G_CALLBACK(on_rename)}, {"Compress", NULL, N_("Co_mpress..."), NULL, NULL, G_CALLBACK(on_compress)}, {"Extract", NULL, N_("Extract _Here"), NULL, NULL, G_CALLBACK(on_extract_here)}, {"ExtractTo", NULL, N_("E_xtract To..."), NULL, NULL, G_CALLBACK(on_extract_to)}, {"Prop", GTK_STOCK_PROPERTIES, N_("Prop_erties"), NULL, NULL, G_CALLBACK(on_prop)} }; /* plugins for MIME type */ typedef struct { FmMimeType *mime_type; FmFileMenuMimeAddonInit cb; /* callbacks */ } FmFileMenuMimeExt; static GList *extensions = NULL; /* elements are FmFileMenuMimeExt */ /** * fm_file_menu_destroy * @menu: a menu * * Destroys menu object. * * Since: 0.1.0 */ void fm_file_menu_destroy(FmFileMenu* menu) { GObject *win = G_OBJECT(gtk_menu_get_attach_widget(menu->menu)); if (win) g_object_weak_unref(win, (GWeakNotify)gtk_menu_detach, menu->menu); gtk_menu_detach(menu->menu); gtk_widget_destroy(GTK_WIDGET(menu->menu)); if(menu->file_infos) fm_file_info_list_unref(menu->file_infos); if(menu->cwd) fm_path_unref(menu->cwd); g_object_unref(menu->act_grp); g_object_unref(menu->ui); g_slice_free(FmFileMenu, menu); } /** * fm_file_menu_new_for_file * @parent: window to place menu over * @fi: target file * @cwd: working directory * @auto_destroy: %TRUE if manu should be destroyed after some action was activated * * Creates new menu for the file. * * Returns: a new #FmFileMenu object. * * Since: 0.1.0 */ FmFileMenu* fm_file_menu_new_for_file(GtkWindow* parent, FmFileInfo* fi, FmPath* cwd, gboolean auto_destroy) { FmFileMenu* menu; FmFileInfoList* files = fm_file_info_list_new(); fm_file_info_list_push_tail(files, fi); menu = fm_file_menu_new_for_files(parent, files, cwd, auto_destroy); fm_file_info_list_unref(files); return menu; } static gboolean on_key_pressed(GtkWidget *widget, GdkEventKey *event, FmFileMenu *data) { GtkAction *act; GdkModifierType mask = 0; gdk_window_get_device_position (gtk_widget_get_window(widget), gdk_device_manager_get_client_pointer( gdk_display_get_device_manager( gdk_screen_get_display( gtk_widget_get_screen(widget)))), NULL, NULL, &mask); if (mask & GDK_SHIFT_MASK) { if (!data->shift_pressed) { data->shift_pressed = TRUE; act = gtk_ui_manager_get_action(data->ui, "/popup/Del"); gtk_action_set_label(act, NULL); gtk_action_set_stock_id(act, GTK_STOCK_REMOVE); } } return FALSE; } static gboolean on_key_released(GtkWidget *widget, GdkEventKey *event, FmFileMenu *data) { GtkAction *act; GdkModifierType mask = 0; gdk_window_get_device_position (gtk_widget_get_window(widget), gdk_device_manager_get_client_pointer( gdk_display_get_device_manager( gdk_screen_get_display( gtk_widget_get_screen(widget)))), NULL, NULL, &mask); if (!(mask & GDK_SHIFT_MASK)) { if (data->shift_pressed) { data->shift_pressed = FALSE; act = gtk_ui_manager_get_action(data->ui, "/popup/Del"); /* Note to translators: Trash in not noun but verb here */ gtk_action_set_label(act, _("Move to _Trash")); gtk_action_set_stock_id(act, GTK_STOCK_DELETE); } } return FALSE; } /** * fm_file_menu_new_for_files * @parent: window to place menu over * @files: target files * @cwd: working directory * @auto_destroy: %TRUE if manu should be destroyed after some action was activated * * Creates new menu for some files list. * * Returns: a new #FmFileMenu object. * * Since: 0.1.0 */ FmFileMenu* fm_file_menu_new_for_files(GtkWindow* parent, FmFileInfoList* files, FmPath* cwd, gboolean auto_destroy) { GtkUIManager* ui; GtkActionGroup* act_grp; GtkAction* act; FmFileInfo* fi; FmFileMenu* data = g_slice_new0(FmFileMenu); GString* xml; GList* mime_types = NULL; GList* l; GList* apps = NULL; gboolean all_native = TRUE; unsigned items_num = fm_file_info_list_get_length(files); data->file_infos = fm_file_info_list_ref(files); /* create list of mime types */ for(l = fm_file_info_list_peek_head_link(files); l; l = l->next) { FmMimeType* mime_type; GList* l2; fi = l->data; if (!fm_file_info_is_native(fi)) all_native = FALSE; else if (all_native && fm_file_info_is_shortcut(fi)) { /* this takes some time but it's inevitable */ FmPath *tp = fm_path_new_for_str(fm_file_info_get_target(fi)); if (!fm_path_is_native(tp)) all_native = FALSE; fm_path_unref(tp); } mime_type = fm_file_info_get_mime_type(fi); if(mime_type == NULL) continue; for(l2 = mime_types; l2; l2 = l2->next) if(l2->data == mime_type) break; if(l2) /* already added */ continue; mime_types = g_list_prepend(mime_types, fm_mime_type_ref(mime_type)); } fi = fm_file_info_list_peek_head(files); /* we'll test it below */ /* create apps list */ if(mime_types) { data->same_type = (mime_types->next == NULL); apps = g_app_info_get_all_for_type(fm_mime_type_get_type(mime_types->data)); for(l = mime_types->next; l; l = l->next) { GList *apps2, *l2, *l3; apps2 = g_app_info_get_all_for_type(fm_mime_type_get_type(l->data)); for(l2 = apps; l2; ) { for(l3 = apps2; l3; l3 = l3->next) if(g_app_info_equal(l2->data, l3->data)) break; if(l3) /* this app supports all files */ { /* g_debug("%s supports %s", g_app_info_get_id(l2->data), fm_mime_type_get_type(l->data)); */ l2 = l2->next; continue; } /* g_debug("%s invalid for %s", g_app_info_get_id(l2->data), fm_mime_type_get_type(l->data)); */ g_object_unref(l2->data); l3 = l2->next; /* save for next iter */ apps = g_list_delete_link(apps, l2); l2 = l3; /* continue with next item */ } g_list_foreach(apps2, (GFunc)g_object_unref, NULL); g_list_free(apps2); } } data->ui = ui = gtk_ui_manager_new(); data->act_grp = act_grp = gtk_action_group_new("Popup"); gtk_action_group_set_translation_domain(act_grp, GETTEXT_PACKAGE); if(cwd) data->cwd = fm_path_ref(cwd); gtk_action_group_add_actions(act_grp, base_menu_actions, G_N_ELEMENTS(base_menu_actions), data); gtk_ui_manager_add_ui_from_string(ui, base_menu_xml, -1, NULL); gtk_ui_manager_insert_action_group(ui, act_grp, 0); xml = g_string_new(""); if(apps) /* add specific menu items for those files */ { gboolean use_sub = g_list_length(apps) > 5; gboolean found_app = FALSE; if(use_sub) g_string_append(xml, ""); for(l=apps;l;l=l->next) { GAppInfo* app = l->data; /*g_debug("app %s, executable %s, command %s\n", g_app_info_get_name(app), g_app_info_get_executable(app), g_app_info_get_commandline(app));*/ gchar * program_path = g_find_program_in_path(g_app_info_get_executable(app)); if (!program_path) goto _next_app; g_free(program_path); if (!all_native && !g_app_info_supports_uris(app)) { _next_app: g_object_unref(app); continue; } found_app = TRUE; act = gtk_action_new(g_app_info_get_id(app), g_app_info_get_name(app), g_app_info_get_description(app), NULL); g_signal_connect(act, "activate", G_CALLBACK(on_open_with_app), data); gtk_action_set_gicon(act, g_app_info_get_icon(app)); gtk_action_group_add_action(act_grp, act); g_object_unref(act); /* associate the app info object with the action */ g_object_set_qdata_full(G_OBJECT(act), fm_qdata_id, app, g_object_unref); g_string_append_printf(xml, "", g_app_info_get_id(app)); } g_list_free(apps); /* don't unref GAppInfos now */ if (!found_app) goto _disable_open; if(use_sub) { g_string_append(xml, "" "" ""); } else g_string_append(xml, ""); } else { _disable_open: act = gtk_ui_manager_get_action(ui, "/popup/Open"); gtk_action_set_visible(act, FALSE); g_string_append(xml, ""); } g_string_append(xml, ""); if (items_num == 1 && fm_file_info_can_set_hidden(fi)) { g_string_append(xml, ""); if (fm_file_info_is_hidden(fi)) g_string_append(xml, ""); else g_string_append(xml, ""); g_string_append(xml, ""); } if (data->same_type) { CHECK_MODULES(); /* run mime-specific extensions */ for (l = extensions; l; l = l->next) { register FmFileMenuMimeExt *ext = l->data; if (ext->mime_type == mime_types->data) /* the same mime type */ if (ext->cb.update_file_menu_for_mime_type != NULL) ext->cb.update_file_menu_for_mime_type(parent, ui, xml, act_grp, data, files, (items_num == 1)); } } /* archiver integration */ if (all_native) { FmArchiver* archiver = fm_archiver_get_default(); if(archiver) { g_string_append(xml, ""); for (l = mime_types; l; l = l->next) if (!fm_archiver_is_mime_type_supported(archiver, fm_mime_type_get_type(l->data))) break; if (mime_types && l == NULL) /* all are archives */ { if(data->cwd && archiver->extract_to_cmd) g_string_append(xml, ""); if(archiver->extract_cmd) g_string_append(xml, ""); } else g_string_append(xml, ""); g_string_append(xml, ""); } } g_list_foreach(mime_types, (GFunc)fm_mime_type_unref, NULL); g_list_free(mime_types); /* shadow 'Paste' if clipboard is empty and unshadow if not */ act = gtk_ui_manager_get_action(ui, "/popup/Paste"); if(items_num != 1 || !fm_file_info_is_dir(fi)) { gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/AddBookmark"); gtk_action_set_visible(act, FALSE); } else if (!fm_file_info_is_writable_directory(fi)) /* it is still directory but file system is R/O */ gtk_action_set_visible(act, FALSE); else gtk_action_set_sensitive(act, fm_clipboard_have_files(GTK_WIDGET(parent))); if (items_num != 1 || !fm_file_info_can_set_name(fi) || /* unfortunately GIO doesn't support changing the .desktop files but treats them as usual files, we can rename only file names, not display names so we have no choice but disable this option */ fm_file_info_is_shortcut(fi) || fm_file_info_is_desktop_entry(fi)) { act = gtk_ui_manager_get_action(ui, "/popup/Rename"); gtk_action_set_visible(act, FALSE); } gtk_ui_manager_add_ui_from_string(ui, xml->str, xml->len, NULL); data->menu = GTK_MENU(gtk_ui_manager_get_widget(data->ui, "/popup")); gtk_menu_attach_to_widget(data->menu, GTK_WIDGET(parent), NULL); g_object_weak_ref(G_OBJECT(parent), (GWeakNotify)gtk_menu_detach, data->menu); fm_widget_menu_fix_tooltips(data->menu); if(auto_destroy) { g_signal_connect_swapped(data->menu, "selection-done", G_CALLBACK(fm_file_menu_destroy), data); } if (fm_config->use_trash && all_native) { data->can_trash = TRUE; /* change menu item text&icon when Shift is pressed */ g_signal_connect(data->menu, "key-press-event", G_CALLBACK(on_key_pressed), data); g_signal_connect(data->menu, "key-release-event", G_CALLBACK(on_key_released), data); act = gtk_ui_manager_get_action(ui, "/popup/Del"); gtk_action_set_label(act, _("Move to _Trash")); } g_string_free(xml, TRUE); return data; } /** * fm_file_menu_get_ui * @menu: a menu * * Retrieves UI manager object for @menu. Returned data are owned by * @menu and should be not freed by caller. * * Returns: (transfer none): UI manager. * * Since: 0.1.0 */ GtkUIManager* fm_file_menu_get_ui(FmFileMenu* menu) { return menu->ui; } /** * fm_file_menu_get_action_group * @menu: a menu * * Retrieves action group for @menu. Returned data are owned by * @menu and should be not freed by caller. * * Returns: (transfer none): the action group. * * Since: 0.1.0 */ GtkActionGroup* fm_file_menu_get_action_group(FmFileMenu* menu) { return menu->act_grp; } /** * fm_file_menu_get_file_info_list * @menu: a menu * * Retrieves list of files @menu was created for. Returned data are owned * by @menu and should be not freed by caller. * * Returns: (transfer none): list of files. * * Since: 0.1.0 */ FmFileInfoList* fm_file_menu_get_file_info_list(FmFileMenu* menu) { return menu->file_infos; } /** * fm_file_menu_get_menu * @menu: a menu * * Retrieves #GtkMenu widget built with GtkUIManager. Returned data are * owned by @menu and should be not freed by caller. * * Returns: (transfer none): created #GtkMenu widget. * * Since: 0.1.0 */ GtkMenu* fm_file_menu_get_menu(FmFileMenu* menu) { return menu->menu; } /** * fm_file_menu_get_cwd * @menu: a menu * * Retrieves working directory @menu was created for. Returned data are owned * by @menu and should be not freed by caller. * * Returns: (transfer none): working directory path. * * Since: 1.3.0 */ FmPath* fm_file_menu_get_cwd(FmFileMenu* menu) { return menu->cwd; } static void on_open(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; GList* l = fm_file_info_list_peek_head_link(data->file_infos); GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(data->menu)); fm_launch_files_simple(window, NULL, l, data->folder_func, data->folder_func_data); } static void open_with_app(FmFileMenu* data, GAppInfo* app) { GdkAppLaunchContext* ctx; FmFileInfoList* files = data->file_infos; GList* l = fm_file_info_list_peek_head_link(files); GList* uris = NULL; int i; for(i=0; l; ++i, l=l->next) { FmFileInfo* fi = FM_FILE_INFO(l->data); FmPath *path; char *uri; /* handle shortcuts here */ if (fm_file_info_is_shortcut(fi)) uri = g_strdup(fm_file_info_get_target(fi)); else { path = fm_file_info_get_path(fi); uri = fm_path_to_uri(path); } uris = g_list_prepend(uris, uri); } uris = g_list_reverse(uris); ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); gdk_app_launch_context_set_screen(ctx, gtk_widget_get_screen(GTK_WIDGET(data->menu))); gdk_app_launch_context_set_icon(ctx, g_app_info_get_icon(app)); gdk_app_launch_context_set_timestamp(ctx, gtk_get_current_event_time()); /* FIXME: error handling. */ fm_app_info_launch_uris(app, uris, G_APP_LAUNCH_CONTEXT(ctx), NULL); g_object_unref(ctx); g_list_foreach(uris, (GFunc)g_free, NULL); g_list_free(uris); } static void on_open_with_app(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; GAppInfo* app = G_APP_INFO(g_object_get_qdata(G_OBJECT(action), fm_qdata_id)); /* g_debug("%s", gtk_action_get_name(action)); */ open_with_app(data, app); } static void on_open_with(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmFileInfoList* files = data->file_infos; FmFileInfo* fi = fm_file_info_list_peek_head(files); FmMimeType* mime_type; GAppInfo* app; GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(data->menu)); if(data->same_type) mime_type = fm_file_info_get_mime_type(fi); else mime_type = NULL; app = fm_choose_app_for_mime_type(window, mime_type, TRUE); if(app) { open_with_app(data, app); g_object_unref(app); } } static void on_cut(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmPathList* files; files = fm_path_list_new_from_file_info_list(data->file_infos); fm_clipboard_cut_files(gtk_menu_get_attach_widget(data->menu), files); fm_path_list_unref(files); } static void on_copy(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmPathList* files; files = fm_path_list_new_from_file_info_list(data->file_infos); fm_clipboard_copy_files(gtk_menu_get_attach_widget(data->menu), files); fm_path_list_unref(files); } static void on_paste(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmFileInfo* fi = fm_file_info_list_peek_head(data->file_infos); if (fi) { fm_clipboard_paste_files(gtk_menu_get_attach_widget(data->menu), fm_file_info_get_path(fi)); } } static void on_delete(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmPathList* files; GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(data->menu)); files = fm_path_list_new_from_file_info_list(data->file_infos); /* Fix for #3436283: accept Shift to delete instead of trash */ if (!data->can_trash || data->shift_pressed) fm_delete_files(window, files); else fm_trash_or_delete_files(window, files); fm_path_list_unref(files); } static void on_copy_path(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; GList *fl; GtkWidget *widget = gtk_menu_get_attach_widget(data->menu); GdkDisplay* dpy = widget ? gtk_widget_get_display(widget) : gdk_display_get_default(); GtkClipboard* clipboard = gtk_clipboard_get_for_display(dpy, GDK_SELECTION_CLIPBOARD); GString *str = g_string_sized_new(128); for (fl = fm_file_info_list_peek_head_link(data->file_infos); fl; fl = fl->next) { char *path = fm_path_to_str(fm_file_info_get_path(fl->data)); if (str->len > 0) g_string_append_c(str, '\n'); g_string_append(str, path); g_free(path); } gtk_clipboard_set_text(clipboard, str->str, str->len); g_string_free(str, TRUE); } static void on_hide(GtkAction* action, FmFileMenu* menu) { GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(menu->menu)); FmFileInfo *fi = fm_file_info_list_peek_head(menu->file_infos); fm_hide_file(window, fm_file_info_get_path(fi)); } static void on_unhide(GtkAction* action, FmFileMenu* menu) { GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(menu->menu)); FmFileInfo *fi = fm_file_info_list_peek_head(menu->file_infos); fm_unhide_file(window, fm_file_info_get_path(fi)); } static void on_add_bookmark(GtkAction* action, FmFileMenu* menu) { FmFileInfo* fi = fm_file_info_list_peek_head(menu->file_infos); FmBookmarks* bookmarks; FmPath *path; GList *all, *l; if(fi) { bookmarks = fm_bookmarks_dup(); path = fm_file_info_get_path(fi); all = fm_bookmarks_get_all(bookmarks); for (l = all; l; l = l->next) if (path == ((FmBookmarkItem*)l->data)->path) break; g_list_free_full(all, (GDestroyNotify)fm_bookmark_item_unref); if (l == NULL) fm_bookmarks_append(bookmarks, path, fm_file_info_get_disp_name(fi)); else fm_show_error(GTK_WINDOW(gtk_menu_get_attach_widget(menu->menu)), NULL, _("Your bookmarks already have a bookmark for this folder.")); g_object_unref(bookmarks); } } static void on_rename(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmFileInfo* fi = fm_file_info_list_peek_head(data->file_infos); GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(data->menu)); if(fi) fm_rename_file(window, fm_file_info_get_path(fi)); } static void on_compress(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmPathList* files; FmArchiver* archiver = fm_archiver_get_default(); if(archiver) { GAppLaunchContext* ctx = (GAppLaunchContext*)gdk_display_get_app_launch_context(gdk_display_get_default()); files = fm_path_list_new_from_file_info_list(data->file_infos); fm_archiver_create_archive(archiver, ctx, files); fm_path_list_unref(files); g_object_unref(ctx); } } static void on_extract_here(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmPathList* files; FmArchiver* archiver = fm_archiver_get_default(); if(archiver) { GAppLaunchContext* ctx = (GAppLaunchContext*)gdk_display_get_app_launch_context(gdk_display_get_default()); files = fm_path_list_new_from_file_info_list(data->file_infos); fm_archiver_extract_archives_to(archiver, ctx, files, data->cwd); fm_path_list_unref(files); g_object_unref(ctx); } } static void on_extract_to(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; FmPathList* files; FmArchiver* archiver = fm_archiver_get_default(); if(archiver) { GAppLaunchContext* ctx = (GAppLaunchContext*)gdk_display_get_app_launch_context(gdk_display_get_default()); files = fm_path_list_new_from_file_info_list(data->file_infos); fm_archiver_extract_archives(archiver, ctx, files); fm_path_list_unref(files); g_object_unref(ctx); } } static void on_prop(GtkAction* action, gpointer user_data) { FmFileMenu* data = (FmFileMenu*)user_data; GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(data->menu)); fm_show_file_properties(window, data->file_infos); } /** * fm_file_menu_is_single_file_type * @menu: a menu * * Checks if @menu was created for files of the same type. * * Returns: %TRUE if menu is single-type. * * Since: 0.1.0 */ gboolean fm_file_menu_is_single_file_type(FmFileMenu* menu) { return menu->same_type; } /** * fm_file_menu_set_folder_func * @menu: a menu * @func: function to open folder * @user_data: data supplied for @func * * Sets up function to open folders for @menu. Function will be called * if action 'Open' was activated for some folder. * * Since: 0.1.0 */ void fm_file_menu_set_folder_func(FmFileMenu* menu, FmLaunchFolderFunc func, gpointer user_data) { menu->folder_func = func; menu->folder_func_data = user_data; } /* modules support */ FM_MODULE_DEFINE_TYPE(gtk_menu_mime, FmFileMenuMimeAddonInit, 1) static gboolean fm_module_callback_gtk_menu_mime(const char *name, gpointer init, int ver) { FmFileMenuMimeExt *ext = g_slice_new(FmFileMenuMimeExt); FmFileMenuMimeAddonInit *cb = init; /* not checking version, it's only 1 for now */ ext->mime_type = fm_mime_type_from_name(name); ext->cb = *cb; if (cb->init != NULL) cb->init(); extensions = g_list_append(extensions, ext); return TRUE; } void _fm_file_menu_init(void) { fm_module_register_gtk_menu_mime(); } void _fm_file_menu_finalize(void) { GList *list, *l; FmFileMenuMimeExt *ext; list = extensions; extensions = NULL; for (l = list; l; l = l->next) { ext = l->data; if (ext->cb.finalize != NULL) ext->cb.finalize(); if (ext->mime_type != NULL) fm_mime_type_unref(ext->mime_type); g_slice_free(FmFileMenuMimeExt, ext); } g_list_free(list); fm_module_unregister_type("gtk_menu_mime"); } libfm-1.4.0/src/gtk/fm-file-menu.h000066400000000000000000000075551475513661000166370ustar00rootroot00000000000000/* * fm-file-menu.h * * Copyright 2009 PCMan * Copyright 2013-2018 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_FILE_MENU_H__ #define __FM_FILE_MENU_H__ #include #include "fm-file-info.h" #include "fm-file-launcher.h" #include "fm-module.h" G_BEGIN_DECLS typedef struct _FmFileMenu FmFileMenu; FmFileMenu* fm_file_menu_new_for_file(GtkWindow* parent, FmFileInfo* fi, FmPath* cwd, gboolean auto_destroy); FmFileMenu* fm_file_menu_new_for_files(GtkWindow* parent, FmFileInfoList* files, FmPath* cwd, gboolean auto_destroy); void fm_file_menu_destroy(FmFileMenu* menu); gboolean fm_file_menu_is_single_file_type(FmFileMenu* menu); GtkUIManager* fm_file_menu_get_ui(FmFileMenu* menu); GtkActionGroup* fm_file_menu_get_action_group(FmFileMenu* menu); /* build the menu with GtkUIManager */ GtkMenu* fm_file_menu_get_menu(FmFileMenu* menu); /* call fm_file_info_list_ref() if you need to own reference to the returned list. */ FmFileInfoList* fm_file_menu_get_file_info_list(FmFileMenu* menu); FmPath* fm_file_menu_get_cwd(FmFileMenu* menu); void fm_file_menu_set_folder_func(FmFileMenu* menu, FmLaunchFolderFunc func, gpointer user_data); /** * FmFileMenuUpdatePopup * @window: the parent window for popup * @ui: the object to add interface * @xml: container where callback should append XML definition * @act_grp: group of actions to add action * @menu: the menu descriptor * @files: list of files for current popup menu * @single_file: %TRUE is @menu was created for single file * * The callback to update popup menu. It can disable items of menu, add * some new, replace actions, etc. depending of the window and files. */ typedef void (*FmFileMenuUpdatePopup)(GtkWindow* window, GtkUIManager* ui, GString* xml, GtkActionGroup* act_grp, FmFileMenu* menu, FmFileInfoList* files, gboolean single_file); /* modules "gtk_menu_mime" stuff */ typedef struct _FmFileMenuMimeAddonInit FmFileMenuMimeAddonInit; /** * FmFileMenuMimeAddonInit: * @init: (allow-none): callback for plugin initialization * @finalize: (allow-none): callback to free resources allocated by @init * @update_file_menu_for_mime_type: (allow-none): callback to update selection context menu * * The @init and @finalize callbacks are called on application start and exit. * * The @update_file_menu_for_mime_type callback will be called each time * context menu is created for files that have the same context type. * * This structure is used for "gtk_menu_mime" module initialization. The * key for module of this type is content type (MIME name) to support. No * wildcards are supported. * * Since: 1.2.0 */ struct _FmFileMenuMimeAddonInit { void (*init)(void); void (*finalize)(void); FmFileMenuUpdatePopup update_file_menu_for_mime_type; }; #define FM_MODULE_gtk_menu_mime_VERSION 1 extern FmFileMenuMimeAddonInit fm_module_init_gtk_menu_mime; void _fm_file_menu_init(void); void _fm_file_menu_finalize(void); G_END_DECLS #endif /* __FM_FILE_MENU_H__ */ libfm-1.4.0/src/gtk/fm-file-properties.c000066400000000000000000001517561475513661000200650ustar00rootroot00000000000000/* * fm-file-properties.c * * Copyright 2009 PCMan * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2024 Ingo Brückl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-file-properties * @short_description: Dialog window for changing properties of file. * @title: File properties dialog * * @include: libfm/fm-gtk.h * * The file properties dialog is a window with few tabs and buttons "OK" * and "Cancel". Most of content of those tabs is handled by the widget * itself but there is a possibility to change its content for some file * type. See fm_file_properties_add_for_mime_type() for details. * * Default content of tabs of file properties dialog follows (each tab has * a GtkAlignment element, tab ids below meant of those): * * Tab 1: contains GtkTable (id general_table) with items: * - GtkImage (id icon) : file icon, eventbox: id icon_eventbox * - GtkLabel (id file) : reserved (hidden), hidden label: id file_label * - GtkEntry (id name) : label: "Name" * - GtkLabel (id dir) : label: "Location" * - GtkLabel (id target) : label: "Target", id target_label * - GtkLabel (id type) : label: "File type" * - GtkComboBox (id open_with) : label: "Open with", id open_with_label * - GtkLabel (id total_files) : (hidden) label: "Total count of files", id total_files_label * - GtkLabel (id total_size) : label: "Total Size of Files", id total_size_label * - GtkLabel (id size_on_disk) : label: "Size on Disk", id size_on_disk_label * - GtkLabel (id mtime) : label: "Last Modification", id mtime_label * - GtkLabel (id atime) : label: "Last Access", id atime_label * - GtkLabel (id ctime) : (hidden) label: "Last Permissions Change", id ctime_label * * Tab 2: id permissions_tab, contains items inside: * - GtkEntry (id owner) : label: "Owner", id owner_label * - GtkEntry (id group) : label: "Group", id group_label * - GtkComboBox (id read_perm) : label: "View content" * - GtkComboBox (id write_perm) : label: "Change content" * - GtkComboBox (id exec_perm) : label: "Execute", id exec_label * - GtkComboBox (id flags_set_file) : label: "Special bits", id flags_label * - GtkComboBox (id flags_set_dir) : share the place with flags_set_file * - GtkCheckButton (id hidden) "Hidden file" * * Tab 3: id extra_tab (hidden), empty, label: id extra_tab_label * * Since gtk_table_get_size() is available only for GTK 2.22 ... GTK 3.4 * it is not generally recommended to change size of GtkTable but be also * aware that gtk_table_attach() is marked deprecated in GTK 3.4 though. * * Widget sets icon activatable if target file supports icon change. If * user changes icon then its name (either themed name or file path) will * be stored as GQuark fm_qdata_id in GtkImage "icon" (see above). * * Widget sets name entry editable if target file supports renaming. Both * icon name and file name will be checked after extensions are finished * therefore extensions have a chance to reset the data and widget will * not do own processing. */ #include #include #include #include #include #include #include #include #include #include #include #include "fm.h" #include "fm-file-properties.h" #include "fm-progress-dlg.h" #include "fm-gtk-utils.h" #include "fm-app-chooser-combo-box.h" #include "gtk-compat.h" #define UI_FILE PACKAGE_UI_DIR"/file-prop.ui" #define GET_WIDGET(transform,name) data->name = transform(gtk_builder_get_object(builder, #name)) /* for 'Read' combo box */ enum { NO_CHANGE = 0, READ_USER, READ_GROUP, READ_ALL }; /* for 'Write' and 'Exec'/'Enter' combo box */ enum { /* NO_CHANGE, */ ACCESS_NOBODY = 1, ACCESS_USER, ACCESS_GROUP, ACCESS_ALL }; /* for files-only 'Special' combo box */ enum { /* NO_CHANGE, */ FILE_COMMON = 1, FILE_SUID, FILE_SGID, FILE_SUID_SGID }; /* for directories-only 'Special' combo box */ enum { /* NO_CHANGE, */ DIR_COMMON = 1, DIR_STICKY, DIR_SGID, DIR_STICKY_SGID }; typedef struct _FmFilePropExt FmFilePropExt; struct _FmFilePropExt { FmFilePropExt *next; /* built-in GSList */ FmMimeType *type; FmFilePropertiesExtensionInit cb; /* callbacks */ }; static FmFilePropExt *extensions = NULL; typedef struct _FmFilePropData FmFilePropData; struct _FmFilePropData { GtkDialog* dlg; /* General page */ GtkTable* general_table; GtkImage* icon; GtkWidget* icon_eventbox; GtkEntry* name; GtkLabel* file; GtkLabel* file_label; GtkLabel* dir; GtkLabel* target; GtkWidget* target_label; GtkLabel* type; GtkWidget* open_with_label; GtkComboBox* open_with; GtkLabel* total_files; GtkWidget* total_files_label; GtkLabel* total_size; GtkLabel* size_on_disk; GtkLabel* mtime; GtkWidget* mtime_label; GtkLabel* atime; GtkWidget* atime_label; GtkLabel* ctime; GtkWidget* ctime_label; /* Permissions page */ GtkWidget* permissions_tab; GtkEntry* owner; char* orig_owner; GtkEntry* group; char* orig_group; GtkComboBox* read_perm; int read_perm_sel; GtkComboBox* write_perm; int write_perm_sel; GtkLabel* exec_label; GtkComboBox* exec_perm; int exec_perm_sel; GtkLabel* flags_label; GtkComboBox* flags_set_file; GtkComboBox* flags_set_dir; int flags_set_sel; GtkWidget *hidden; FmFileInfoList* files; FmFileInfo* fi; gboolean single_type; gboolean single_file; gboolean all_native; gboolean has_dir; gboolean all_dirs; FmMimeType* mime_type; gint32 uid; gint32 gid; guint timeout; FmDeepCountJob* dc_job; GSList *ext; /* elements: FmFilePropExt */ GSList *extdata; }; /* ---- icon change handling ---- */ /* this handler is taken from lxshortcut and modified a bit */ static void on_update_preview(GtkFileChooser* chooser, GtkImage* img) { char *file = gtk_file_chooser_get_preview_filename(chooser); if (file) { GdkPixbuf *pix = gdk_pixbuf_new_from_file_at_scale(file, 48, 48, TRUE, NULL); if (pix) { gtk_image_set_from_pixbuf(img, pix); g_object_unref(pix); return; } } gtk_image_clear(img); } static void on_toggle_theme(GtkToggleButton *btn, GtkNotebook *notebook) { gtk_notebook_set_current_page(notebook, 0); } static void on_toggle_files(GtkToggleButton *btn, GtkNotebook *notebook) { gtk_notebook_set_current_page(notebook, 1); } static GdkPixbuf *vfs_load_icon(GtkIconTheme *theme, const char *icon_name, int size) { GdkPixbuf *icon = NULL; const char *file; GtkIconInfo *inf = gtk_icon_theme_lookup_icon(theme, icon_name, size, GTK_ICON_LOOKUP_USE_BUILTIN); if (G_UNLIKELY(!inf)) return NULL; file = gtk_icon_info_get_filename(inf); if (G_LIKELY(file)) icon = gdk_pixbuf_new_from_file_at_scale(file, size, size, TRUE, NULL); else { icon = gtk_icon_info_get_builtin_pixbuf(inf); g_object_ref(icon); } gtk_icon_info_free(inf); if (G_LIKELY(icon)) /* scale down the icon if it's too big */ { int width, height; height = gdk_pixbuf_get_height(icon); width = gdk_pixbuf_get_width(icon); if (G_UNLIKELY(height > size || width > size)) { GdkPixbuf *scaled; if (height > width) { width = size * height / width; height = size; } else if (height < width) { height = size * width / height; width = size; } else height = width = size; scaled = gdk_pixbuf_scale_simple(icon, width, height, GDK_INTERP_BILINEAR); g_object_unref(icon); icon = scaled; } } return icon; } typedef struct { GtkIconView *view; GtkListStore *model; GAsyncQueue *queue; } IconThreadData; static gpointer load_themed_icon(GtkIconTheme *theme, IconThreadData *data) { GdkPixbuf *pix; char *icon_name = g_async_queue_pop(data->queue); GDK_THREADS_ENTER(); pix = vfs_load_icon(theme, icon_name, 48); if (pix) { GtkTreeIter it; gtk_list_store_append(data->model, &it); gtk_list_store_set(data->model, &it, 0, pix, 1, icon_name, -1); g_object_unref(pix); } if (g_async_queue_length(data->queue) == 0) { if (gtk_icon_view_get_model(data->view) == NULL) { gtk_icon_view_set_model(data->view, GTK_TREE_MODEL(data->model)); #if GTK_CHECK_VERSION(2, 20, 0) if (gtk_widget_get_realized(GTK_WIDGET(data->view))) gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(data->view)), NULL); #else if (GTK_WIDGET_REALIZED(GTK_WIDGET(data->view))) gdk_window_set_cursor(GTK_WIDGET(data->view)->window, NULL); #endif } } GDK_THREADS_LEAVE(); g_thread_yield(); /* g_debug("load: %s", icon_name); */ g_free(icon_name); return NULL; } static void _change_icon(GtkWidget *dlg, FmFilePropData *data) { GtkBuilder *builder; GtkFileChooser *chooser; GtkWidget *chooser_dlg, *preview, *notebook; GtkFileFilter *filter; GtkIconTheme *theme; GList *contexts, *l; GThreadPool *thread_pool; IconThreadData thread_data; builder = gtk_builder_new(); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/choose-icon.ui", NULL); chooser_dlg = GTK_WIDGET(gtk_builder_get_object(builder, "dlg")); chooser = GTK_FILE_CHOOSER(gtk_builder_get_object(builder, "chooser")); thread_data.view = GTK_ICON_VIEW(gtk_builder_get_object(builder, "icons")); notebook = GTK_WIDGET(gtk_builder_get_object(builder, "notebook")); g_signal_connect(gtk_builder_get_object(builder,"theme"), "toggled", G_CALLBACK(on_toggle_theme), notebook); g_signal_connect(gtk_builder_get_object(builder,"files"), "toggled", G_CALLBACK(on_toggle_files), notebook); gtk_window_set_default_size(GTK_WINDOW(chooser_dlg), 600, 440); gtk_window_set_transient_for(GTK_WINDOW(chooser_dlg), GTK_WINDOW(dlg)); preview = gtk_image_new(); gtk_widget_show(preview); gtk_file_chooser_set_preview_widget(chooser, preview); g_signal_connect(chooser, "update-preview", G_CALLBACK(on_update_preview), GTK_IMAGE(preview)); filter = gtk_file_filter_new(); gtk_file_filter_set_name(GTK_FILE_FILTER(filter), _("Image files")); gtk_file_filter_add_pixbuf_formats(GTK_FILE_FILTER(filter)); gtk_file_chooser_add_filter(chooser, filter); gtk_file_chooser_set_local_only(chooser, TRUE); gtk_file_chooser_set_select_multiple(chooser, FALSE); gtk_file_chooser_set_use_preview_label(chooser, FALSE); gtk_widget_show(chooser_dlg); while (gtk_events_pending()) gtk_main_iteration(); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(thread_data.view)), gdk_cursor_new(GDK_WATCH)); /* load themed icons */ thread_pool = g_thread_pool_new((GFunc)load_themed_icon, &thread_data, 1, TRUE, NULL); g_thread_pool_set_max_threads(thread_pool, 1, NULL); thread_data.queue = g_async_queue_new(); thread_data.model = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING); theme = gtk_icon_theme_get_default(); gtk_icon_view_set_pixbuf_column(thread_data.view, 0); gtk_icon_view_set_item_width(thread_data.view, 80); gtk_icon_view_set_text_column(thread_data.view, 1); /* GList* contexts = gtk_icon_theme_list_contexts(theme); */ contexts = g_list_alloc(); /* FIXME: we should enable more contexts */ /* http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html#context */ contexts->data = g_strdup("Applications"); for (l = contexts; l; l = l->next) { /* g_debug(l->data); */ GList *icon_names = gtk_icon_theme_list_icons(theme, (char*)l->data); GList *icon_name; for (icon_name = icon_names; icon_name; icon_name = icon_name->next) { g_async_queue_push(thread_data.queue, icon_name->data); g_thread_pool_push(thread_pool, theme, NULL); } g_list_free(icon_names); g_free(l->data); } g_list_free(contexts); if (gtk_dialog_run(GTK_DIALOG(chooser_dlg)) == GTK_RESPONSE_OK) { char* icon_name = NULL; if (gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)) == 0) { GList *sels = gtk_icon_view_get_selected_items(thread_data.view); GtkTreePath *tp = (GtkTreePath*)sels->data; GtkTreeIter it; if (gtk_tree_model_get_iter(GTK_TREE_MODEL(thread_data.model), &it, tp)) { gtk_tree_model_get(GTK_TREE_MODEL(thread_data.model), &it, 1, &icon_name, -1); } g_list_foreach(sels, (GFunc)gtk_tree_path_free, NULL); g_list_free(sels); if (icon_name) gtk_image_set_from_icon_name(data->icon, icon_name, GTK_ICON_SIZE_DIALOG); } else { icon_name = gtk_file_chooser_get_filename(chooser); if (icon_name) { GdkPixbuf *pix = gdk_pixbuf_new_from_file_at_scale(icon_name, 48, 48, TRUE, NULL); if (pix) { gtk_image_set_from_pixbuf(data->icon, pix); g_object_unref(pix); } } } if (icon_name) { g_object_set_qdata_full(G_OBJECT(data->icon), fm_qdata_id, icon_name, g_free); } } g_thread_pool_free(thread_pool, TRUE, FALSE); gtk_widget_destroy(chooser_dlg); } static gboolean _icon_click_event(GtkWidget *widget, GdkEventButton *event, FmFilePropData *data) { /* g_debug("icon click received (button=%d)", event->button); */ if (event->button == 1 && gtk_widget_get_can_focus(data->icon_eventbox)) { /* accept only left click */ _change_icon(gtk_widget_get_toplevel(widget), data); return TRUE; } return FALSE; } static gboolean _icon_press_event(GtkWidget *widget, GdkEventKey *event, FmFilePropData *data) { /* g_debug("icon key received (key=%u)", event->keyval); */ if (event->keyval == GDK_KEY_space) _change_icon(gtk_widget_get_toplevel(widget), data); return FALSE; } /* ---- all other handlers ---- */ static gboolean _on_timeout(gpointer user_data) { FmFilePropData* data = (FmFilePropData*)user_data; char size_str[128]; FmDeepCountJob* dc; dc = data->dc_job; if(G_LIKELY(dc && !fm_job_is_cancelled(FM_JOB(dc)))) { char* str; fm_file_size_to_str(size_str, sizeof(size_str), dc->total_size, fm_config->si_unit); str = g_strdup_printf("%s (%'llu %s)", size_str, (long long unsigned int)dc->total_size, dngettext(GETTEXT_PACKAGE, "byte", "bytes", (gulong)dc->total_size)); gtk_label_set_text(data->total_size, str); g_free(str); fm_file_size_to_str(size_str, sizeof(size_str), dc->total_ondisk_size, fm_config->si_unit); str = g_strdup_printf("%s (%'llu %s)", size_str, (long long unsigned int)dc->total_ondisk_size, dngettext(GETTEXT_PACKAGE, "byte", "bytes", (gulong)dc->total_ondisk_size)); gtk_label_set_text(data->size_on_disk, str); g_free(str); if (data->total_files) { str = g_strdup_printf(_("scanning... %d"), dc->count); gtk_label_set_text(data->total_files, str); g_free(str); } } return TRUE; } static gboolean on_timeout(gpointer user_data) { if(g_source_is_destroyed(g_main_current_source())) return FALSE; return _on_timeout(user_data); } static void on_finished(FmDeepCountJob* job, FmFilePropData* data) { GDK_THREADS_ENTER(); _on_timeout(data); /* update display */ if(data->timeout) { g_source_remove(data->timeout); data->timeout = 0; } if (data->total_files) { char *tt = g_strdup_printf("%d", job->count); gtk_label_set_text(data->total_files, tt); g_free(tt); } GDK_THREADS_LEAVE(); g_object_unref(data->dc_job); data->dc_job = NULL; } static void fm_file_prop_data_free(FmFilePropData* data) { g_free(data->orig_owner); g_free(data->orig_group); if(data->timeout) g_source_remove(data->timeout); if(data->dc_job) /* FIXME: check if it's running */ { fm_job_cancel(FM_JOB(data->dc_job)); g_signal_handlers_disconnect_by_func(data->dc_job, on_finished, data); g_object_unref(data->dc_job); } if(data->mime_type) fm_mime_type_unref(data->mime_type); fm_file_info_list_unref(data->files); g_slice_free(FmFilePropData, data); } static gboolean ensure_valid_owner(FmFilePropData* data) { gboolean ret = TRUE; const char* tmp = gtk_entry_get_text(data->owner); data->uid = -1; if(tmp && *tmp) { if(data->all_native && !isdigit(tmp[0])) /* entering names instead of numbers is only allowed for local files. */ { struct passwd* pw; if(!(pw = getpwnam(tmp))) ret = FALSE; else data->uid = pw->pw_uid; } else data->uid = atoi(tmp); } else ret = FALSE; if(!ret) { fm_show_error(GTK_WINDOW(data->dlg), NULL, _("Please enter a valid user name or numeric id.")); gtk_widget_grab_focus(GTK_WIDGET(data->owner)); } return ret; } static gboolean ensure_valid_group(FmFilePropData* data) { gboolean ret = TRUE; const char* tmp = gtk_entry_get_text(data->group); if(tmp && *tmp) { if(data->all_native && !isdigit(tmp[0])) /* entering names instead of numbers is only allowed for local files. */ { struct group* gr; if(!(gr = getgrnam(tmp))) ret = FALSE; else data->gid = gr->gr_gid; } else data->gid = atoi(tmp); } else ret = FALSE; if(!ret) { fm_show_error(GTK_WINDOW(data->dlg), NULL, _("Please enter a valid group name or numeric id.")); gtk_widget_grab_focus(GTK_WIDGET(data->group)); } return ret; } static void on_response(GtkDialog* dlg, int response, FmFilePropData* data) { FmFileOpsJob* job = NULL; if( response == GTK_RESPONSE_OK ) { /* call the extension if it was set */ if(data->ext != NULL) { GSList *l, *l2; for (l = data->ext, l2 = data->extdata; l; l = l->next, l2 = l2->next) ((FmFilePropExt*)l->data)->cb.finish(l2->data, FALSE); g_slist_free(data->ext); g_slist_free(data->extdata); data->ext = NULL; } /* if permissions_tab is hidden then it has undefined data so don't ever try to check those data */ if(gtk_widget_get_visible(data->permissions_tab)) { int sel; const char* new_owner = gtk_entry_get_text(data->owner); const char* new_group = gtk_entry_get_text(data->group); mode_t new_mode = 0, new_mode_mask = 0; if(!ensure_valid_owner(data) || !ensure_valid_group(data)) { g_signal_stop_emission_by_name(dlg, "response"); return; } /* FIXME: if all files are native, it's possible to check * if the names are legal user and group names on the local * machine prior to chown. */ if(new_owner && *new_owner && g_strcmp0(data->orig_owner, new_owner)) { /* change owner */ g_debug("change owner to: %d", data->uid); } else data->uid = -1; if(new_group && *new_group && g_strcmp0(data->orig_group, new_group)) { /* change group */ g_debug("change group to: %d", data->gid); } else data->gid = -1; /* check if chmod is needed here. */ sel = gtk_combo_box_get_active(data->read_perm); if( sel > NO_CHANGE ) /* requested to change read permissions */ { g_debug("got selection for read: %d", sel); if(data->read_perm_sel != sel) /* new value is different from original */ { new_mode_mask = (S_IRUSR|S_IRGRP|S_IROTH); data->read_perm_sel = sel; switch(sel) { case READ_ALL: new_mode = S_IROTH; case READ_GROUP: new_mode |= S_IRGRP; case READ_USER: default: new_mode |= S_IRUSR; } } else /* otherwise, no change */ data->read_perm_sel = NO_CHANGE; } else data->read_perm_sel = NO_CHANGE; sel = gtk_combo_box_get_active(data->write_perm); if( sel > NO_CHANGE ) /* requested to change write permissions */ { g_debug("got selection for write: %d", sel); if(data->write_perm_sel != sel) /* new value is different from original */ { new_mode_mask |= (S_IWUSR|S_IWGRP|S_IWOTH); data->write_perm_sel = sel; switch(sel) { case ACCESS_ALL: new_mode |= S_IWOTH; case ACCESS_GROUP: new_mode |= S_IWGRP; case ACCESS_USER: new_mode |= S_IWUSR; case ACCESS_NOBODY: default: ; } } else /* otherwise, no change */ data->write_perm_sel = NO_CHANGE; } else data->write_perm_sel = NO_CHANGE; sel = gtk_combo_box_get_active(data->exec_perm); if( sel > NO_CHANGE ) /* requested to change exec permissions */ { g_debug("got selection for exec: %d", sel); if(data->exec_perm_sel != sel) /* new value is different from original */ { new_mode_mask |= (S_IXUSR|S_IXGRP|S_IXOTH); data->exec_perm_sel = sel; switch(sel) { case ACCESS_ALL: new_mode |= S_IXOTH; case ACCESS_GROUP: new_mode |= S_IXGRP; case ACCESS_USER: new_mode |= S_IXUSR; case ACCESS_NOBODY: default: ; } } else /* otherwise, no change */ data->exec_perm_sel = NO_CHANGE; } else data->exec_perm_sel = NO_CHANGE; if(data->all_dirs) sel = gtk_combo_box_get_active(data->flags_set_dir); else if(!data->has_dir) sel = gtk_combo_box_get_active(data->flags_set_file); else sel = NO_CHANGE; if( sel > NO_CHANGE ) /* requested to change special bits */ { g_debug("got selection for flags: %d", sel); if(data->flags_set_sel != sel) /* new value is different from original */ { new_mode_mask |= (S_ISUID|S_ISGID|S_ISVTX); data->flags_set_sel = sel; if(data->all_dirs) { switch(sel) { case DIR_STICKY: new_mode |= S_ISVTX; break; case DIR_STICKY_SGID: new_mode |= S_ISVTX; case DIR_SGID: new_mode |= S_ISGID; case DIR_COMMON: default: ; } } else { switch(sel) { case FILE_SUID: new_mode |= S_ISUID; break; case FILE_SUID_SGID: new_mode |= S_ISUID; case FILE_SGID: new_mode |= S_ISGID; case FILE_COMMON: default: ; } } } else /* otherwise, no change */ data->flags_set_sel = NO_CHANGE; } else data->flags_set_sel = NO_CHANGE; if(new_mode_mask || data->uid != -1 || data->gid != -1) { FmPathList* paths = fm_path_list_new_from_file_info_list(data->files); job = fm_file_ops_job_new(FM_FILE_OP_CHANGE_ATTR, paths); fm_path_list_unref(paths); /* need to chown */ if(data->uid != -1 || data->gid != -1) fm_file_ops_job_set_chown(job, data->uid, data->gid); /* need to do chmod */ if(new_mode_mask) { g_debug("going to set mode bits %04o by mask %04o", new_mode, new_mode_mask); fm_file_ops_job_set_chmod(job, new_mode, new_mode_mask); } /* try recursion but don't recurse exec/sgid/sticky changes */ if(data->has_dir && data->exec_perm_sel == NO_CHANGE && data->flags_set_sel == NO_CHANGE) { gtk_combo_box_set_active(data->read_perm, data->read_perm_sel); gtk_combo_box_set_active(data->write_perm, data->write_perm_sel); gtk_combo_box_set_active(data->exec_perm, NO_CHANGE); gtk_combo_box_set_active(data->flags_set_dir, NO_CHANGE); /* FIXME: may special bits and exec flags still be messed up? */ if(fm_yes_no(GTK_WINDOW(data->dlg), NULL, _( "Do you want to recursively apply these changes to all files and sub-folders?" ), TRUE)) fm_file_ops_job_set_recursive(job, TRUE); } } if(data->hidden != NULL && gtk_widget_get_visible(data->hidden)) { gboolean new_hidden = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->hidden)); if(new_hidden != fm_file_info_is_hidden(fm_file_info_list_peek_head(data->files))) { /* change hidden attribute of file */ g_debug("hidden changed to %d",new_hidden); if (job == NULL) { FmPathList* paths = fm_path_list_new_from_file_info_list(data->files); job = fm_file_ops_job_new(FM_FILE_OP_CHANGE_ATTR, paths); fm_path_list_unref(paths); } fm_file_ops_job_set_hidden(job, new_hidden); } } } /* end of permissions update */ /* change default application for the mime-type if needed */ if(data->mime_type && fm_mime_type_get_type(data->mime_type) && data->open_with) { GAppInfo* app; gboolean default_app_changed = FALSE; GError* err = NULL; app = fm_app_chooser_combo_box_dup_selected_app(data->open_with, &default_app_changed); if(app) { if(default_app_changed) { g_app_info_set_as_default_for_type(app, fm_mime_type_get_type(data->mime_type), &err); if(err) { fm_show_error(GTK_WINDOW(dlg), NULL, err->message); g_error_free(err); } } g_object_unref(app); } } if(data->single_file) /* when only one file is shown */ { const char *text = gtk_entry_get_text(data->name); /* if the user has changed the name of the file */ if(g_strcmp0(fm_file_info_get_disp_name(data->fi), text)) { /* rename the file or set display name for it. */ if (job == NULL) { FmPathList* paths = fm_path_list_new_from_file_info_list(data->files); job = fm_file_ops_job_new(FM_FILE_OP_CHANGE_ATTR, paths); fm_path_list_unref(paths); } fm_file_ops_job_set_display_name(job, text); } text = g_object_get_qdata(G_OBJECT(data->icon), fm_qdata_id); /* if the user has changed icon */ if(text) { GIcon *icon = g_icon_new_for_string(text, NULL); if (icon) { /* change icon property of the file. */ if (job == NULL) { FmPathList* paths = fm_path_list_new_from_file_info_list(data->files); job = fm_file_ops_job_new(FM_FILE_OP_CHANGE_ATTR, paths); fm_path_list_unref(paths); } fm_file_ops_job_set_icon(job, icon); g_object_unref(icon); } /* FIXME: handle errors */ } } if (job) /* show progress dialog */ fm_file_ops_job_run_with_progress(GTK_WINDOW(dlg), job); /* it eats reference! */ } /* call the extension if it was set */ else if(data->ext != NULL) { GSList *l, *l2; for (l = data->ext, l2 = data->extdata; l; l = l->next, l2 = l2->next) ((FmFilePropExt*)l->data)->cb.finish(l2->data, TRUE); g_slist_free(data->ext); g_slist_free(data->extdata); data->ext = NULL; } } /* FIXME: this is too dirty. Need some refactor later. */ static void update_permissions(FmFilePropData* data) { FmFileInfo* fi = fm_file_info_list_peek_head(data->files); GList *l; int sel; mode_t fi_mode = fm_file_info_get_mode(fi); mode_t read_perm = (fi_mode & (S_IRUSR|S_IRGRP|S_IROTH)); mode_t write_perm = (fi_mode & (S_IWUSR|S_IWGRP|S_IWOTH)); mode_t exec_perm = (fi_mode & (S_IXUSR|S_IXGRP|S_IXOTH)); mode_t flags_set = (fi_mode & (S_ISUID|S_ISGID|S_ISVTX)); gint32 uid = fm_file_info_get_uid(fi); gint32 gid = fm_file_info_get_gid(fi); gboolean mix_read = FALSE, mix_write = FALSE, mix_exec = FALSE; gboolean mix_flags = FALSE; data->all_native = fm_path_is_native(fm_file_info_get_path(fi)); data->has_dir = (S_ISDIR(fi_mode) != FALSE); data->all_dirs = data->has_dir; if((fi_mode & ~S_IFDIR) == 0) /* no permissions accessible */ { gtk_widget_hide(data->permissions_tab); return; } if(data->hidden == NULL) ; else if(data->single_file) { if(fm_file_info_can_set_hidden(fi)) { gtk_widget_set_can_focus(data->hidden, TRUE); gtk_widget_set_sensitive(data->hidden, TRUE); gtk_widget_set_tooltip_text(data->hidden, _("Hide or unhide the file")); } /* FIXME: use markup for bold text? */ else if(fm_file_info_is_hidden(fi)) gtk_widget_set_tooltip_text(data->hidden, _("This file is hidden because its " "name starts with a dot ('.').")); else gtk_widget_set_tooltip_text(data->hidden, _("Files on this system are hidden " "if their name starts with a dot " "('.'). Hit to toggle " "displaying hidden files.")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->hidden), fm_file_info_is_hidden(fi)); gtk_widget_show(data->hidden); /* NOTE: for files in menu:// we have it not available still just because permissions tab is hidden for those files. That should stay this way because for all other .desktop files it should be 'Hidden' key changed but for menu:// 'NoDisplay' is the key */ } for(l=fm_file_info_list_peek_head_link(data->files)->next; l; l=l->next) { FmFileInfo* fi = FM_FILE_INFO(l->data); if(data->all_native && !fm_path_is_native(fm_file_info_get_path(fi))) data->all_native = FALSE; fi_mode = fm_file_info_get_mode(fi); if((fi_mode & ~S_IFDIR) == 0) /* no permissions accessible */ { gtk_widget_hide(data->permissions_tab); return; } if(S_ISDIR(fi_mode)) data->has_dir = TRUE; else data->all_dirs = FALSE; if( uid >= 0 && uid != (gint32)fm_file_info_get_uid(fi) ) uid = -1; if( gid >= 0 && gid != (gint32)fm_file_info_get_gid(fi) ) gid = -1; if(!mix_read && read_perm != (fi_mode & (S_IRUSR|S_IRGRP|S_IROTH))) mix_read = TRUE; if(!mix_write && write_perm != (fi_mode & (S_IWUSR|S_IWGRP|S_IWOTH))) mix_write = TRUE; if(!mix_exec && exec_perm != (fi_mode & (S_IXUSR|S_IXGRP|S_IXOTH))) mix_exec = TRUE; if(!mix_flags && flags_set != (fi_mode & (S_ISUID|S_ISGID|S_ISVTX))) mix_flags = TRUE; } if( data->all_native ) { if(uid >= 0) gtk_entry_set_text(data->owner, fm_file_info_get_disp_owner(fi)); if(gid >= 0) gtk_entry_set_text(data->group, fm_file_info_get_disp_group(fi)); } if (data->has_dir && data->total_files) { gtk_widget_show(data->total_files_label); gtk_widget_show(GTK_WIDGET(data->total_files)); gtk_label_set_text(data->total_files, _("scanning...")); } else if (data->total_files) { gtk_widget_destroy(data->total_files_label); gtk_widget_destroy(GTK_WIDGET(data->total_files)); gtk_table_set_row_spacing(data->general_table, 6, 0); data->total_files = NULL; } data->orig_owner = g_strdup(gtk_entry_get_text(data->owner)); data->orig_group = g_strdup(gtk_entry_get_text(data->group)); /* on local filesystems, only root can do chown. */ if( data->all_native && geteuid() != 0 ) { gtk_widget_set_sensitive(GTK_WIDGET(data->owner), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(data->group), FALSE); } /* read access chooser */ sel = NO_CHANGE; if(!mix_read) { if(read_perm & S_IROTH) sel = READ_ALL; else if(read_perm & S_IRGRP) sel = READ_GROUP; else sel = READ_USER; } gtk_combo_box_set_active(data->read_perm, sel); data->read_perm_sel = sel; /* write access chooser */ sel = NO_CHANGE; if(!mix_write) { if(write_perm & S_IWOTH) sel = ACCESS_ALL; else if(write_perm & S_IWGRP) sel = ACCESS_GROUP; else if(write_perm & S_IWUSR) sel = ACCESS_USER; else sel = ACCESS_NOBODY; } gtk_combo_box_set_active(data->write_perm, sel); data->write_perm_sel = sel; /* disable exec and special bits for mixed selection and return */ if(data->has_dir && !data->all_dirs) { gtk_widget_hide(GTK_WIDGET(data->exec_label)); gtk_widget_hide(GTK_WIDGET(data->exec_perm)); data->exec_perm_sel = NO_CHANGE; gtk_widget_hide(GTK_WIDGET(data->flags_label)); gtk_widget_hide(GTK_WIDGET(data->flags_set_file)); gtk_widget_hide(GTK_WIDGET(data->flags_set_dir)); data->flags_set_sel = NO_CHANGE; return; } if(data->has_dir) gtk_label_set_label(data->exec_label, _("_Access content:")); if(!fm_config->advanced_mode) { gtk_widget_hide(GTK_WIDGET(data->flags_label)); gtk_widget_hide(GTK_WIDGET(data->flags_set_file)); gtk_widget_hide(GTK_WIDGET(data->flags_set_dir)); data->flags_set_sel = NO_CHANGE; } else if(data->has_dir) gtk_widget_hide(GTK_WIDGET(data->flags_set_file)); else gtk_widget_hide(GTK_WIDGET(data->flags_set_dir)); /* exec access chooser */ sel = NO_CHANGE; if(!mix_exec) { if(exec_perm & S_IXOTH) sel = ACCESS_ALL; else if(exec_perm & S_IXGRP) sel = ACCESS_GROUP; else if(exec_perm & S_IXUSR) sel = ACCESS_USER; else sel = ACCESS_NOBODY; } gtk_combo_box_set_active(data->exec_perm, sel); data->exec_perm_sel = sel; /* special bits chooser */ sel = NO_CHANGE; if(data->has_dir) { if(!mix_flags) { if((flags_set & (S_ISGID|S_ISVTX)) == (S_ISGID|S_ISVTX)) sel = DIR_STICKY_SGID; else if(flags_set & S_ISGID) sel = DIR_SGID; else if(flags_set & S_ISVTX) sel = DIR_STICKY; else sel = DIR_COMMON; } gtk_combo_box_set_active(data->flags_set_dir, sel); } else { if(!mix_flags) { if((flags_set & (S_ISUID|S_ISGID)) == (S_ISUID|S_ISGID)) sel = FILE_SUID_SGID; else if(flags_set & S_ISUID) sel = FILE_SUID; else if(flags_set & S_ISGID) sel = FILE_SGID; else sel = FILE_COMMON; } gtk_combo_box_set_active(data->flags_set_file, sel); } data->flags_set_sel = sel; } static gboolean on_icon_enter_notify(GtkWidget *widget, GdkEvent *event, FmFilePropData *data) { GdkWindow *window = gtk_widget_get_window(data->icon_eventbox); if (window && gdk_window_get_cursor(window) == NULL) gdk_window_set_cursor(window, gdk_cursor_new(GDK_HAND1)); return FALSE; } static void update_ui(FmFilePropData* data) { GtkImage* img = data->icon; const char *text; if( data->single_type ) /* all files are of the same mime-type */ { GIcon* icon = NULL; FmFilePropExt* ext; if( data->single_file ) /* only one file is selected. */ { FmFileInfo* fi = fm_file_info_list_peek_head(data->files); FmIcon* fi_icon = fm_file_info_get_icon(fi); if(fi_icon) icon = G_ICON(fi_icon); if(fm_file_info_can_set_icon(fi)) { /* enable icon change if file allows that */ gtk_widget_set_can_focus(data->icon_eventbox, TRUE); } } if(data->mime_type) { if(!icon) { FmIcon* ficon = fm_mime_type_get_icon(data->mime_type); if(ficon) icon = G_ICON(ficon); } char *text = g_strdup_printf("%s (%s)", fm_mime_type_get_desc(data->mime_type), fm_mime_type_get_type(data->mime_type)); gtk_label_set_text(data->type, text); if(strlen(text) > 16) gtk_widget_set_tooltip_text(GTK_WIDGET(data->type), text); g_free(text); } if(icon) gtk_image_set_from_gicon(img, icon, GTK_ICON_SIZE_DIALOG); if(data->single_file && (fm_file_info_is_symlink(data->fi) || fm_file_info_is_shortcut(data->fi))) { text = fm_file_info_get_target(data->fi); gtk_widget_show(data->target_label); gtk_widget_show(GTK_WIDGET(data->target)); gtk_label_set_text(data->target, text); if(strlen(text) > 16) gtk_widget_set_tooltip_text(GTK_WIDGET(data->target), text); } else { gtk_widget_destroy(data->target_label); gtk_widget_destroy(GTK_WIDGET(data->target)); gtk_table_set_row_spacing(data->general_table, 3, 0); } CHECK_MODULES(); for(ext = extensions; ext; ext = ext->next) if(ext->type == data->mime_type) { data->ext = g_slist_append(data->ext, ext); data->extdata = g_slist_append(data->extdata, NULL); } if(!data->ext) for(ext = extensions; ext; ext = ext->next) if(ext->type == NULL) /* fallback handler */ { data->ext = g_slist_append(data->ext, ext); data->extdata = g_slist_append(data->extdata, NULL); break; } } else { gtk_image_set_from_stock(img, GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_DIALOG); gtk_widget_set_sensitive(GTK_WIDGET(data->name), FALSE); gtk_label_set_text(data->type, _("Files of different types")); gtk_widget_destroy(data->target_label); gtk_widget_destroy(GTK_WIDGET(data->target)); gtk_widget_destroy(data->open_with_label); gtk_widget_destroy(GTK_WIDGET(data->open_with)); gtk_table_set_row_spacing(data->general_table, 5, 0); data->open_with = NULL; data->open_with_label = NULL; } /* FIXME: check if all files has the same parent dir, mtime, or atime */ if( data->single_file ) { char buf[128]; FmPath* path = fm_file_info_get_path(data->fi); GFile* gfile = fm_path_to_gfile(path); char* parent_str; time_t atime; struct tm tm; /* FIXME: use fm_file_info_get_edit_name */ text = fm_file_info_get_disp_name(data->fi); gtk_entry_set_text(data->name, text); if(strlen(text) > 16) gtk_widget_set_tooltip_text(GTK_WIDGET(data->name), text); if (g_strcmp0(text, fm_path_get_basename(path)) != 0) { char *basename = NULL; if (fm_path_is_native(path)) { parent_str = g_file_get_path(gfile); if (parent_str) { basename = g_filename_display_basename(parent_str); g_free(parent_str); } } else basename = g_uri_unescape_string(fm_path_get_basename(path), NULL); if (basename && strcmp(text, basename) != 0) { gtk_label_set_text(data->file, basename); gtk_label_set_markup(data->file_label, _("File:")); gtk_widget_show(GTK_WIDGET(data->file)); gtk_widget_show(GTK_WIDGET(data->file_label)); } g_free(basename); } parent_str = NULL; if (fm_path_get_parent(path)) { GFile *parent_gf = g_file_get_parent(gfile); if (parent_gf) /* FmPath may think wrong query URI has parent */ { parent_str = g_file_get_parse_name(parent_gf); g_object_unref(parent_gf); } } g_object_unref(gfile); if(parent_str) { gtk_label_set_text(data->dir, parent_str); if(strlen(parent_str) > 16) gtk_widget_set_tooltip_text(GTK_WIDGET(data->dir), parent_str); g_free(parent_str); } else gtk_label_set_text(data->dir, ""); if(fm_file_info_get_mtime(data->fi) > 0) gtk_label_set_text(data->mtime, fm_file_info_get_disp_mtime(data->fi)); else { gtk_widget_destroy(data->mtime_label); gtk_widget_destroy(GTK_WIDGET(data->mtime)); } /* FIXME: need to encapsulate this in an libfm API. */ atime = fm_file_info_get_atime(data->fi); if(atime > 0) { localtime_r(&atime, &tm); strftime(buf, sizeof(buf), fm_config->date_iso_8601 ? "%F %R" : "%x %R", &tm); gtk_label_set_text(data->atime, buf); } else { gtk_widget_destroy(data->atime_label); gtk_widget_destroy(GTK_WIDGET(data->atime)); } atime = fm_file_info_get_ctime(data->fi); if(atime > 0 && data->ctime) { localtime_r(&atime, &tm); strftime(buf, sizeof(buf), fm_config->date_iso_8601 ? "%F %R" : "%x %R", &tm); gtk_label_set_text(data->ctime, buf); gtk_widget_show(data->ctime_label); gtk_widget_show(GTK_WIDGET(data->ctime)); } if (!fm_file_info_can_set_name(data->fi) || fm_file_info_is_shortcut(data->fi)) { /* changing file name isn't available, disable entry */ gtk_widget_set_can_focus(GTK_WIDGET(data->name), FALSE); gtk_editable_set_editable(GTK_EDITABLE(data->name), FALSE); } } else { gtk_entry_set_text(data->name, _("Multiple files")); gtk_widget_set_sensitive(GTK_WIDGET(data->name), FALSE); } update_permissions(data); _on_timeout(data); } static void init_application_list(FmFilePropData* data) { if(data->single_type && data->mime_type) { if(!fm_file_info_is_dir(data->fi)) fm_app_chooser_combo_box_setup_for_mime_type(data->open_with, data->mime_type); else /* shouldn't allow set file association for folders. */ { gtk_widget_destroy(data->open_with_label); gtk_widget_destroy(GTK_WIDGET(data->open_with)); gtk_table_set_row_spacing(data->general_table, 5, 0); data->open_with = NULL; data->open_with_label = NULL; } } } /** * fm_file_properties_widget_new * @files: list of files * @toplevel: choose appearance of dialog * * Creates new dialog widget for change properties of @files. * * Returns: (transfer full): a new widget. * * Since: 0.1.0 */ GtkDialog* fm_file_properties_widget_new(FmFileInfoList* files, gboolean toplevel) { GtkBuilder* builder=gtk_builder_new(); GtkDialog* dlg; FmFilePropData* data; FmPathList* paths; gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); data = g_slice_new0(FmFilePropData); data->files = fm_file_info_list_ref(files); data->single_type = fm_file_info_list_is_same_type(files); data->single_file = (fm_file_info_list_get_length(files) == 1); data->fi = fm_file_info_list_peek_head(files); if(data->single_type) data->mime_type = fm_mime_type_ref(fm_file_info_get_mime_type(data->fi)); paths = fm_path_list_new_from_file_info_list(files); data->dc_job = fm_deep_count_job_new(paths, FM_DC_JOB_DEFAULT); fm_path_list_unref(paths); data->ext = NULL; /* no extension by default */ data->extdata = NULL; if(toplevel) { gtk_builder_add_from_file(builder, UI_FILE, NULL); GET_WIDGET(GTK_DIALOG,dlg); gtk_dialog_set_alternative_button_order(GTK_DIALOG(data->dlg), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); } else { /* FIXME: is this really useful? */ char* names[]={"notebook", NULL}; gtk_builder_add_objects_from_file(builder, UI_FILE, names, NULL); data->dlg = GTK_DIALOG(gtk_builder_get_object(builder, "notebook")); } dlg = data->dlg; GET_WIDGET(GTK_TABLE,general_table); GET_WIDGET(GTK_IMAGE,icon); GET_WIDGET(GTK_WIDGET,icon_eventbox); GET_WIDGET(GTK_ENTRY,name); GET_WIDGET(GTK_LABEL,file); GET_WIDGET(GTK_LABEL,file_label); GET_WIDGET(GTK_LABEL,dir); GET_WIDGET(GTK_LABEL,target); GET_WIDGET(GTK_WIDGET,target_label); GET_WIDGET(GTK_LABEL,type); GET_WIDGET(GTK_WIDGET,open_with_label); GET_WIDGET(GTK_COMBO_BOX,open_with); GET_WIDGET(GTK_LABEL,total_files); GET_WIDGET(GTK_WIDGET,total_files_label); GET_WIDGET(GTK_LABEL,total_size); GET_WIDGET(GTK_LABEL,size_on_disk); GET_WIDGET(GTK_LABEL,mtime); GET_WIDGET(GTK_WIDGET,mtime_label); GET_WIDGET(GTK_LABEL,atime); GET_WIDGET(GTK_WIDGET,atime_label); GET_WIDGET(GTK_LABEL,ctime); GET_WIDGET(GTK_WIDGET,ctime_label); GET_WIDGET(GTK_WIDGET,permissions_tab); GET_WIDGET(GTK_ENTRY,owner); GET_WIDGET(GTK_ENTRY,group); GET_WIDGET(GTK_COMBO_BOX,read_perm); GET_WIDGET(GTK_COMBO_BOX,write_perm); GET_WIDGET(GTK_LABEL,exec_label); GET_WIDGET(GTK_COMBO_BOX,exec_perm); GET_WIDGET(GTK_LABEL,flags_label); GET_WIDGET(GTK_COMBO_BOX,flags_set_file); GET_WIDGET(GTK_COMBO_BOX,flags_set_dir); GET_WIDGET(GTK_WIDGET,hidden); init_application_list(data); data->timeout = gdk_threads_add_timeout(600, on_timeout, data); g_signal_connect(dlg, "response", G_CALLBACK(on_response), data); g_signal_connect_swapped(dlg, "destroy", G_CALLBACK(fm_file_prop_data_free), data); g_signal_connect(data->dc_job, "finished", G_CALLBACK(on_finished), data); g_signal_connect(data->icon_eventbox, "button-press-event", G_CALLBACK(_icon_click_event), data); g_signal_connect(data->icon_eventbox, "key-press-event", G_CALLBACK(_icon_press_event), data); if (!fm_job_run_async(FM_JOB(data->dc_job))) { g_object_unref(data->dc_job); data->dc_job = NULL; g_critical("failed to run scanning job for file properties dialog"); } update_ui(data); /* if we got some extension then activate it updating dialog window */ if(data->ext != NULL) { GSList *l, *l2; for (l = data->ext, l2 = data->extdata; l; l = l->next, l2 = l2->next) l2->data = ((FmFilePropExt*)l->data)->cb.init(builder, data, data->files); } /* add this after all updates from extensions was made */ if (gtk_widget_get_can_focus(data->icon_eventbox)) { /* the dialog isn't realized yet so set cursor in callback */ g_signal_connect(data->icon_eventbox, "enter-notify-event", G_CALLBACK(on_icon_enter_notify), data); } g_object_unref(builder); return dlg; } /** * fm_show_file_properties * @parent: a window to put dialog over it * @files:list of files * * Creates and shows file properties dialog for @files. * * Returns: %TRUE. * * Since: 0.1.0 */ gboolean fm_show_file_properties(GtkWindow* parent, FmFileInfoList* files) { GtkDialog* dlg = fm_file_properties_widget_new(files, TRUE); if(parent) gtk_window_set_transient_for(GTK_WINDOW(dlg), parent); gtk_widget_show(GTK_WIDGET(dlg)); g_signal_connect_after(dlg, "response", G_CALLBACK(gtk_widget_destroy), NULL); return TRUE; } /** * fm_file_properties_add_for_mime_type * @mime_type: mime type to add handler for * @callbacks: table of handler callbacks * * Adds a handler for some mime type into file properties dialog. The * handler will be used if file properties dialog is opened for single * file or for few files of the same type to extend its functionality. * The value "*" of @mime_type has special meaning - the handler will * be used for file types where no other extension is applied. No * wildcards are allowed otherwise. * * Returns: %TRUE if handler was added successfully. * * Since: 1.2.0 */ gboolean fm_file_properties_add_for_mime_type(const char *mime_type, FmFilePropertiesExtensionInit *callbacks) { FmMimeType *type; FmFilePropExt *ext; /* validate input */ if(!mime_type || !callbacks || !callbacks->init || !callbacks->finish) return FALSE; if(strcmp(mime_type, "*") == 0) type = NULL; else type = fm_mime_type_from_name(mime_type); ext = g_slice_new(FmFilePropExt); ext->type = type; ext->next = extensions; ext->cb = *callbacks; extensions = ext; return TRUE; } /* modules support here */ FM_MODULE_DEFINE_TYPE(gtk_file_prop, FmFilePropertiesExtensionInit, 1) static gboolean fm_module_callback_gtk_file_prop(const char *name, gpointer init, int ver) { /* we don't test version yet since there is only version 1 */ return fm_file_properties_add_for_mime_type(name, init); } void _fm_file_properties_init(void) { fm_module_register_gtk_file_prop(); } void _fm_file_properties_finalize(void) { FmFilePropExt *ext; fm_module_unregister_type("gtk_file_prop"); /* free all extensions */ while ((ext = extensions)) { extensions = ext->next; if (ext->type) fm_mime_type_unref(ext->type); g_slice_free(FmFilePropExt, ext); } } libfm-1.4.0/src/gtk/fm-file-properties.h000066400000000000000000000065601475513661000200620ustar00rootroot00000000000000/* * fm-file-properties.h * * Copyright 2009 PCMan * Copyright 2013 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_FILE_PROPERTIES_H__ #define __FM_FILE_PROPERTIES_H__ #include "fm-module.h" #include "fm-file-info.h" #include G_BEGIN_DECLS /* FIXME: use list of FmFileInfo is much better here. */ GtkDialog* fm_file_properties_widget_new(FmFileInfoList* files, gboolean toplevel); gboolean fm_show_file_properties(GtkWindow* parent, FmFileInfoList* files); typedef struct _FmFilePropertiesExtensionInit FmFilePropertiesExtensionInit; /** * FmFilePropertiesExtensionInit: * @init: callback to make ui fields specific to file type * @finish: callback to optionally apply changes * * The structure describing callbacks for File Properties dialog extension * specific for some file type. * * The @init callback is called before dialog window is opened. Callback * can disable or enable elements in dialog window, add triggers on those * elements, append new elements, etc. Callback gets three arguments: the * actual UI from builder, internal widget data pointer, and file infos * list. Internal widget data pointer may be used to block widget builtin * signal handler (that may be required if extension has own handler for * some GtkEntry element). Callback should return some own internal data * pointer which will be used as argument for @finish callback later. * * The @finish callback is called before dialog window is closed. It gets * two arguments: the data pointer that was returned by @init callback * before and boolean value indicating if dialog was closed not by "OK" * button. Callback should free any resources allocated by @init callback * before. * * This structure is used for "gtk_file_prop" module initialization. The * key for module of this type is content type (MIME name) to support. * The value "*" has special meaning - the module will be used for file * types where no other extension is applied. No wildcards are allowed * otherwise. * * Since: 1.2.0 */ struct _FmFilePropertiesExtensionInit { gpointer (*init)(GtkBuilder *ui, gpointer uidata, FmFileInfoList *files); void (*finish)(gpointer data, gboolean cancelled); }; gboolean fm_file_properties_add_for_mime_type(const char *mime_type, FmFilePropertiesExtensionInit *callbacks); /* modules support */ #define FM_MODULE_gtk_file_prop_VERSION 1 extern FmFilePropertiesExtensionInit fm_module_init_gtk_file_prop; void _fm_file_properties_init(void); void _fm_file_properties_finalize(void); G_END_DECLS #endif libfm-1.4.0/src/gtk/fm-file-search-ui.c000066400000000000000000000041601475513661000175330ustar00rootroot00000000000000/* The file is generated by glade-gen-connect. * DO NOT EDIT. Your changes will be lost. */ #include #include static void __filesearch_glade_connect_func( GtkBuilder *builder, GObject *object, const gchar *signal_name, const gchar *handler_name, GObject *connect_object, GConnectFlags flags, gpointer user_data) { static const char* handler_names[] = { "on_add_path_button_clicked", "on_bigger_than_checkbutton_toggled", "on_dlg_response", "on_max_mtime_button_clicked", "on_max_mtime_checkbutton_toggled", "on_min_mtime_button_clicked", "on_min_mtime_checkbutton_toggled", "on_remove_path_button_clicked", "on_smaller_than_checkbutton_toggled" }; static GCallback handler_funcs[] = { G_CALLBACK(on_add_path_button_clicked), G_CALLBACK(on_bigger_than_checkbutton_toggled), G_CALLBACK(on_dlg_response), G_CALLBACK(on_max_mtime_button_clicked), G_CALLBACK(on_max_mtime_checkbutton_toggled), G_CALLBACK(on_min_mtime_button_clicked), G_CALLBACK(on_min_mtime_checkbutton_toggled), G_CALLBACK(on_remove_path_button_clicked), G_CALLBACK(on_smaller_than_checkbutton_toggled) }; /* binary search for the function name */ int min = 0; int max = G_N_ELEMENTS(handler_names) - 1; for(; min <= max;) { int i = (min + max) / 2; int cmp = strcmp(handler_name, handler_names[i]); if(G_UNLIKELY(cmp == 0)) /* found */ { GCallback handler = handler_funcs[i]; if(connect_object) g_signal_connect_object(object, signal_name, handler, connect_object, flags); else g_signal_connect_data(object, signal_name, handler, user_data, NULL, flags); break; } if(cmp < 0) max = i - 1; else min = i + 1; } } static void filesearch_glade_connect_signals(GtkBuilder* builder, gpointer user_data) { gtk_builder_connect_signals_full(builder, __filesearch_glade_connect_func, user_data); } libfm-1.4.0/src/gtk/fm-folder-model.c000066400000000000000000002304771475513661000173230ustar00rootroot00000000000000/* * fm-folder-model.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2012-2015 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-folder-model * @short_description: A model for folder view window. * @title: FmFolderModel * * @include: libfm/fm-gtk.h * * The #FmFolderModel is used by widgets such as #FmFolderView to arrange * items of folder. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-config.h" #include "fm-folder-model.h" #include "fm-file-info.h" #include "fm-icon-pixbuf.h" #include "fm-thumbnail.h" #include "fm-gtk-marshal.h" #include "glib-compat.h" #include #include #include #include struct _FmFolderModel { GObject parent; FmFolder* folder; GSequence *items; GSequence* hidden; /* items hidden by filter */ gboolean show_hidden : 1; FmFolderModelCol sort_col; FmSortMode sort_mode; /* Random integer to check whether an iter belongs to our model */ gint stamp; guint theme_change_handler; guint icon_size; guint thumbnail_max; GList* thumbnail_requests; GHashTable* items_hash; GSList* filters; }; typedef struct _FmFolderItem FmFolderItem; struct _FmFolderItem { FmFileInfo* inf; GdkPixbuf* icon; gpointer userdata; gboolean is_thumbnail : 1; gboolean thumbnail_loading : 1; gboolean thumbnail_failed : 1; gboolean is_extra : 1; FmFolderModelExtraFilePos pos : 3; }; typedef struct _FmFolderModelFilterItem { FmFolderModelFilterFunc func; gpointer user_data; }FmFolderModelFilterItem; enum ReloadFlags { RELOAD_ICONS = 1 << 0, RELOAD_THUMBNAILS = 1 << 1, RELOAD_BOTH = (RELOAD_ICONS | RELOAD_THUMBNAILS) }; static void fm_folder_model_tree_model_init(GtkTreeModelIface *iface); static void fm_folder_model_tree_sortable_init(GtkTreeSortableIface *iface); static void fm_folder_model_drag_source_init(GtkTreeDragSourceIface *iface); static void fm_folder_model_drag_dest_init(GtkTreeDragDestIface *iface); static void fm_folder_model_dispose(GObject *object); G_DEFINE_TYPE_WITH_CODE( FmFolderModel, fm_folder_model, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, fm_folder_model_tree_model_init) G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_SORTABLE, fm_folder_model_tree_sortable_init) G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_DRAG_SOURCE, fm_folder_model_drag_source_init) G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_DRAG_DEST, fm_folder_model_drag_dest_init) ) static GtkTreeModelFlags fm_folder_model_get_flags(GtkTreeModel *tree_model); static gint fm_folder_model_get_n_columns(GtkTreeModel *tree_model); static GType fm_folder_model_get_column_type(GtkTreeModel *tree_model, gint index); static gboolean fm_folder_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path); static GtkTreePath *fm_folder_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter); static void fm_folder_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value); static gboolean fm_folder_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean fm_folder_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent); static gboolean fm_folder_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter); static gint fm_folder_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter); static gboolean fm_folder_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n); static gboolean fm_folder_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child); static gboolean fm_folder_model_get_sort_column_id(GtkTreeSortable* sortable, gint* sort_column_id, GtkSortType* order); static void fm_folder_model_set_sort_column_id(GtkTreeSortable* sortable, gint sort_column_id, GtkSortType order); static void fm_folder_model_set_sort_func(GtkTreeSortable *sortable, gint sort_column_id, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy); static void fm_folder_model_set_default_sort_func(GtkTreeSortable *sortable, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy); static void fm_folder_model_do_sort(FmFolderModel* model); static inline gboolean file_can_show(FmFolderModel* model, FmFileInfo* file); /* signal handlers */ static void on_icon_theme_changed(GtkIconTheme* theme, FmFolderModel* model); static void on_thumbnail_loaded(FmThumbnailRequest* req, gpointer user_data); static void on_show_thumbnail_changed(FmConfig* cfg, gpointer user_data); static void on_thumbnail_local_changed(FmConfig* cfg, gpointer user_data); static void on_thumbnail_max_changed(FmConfig* cfg, gpointer user_data); typedef struct { FmFolderModelCol id; GType type; const char *name; const char *title; gboolean sortable; gint default_width; void (*get_value)(FmFileInfo *fi, GValue *value); gint (*compare)(FmFileInfo *fi1, FmFileInfo *fi2); } FmFolderModelInfo; static FmFolderModelInfo column_infos_raw[] = { /* columns visible to the users */ { FM_FOLDER_MODEL_COL_NAME, 0, "name", N_("Name"), TRUE }, { FM_FOLDER_MODEL_COL_DESC, 0, "desc", N_("Description"), TRUE }, { FM_FOLDER_MODEL_COL_SIZE, 0, "size", N_("Size"), TRUE }, { FM_FOLDER_MODEL_COL_PERM, 0, "perm", N_("Permissions"), FALSE }, { FM_FOLDER_MODEL_COL_OWNER, 0, "owner", N_("Owner"), FALSE }, { FM_FOLDER_MODEL_COL_MTIME, 0, "mtime", N_("Modified"), TRUE }, { FM_FOLDER_MODEL_COL_DIRNAME, 0, "dirname", N_("Location"), TRUE }, { FM_FOLDER_MODEL_COL_EXT, 0, "ext", N_("Extension"), TRUE }, /* columns used internally */ { FM_FOLDER_MODEL_COL_INFO, 0, "info", NULL, TRUE }, { FM_FOLDER_MODEL_COL_ICON, 0, "icon", NULL, FALSE }, { FM_FOLDER_MODEL_COL_GICON, 0, "gicon", NULL, FALSE } }; static guint column_infos_n = 0; static FmFolderModelInfo** column_infos = NULL; enum { ROW_DELETING, FILTER_CHANGED, N_SIGNALS }; static guint signals[N_SIGNALS]; static void fm_folder_model_init(FmFolderModel* model) { model->sort_mode = FM_SORT_ASCENDING; model->sort_col = FM_FOLDER_MODEL_COL_DEFAULT; /* Random int to check whether an iter belongs to our model */ model->stamp = g_random_int(); model->theme_change_handler = g_signal_connect(gtk_icon_theme_get_default(), "changed", G_CALLBACK(on_icon_theme_changed), model); g_signal_connect(fm_config, "changed::show_thumbnail", G_CALLBACK(on_show_thumbnail_changed), model); g_signal_connect(fm_config, "changed::thumbnail_local", G_CALLBACK(on_thumbnail_local_changed), model); g_signal_connect(fm_config, "changed::thumbnail_max", G_CALLBACK(on_thumbnail_max_changed), model); model->thumbnail_max = fm_config->thumbnail_max << 10; model->items_hash = g_hash_table_new(g_direct_hash, g_direct_equal); } static void fm_folder_model_class_init(FmFolderModelClass *klass) { GObjectClass * object_class; fm_folder_model_parent_class = (GObjectClass*)g_type_class_peek_parent(klass); object_class = (GObjectClass*)klass; object_class->dispose = fm_folder_model_dispose; /** * FmFolderModel::row-deleting: * @model: folder model instance that received the signal * @row: path to row that is about to be deleted * @iter: iterator of row that is about to be deleted * @data: user data associated with the row * * This signal is emitted before row is deleted. * * It can be used if view has some data associated with the row so * those data can be freed safely. * * Since: 1.0.0 */ signals[ROW_DELETING] = g_signal_new("row-deleting", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderModelClass, row_deleting), NULL, NULL, fm_marshal_VOID__BOXED_BOXED_POINTER, G_TYPE_NONE, 3, GTK_TYPE_TREE_PATH, GTK_TYPE_TREE_ITER, G_TYPE_POINTER); /** * FmFolderModel::filter-changed: * @model: folder model instance that received the signal * * This signal is emitted when model data were changed due to filter * changes. * * Since: 1.0.2 */ signals[FILTER_CHANGED] = g_signal_new("filter-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderModelClass, filter_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void fm_folder_model_tree_model_init(GtkTreeModelIface *iface) { iface->get_flags = fm_folder_model_get_flags; iface->get_n_columns = fm_folder_model_get_n_columns; iface->get_column_type = fm_folder_model_get_column_type; iface->get_iter = fm_folder_model_get_iter; iface->get_path = fm_folder_model_get_path; iface->get_value = fm_folder_model_get_value; iface->iter_next = fm_folder_model_iter_next; iface->iter_children = fm_folder_model_iter_children; iface->iter_has_child = fm_folder_model_iter_has_child; iface->iter_n_children = fm_folder_model_iter_n_children; iface->iter_nth_child = fm_folder_model_iter_nth_child; iface->iter_parent = fm_folder_model_iter_parent; } static void fm_folder_model_tree_sortable_init(GtkTreeSortableIface *iface) { /* iface->sort_column_changed = fm_folder_model_sort_column_changed; */ iface->get_sort_column_id = fm_folder_model_get_sort_column_id; iface->set_sort_column_id = fm_folder_model_set_sort_column_id; iface->set_sort_func = fm_folder_model_set_sort_func; iface->set_default_sort_func = fm_folder_model_set_default_sort_func; iface->has_default_sort_func = ( gboolean (*)(GtkTreeSortable *) )gtk_false; } static gboolean _drag_source_false(GtkTreeDragSource *drag_source, GtkTreePath *path) { return FALSE; } static gboolean _drag_source_false2(GtkTreeDragSource *drag_source, GtkTreePath *path, GtkSelectionData *selection_data) { return FALSE; } static void fm_folder_model_drag_source_init(GtkTreeDragSourceIface *iface) { /* we don't support drag items even for extras - widgets will handle them */ iface->row_draggable = _drag_source_false; iface->drag_data_get = _drag_source_false2; iface->drag_data_delete = _drag_source_false; } static gboolean _drag_dest_false(GtkTreeDragDest *drag_dest, GtkTreePath *dest, GtkSelectionData *selection_data) { return FALSE; } static void fm_folder_model_drag_dest_init(GtkTreeDragDestIface *iface) { /* we don't support drag items even for extras - widgets will handle them */ iface->drag_data_received = _drag_dest_false; iface->row_drop_possible = _drag_dest_false; } static void fm_folder_model_filter_item_free(FmFolderModelFilterItem* item) { g_slice_free(FmFolderModelFilterItem, item); } static void fm_folder_model_dispose(GObject *object) { FmFolderModel* model = FM_FOLDER_MODEL(object); if(model->folder) fm_folder_model_set_folder(model, NULL); if(model->items) { g_sequence_free(model->items); model->items = NULL; } if(model->hidden) { g_sequence_free(model->hidden); model->hidden = NULL; } if(model->theme_change_handler) { g_signal_handler_disconnect(gtk_icon_theme_get_default(), model->theme_change_handler); model->theme_change_handler = 0; } g_signal_handlers_disconnect_by_func(fm_config, on_show_thumbnail_changed, model); g_signal_handlers_disconnect_by_func(fm_config, on_thumbnail_local_changed, model); g_signal_handlers_disconnect_by_func(fm_config, on_thumbnail_max_changed, model); if(model->thumbnail_requests) { g_list_foreach(model->thumbnail_requests, (GFunc)fm_thumbnail_request_cancel, NULL); g_list_free(model->thumbnail_requests); model->thumbnail_requests = NULL; } if(model->items_hash) { g_hash_table_destroy(model->items_hash); model->items_hash = NULL; } if(model->filters) { g_slist_free_full(model->filters, (GDestroyNotify)fm_folder_model_filter_item_free); model->filters = NULL; } (*G_OBJECT_CLASS(fm_folder_model_parent_class)->dispose)(object); } /** * fm_folder_model_new * @dir: the folder to create model * @show_hidden: whether show hidden files initially or not * * Creates new folder model for the @dir. * * Returns: (transfer full): a new #FmFolderModel object. * * Since: 0.1.0 */ FmFolderModel *fm_folder_model_new(FmFolder* dir, gboolean show_hidden) { FmFolderModel* model; model = (FmFolderModel*)g_object_new(FM_TYPE_FOLDER_MODEL, NULL); model->items = NULL; model->hidden = NULL; model->show_hidden = show_hidden; fm_folder_model_set_folder(model, dir); CHECK_MODULES(); /* prepare columns for application */ return model; } static inline FmFolderItem* fm_folder_item_new(FmFileInfo* inf) { FmFolderItem* item = g_slice_new0(FmFolderItem); item->inf = fm_file_info_ref(inf); return item; } static inline void fm_folder_item_free(gpointer data) { FmFolderItem* item = (FmFolderItem*)data; if( item->icon ) g_object_unref(item->icon); fm_file_info_unref(item->inf); g_slice_free(FmFolderItem, item); } static void _fm_folder_model_files_changed(FmFolder* dir, GSList* files, FmFolderModel* model) { GSList* l; for( l = files; l; l=l->next ) fm_folder_model_file_changed(model, l->data); } static void _fm_folder_model_add_file(FmFolderModel* model, FmFileInfo* file) { if(!file_can_show(model, file)) g_sequence_append( model->hidden, fm_folder_item_new(file) ); else fm_folder_model_file_created(model, file); } static void _fm_folder_model_files_added(FmFolder* dir, GSList* files, FmFolderModel* model) { GSList* l; for( l = files; l; l=l->next ) { FmFileInfo* fi = FM_FILE_INFO(l->data); _fm_folder_model_add_file(model, fi); } } static void _fm_folder_model_files_removed(FmFolder* dir, GSList* files, FmFolderModel* model) { GSList* l; for( l = files; l; l=l->next ) fm_folder_model_file_deleted(model, FM_FILE_INFO(l->data)); } /** * fm_folder_model_get_folder * @model: the folder model instance * * Retrieves a folder that @model is created for. Returned data are owned * by the @model and should not be freed by caller. * * Returns: (transfer none): the folder descriptor. * * Since: 1.0.0 */ FmFolder* fm_folder_model_get_folder(FmFolderModel* model) { return model->folder; } /** * fm_folder_model_get_folder_path * @model: the folder model instance * * Retrieves path of folder that @model is created for. Returned data * are owned by the @model and should not be freed by caller. * * Returns: (transfer none): the path of the folder of the model. * * Since: 1.0.0 */ FmPath* fm_folder_model_get_folder_path(FmFolderModel* model) { return model->folder ? fm_folder_get_path(model->folder) : NULL; } /** * fm_folder_model_set_folder * @model: a folder model instance * @dir: a new folder for the model * * Changes folder which model handles. This call allows reusing the model * for different folder, in case, e.g. directory was changed. * * Items added to @model with fm_folder_model_extra_file_add() are not * affected by this API. * * Since: 0.1.0 */ void fm_folder_model_set_folder(FmFolderModel* model, FmFolder* dir) { GSequence *new_items, *new_hidden; GSequenceIter *item_it, *next_item_it; FmFolderItem *item; if(model->folder == dir) return; /* g_debug("fm_folder_model_set_folder(%p, %p)", model, dir); */ new_items = g_sequence_new(fm_folder_item_free); new_hidden = g_sequence_new(fm_folder_item_free); /* keep extra items from removing */ if (model->items) { item_it = g_sequence_get_begin_iter(model->items); while(!g_sequence_iter_is_end(item_it)) { next_item_it = g_sequence_iter_next(item_it); /* next item */ item = (FmFolderItem*)g_sequence_get(item_it); if(item->is_extra) g_sequence_move(item_it, g_sequence_get_end_iter(new_items)); item_it = next_item_it; } } if (model->hidden) { item_it = g_sequence_get_begin_iter(model->hidden); while(!g_sequence_iter_is_end(item_it)) { next_item_it = g_sequence_iter_next(item_it); /* next item */ item = (FmFolderItem*)g_sequence_get(item_it); if(item->is_extra) g_sequence_move(item_it, g_sequence_get_begin_iter(new_hidden)); item_it = next_item_it; } } /* free the old folder */ if(model->folder) { guint row_deleted_signal = g_signal_lookup("row-deleted", GTK_TYPE_TREE_MODEL); g_signal_handlers_disconnect_by_func(model->folder, _fm_folder_model_files_added, model); g_signal_handlers_disconnect_by_func(model->folder, _fm_folder_model_files_removed, model); g_signal_handlers_disconnect_by_func(model->folder, _fm_folder_model_files_changed, model); /* Emit 'row-deleted' signals for all files */ if(g_signal_has_handler_pending(model, row_deleted_signal, 0, TRUE)) { GtkTreePath* tp = gtk_tree_path_new_first(); GSequenceIter* item_it = g_sequence_get_begin_iter(model->items); GtkTreeIter it; it.stamp = model->stamp; while(!g_sequence_iter_is_end(item_it)) { FmFolderItem* item = (FmFolderItem*)g_sequence_get(item_it); it.user_data = item_it; g_signal_emit(model, signals[ROW_DELETING], 0, tp, &it, item->userdata); gtk_tree_model_row_deleted((GtkTreeModel*)model, tp); item_it = g_sequence_iter_next(item_it); } gtk_tree_path_free(tp); } g_hash_table_remove_all(model->items_hash); g_sequence_free(model->items); g_sequence_free(model->hidden); g_object_unref(model->folder); model->folder = NULL; } model->items = new_items; model->hidden = new_hidden; /* recreate the hash for items that are in sequence still */ item_it = g_sequence_get_begin_iter(model->items); while(!g_sequence_iter_is_end(item_it)) { item = (FmFolderItem*)g_sequence_get(item_it); g_hash_table_insert(model->items_hash, item->inf, item_it); item_it = g_sequence_iter_next(item_it); } if( !dir ) return; model->folder = FM_FOLDER(g_object_ref(dir)); g_signal_connect(model->folder, "files-added", G_CALLBACK(_fm_folder_model_files_added), model); g_signal_connect(model->folder, "files-removed", G_CALLBACK(_fm_folder_model_files_removed), model); g_signal_connect(model->folder, "files-changed", G_CALLBACK(_fm_folder_model_files_changed), model); if(fm_folder_is_loaded(model->folder) || fm_folder_is_incremental(model->folder)) /* if it's already loaded */ { /* add existing files to the model */ if(!fm_folder_is_empty(model->folder)) { GList *l; FmFileInfoList* files = fm_folder_get_files(model->folder); for( l = fm_file_info_list_peek_head_link(files); l; l = l->next ) _fm_folder_model_add_file(model, FM_FILE_INFO(l->data)); } } } static GtkTreeModelFlags fm_folder_model_get_flags(GtkTreeModel *tree_model) { g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), (GtkTreeModelFlags)0); return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST); } static gint fm_folder_model_get_n_columns(GtkTreeModel *tree_model) { return (gint)column_infos_n; } static GType fm_folder_model_get_column_type(GtkTreeModel *tree_model, gint index) { g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), G_TYPE_INVALID); if((guint)index >= column_infos_n) return G_TYPE_INVALID; if(column_infos[index] == NULL) return G_TYPE_INVALID; return column_infos[index]->type; } static gboolean fm_folder_model_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) { FmFolderModel* model; gint *indices, n, depth; GSequenceIter* items_it; g_assert(FM_IS_FOLDER_MODEL(tree_model)); g_assert(path!=NULL); model = (FmFolderModel*)tree_model; indices = gtk_tree_path_get_indices(path); depth = gtk_tree_path_get_depth(path); /* we do not allow children */ g_assert(depth == 1); /* depth 1 = top level; a list only has top level nodes and no children */ n = indices[0]; /* the n-th top level row */ if( n >= g_sequence_get_length(model->items) || n < 0 ) return FALSE; items_it = g_sequence_get_iter_at_pos(model->items, n); g_assert( items_it != g_sequence_get_end_iter(model->items) ); /* We simply store a pointer in the iter */ iter->stamp = model->stamp; iter->user_data = items_it; return TRUE; } static GtkTreePath *fm_folder_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkTreePath* path; GSequenceIter* items_it; FmFolderModel* model = FM_FOLDER_MODEL(tree_model); g_return_val_if_fail(model, NULL); g_return_val_if_fail(iter != NULL, NULL); g_return_val_if_fail(iter->stamp == model->stamp, NULL); g_return_val_if_fail(iter->user_data != NULL, NULL); items_it = (GSequenceIter*)iter->user_data; path = gtk_tree_path_new(); gtk_tree_path_append_index( path, g_sequence_iter_get_position(items_it) ); return path; } static void fm_folder_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { GSequenceIter* item_it; FmFolderModel* model = FM_FOLDER_MODEL(tree_model); g_return_if_fail(iter != NULL); g_return_if_fail((guint)column < column_infos_n && column_infos[column] != NULL); g_value_init(value, column_infos[column]->type); item_it = (GSequenceIter*)iter->user_data; g_return_if_fail(item_it != NULL); FmFolderItem* item = (FmFolderItem*)g_sequence_get(item_it); FmFileInfo* info = item->inf; FmIcon* icon; mode_t mode; char buf[12]; if(column >= FM_FOLDER_MODEL_N_COLS) /* extension */ { column_infos[column]->get_value(info, value); } else switch( (FmFolderModelCol)column ) { case FM_FOLDER_MODEL_COL_GICON: icon = fm_file_info_get_icon(info); if(G_LIKELY(icon)) g_value_set_object(value, icon); break; case FM_FOLDER_MODEL_COL_ICON: { if(G_UNLIKELY(!item->icon)) { icon = fm_file_info_get_icon(info); if(!icon) return; /* FIXME: use "emblem-symbolic-link" if file is some kind of link */ /* special handle for desktop entries that have invalid icon */ if(fm_file_info_is_dir(info)) item->icon = fm_pixbuf_from_icon_with_fallback(icon, model->icon_size, "folder"); else if(fm_file_info_is_desktop_entry(info)) item->icon = fm_pixbuf_from_icon_with_fallback(icon, model->icon_size, "application-x-executable"); else item->icon = fm_pixbuf_from_icon(icon, model->icon_size); } g_value_set_object(value, item->icon); /* if we want to show a thumbnail */ /* if we're on local filesystem or thumbnailing for remote files is allowed */ if(fm_config->show_thumbnail && (fm_path_is_native_or_trash(fm_file_info_get_path(info)) || !fm_config->thumbnail_local)) { if(!item->is_thumbnail && !item->thumbnail_failed && !item->thumbnail_loading) { if(fm_file_info_can_thumbnail(item->inf)) { FmThumbnailRequest* req = fm_thumbnail_request(item->inf, model->icon_size, on_thumbnail_loaded, model); model->thumbnail_requests = g_list_prepend(model->thumbnail_requests, req); item->thumbnail_loading = TRUE; } else { item->thumbnail_failed = TRUE; } } } break; } case FM_FOLDER_MODEL_COL_NAME: g_value_set_string(value, fm_file_info_get_disp_name(info)); break; case FM_FOLDER_MODEL_COL_SIZE: g_value_set_string( value, fm_file_info_get_disp_size(info) ); break; case FM_FOLDER_MODEL_COL_DESC: g_value_set_string( value, fm_file_info_get_desc(info) ); break; case FM_FOLDER_MODEL_COL_PERM: mode = fm_file_info_get_mode(info); strcpy(buf, "---------"); if ((mode & S_IRUSR) != 0) buf[0] = 'r'; if ((mode & S_IWUSR) != 0) buf[1] = 'w'; if ((mode & (S_IXUSR | S_ISUID)) == (S_IXUSR | S_ISUID)) buf[2] = 's'; else if ((mode & S_IXUSR) != 0) buf[2] = 'x'; else if ((mode & S_ISUID) != 0) buf[2] = 'S'; if ((mode & S_IRGRP) != 0) buf[3] = 'r'; if ((mode & S_IWGRP) != 0) buf[4] = 'w'; if ((mode & (S_IXGRP | S_ISGID)) == (S_IXGRP | S_ISGID)) buf[5] = 's'; else if ((mode & S_IXGRP) != 0) buf[5] = 'x'; else if ((mode & S_ISGID) != 0) buf[5] = 'S'; if ((mode & S_IROTH) != 0) buf[6] = 'r'; if ((mode & S_IWOTH) != 0) buf[7] = 'w'; if ((mode & (S_IXOTH | S_ISVTX)) == (S_IXOTH | S_ISVTX)) buf[8] = 't'; else if ((mode & S_IXOTH) != 0) buf[8] = 'x'; else if ((mode & S_ISVTX) != 0) buf[8] = 'T'; g_value_set_string(value, buf); break; case FM_FOLDER_MODEL_COL_OWNER: g_value_set_string( value, fm_file_info_get_disp_owner(info) ); break; case FM_FOLDER_MODEL_COL_MTIME: g_value_set_string( value, fm_file_info_get_disp_mtime(info) ); break; case FM_FOLDER_MODEL_COL_INFO: g_value_set_pointer(value, info); break; case FM_FOLDER_MODEL_COL_DIRNAME: { FmPath* path = fm_file_info_get_path(info); FmPath* dirpath = fm_path_get_parent(path); if(dirpath) { char* dirname = fm_path_display_name(dirpath, TRUE); /* get name of the folder containing the file. */ g_value_set_string(value, dirname); g_free(dirname); } break; } case FM_FOLDER_MODEL_COL_EXT: { const char *name = fm_file_info_get_disp_name(info); const char *str; if (fm_file_info_is_dir(info)) { /* don't look for extension in directories*/ str = NULL; } else { str = strrchr(name, '.'); if (str == name) str = NULL; else if (str) str++; } g_value_set_string(value, str); } break; case FM_FOLDER_MODEL_N_COLS: ; /* unused here */ } } static gboolean fm_folder_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter) { GSequenceIter* item_it, *next_item_it; FmFolderModel* model; g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), FALSE); if( iter == NULL || iter->user_data == NULL ) return FALSE; model = (FmFolderModel*)tree_model; item_it = (GSequenceIter *)iter->user_data; /* Is this the last iter in the list? */ next_item_it = g_sequence_iter_next(item_it); if( g_sequence_iter_is_end(next_item_it) ) return FALSE; iter->stamp = model->stamp; iter->user_data = next_item_it; return TRUE; } static gboolean fm_folder_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { FmFolderModel* model; GSequenceIter* items_it; g_return_val_if_fail(parent == NULL || parent->user_data != NULL, FALSE); /* this is a list, nodes have no children */ if( parent ) return FALSE; /* parent == NULL is a special case; we need to return the first top-level row */ g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), FALSE); model = (FmFolderModel*)tree_model; /* No rows => no first row */ // if ( model->folder->n_items == 0 ) // return FALSE; /* Set iter to first item in list */ items_it = g_sequence_get_begin_iter(model->items); iter->stamp = model->stamp; iter->user_data = items_it; return TRUE; } static gboolean fm_folder_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter) { return FALSE; } static gint fm_folder_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter) { FmFolderModel* model; g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), -1); g_return_val_if_fail(iter == NULL || iter->user_data != NULL, -1); model = (FmFolderModel*)tree_model; /* special case: if iter == NULL, return number of top-level rows */ if( !iter ) return g_sequence_get_length(model->items); return 0; /* otherwise, this is easy again for a list */ } static gboolean fm_folder_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n) { GSequenceIter* items_it; FmFolderModel* model; g_return_val_if_fail(FM_IS_FOLDER_MODEL(tree_model), FALSE); model = (FmFolderModel*)tree_model; /* a list has only top-level rows */ if( parent ) return FALSE; /* special case: if parent == NULL, set iter to n-th top-level row */ if( n >= g_sequence_get_length(model->items) || n < 0 ) return FALSE; items_it = g_sequence_get_iter_at_pos(model->items, n); g_assert( items_it != g_sequence_get_end_iter(model->items) ); iter->stamp = model->stamp; iter->user_data = items_it; return TRUE; } static gboolean fm_folder_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) { return FALSE; } static gboolean fm_folder_model_get_sort_column_id(GtkTreeSortable* sortable, gint* sort_column_id, GtkSortType* order) { FmFolderModel* model = FM_FOLDER_MODEL(sortable); if( sort_column_id ) *sort_column_id = model->sort_col; if( order ) *order = FM_SORT_IS_ASCENDING(model->sort_mode) ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING; return TRUE; } static void fm_folder_model_set_sort_column_id(GtkTreeSortable* sortable, gint sort_column_id, GtkSortType order) { FmFolderModel* model = FM_FOLDER_MODEL(sortable); FmSortMode mode = model->sort_mode; mode &= ~FM_SORT_ORDER_MASK; if(order == GTK_SORT_ASCENDING) mode |= FM_SORT_ASCENDING; else mode |= FM_SORT_DESCENDING; model->sort_col = sort_column_id; model->sort_mode = mode; gtk_tree_sortable_sort_column_changed(sortable); fm_folder_model_do_sort(model); } static void fm_folder_model_set_sort_func(GtkTreeSortable *sortable, gint sort_column_id, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy) { g_warning("fm_folder_model_set_sort_func: Not supported\n"); } static void fm_folder_model_set_default_sort_func(GtkTreeSortable *sortable, GtkTreeIterCompareFunc sort_func, gpointer user_data, GDestroyNotify destroy) { g_warning("fm_folder_model_set_default_sort_func: Not supported\n"); } static gint fm_folder_model_compare(gconstpointer item1, gconstpointer item2, gpointer user_data) { FmFolderModel* model = FM_FOLDER_MODEL(user_data); FmFileInfo* file1 = ((FmFolderItem*)item1)->inf; FmFileInfo* file2 = ((FmFolderItem*)item2)->inf; const char* key1; const char* key2; const char *name; goffset diff; int ret = 0; /* put folders before files */ if(!(model->sort_mode & FM_SORT_NO_FOLDER_FIRST)) { ret = fm_file_info_is_dir(file2) - fm_file_info_is_dir(file1); if( ret ) return ret; } /* do with extra items */ if (G_UNLIKELY(((FmFolderItem*)item1)->is_extra)) switch (((FmFolderItem*)item1)->pos) { case FM_FOLDER_MODEL_ITEMPOS_SORTED: break; /* file1 is in sort sequence */ case FM_FOLDER_MODEL_ITEMPOS_PRE: if (((FmFolderItem*)item2)->is_extra && ((FmFolderItem*)item2)->pos == FM_FOLDER_MODEL_ITEMPOS_PRE) goto _main_sort; /* both are PRE */ return -1; /* file1 should be before file2 */ case FM_FOLDER_MODEL_ITEMPOS_POST: if (((FmFolderItem*)item2)->is_extra && ((FmFolderItem*)item2)->pos == FM_FOLDER_MODEL_ITEMPOS_POST) goto _main_sort; /* both are POST */ return 1; /* file1 should be after file2 */ } if (G_UNLIKELY(((FmFolderItem*)item2)->is_extra)) switch (((FmFolderItem*)item2)->pos) { case FM_FOLDER_MODEL_ITEMPOS_SORTED: break; /* file2 is in sort sequence */ case FM_FOLDER_MODEL_ITEMPOS_PRE: return 1; /* case if both are PRE was handled above */ case FM_FOLDER_MODEL_ITEMPOS_POST: return -1; /* case if both are POST was handled above */ } _main_sort: if(model->sort_col >= FM_FOLDER_MODEL_N_COLS && model->sort_col < column_infos_n && column_infos[model->sort_col]->compare) { ret = column_infos[model->sort_col]->compare(file1, file2); if(ret == 0) goto _sort_by_name; } else switch( model->sort_col ) { case FM_FOLDER_MODEL_COL_SIZE: /* to support files more than 2Gb */ diff = fm_file_info_get_size(file1) - fm_file_info_get_size(file2); if(0 == diff) goto _sort_by_name; ret = diff > 0 ? 1 : -1; break; case FM_FOLDER_MODEL_COL_MTIME: ret = fm_file_info_get_mtime(file1) - fm_file_info_get_mtime(file2); if(0 == ret) goto _sort_by_name; break; case FM_FOLDER_MODEL_COL_DESC: /* FIXME: this is very slow */ ret = g_utf8_collate(fm_file_info_get_desc(file1), fm_file_info_get_desc(file2)); if(0 == ret) goto _sort_by_name; break; case FM_FOLDER_MODEL_COL_UNSORTED: return 0; case FM_FOLDER_MODEL_COL_DIRNAME: { /* get name of the folder containing the file. */ FmPath* dirpath1 = fm_file_info_get_path(file1); FmPath* dirpath2 = fm_file_info_get_path(file2); dirpath1 = fm_path_get_parent(dirpath1); dirpath2 = fm_path_get_parent(dirpath2); /* FIXME: should we compare display names instead? */ ret = fm_path_compare(dirpath1, dirpath2); } break; case FM_FOLDER_MODEL_COL_EXT: name = fm_file_info_get_disp_name(file1); key1 = strrchr(name, '.'); if (key1 == name) key1 = NULL; name = fm_file_info_get_disp_name(file2); key2 = strrchr(name, '.'); if (key2 == name) key2 = NULL; ret = g_strcmp0(key1, key2); if (ret == 0) goto _sort_by_name; break; default: _sort_by_name: if(model->sort_mode & FM_SORT_CASE_SENSITIVE) { // key1 = fm_file_info_get_collate_key_nocasefold(file1); // key2 = fm_file_info_get_collate_key_nocasefold(file2); /* unfortunately g_uft8_collate_key() ignores case in some locales */ key1 = fm_file_info_get_disp_name(file1); key2 = fm_file_info_get_disp_name(file2); } else { key1 = fm_file_info_get_collate_key(file1); key2 = fm_file_info_get_collate_key(file2); /* collate keys are already passed to g_utf8_casefold, no need to use strcasecmp here (and g_utf8_collate_key returns a string of which case cannot be ignored) */ } ret = g_strcmp0(key1, key2); break; } return FM_SORT_IS_ASCENDING(model->sort_mode) ? ret : -ret; } static void fm_folder_model_do_sort(FmFolderModel* model) { GHashTable* old_order; gint *new_order; GSequenceIter *items_it; GtkTreePath *path; /* if there is only one item */ if( model->items == NULL || g_sequence_get_length(model->items) <= 1 ) return; old_order = g_hash_table_new(g_direct_hash, g_direct_equal); /* save old order */ items_it = g_sequence_get_begin_iter(model->items); while( !g_sequence_iter_is_end(items_it) ) { int i = g_sequence_iter_get_position(items_it); g_hash_table_insert( old_order, items_it, GINT_TO_POINTER(i) ); items_it = g_sequence_iter_next(items_it); } /* sort the list */ g_sequence_sort(model->items, fm_folder_model_compare, model); /* save new order */ new_order = g_new( int, g_sequence_get_length(model->items) ); items_it = g_sequence_get_begin_iter(model->items); while( !g_sequence_iter_is_end(items_it) ) { int i = g_sequence_iter_get_position(items_it); new_order[i] = GPOINTER_TO_INT(g_hash_table_lookup(old_order, items_it)); items_it = g_sequence_iter_next(items_it); } g_hash_table_destroy(old_order); path = gtk_tree_path_new(); gtk_tree_model_rows_reordered(GTK_TREE_MODEL(model), path, NULL, new_order); gtk_tree_path_free(path); g_free(new_order); } static void _fm_folder_model_insert_item(FmFolderModel* model, FmFolderItem* new_item) { GtkTreeIter it; GtkTreePath* path; GSequenceIter *item_it = g_sequence_insert_sorted(model->items, new_item, fm_folder_model_compare, model); g_hash_table_insert(model->items_hash, new_item->inf, item_it); it.stamp = model->stamp; it.user_data = item_it; path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(item_it), -1); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), path, &it); gtk_tree_path_free(path); } /** * fm_folder_model_file_created * @model: the folder model instance * @file: new file into * * Adds new created @file into @model. * * Since: 0.1.0 */ void fm_folder_model_file_created(FmFolderModel* model, FmFileInfo* file) { FmFolderItem* new_item = fm_folder_item_new(file); _fm_folder_model_insert_item(model, new_item); } /** * fm_folder_model_extra_file_add * @model: the folder model instance * @file: the file into * @where: position where to put @file in folder model * * Adds @file into @model. Added file will stay at defined position after * any folder change. * * See also: fm_folder_model_set_folder(), fm_folder_model_extra_file_remove(). * * Returns: %FALSE if adding was failed. * * Since: 1.2.0 */ gboolean fm_folder_model_extra_file_add(FmFolderModel* model, FmFileInfo* file, FmFolderModelExtraFilePos where) { FmFolderItem *item; /* check visible items first */ if (g_hash_table_lookup(model->items_hash, file) != NULL) return FALSE; /* it is already there! */ /* check hidden items as well */ if (!file_can_show(model, file)) /* if this is a hidden file */ { GSequenceIter *seq_it = g_sequence_get_begin_iter(model->hidden); while (!g_sequence_iter_is_end(seq_it)) { item = (FmFolderItem*)g_sequence_get(seq_it); if (item->inf == file) /* found! */ return FALSE; seq_it = g_sequence_iter_next(seq_it); } } item = fm_folder_item_new(file); item->is_extra = TRUE; item->pos = where; _fm_folder_model_insert_item(model, item); return TRUE; } static inline GSequenceIter* info2iter(FmFolderModel* model, FmFileInfo* file) { return (GSequenceIter*)g_hash_table_lookup(model->items_hash, file); } /** * fm_folder_model_file_deleted * @model: the folder model instance * @file: removed file into * * Removes a @file from @model. * * Since: 0.1.0 */ void fm_folder_model_file_deleted(FmFolderModel* model, FmFileInfo* file) { GSequenceIter *seq_it; FmFolderItem* item = NULL; GtkTreePath* path; GtkTreeIter it; if(!file_can_show(model, file)) /* if this is a hidden file */ { seq_it = g_sequence_get_begin_iter(model->hidden); while( !g_sequence_iter_is_end(seq_it) ) { item = (FmFolderItem*)g_sequence_get(seq_it); if( item->inf == file ) { g_sequence_remove(seq_it); return; } seq_it = g_sequence_iter_next(seq_it); } return; } seq_it = info2iter(model, file); g_return_if_fail(seq_it != NULL); item = (FmFolderItem*)g_sequence_get(seq_it); path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(seq_it), -1); it.stamp = model->stamp; it.user_data = seq_it; g_signal_emit(model, signals[ROW_DELETING], 0, path, &it, item->userdata); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path); gtk_tree_path_free(path); g_hash_table_remove(model->items_hash, file); g_sequence_remove(seq_it); } /** * fm_folder_model_extra_file_remove * @model: the folder model instance * @file: the file into * * Removes @file from @model if @file was added to the model using * fm_folder_model_extra_file_add(). * * Returns: %FALSE if @file cannot be removed. * * Since: 1.2.0 */ gboolean fm_folder_model_extra_file_remove(FmFolderModel* model, FmFileInfo* file) { GSequenceIter *seq_it; FmFolderItem *item = NULL; GtkTreePath *path; GtkTreeIter it; gboolean is_hidden = FALSE; /* check visible items */ seq_it = info2iter(model, file); if (seq_it) item = (FmFolderItem*)g_sequence_get(seq_it); /* check hidden items */ else if (!file_can_show(model, file)) /* if this is a hidden file */ { seq_it = g_sequence_get_begin_iter(model->hidden); while (!g_sequence_iter_is_end(seq_it)) { item = (FmFolderItem*)g_sequence_get(seq_it); if (item->inf == file) /* found! */ break; item = NULL; /* reset it again */ seq_it = g_sequence_iter_next(seq_it); } is_hidden = TRUE; } if (item == NULL) /* item not found */ return FALSE; if (!item->is_extra) /* it wasn't added with fm_folder_model_extra_file_add */ return FALSE; if (!is_hidden) /* it is visible, notify everyone we remove it */ { path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(seq_it), -1); it.stamp = model->stamp; it.user_data = seq_it; g_signal_emit(model, signals[ROW_DELETING], 0, path, &it, item->userdata); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path); gtk_tree_path_free(path); g_hash_table_remove(model->items_hash, file); } g_sequence_remove(seq_it); return TRUE; } /** * fm_folder_model_file_changed * @model: a folder model instance * @file: a file into * * Updates info for the @file in the @model. * * Since: 0.1.0 */ void fm_folder_model_file_changed(FmFolderModel* model, FmFileInfo* file) { FmFolderItem* item = NULL; GSequenceIter* items_it; GtkTreeIter it; GtkTreePath* path; it.stamp = model->stamp; if(!file_can_show(model, file)) { items_it = info2iter(model, file); if (items_it) /* file was visible and now is hidden */ { gint delete_pos = g_sequence_iter_get_position(items_it); /* get row index */ it.user_data = items_it; /* setup the tree iterator */ g_hash_table_remove(model->items_hash, file); /* move the item from visible list to hidden list */ g_sequence_move(items_it, g_sequence_get_begin_iter(model->hidden)); /* tell everybody that we removed the item */ path = gtk_tree_path_new_from_indices(delete_pos, -1); item = (FmFolderItem*)g_sequence_get(items_it); g_signal_emit(model, signals[ROW_DELETING], 0, path, &it, item->userdata); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), path); gtk_tree_path_free(path); } return; } items_it = info2iter(model, file); if(!items_it) { /* handle this: file was hidden and now is visible */ items_it = g_sequence_get_begin_iter(model->hidden); while(!g_sequence_iter_is_end(items_it)) /* iterate over the hidden list */ { item = (FmFolderItem*)g_sequence_get(items_it); if (item->inf == file) { /* find a nice position in visible item list to insert the item */ GSequenceIter* insert_item_it = g_sequence_search(model->items, item, fm_folder_model_compare, model); it.user_data = items_it; /* setup the tree iterator */ /* move the item from hidden items to visible items list */ g_sequence_move(items_it, insert_item_it); g_hash_table_insert(model->items_hash, file, items_it); /* tell the world that we inserted it */ path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(items_it), -1); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), path, &it); gtk_tree_path_free(path); return; } items_it = g_sequence_iter_next(items_it); } /* item found nowhere, shouldn't we crash? */ g_return_if_reached(); } item = (FmFolderItem*)g_sequence_get(items_it); /* update the icon */ if( item->icon ) { g_object_unref(item->icon); item->icon = NULL; item->is_thumbnail = FALSE; } it.user_data = items_it; path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(items_it), -1); gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &it); gtk_tree_path_free(path); } static inline gboolean file_can_show(FmFolderModel* model, FmFileInfo* file) { if(!model->show_hidden && fm_file_info_is_hidden(file)) return FALSE; if(model->filters) { GSList* l; for(l = model->filters; l; l=l->next) { FmFolderModelFilterItem* item = (FmFolderModelFilterItem*)l->data; if(!item->func(file, item->user_data)) return FALSE; } } return TRUE; } /** * fm_folder_model_get_show_hidden * @model: the folder model instance * * Retrieves info whether folder model includes hidden files. * * Returns: %TRUE if hidden files are visible within @model. * * Since: 0.1.0 */ gboolean fm_folder_model_get_show_hidden(FmFolderModel* model) { return model->show_hidden; } /** * fm_folder_model_set_show_hidden * @model: the folder model instance * @show_hidden: whether show hidden files or not * * Changes visibility of hodden files within @model. * * Since: 0.1.0 */ void fm_folder_model_set_show_hidden(FmFolderModel* model, gboolean show_hidden) { g_return_if_fail(model != NULL); if( model->show_hidden == show_hidden ) return; model->show_hidden = show_hidden; fm_folder_model_apply_filters(model); } static void reload_icons(FmFolderModel* model, enum ReloadFlags flags) { /* reload icons */ GSequenceIter* it = g_sequence_get_begin_iter(model->items); GtkTreePath* tp = gtk_tree_path_new_from_indices(0, -1); if(model->thumbnail_requests) { g_list_foreach(model->thumbnail_requests, (GFunc)fm_thumbnail_request_cancel, NULL); g_list_free(model->thumbnail_requests); model->thumbnail_requests = NULL; } for( ; !g_sequence_iter_is_end(it); it = g_sequence_iter_next(it) ) { FmFolderItem* item = (FmFolderItem*)g_sequence_get(it); if(item->icon) { GtkTreeIter tree_it; if((flags & RELOAD_ICONS && !item->is_thumbnail) || (flags & RELOAD_THUMBNAILS && item->is_thumbnail)) { g_object_unref(item->icon); item->icon = NULL; item->is_thumbnail = FALSE; item->thumbnail_loading = FALSE; tree_it.stamp = model->stamp; tree_it.user_data = it; gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &tree_it); } } gtk_tree_path_next(tp); } gtk_tree_path_free(tp); it = g_sequence_get_begin_iter(model->hidden); for( ; !g_sequence_iter_is_end(it); it = g_sequence_iter_next(it) ) { FmFolderItem* item = (FmFolderItem*)g_sequence_get(it); if(item->icon) { g_object_unref(item->icon); item->icon = NULL; item->is_thumbnail = FALSE; item->thumbnail_loading = FALSE; } } } static void on_icon_theme_changed(GtkIconTheme* theme, FmFolderModel* model) { reload_icons(model, RELOAD_ICONS); } /** * fm_folder_model_find_iter_by_filename * @model: the folder model instance * @it: pointer to iterator to fill * @name: file name to search * * Searches @model for existance of some file in it. If file was found * then sets @it to match found file. * * Returns: %TRUE if file was found. * * Since: 0.1.0 */ gboolean fm_folder_model_find_iter_by_filename(FmFolderModel* model, GtkTreeIter* it, const char* name) { GSequenceIter *item_it = g_sequence_get_begin_iter(model->items); for( ; !g_sequence_iter_is_end(item_it); item_it = g_sequence_iter_next(item_it) ) { FmFolderItem* item = (FmFolderItem*)g_sequence_get(item_it); FmPath* path = fm_file_info_get_path(item->inf); if( g_strcmp0(fm_path_get_basename(path), name) == 0 ) { it->stamp = model->stamp; it->user_data = item_it; return TRUE; } } return FALSE; } static void on_thumbnail_loaded(FmThumbnailRequest* req, gpointer user_data) { FmFolderModel* model = (FmFolderModel*)user_data; FmFileInfo* fi = fm_thumbnail_request_get_file_info(req); GdkPixbuf* pix = fm_thumbnail_request_get_pixbuf(req); GtkTreeIter it; GSequenceIter* seq_it; /* FmPath* path = fm_file_info_get_path(fi); g_debug("thumbnail loaded for %s, %p, size = %d", path->name, pix, size); */ /* remove the request from list */ model->thumbnail_requests = g_list_remove(model->thumbnail_requests, req); seq_it = info2iter(model, fi); if(seq_it) { FmFolderItem* item; item = (FmFolderItem*)g_sequence_get(seq_it); if(pix) { GtkTreePath* tp; it.stamp = model->stamp; it.user_data = seq_it; GDK_THREADS_ENTER(); tp = fm_folder_model_get_path(GTK_TREE_MODEL(model), &it); if(item->icon) g_object_unref(item->icon); item->icon = g_object_ref(pix); item->is_thumbnail = TRUE; gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &it); gtk_tree_path_free(tp); GDK_THREADS_LEAVE(); } else { item->thumbnail_failed = TRUE; } item->thumbnail_loading = FALSE; return; } g_return_if_reached(); } /** * fm_folder_model_set_icon_size * @model: the folder model instance * @icon_size: new size for icons in pixels * * Changes the size of icons in @model data. * * Since: 0.1.0 */ void fm_folder_model_set_icon_size(FmFolderModel* model, guint icon_size) { if(model->icon_size == icon_size) return; model->icon_size = icon_size; reload_icons(model, RELOAD_BOTH); } /** * fm_folder_model_get_icon_size * @model: the folder model instance * * Retrieves the size of icons in @model data. * * Returns: size of icons in pixels. * * Since: 0.1.0 */ guint fm_folder_model_get_icon_size(FmFolderModel* model) { return model->icon_size; } static void on_show_thumbnail_changed(FmConfig* cfg, gpointer user_data) { FmFolderModel* model = (FmFolderModel*)user_data; reload_icons(model, RELOAD_THUMBNAILS); } static GList* find_in_pending_thumbnail_requests(FmFolderModel* model, FmFileInfo* fi) { GList* reqs = model->thumbnail_requests, *l; for(l=reqs;l;l=l->next) { FmThumbnailRequest* req = (FmThumbnailRequest*)l->data; FmFileInfo* fi2 = fm_thumbnail_request_get_file_info(req); FmPath* path = fm_file_info_get_path(fi); FmPath* path2 = fm_file_info_get_path(fi2); if(path && path2 && strcmp(fm_path_get_basename(path), fm_path_get_basename(path2)) == 0) return l; } return NULL; } static void reload_thumbnail(FmFolderModel* model, GSequenceIter* seq_it, FmFolderItem* item) { GtkTreeIter it; GtkTreePath* tp; if(item->is_thumbnail) { g_object_unref(item->icon); item->icon = NULL; it.stamp = model->stamp; it.user_data = seq_it; tp = fm_folder_model_get_path(GTK_TREE_MODEL(model), &it); gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &it); gtk_tree_path_free(tp); } } /* FIXME: how about hidden files? */ static void on_thumbnail_local_changed(FmConfig* cfg, gpointer user_data) { FmFolderModel* model = (FmFolderModel*)user_data; FmThumbnailRequest* req; GList* new_reqs = NULL; GSequenceIter* seq_it; FmFileInfo* fi; if(cfg->thumbnail_local) { GList* l; /* remove non-local files from thumbnail requests */ for(l = model->thumbnail_requests; l; ) { GList* next = l->next; req = (FmThumbnailRequest*)l->data; fi = fm_thumbnail_request_get_file_info(req); if(!fm_path_is_native_or_trash(fm_file_info_get_path(fi))) { fm_thumbnail_request_cancel(req); model->thumbnail_requests = g_list_delete_link(model->thumbnail_requests, l); /* FIXME: item->thumbnail_loading should be set to FALSE. */ } l = next; } } seq_it = g_sequence_get_begin_iter(model->items); while( !g_sequence_iter_is_end(seq_it) ) { FmFolderItem* item = (FmFolderItem*)g_sequence_get(seq_it); fi = item->inf; FmPath* path = fm_file_info_get_path(fi); if(cfg->thumbnail_local) { /* add all non-local files to thumbnail requests */ if(!fm_path_is_native_or_trash(path)) reload_thumbnail(model, seq_it, item); } else { /* add all non-local files to thumbnail requests */ if(!fm_path_is_native_or_trash(path)) { req = fm_thumbnail_request(fi, model->icon_size, on_thumbnail_loaded, model); new_reqs = g_list_append(new_reqs, req); } } seq_it = g_sequence_iter_next(seq_it); } if(new_reqs) model->thumbnail_requests = g_list_concat(model->thumbnail_requests, new_reqs); } /* FIXME: how about hidden files? */ static void on_thumbnail_max_changed(FmConfig* cfg, gpointer user_data) { FmFolderModel* model = (FmFolderModel*)user_data; FmThumbnailRequest* req; GList* new_reqs = NULL; GSequenceIter* seq_it; FmFileInfo* fi; guint thumbnail_max_bytes = fm_config->thumbnail_max << 10; goffset size; seq_it = g_sequence_get_begin_iter(model->items); while( !g_sequence_iter_is_end(seq_it) ) { FmFolderItem* item = (FmFolderItem*)g_sequence_get(seq_it); fi = item->inf; if(cfg->thumbnail_max) { /* if the new size limit for image files becomes bigger, * find out image files which can be thumbnailed under the * new file size limit. */ if(thumbnail_max_bytes > model->thumbnail_max) { /* this file is previously beyond our limit, but now it's * below the new limit. so, generate a thumbnail for it. */ size = fm_file_info_get_size(fi); if(size < thumbnail_max_bytes && size > model->thumbnail_max ) { /* check if we can really thumbnail the file and call * fm_file_info_is_image() to see if it's an image file * for which the thumbnails are created by the built-in GdkPixbuf * thumbnailer. We don't apply the file size limit * for external thumbnailers now. */ if(!item->thumbnail_failed && fm_file_info_can_thumbnail(fi) && fm_file_info_is_image(fi)) { req = fm_thumbnail_request(fi, model->icon_size, on_thumbnail_loaded, model); new_reqs = g_list_append(new_reqs, req); } } } } else /* no limit, all files can be added */ { /* add all files to thumbnail requests */ if(!item->is_thumbnail && !item->thumbnail_loading && !item->thumbnail_failed && fm_file_info_can_thumbnail(fi)) { GList* l = find_in_pending_thumbnail_requests(model, fi); if(!l) { req = fm_thumbnail_request(fi, model->icon_size, on_thumbnail_loaded, model); new_reqs = g_list_append(new_reqs, req); } } } seq_it = g_sequence_iter_next(seq_it); } if(new_reqs) model->thumbnail_requests = g_list_concat(model->thumbnail_requests, new_reqs); model->thumbnail_max = thumbnail_max_bytes; } /** * fm_folder_model_set_item_userdata * @model : the folder model instance * @it : iterator of row to set data * @user_data : user data that will be associated with the row * * Sets the data that can be retrieved by fm_folder_model_get_item_userdata(). * * Since: 1.0.0 */ void fm_folder_model_set_item_userdata(FmFolderModel* model, GtkTreeIter* it, gpointer user_data) { GSequenceIter* item_it; FmFolderItem* item; g_return_if_fail(it != NULL); g_return_if_fail(model != NULL); g_return_if_fail(it->stamp == model->stamp); item_it = (GSequenceIter*)it->user_data; g_return_if_fail(item_it != NULL); item = (FmFolderItem*)g_sequence_get(item_it); item->userdata = user_data; } /** * fm_folder_model_get_item_userdata * @model: the folder model instance * @it: iterator of row to retrieve data * * Returns the data that was set by last call of * fm_folder_model_set_item_userdata() on that row. * * Return value: user data that was set on that row * * Since: 1.0.0 */ gpointer fm_folder_model_get_item_userdata(FmFolderModel* model, GtkTreeIter* it) { GSequenceIter* item_it; FmFolderItem* item; g_return_val_if_fail(it != NULL, NULL); g_return_val_if_fail(model != NULL, NULL); g_return_val_if_fail(it->stamp == model->stamp, NULL); item_it = (GSequenceIter*)it->user_data; g_return_val_if_fail(item_it != NULL, NULL); item = (FmFolderItem*)g_sequence_get(item_it); return item->userdata; } /** * fm_folder_model_add_filter * @model: the folder model instance * @func: a filter function * @user_data: user data passed to the filter function * * Install a filter function to filter out and hide some items. * This only install a filter function and does not update content of the model. * You need to call fm_folder_model_apply_filters() to refilter the model. * * Since: 1.0.2 */ void fm_folder_model_add_filter(FmFolderModel* model, FmFolderModelFilterFunc func, gpointer user_data) { FmFolderModelFilterItem* item = g_slice_new(FmFolderModelFilterItem); item->func = func; item->user_data = user_data; model->filters = g_slist_prepend(model->filters, item); } /** * fm_folder_model_remove_filter * @model: the folder model instance * @func: a filter function * @user_data: user data passed to the filter function * * Remove a filter function previously installed by fm_folder_model_add_filter() * This only remove the filter function and does not update content of the model. * You need to call fm_folder_model_apply_filters() to refilter the model. * * Since: 1.0.2 */ void fm_folder_model_remove_filter(FmFolderModel* model, FmFolderModelFilterFunc func, gpointer user_data) { GSList* l; for(l = model->filters; l; l=l->next) { FmFolderModelFilterItem* item = (FmFolderModelFilterItem*)l->data; if(item->func == func && item->user_data == user_data) { model->filters = g_slist_delete_link(model->filters, l); fm_folder_model_filter_item_free(item); break; } } } /** * fm_folder_model_apply_filters * @model: the folder model instance * * After changing the filters by fm_folder_model_add_filter() or * fm_folder_model_remove_filter(), you have to call this function * to really apply the filter to the model content. * This is for performance reason. * You can add many filter functions and also remove some, and then * call fm_folder_model_apply_filters() to update the content of the model once. * * If you forgot to call fm_folder_model_apply_filters(), the content of the * model may be incorrect. * * Since: 1.0.2 */ void fm_folder_model_apply_filters(FmFolderModel* model) { FmFolderItem* item; GSList* items_to_show = NULL; GtkTreeIter tree_it; GtkTreePath* tree_path; GSequenceIter *item_it; tree_it.stamp = model->stamp; /* set the stamp of GtkTreeIter */ /* make previously hidden items visible again if they can be shown */ item_it = g_sequence_get_begin_iter(model->hidden); while(!g_sequence_iter_is_end(item_it)) /* iterate over the hidden list */ { item = (FmFolderItem*)g_sequence_get(item_it); if(file_can_show(model, item->inf)) /* if the file should be shown */ { /* we delay the real insertion operation and do it * after we finish hiding some currently visible items for * apparent performance reasons. */ items_to_show = g_slist_prepend(items_to_show, item_it); } item_it = g_sequence_iter_next(item_it); } /* move currently visible items to hidden list if they should be hidden */ item_it = g_sequence_get_begin_iter(model->items); while(!g_sequence_iter_is_end(item_it)) /* iterate over currently visible items */ { GSequenceIter *next_item_it = g_sequence_iter_next(item_it); /* next item */ item = (FmFolderItem*)g_sequence_get(item_it); if(!file_can_show(model, item->inf)) /* it should be hidden */ { gint delete_pos = g_sequence_iter_get_position(item_it); /* get row index */ tree_it.user_data = item_it; /* setup the tree iterator */ g_hash_table_remove(model->items_hash, item->inf); /* move the item from visible list to hidden list */ g_sequence_move(item_it, g_sequence_get_begin_iter(model->hidden)); /* tell everybody that we removed the item */ tree_path = gtk_tree_path_new_from_indices(delete_pos, -1); g_signal_emit(model, signals[ROW_DELETING], 0, tree_path, &tree_it, item->userdata); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model), tree_path); gtk_tree_path_free(tree_path); } item_it = next_item_it; } /* show items scheduled for showing */ if(items_to_show) { GSList* l; for(l = items_to_show; l; l = l->next) { GSequenceIter *insert_item_it; item_it = (GSequenceIter*)l->data; /* this is a iterator from hidden list */ item = (FmFolderItem*)g_sequence_get(item_it); /* find a nice position in visible item list to insert the item */ insert_item_it = g_sequence_search(model->items, item, fm_folder_model_compare, model); tree_it.user_data = item_it; /* setup the tree iterator */ /* move the item from hidden items to visible items list */ g_sequence_move(item_it, insert_item_it); g_hash_table_insert(model->items_hash, item->inf, item_it); /* add it to has for quick lookup */ /* tell the world that we insert it */ tree_path = gtk_tree_path_new_from_indices(g_sequence_iter_get_position(item_it), -1); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model), tree_path, &tree_it); gtk_tree_path_free(tree_path); } g_slist_free(items_to_show); } g_signal_emit(model, signals[FILTER_CHANGED], 0); } /** * fm_folder_model_set_sort * @model: model to apply * @col: new sorting column * @mode: new sorting mode * * Changes sorting of @model items in accordance to new @col and @mode. * If new parameters are not different from previous then nothing will * be changed (nor any signal emitted). * * Since: 1.0.2 */ void fm_folder_model_set_sort(FmFolderModel* model, FmFolderModelCol col, FmSortMode mode) { FmFolderModelCol old_col = model->sort_col; /* g_debug("fm_folder_model_set_sort: col %x mode %x", col, mode); */ if((guint)col >= column_infos_n) col = old_col; if(mode == FM_SORT_DEFAULT) mode = model->sort_mode; if(model->sort_mode != mode || old_col != col) { model->sort_mode = mode; gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), col, FM_SORT_IS_ASCENDING(mode) ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING); } } /** * fm_folder_model_get_sort * @model: model to query * @col: (out) (allow-none): location to store sorting column * @mode: (out) (allow-none): location to store sorting mode * * Retrieves current sorting criteria for @model. * * Returns: %TRUE if @model is valid. * * Since: 1.0.2 */ gboolean fm_folder_model_get_sort(FmFolderModel* model, FmFolderModelCol *col, FmSortMode *mode) { if(!FM_IS_FOLDER_MODEL(model)) return FALSE; /* g_debug("fm_folder_model_get_sort: col %x mode %x", model->sort_col, model->sort_mode); */ if(col) *col = model->sort_col; if(mode) *mode = model->sort_mode; return TRUE; } /* FmFolderModelCol APIs */ /** * fm_folder_model_col_get_title * @model: (allow-none): the folder model * @col_id: column id * * Retrieves the title of the column specified, or %NULL if the specified * @col_id is invalid. Returned data are owned by implementation and * should be not freed by caller. * * Returns: title of column in current locale. * * Since: 1.0.2 */ const char* fm_folder_model_col_get_title(FmFolderModel* model, FmFolderModelCol col_id) { if(G_UNLIKELY((guint)col_id >= column_infos_n || column_infos[col_id] == NULL)) /* invalid id */ return NULL; return _(column_infos[col_id]->title); } /** * fm_folder_model_col_is_sortable * @model: (allow-none): model to check * @col_id: column id * * Checks if model can be sorted by @col_id. * * Returns: %TRUE if model can be sorted by @col_id. * * Since: 1.0.2 */ gboolean fm_folder_model_col_is_sortable(FmFolderModel* model, FmFolderModelCol col_id) { if(G_UNLIKELY((guint)col_id >= column_infos_n || column_infos[col_id] == NULL)) /* invalid id */ return FALSE; return column_infos[col_id]->sortable; } /** * fm_folder_model_col_get_name * @col_id: column id * * Retrieves the name of the column specified, or %NULL if the specified * @col_id is invalid. The name of column may be used for config save or * another similar purpose. Returned data are owned by implementation and * should be not freed by caller. * * Returns: the name associated with column. * * Since: 1.0.2 */ const char* fm_folder_model_col_get_name(FmFolderModelCol col_id) { if(G_UNLIKELY((guint)col_id >= column_infos_n || column_infos[col_id] == NULL)) /* invalid id */ return NULL; return column_infos[col_id]->name; } /** * fm_folder_model_get_col_by_name * @str: a column name * * Finds a column which has associated name equal to @str. * * Returns: column id or (FmFolderModelCol)-1 if no such column exists. * * Since: 1.0.2 */ FmFolderModelCol fm_folder_model_get_col_by_name(const char* str) { /* if further optimization is wanted, can use a sorted string array * and binary search here, but I think this micro-optimization is unnecessary. */ if(G_LIKELY(str != NULL)) { FmFolderModelCol i = 0; for(i = 0; i < column_infos_n; ++i) { if(column_infos[i] && strcmp(str, column_infos[i]->name) == 0) return i; } } return (FmFolderModelCol)-1; } /** * fm_folder_model_col_get_default_width * @model: (allow-none): model to check * @col_id: column id * * Retrieves preferred width for @col_id. * * Returns: default width. * * Since: 1.2.0 */ gint fm_folder_model_col_get_default_width(FmFolderModel* model, FmFolderModelCol col_id) { if(G_UNLIKELY((guint)col_id >= column_infos_n || column_infos[col_id] == NULL)) /* invalid id */ return 0; return column_infos[col_id]->default_width; } /** * fm_folder_model_add_custom_column * @name: unique name of column * @init: setup data for column * * Registers custom columns in #FmFolderModel handlers. * * Returns: new column ID or FM_FOLDER_MODEL_COL_DEFAULT in case of failure. * * Since: 1.2.0 */ FmFolderModelCol fm_folder_model_add_custom_column(const char* name, FmFolderModelColumnInit* init) { FmFolderModelInfo* info; guint i; g_return_val_if_fail(name && init && init->title && init->get_type && init->get_value, FM_FOLDER_MODEL_COL_DEFAULT); for(i = 0; i < column_infos_n; i++) if(strcmp(name, column_infos[i]->name) == 0) /* already exists */ return FM_FOLDER_MODEL_COL_DEFAULT; column_infos = g_realloc(column_infos, sizeof(FmFolderModelInfo*) * (i+1)); info = g_new0(FmFolderModelInfo, 1); column_infos[i] = info; column_infos_n = i+1; info->type = init->get_type(); info->name = g_strdup(name); info->title = g_strdup(init->title); info->sortable = (init->compare != NULL); info->default_width = init->default_width; info->get_value = init->get_value; info->compare = init->compare; return i; } /** * fm_folder_model_col_is_valid * @col_id: column id * * Checks if @col_id can be handled by #FmFolderModel. * This API makes things similar to gtk_tree_model_get_n_columns() but it * doesn't operate the model instance. * * Returns: %TRUE if @col_id is valid. * * Since: 1.2.0 */ gboolean fm_folder_model_col_is_valid(FmFolderModelCol col_id) { return col_id < column_infos_n; } FM_MODULE_DEFINE_TYPE(gtk_folder_col, FmFolderModelColumnInit, 1) static gboolean fm_module_callback_gtk_folder_col(const char *name, gpointer init, int ver) { if (fm_folder_model_add_custom_column(name, init) == FM_FOLDER_MODEL_COL_DEFAULT) return FALSE; return TRUE; } void _fm_folder_model_init(void) { guint i; /* prepare column_infos table */ column_infos_n = FM_FOLDER_MODEL_N_COLS; column_infos = g_new0(FmFolderModelInfo*, FM_FOLDER_MODEL_N_COLS); for(i = 0; i < G_N_ELEMENTS(column_infos_raw); i++) { FmFolderModelCol id = column_infos_raw[i].id; column_infos[id] = &column_infos_raw[i]; } /* GType value is actually generated at runtime by * calling _get_type() functions for every type. * So they should not be filled at compile-time. * Though G_TYPE_STRING and other fundimental type ids * are known at compile-time, this behavior is not * guaranteed to be true in newer glib. */ /* visible columns in the view */ column_infos[FM_FOLDER_MODEL_COL_NAME]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_DESC]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_SIZE]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_PERM]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_OWNER]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_MTIME]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_DIRNAME]->type= G_TYPE_STRING; column_infos[FM_FOLDER_MODEL_COL_EXT]->type= G_TYPE_STRING; /* columns used internally */ column_infos[FM_FOLDER_MODEL_COL_INFO]->type= G_TYPE_POINTER; column_infos[FM_FOLDER_MODEL_COL_ICON]->type= GDK_TYPE_PIXBUF; column_infos[FM_FOLDER_MODEL_COL_GICON]->type= G_TYPE_ICON; fm_module_register_gtk_folder_col(); } void _fm_folder_model_finalize(void) { FmFolderModelCol i = column_infos_n; fm_module_unregister_type("gtk_folder_col"); column_infos_n = 0; /* free all custom columns! */ while (i > FM_FOLDER_MODEL_N_COLS) { i--; g_free((char*)column_infos[i]->name); g_free((char*)column_infos[i]->title); g_free(column_infos[i]); } g_free(column_infos); } libfm-1.4.0/src/gtk/fm-folder-model.h000066400000000000000000000216471475513661000173250ustar00rootroot00000000000000/* * fm-folder-model.h * * Copyright 2009 PCMan * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef _FM_FOLDER_MODEL_H_ #define _FM_FOLDER_MODEL_H_ #include "fm-module.h" #include "fm-folder.h" #include "fm-sortable.h" #include #include #include #include G_BEGIN_DECLS #define FM_TYPE_FOLDER_MODEL (fm_folder_model_get_type()) #define FM_FOLDER_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), FM_TYPE_FOLDER_MODEL, FmFolderModel)) #define FM_FOLDER_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FM_TYPE_FOLDER_MODEL, FmFolderModelClass)) #define FM_IS_FOLDER_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FM_TYPE_FOLDER_MODEL)) #define FM_IS_FOLDER_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FM_TYPE_FOLDER_MODEL)) #define FM_FOLDER_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FM_TYPE_FOLDER_MODEL, FmFolderModelClass)) /** * FmFolderModelCol: * @FM_FOLDER_MODEL_COL_GICON: (#GIcon *) icon descriptor * @FM_FOLDER_MODEL_COL_ICON: (#GdkPixbuf *) icon image * @FM_FOLDER_MODEL_COL_NAME: (#gchar *) file display name * @FM_FOLDER_MODEL_COL_SIZE: (#gchar *) file size text * @FM_FOLDER_MODEL_COL_DESC: (#gchar *) file MIME description * @FM_FOLDER_MODEL_COL_PERM: (#gchar *) file permissions like "rw-r--r--" * @FM_FOLDER_MODEL_COL_OWNER: (#gchar *) file owner username * @FM_FOLDER_MODEL_COL_MTIME: (#gchar *) modification time text * @FM_FOLDER_MODEL_COL_INFO: (#FmFileInfo *) file info * @FM_FOLDER_MODEL_COL_DIRNAME: (#gchar *) path of dir containing the file * @FM_FOLDER_MODEL_COL_EXT: (#gchar *) (since 1.2.0) last suffix of file name * * Columns of folder view */ typedef enum { FM_FOLDER_MODEL_COL_GICON = 0, FM_FOLDER_MODEL_COL_ICON, FM_FOLDER_MODEL_COL_NAME, FM_FOLDER_MODEL_COL_SIZE, FM_FOLDER_MODEL_COL_DESC, FM_FOLDER_MODEL_COL_PERM, FM_FOLDER_MODEL_COL_OWNER, FM_FOLDER_MODEL_COL_MTIME, FM_FOLDER_MODEL_COL_INFO, FM_FOLDER_MODEL_COL_DIRNAME, FM_FOLDER_MODEL_COL_EXT, /*< private >*/ FM_FOLDER_MODEL_N_COLS } FmFolderModelCol; /** * FM_FOLDER_MODEL_COL_UNSORTED: * * for 'Unsorted' folder view use 'FileInfo' column which is ambiguous for sorting */ #define FM_FOLDER_MODEL_COL_UNSORTED FM_FOLDER_MODEL_COL_INFO /** * FM_FOLDER_MODEL_COL_DEFAULT: * * value which means do not change sorting column. */ #define FM_FOLDER_MODEL_COL_DEFAULT ((FmFolderModelCol)-1) #ifndef FM_DISABLE_DEPRECATED /* for backward compatiblity, kept until soname 6 */ #define FmFolderModelViewCol FmFolderModelCol #define COL_FILE_GICON FM_FOLDER_MODEL_COL_GICON #define COL_FILE_ICON FM_FOLDER_MODEL_COL_ICON #define COL_FILE_NAME FM_FOLDER_MODEL_COL_NAME #define COL_FILE_SIZE FM_FOLDER_MODEL_COL_SIZE #define COL_FILE_DESC FM_FOLDER_MODEL_COL_DESC #define COL_FILE_PERM FM_FOLDER_MODEL_COL_PERM #define COL_FILE_OWNER FM_FOLDER_MODEL_COL_OWNER #define COL_FILE_MTIME FM_FOLDER_MODEL_COL_MTIME #define COL_FILE_INFO FM_FOLDER_MODEL_COL_INFO #define COL_FILE_UNSORTED FM_FOLDER_MODEL_COL_UNSORTED #define FM_FOLDER_MODEL_COL_IS_VALID(col) fm_folder_model_col_is_valid((guint)col) #endif typedef struct _FmFolderModel FmFolderModel; typedef struct _FmFolderModelClass FmFolderModelClass; /** * FmFolderModelClass: * @parent: the parent class * @row_deleting: the class closure for the #FmFolderModel::row-deleting signal * @filter_changed: the class closure for the #FmFolderModel::filter-changed signal */ struct _FmFolderModelClass { GObjectClass parent; void (*row_deleting)(FmFolderModel* model, GtkTreePath* tp, GtkTreeIter* iter, gpointer data); void (*filter_changed)(FmFolderModel* model); /*< private >*/ gpointer _reserved1; gpointer _reserved2; }; /** * FmFolderModelFilterFunc: * @file: the file to check filtering * @user_data: data supplied to fm_folder_model_add_filter() * * A callback used by #FmFolderModel to filter visible items in the model. * * Returns: %TRUE if @file should be visible. * * Since: 1.0.2 */ typedef gboolean (*FmFolderModelFilterFunc)(FmFileInfo* file, gpointer user_data); GType fm_folder_model_get_type (void); FmFolderModel *fm_folder_model_new( FmFolder* dir, gboolean show_hidden ); void fm_folder_model_set_folder( FmFolderModel* model, FmFolder* dir ); FmFolder* fm_folder_model_get_folder(FmFolderModel* model); FmPath* fm_folder_model_get_folder_path(FmFolderModel* model); void fm_folder_model_set_item_userdata(FmFolderModel* model, GtkTreeIter* it, gpointer user_data); gpointer fm_folder_model_get_item_userdata(FmFolderModel* model, GtkTreeIter* it); gboolean fm_folder_model_get_show_hidden( FmFolderModel* model ); void fm_folder_model_set_show_hidden( FmFolderModel* model, gboolean show_hidden ); void fm_folder_model_file_created( FmFolderModel* model, FmFileInfo* file); void fm_folder_model_file_deleted( FmFolderModel* model, FmFileInfo* file); void fm_folder_model_file_changed( FmFolderModel* model, FmFileInfo* file); gboolean fm_folder_model_find_iter_by_filename( FmFolderModel* model, GtkTreeIter* it, const char* name); void fm_folder_model_set_icon_size(FmFolderModel* model, guint icon_size); guint fm_folder_model_get_icon_size(FmFolderModel* model); void fm_folder_model_add_filter(FmFolderModel* model, FmFolderModelFilterFunc func, gpointer user_data); void fm_folder_model_remove_filter(FmFolderModel* model, FmFolderModelFilterFunc func, gpointer user_data); void fm_folder_model_apply_filters(FmFolderModel* model); void fm_folder_model_set_sort(FmFolderModel* model, FmFolderModelCol col, FmSortMode mode); gboolean fm_folder_model_get_sort(FmFolderModel* model, FmFolderModelCol *col, FmSortMode *mode); /* void fm_folder_model_set_thumbnail_size(FmFolderModel* model, guint size); */ /** * FmFolderModelExtraFilePos: * @FM_FOLDER_MODEL_ITEMPOS_SORTED: insert extra item into main sorted list * @FM_FOLDER_MODEL_ITEMPOS_PRE: insert extra item before main list * @FM_FOLDER_MODEL_ITEMPOS_POST: insert extra item after main list * * Where the fm_folder_model_extra_file_add() should insert extra file item. */ typedef enum { FM_FOLDER_MODEL_ITEMPOS_SORTED = 0, FM_FOLDER_MODEL_ITEMPOS_PRE, FM_FOLDER_MODEL_ITEMPOS_POST } FmFolderModelExtraFilePos; gboolean fm_folder_model_extra_file_add(FmFolderModel* model, FmFileInfo* file, FmFolderModelExtraFilePos where); gboolean fm_folder_model_extra_file_remove(FmFolderModel* model, FmFileInfo* file); /* APIs for FmFolderModelCol */ const char* fm_folder_model_col_get_title(FmFolderModel* model, FmFolderModelCol col_id); gboolean fm_folder_model_col_is_sortable(FmFolderModel* model, FmFolderModelCol col_id); const char* fm_folder_model_col_get_name(FmFolderModelCol col_id); FmFolderModelCol fm_folder_model_get_col_by_name(const char* str); gint fm_folder_model_col_get_default_width(FmFolderModel* model, FmFolderModelCol col_id); gboolean fm_folder_model_col_is_valid(FmFolderModelCol col_id); /* --- columns extensions --- */ typedef struct _FmFolderModelColumnInit FmFolderModelColumnInit; /** * FmFolderModelColumnInit: * @title: column title * @default_width: default width for column (0 means auto) * @get_type: function to get #GType of column data * @get_value: function to retrieve column data * @compare: sorting routine (%NULL if column isn't sortable) * * This structure is used for "gtk_folder_col" module initialization. The * key for module of this type is new unique column name. * * Since: 1.2.0 */ struct _FmFolderModelColumnInit { const char *title; gint default_width; GType (*get_type)(void); void (*get_value)(FmFileInfo *fi, GValue *value); gint (*compare)(FmFileInfo *fi1, FmFileInfo *fi2); }; FmFolderModelCol fm_folder_model_add_custom_column(const char* name, FmFolderModelColumnInit* init); /* modules */ #define FM_MODULE_gtk_folder_col_VERSION 1 extern FmFolderModelColumnInit fm_module_init_gtk_folder_col; void _fm_folder_model_init(void); void _fm_folder_model_finalize(void); G_END_DECLS #endif libfm-1.4.0/src/gtk/fm-folder-view.c000066400000000000000000002036031475513661000171640ustar00rootroot00000000000000/* * fm-folder-view.c * * Copyright 2012-2015 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-folder-view * @short_description: A folder view generic interface. * @title: FmFolderView * * @include: libfm/fm-gtk.h * * The #FmFolderView generic interface is used to implement folder views * common code including handling sorting change, and keyboard and mouse * buttons events. * * The #FmFolderView interface methods can attach context menu to widget * which does folder operations and consists of items: * |[ * CreateNew -> NewFolder * <placeholder name='ph1'/> * ---------------- * NewBlank * ------------------------ * <placeholder name='CustomFileOps'/> * ------------------------ * Paste * Cut * Copy * Del * Remove * FileProp * ------------------------ * SelAll * InvSel * ------------------------ * Sort -> Asc * Desc * ---------------- * ByName * ByMTime * BySize * ByType * ---------------- * MingleDirs * SortIgnoreCase * <placeholder name='CustomSortOps'/> * ShowHidden * Rename * <placeholder name='CustomFolderOps'/> * ------------------------ * <placeholder name='CustomCommonOps'/> * ------------------------ * Prop * ]| * In created menu items 'Cut', 'Copy', 'Del', 'Remove', 'FileProp', and * 'Rename' are hidden. * * Widget can modity the menu replacing placeholders and hiding or * enabling existing items in it. Widget can do that in callback which * is supplied for call fm_folder_view_add_popup(). * * If click was not on widget but on some item in it then not this * context menu but one with #FmFileMenu object will be opened instead. */ #ifdef HAVE_CONFIG_H #include #endif #include "gtk-compat.h" #include #include #include #include "fm-folder-view.h" #include "fm-file-properties.h" #include "fm-clipboard.h" #include "fm-gtk-file-launcher.h" #include "fm-file-menu.h" #include "fm-gtk-utils.h" #include "fm-templates.h" #include "fm-config.h" static const char folder_popup_xml[] = "" "" "" /* placeholder for ~/Templates support */ "" "" "" "" "" /* placeholder for custom file operations such as empty trash can */ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" /* placeholder for custom sort options */ "" /* "" "" */ "" "" "" /* placeholder for custom folder operations */ "" "" /* placeholder for custom application operations such as view mode changing */ "" "" "" "" "" "" "" "" "" "" "" ""; static void on_create_new(GtkAction* act, FmFolderView* fv); static void on_cut(GtkAction* act, FmFolderView* fv); static void on_copy(GtkAction* act, FmFolderView* fv); static void on_paste(GtkAction* act, FmFolderView* fv); static void on_trash(GtkAction* act, FmFolderView* fv); static void on_rm(GtkAction* act, FmFolderView* fv); static void on_select_all(GtkAction* act, FmFolderView* fv); static void on_invert_select(GtkAction* act, FmFolderView* fv); static void on_rename(GtkAction* act, FmFolderView* fv); static void on_prop(GtkAction* act, FmFolderView* fv); static void on_file_prop(GtkAction* act, FmFolderView* fv); static void on_menu(GtkAction* act, FmFolderView* fv); static void on_file_menu(GtkAction* act, FmFolderView* fv); static void on_show_hidden(GtkToggleAction* act, FmFolderView* fv); static void on_mingle_dirs(GtkToggleAction* act, FmFolderView* fv); static void on_ignore_case(GtkToggleAction* act, FmFolderView* fv); static const GtkActionEntry folder_popup_actions[]= { {"CreateNew", NULL, N_("Create _New..."), NULL, NULL, NULL}, {"NewFolder", "folder", N_("Folder"), "N", NULL, G_CALLBACK(on_create_new)}, {"NewFolder2", NULL, NULL, "Insert", NULL, G_CALLBACK(on_create_new)}, {"NewFolder3", NULL, NULL, "KP_Insert", NULL, G_CALLBACK(on_create_new)}, {"NewBlank", NULL, N_("Empty File"), NULL, NULL, G_CALLBACK(on_create_new)}, /* {"NewShortcut", "system-run", N_("Shortcut"), NULL, NULL, G_CALLBACK(on_create_new)}, */ {"Cut", GTK_STOCK_CUT, NULL, "X", NULL, G_CALLBACK(on_cut)}, {"Copy", GTK_STOCK_COPY, NULL, "C", NULL, G_CALLBACK(on_copy)}, {"Copy2", NULL, NULL, "Insert", NULL, G_CALLBACK(on_copy)}, {"Paste", GTK_STOCK_PASTE, NULL, "V", NULL, G_CALLBACK(on_paste)}, {"Paste2", NULL, NULL, "Insert", NULL, G_CALLBACK(on_paste)}, {"Del", GTK_STOCK_DELETE, NULL, "Delete", NULL, G_CALLBACK(on_trash)}, {"Del2", NULL, NULL, "KP_Delete", NULL, G_CALLBACK(on_trash)}, {"Remove", GTK_STOCK_REMOVE, NULL, "Delete", NULL, G_CALLBACK(on_rm)}, {"Remove2", NULL, NULL, "KP_Delete", NULL, G_CALLBACK(on_rm)}, {"SelAll", GTK_STOCK_SELECT_ALL, NULL, "A", NULL, G_CALLBACK(on_select_all)}, {"InvSel", NULL, N_("_Invert Selection"), "I", NULL, G_CALLBACK(on_invert_select)}, {"Sort", NULL, N_("_Sort Files"), NULL, NULL, NULL}, {"Rename", NULL, N_("_Rename Folder..."), NULL, NULL, G_CALLBACK(on_rename)}, {"Prop", GTK_STOCK_PROPERTIES, N_("Folder Prop_erties"), "", NULL, G_CALLBACK(on_prop)}, {"FileProp", GTK_STOCK_PROPERTIES, N_("Prop_erties"), "Return", NULL, G_CALLBACK(on_file_prop)}, {"FileProp2", NULL, NULL, "KP_Enter", NULL, G_CALLBACK(on_file_prop)}, {"FileProp3", NULL, NULL, "ISO_Enter", NULL, G_CALLBACK(on_file_prop)} }; static GtkToggleActionEntry folder_toggle_actions[]= { {"ShowHidden", NULL, N_("Show _Hidden"), NULL, NULL, G_CALLBACK(on_show_hidden), FALSE}, /* Note to translators: "Mingle..." means "Do not put folders before files" but make the translation as short as possible, please! */ {"MingleDirs", NULL, N_("Mingle _Files and Folders"), NULL, NULL, G_CALLBACK(on_mingle_dirs), FALSE}, {"SortIgnoreCase", NULL, N_("_Ignore Name Case"), NULL, NULL, G_CALLBACK(on_ignore_case), TRUE} }; static const GtkRadioActionEntry folder_sort_type_actions[]= { {"Asc", GTK_STOCK_SORT_ASCENDING, NULL, NULL, NULL, GTK_SORT_ASCENDING}, {"Desc", GTK_STOCK_SORT_DESCENDING, NULL, NULL, NULL, GTK_SORT_DESCENDING}, }; static const GtkRadioActionEntry folder_sort_by_actions[]= { {"ByName", NULL, N_("By _Name"), NULL, NULL, FM_FOLDER_MODEL_COL_NAME}, {"ByMTime", NULL, N_("By _Modification Time"), NULL, NULL, FM_FOLDER_MODEL_COL_MTIME}, {"BySize", NULL, N_("By _Size"), NULL, NULL, FM_FOLDER_MODEL_COL_SIZE}, {"ByType", NULL, N_("By File _Type"), NULL, NULL, FM_FOLDER_MODEL_COL_DESC} }; /* plugins for scheme */ typedef struct { FmPath *scheme; /* scheme path, NULL for scheme mask "*" */ FmContextMenuSchemeAddonInit cb; /* callbacks */ } FmContextMenuSchemeExt; static GList *extensions = NULL; /* elements are FmContextMenuSchemeExt */ G_DEFINE_INTERFACE(FmFolderView, fm_folder_view, GTK_TYPE_WIDGET); enum { CLICKED, SEL_CHANGED, SORT_CHANGED, FILTER_CHANGED, COLUMNS_CHANGED, //CHDIR, N_SIGNALS }; static guint signals[N_SIGNALS]; static GQuark ui_quark; static GQuark popup_quark; static GQuark templates_quark; static void fm_folder_view_default_init(FmFolderViewInterface *iface) { ui_quark = g_quark_from_static_string("popup-ui"); popup_quark = g_quark_from_static_string("popup-menu"); templates_quark = g_quark_from_static_string("templates-list"); /* properties and signals */ /** * FmFolderView::clicked: * @view: the widget that emitted the signal * @type: (#FmFolderViewClickType) type of click * @file: (#FmFileInfo *) file on which cursor is * * The #FmFolderView::clicked signal is emitted when user clicked * somewhere in the folder area. If click was on free folder area * then @file is %NULL. * * Since: 0.1.0 */ signals[CLICKED]= g_signal_new("clicked", FM_TYPE_FOLDER_VIEW, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderViewInterface, clicked), NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER); /** * FmFolderView::sel-changed: * @view: the widget that emitted the signal * @n_sel: number of files currently selected in the folder * * The #FmFolderView::sel-changed signal is emitted when * selection of the view got changed. * * Before 1.0.0 parameter was list of currently selected files. * * Since: 0.1.0 */ signals[SEL_CHANGED]= g_signal_new("sel-changed", FM_TYPE_FOLDER_VIEW, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderViewInterface, sel_changed), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); /** * FmFolderView::sort-changed: * @view: the widget that emitted the signal * * The #FmFolderView::sort-changed signal is emitted when sorting * of the view got changed. * * Since: 0.1.10 */ signals[SORT_CHANGED]= g_signal_new("sort-changed", FM_TYPE_FOLDER_VIEW, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderViewInterface, sort_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolderView::filter-changed: * @view: the widget that emitted the signal * * The #FmFolderView::filter-changed signal is emitted when filter * of the view model got changed. It's just bouncer for the same * signal of #FmFolderModel. * * Since: 1.0.2 */ signals[FILTER_CHANGED]= g_signal_new("filter-changed", FM_TYPE_FOLDER_VIEW, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderViewInterface, filter_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * FmFolderView::columns-changed: * @view: the widget that emitted the signal * * The #FmFolderView::columns-changed signal is emitted when layout * of #FmFolderView instance is changed, i.e. some column is added, * deleted, or changed its size. * * Since: 1.2.0 */ signals[COLUMNS_CHANGED]= g_signal_new("columns-changed", FM_TYPE_FOLDER_VIEW, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmFolderViewInterface, columns_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void on_sort_col_changed(GtkTreeSortable* sortable, FmFolderView* fv) { if(fm_folder_model_get_sort(FM_FOLDER_MODEL(sortable), NULL, NULL)) { g_signal_emit(fv, signals[SORT_CHANGED], 0); } } static void on_filter_changed(FmFolderModel* model, FmFolderView* fv) { g_signal_emit(fv, signals[FILTER_CHANGED], 0); } /** * fm_folder_view_set_selection_mode * @fv: a widget to apply * @mode: new mode of selection in @fv. * * Changes selection mode in @fv. * * Since: 0.1.0 */ void fm_folder_view_set_selection_mode(FmFolderView* fv, GtkSelectionMode mode) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); FM_FOLDER_VIEW_GET_IFACE(fv)->set_sel_mode(fv, mode); } /** * fm_folder_view_get_selection_mode * @fv: a widget to inspect * * Retrieves current selection mode in @fv. * * Returns: current selection mode. * * Since: 0.1.0 */ GtkSelectionMode fm_folder_view_get_selection_mode(FmFolderView* fv) { g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), GTK_SELECTION_NONE); return (*FM_FOLDER_VIEW_GET_IFACE(fv)->get_sel_mode)(fv); } /** * fm_folder_view_sort * @fv: a widget to apply * @type: new mode of sorting (ascending or descending) * @by: criteria of sorting * * Changes sorting in the view. Invalid values for @type or @by are * ignored (will not change sorting). * * Since 1.0.2 values passed to this API aren't remembered in the @fv * object. If @fv has no model then this API has no effect. * After the model is removed from @fv (calling fm_folder_view_set_model() * with NULL) there is no possibility to recover last settings and any * model added to @fv later will get defaults: FM_FOLDER_MODEL_COL_DEFAULT * and FM_SORT_DEFAULT. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_folder_model_set_sort() instead. */ void fm_folder_view_sort(FmFolderView* fv, GtkSortType type, FmFolderModelCol by) { FmFolderViewInterface* iface; FmFolderModel* model; FmSortMode mode; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); iface = FM_FOLDER_VIEW_GET_IFACE(fv); model = iface->get_model(fv); if(model) { if(type == GTK_SORT_ASCENDING || type == GTK_SORT_DESCENDING) { fm_folder_model_get_sort(model, NULL, &mode); mode &= ~FM_SORT_ORDER_MASK; mode |= (type == GTK_SORT_ASCENDING) ? FM_SORT_ASCENDING : FM_SORT_DESCENDING; } else mode = FM_SORT_DEFAULT; fm_folder_model_set_sort(model, by, mode); } /* model will generate signal to update config if changed */ } /** * fm_folder_view_get_sort_type * @fv: a widget to inspect * * Retrieves current sorting type in @fv. * * Returns: mode of sorting (ascending or descending) * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_folder_model_get_sort() instead. */ GtkSortType fm_folder_view_get_sort_type(FmFolderView* fv) { FmFolderViewInterface* iface; FmFolderModel* model; FmSortMode mode; g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), GTK_SORT_ASCENDING); iface = FM_FOLDER_VIEW_GET_IFACE(fv); model = iface->get_model(fv); if(model == NULL || !fm_folder_model_get_sort(model, NULL, &mode)) return GTK_SORT_ASCENDING; return FM_SORT_IS_ASCENDING(mode) ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING; } /** * fm_folder_view_get_sort_by * @fv: a widget to inspect * * Retrieves current criteria of sorting in @fv (e.g. by name). * * Returns: criteria of sorting. * * Since: 0.1.0 * * Deprecated: 1.0.2: Use fm_folder_model_get_sort() instead. */ FmFolderModelCol fm_folder_view_get_sort_by(FmFolderView* fv) { FmFolderViewInterface* iface; FmFolderModel* model; FmFolderModelCol by; g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), FM_FOLDER_MODEL_COL_DEFAULT); iface = FM_FOLDER_VIEW_GET_IFACE(fv); model = iface->get_model(fv); if(model == NULL || !fm_folder_model_get_sort(model, &by, NULL)) return FM_FOLDER_MODEL_COL_DEFAULT; return by; } /** * fm_folder_view_set_show_hidden * @fv: a widget to apply * @show: new setting * * Changes whether hidden files in folder shown in @fv should be visible * or not. * * See also: fm_folder_view_get_show_hidden(). * * Since: 0.1.0 */ void fm_folder_view_set_show_hidden(FmFolderView* fv, gboolean show) { FmFolderViewInterface* iface; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); iface = FM_FOLDER_VIEW_GET_IFACE(fv); if(iface->get_show_hidden(fv) != show) { FmFolderModel* model; iface->set_show_hidden(fv, show); model = iface->get_model(fv); if(G_LIKELY(model)) fm_folder_model_set_show_hidden(model, show); /* "filter-changed" signal will be sent by model */ } } /** * fm_folder_view_get_show_hidden * @fv: a widget to inspect * * Retrieves setting whether hidden files in folder shown in @fv should * be visible or not. * * See also: fm_folder_view_set_show_hidden(). * * Returns: %TRUE if hidden files are visible. * * Since: 0.1.0 */ gboolean fm_folder_view_get_show_hidden(FmFolderView* fv) { g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), FALSE); return (*FM_FOLDER_VIEW_GET_IFACE(fv)->get_show_hidden)(fv); } /** * fm_folder_view_get_folder * @fv: a widget to inspect * * Retrieves the folder shown by @fv. Returned data are owned by @fv and * should not be freed by caller. * * Returns: (transfer none): the folder of view. * * Since: 1.0.0 */ FmFolder* fm_folder_view_get_folder(FmFolderView* fv) { FmFolderModel *model; g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), NULL); model = FM_FOLDER_VIEW_GET_IFACE(fv)->get_model(fv); return model ? fm_folder_model_get_folder(model) : NULL; } /** * fm_folder_view_get_cwd * @fv: a widget to inspect * * Retrieves file path of the folder shown by @fv. Returned data are * owned by @fv and should not be freed by caller. * * Returns: (transfer none): file path of the folder. * * Since: 0.1.0 */ FmPath* fm_folder_view_get_cwd(FmFolderView* fv) { FmFolder* folder = fm_folder_view_get_folder(fv); return folder ? fm_folder_get_path(folder) : NULL; } /** * fm_folder_view_get_cwd_info * @fv: a widget to inspect * * Retrieves file info of the folder shown by @fv. Returned data are * owned by @fv and should not be freed by caller. * * Returns: (transfer none): file info descriptor of the folder. * * Since: 0.1.0 */ FmFileInfo* fm_folder_view_get_cwd_info(FmFolderView* fv) { FmFolder* folder = fm_folder_view_get_folder(fv); return folder ? fm_folder_get_info(folder) : NULL; } /** * fm_folder_view_get_model * @fv: a widget to inspect * * Retrieves the model used by @fv. Returned data are owned by @fv and * should not be freed by caller. * * Returns: (transfer none): the model of view. * * Since: 0.1.16 */ FmFolderModel* fm_folder_view_get_model(FmFolderView* fv) { g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), NULL); return (*FM_FOLDER_VIEW_GET_IFACE(fv)->get_model)(fv); } static void unset_model(FmFolderView* fv, FmFolderModel* model) { g_signal_handlers_disconnect_by_func(model, on_sort_col_changed, fv); g_signal_handlers_disconnect_by_func(model, on_filter_changed, fv); } /** * fm_folder_view_set_model * @fv: a widget to apply * @model: (allow-none): new view model * * Changes model for the @fv. * * Since: 1.0.0 */ void fm_folder_view_set_model(FmFolderView* fv, FmFolderModel* model) { FmFolderViewInterface* iface; FmFolderModel* old_model; FmFolderModelCol by = FM_FOLDER_MODEL_COL_DEFAULT; FmSortMode mode = FM_SORT_ASCENDING; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); iface = FM_FOLDER_VIEW_GET_IFACE(fv); old_model = iface->get_model(fv); if(old_model) { fm_folder_model_get_sort(old_model, &by, &mode); unset_model(fv, old_model); /* https://bugs.launchpad.net/ubuntu/+source/pcmanfm/+bug/1071231: after changing the folder selection isn't reset */ iface->unselect_all(fv); } /* FIXME: which setting to apply if this is first model? */ iface->set_model(fv, model); if(model) { fm_folder_model_set_sort(model, by, mode); g_signal_connect(model, "sort-column-changed", G_CALLBACK(on_sort_col_changed), fv); g_signal_connect(model, "filter-changed", G_CALLBACK(on_filter_changed), fv); } } /** * fm_folder_view_get_n_selected_files * @fv: a widget to inspect * * Retrieves number of the currently selected files. * * Returns: number of files selected. * * Since: 1.0.1 */ gint fm_folder_view_get_n_selected_files(FmFolderView* fv) { g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), 0); return (*FM_FOLDER_VIEW_GET_IFACE(fv)->count_selected_files)(fv); } /** * fm_folder_view_dup_selected_files * @fv: a FmFolderView object * * Retrieves a list of * the currently selected files. The list should be freed after usage * with fm_file_info_list_unref(). If there are no files selected then * returns %NULL. * * Before 1.0.0 this API had name fm_folder_view_get_selected_files. * * Returns: (transfer full) (element-type FmFileInfo): list of selected file infos. * * Since: 0.1.0 */ FmFileInfoList* fm_folder_view_dup_selected_files(FmFolderView* fv) { g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), NULL); return (*FM_FOLDER_VIEW_GET_IFACE(fv)->dup_selected_files)(fv); } /** * fm_folder_view_dup_selected_file_paths * @fv: a FmFolderView object * * Retrieves a list of * the currently selected files. The list should be freed after usage * with fm_path_list_unref(). If there are no files selected then returns * %NULL. * * Before 1.0.0 this API had name fm_folder_view_get_selected_file_paths. * * Returns: (transfer full) (element-type FmPath): list of selected file paths. * * Since: 0.1.0 */ FmPathList* fm_folder_view_dup_selected_file_paths(FmFolderView* fv) { g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), NULL); return (*FM_FOLDER_VIEW_GET_IFACE(fv)->dup_selected_file_paths)(fv); } /** * fm_folder_view_select_all * @fv: a widget to apply * * Selects all files in folder. * * Since: 0.1.0 */ void fm_folder_view_select_all(FmFolderView* fv) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); FM_FOLDER_VIEW_GET_IFACE(fv)->select_all(fv); } /** * fm_folder_view_unselect_all * @fv: a widget to apply * * Unselects all files in folder. * * Since: 1.0.1 */ void fm_folder_view_unselect_all(FmFolderView* fv) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); FM_FOLDER_VIEW_GET_IFACE(fv)->unselect_all(fv); } /** * fm_folder_view_select_invert * @fv: a widget to apply * * Selects all unselected files in @fv but unselects all selected. * * Since: 0.1.0 */ void fm_folder_view_select_invert(FmFolderView* fv) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); FM_FOLDER_VIEW_GET_IFACE(fv)->select_invert(fv); } /** * fm_folder_view_select_file_path * @fv: a widget to apply * @path: a file path to select * * Selects a file in the folder. * * Since: 0.1.0 */ void fm_folder_view_select_file_path(FmFolderView* fv, FmPath* path) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); FM_FOLDER_VIEW_GET_IFACE(fv)->select_file_path(fv, path); } /** * fm_folder_view_select_file_paths * @fv: a widget to apply * @paths: list of files to select * * Selects few files in the folder. * * Since: 0.1.0 */ void fm_folder_view_select_file_paths(FmFolderView* fv, FmPathList* paths) { GList* l; FmFolderViewInterface* iface; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); iface = FM_FOLDER_VIEW_GET_IFACE(fv); for(l = fm_path_list_peek_head_link(paths);l; l=l->next) { FmPath* path = FM_PATH(l->data); iface->select_file_path(fv, path); } } static void on_run_app_toggled(GtkToggleButton *button, gboolean *run) { *run = gtk_toggle_button_get_active(button); } static void on_create_new(GtkAction* act, FmFolderView* fv) { const char* name = gtk_action_get_name(act); GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkUIManager *ui = g_object_get_qdata(G_OBJECT(fv), ui_quark); GList *templates = g_object_get_qdata(G_OBJECT(ui), templates_quark); FmTemplate *templ; FmMimeType *mime_type; const char *prompt, *name_template, *label; char *_prompt = NULL, *header, *basename; GFile *dir, *gf; GError *error = NULL; GtkWidget *run_button, *sub_button; gboolean new_folder = FALSE, run_app; gint n; g_return_if_fail(ui != NULL); if(strncmp(name, "NewFolder", 9) == 0) { templ = NULL; prompt = _("Enter a name for the newly created folder:"); header = _("Creating New Folder"); new_folder = TRUE; } else if(G_LIKELY(strncmp(name, "NewFile", 7) == 0)) { n = atoi(&name[7]); if(n < 0 || (templ = g_list_nth_data(templates, n)) == NULL) return; /* invalid action name, is it possible? */ } /* special option 'NewBlank' */ else if(G_LIKELY(strcmp(name, "NewBlank") == 0)) { templ = NULL; prompt = _("Enter a name for empty file:"); header = _("Creating ..."); } else /* invalid action name, is it possible? */ return; if(templ == NULL) /* new folder or empty file */ { name_template = _("New"); n = -1; run_app = FALSE; run_button = NULL; } else { mime_type = fm_template_get_mime_type(templ); prompt = fm_template_get_prompt(templ); if(!prompt) prompt = _prompt = g_strdup_printf(_("Enter a name for the new %s:"), fm_mime_type_get_desc(mime_type)); label = fm_template_get_label(templ); header = g_strdup_printf(_("Creating %s"), label ? label : fm_mime_type_get_desc(mime_type)); name_template = fm_template_get_name(templ, &n); run_app = fm_config->template_run_app; sub_button = gtk_check_button_new_with_mnemonic(_("_Run default application on file after creation")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sub_button), run_app); g_signal_connect(sub_button, "toggled", G_CALLBACK(on_run_app_toggled), &run_app); run_button = gtk_alignment_new(0, 0, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(run_button), 0, 0, 16, 0); gtk_container_add(GTK_CONTAINER(run_button), sub_button); } basename = fm_get_user_input_n(GTK_WINDOW(win), header, prompt, name_template, n, run_button); if(templ) { g_free(_prompt); g_free(header); } if(!basename) return; if (new_folder) fm_folder_make_directory(fm_folder_view_get_folder(fv), basename, &error); else { dir = fm_path_to_gfile(fm_folder_view_get_cwd(fv)); gf = g_file_get_child_for_display_name(dir, basename, &error); g_object_unref(dir); if (gf) { fm_template_create_file(templ, gf, &error, run_app); g_object_unref(gf); } } g_free(basename); if(error) { fm_show_error(GTK_WINDOW(win), NULL, error->message); g_error_free(error); } } #define FOCUS_IS_IN_FOLDER_VIEW(_focus_,_fv_) \ _focus_ == NULL || _focus_ == _fv_ || gtk_widget_is_ancestor(_focus_, _fv_) static void on_cut(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if we cut inside the view; for desktop focus will be NULL */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) { FmPathList* files = fm_folder_view_dup_selected_file_paths(fv); if(files) { fm_clipboard_cut_files(win, files); fm_path_list_unref(files); } } else if(GTK_IS_EDITABLE(focus) && /* fallback for editables */ gtk_editable_get_selection_bounds((GtkEditable*)focus, NULL, NULL)) gtk_editable_cut_clipboard((GtkEditable*)focus); } static void on_copy(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if we copy inside the view; for desktop focus will be NULL */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) { FmPathList* files = fm_folder_view_dup_selected_file_paths(fv); if(files) { fm_clipboard_copy_files(win, files); fm_path_list_unref(files); } } else if(GTK_IS_EDITABLE(focus) && /* fallback for editables */ gtk_editable_get_selection_bounds((GtkEditable*)focus, NULL, NULL)) gtk_editable_copy_clipboard((GtkEditable*)focus); } static void on_paste(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if we paste inside the view; for desktop focus will be NULL */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) { FmPath* path = fm_folder_view_get_cwd(fv); fm_clipboard_paste_files(GTK_WIDGET(fv), path); } else if(GTK_IS_EDITABLE(focus)) /* fallback for editables */ gtk_editable_paste_clipboard((GtkEditable*)focus); else g_debug("paste on %s isn't supported by FmFolderView widget", G_OBJECT_TYPE_NAME(focus)); } static void on_trash(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if user pressed 'Del' inside the view; for desktop focus will be NULL */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) { FmPathList* files = fm_folder_view_dup_selected_file_paths(fv); if(files) { fm_trash_or_delete_files(GTK_WINDOW(win), files); fm_path_list_unref(files); } } else if(GTK_IS_EDITABLE(focus)) /* fallback for editables */ { if(!gtk_editable_get_selection_bounds((GtkEditable*)focus, NULL, NULL)) { gint pos = gtk_editable_get_position((GtkEditable*)focus); /* if no text selected then delete character next to cursor */ gtk_editable_select_region((GtkEditable*)focus, pos, pos + 1); } gtk_editable_delete_selection((GtkEditable*)focus); } } static void on_rm(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if user pressed 'Shift+Del' inside the view */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) { FmPathList* files = fm_folder_view_dup_selected_file_paths(fv); if(files) { fm_delete_files(GTK_WINDOW(win), files); fm_path_list_unref(files); } } /* for editables 'Shift+Del' means 'Cut' */ else if(GTK_IS_EDITABLE(focus)) gtk_editable_cut_clipboard((GtkEditable*)focus); } static void on_select_all(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if we are inside the view; for desktop focus will be NULL */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) fm_folder_view_select_all(fv); else if(GTK_IS_EDITABLE(focus)) /* fallback for editables */ gtk_editable_select_region((GtkEditable*)focus, 0, -1); } static void on_invert_select(GtkAction* act, FmFolderView* fv) { fm_folder_view_select_invert(fv); } static void on_rename(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); /* FIXME: is it OK to rename folder itself? */ fm_rename_file(GTK_WINDOW(win), fm_folder_view_get_cwd(fv)); } static void on_prop(GtkAction* act, FmFolderView* fv) { FmFolder* folder = fm_folder_view_get_folder(fv); if(folder && fm_folder_is_valid(folder)) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); FmFileInfo* fi = fm_folder_get_info(folder); FmFileInfoList* files = fm_file_info_list_new(); fm_file_info_list_push_tail(files, fi); fm_show_file_properties(GTK_WINDOW(win), files); fm_file_info_list_unref(files); } } static void on_file_prop(GtkAction* act, FmFolderView* fv) { GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); GtkWidget *win = gtk_menu_get_attach_widget(popup); GtkWidget *focus = gtk_window_get_focus(GTK_WINDOW(win)); /* check if it is inside the view; for desktop focus will be NULL */ if(FOCUS_IS_IN_FOLDER_VIEW(focus, GTK_WIDGET(fv))) { FmFileInfoList* files = fm_folder_view_dup_selected_files(fv); if(files) { fm_show_file_properties(GTK_WINDOW(win), files); fm_file_info_list_unref(files); } } } static void popup_position_func(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { GtkWidget *widget = GTK_WIDGET(user_data); GdkWindow *parent_window; GdkScreen *screen; GtkAllocation a, ma; GdkRectangle mr; gint x2, y2, mon; gboolean rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); /* realize menu so we get actual size of it */ gtk_widget_realize(GTK_WIDGET(menu)); /* get all the relative coordinates */ gtk_widget_get_allocation(widget, &a); screen = gtk_widget_get_screen(widget); gdk_window_get_device_position(gtk_widget_get_window(widget), gdk_device_manager_get_client_pointer( gdk_display_get_device_manager( gdk_screen_get_display(screen))), &x2, &y2, NULL); gtk_widget_get_allocation(GTK_WIDGET(menu), &ma); parent_window = gtk_widget_get_parent_window(widget); /* get absolute coordinate of parent window - we got coords relative to it */ if (parent_window) gdk_window_get_origin(parent_window, x, y); else { /* desktop has no parent window so parent coords will be from geom */ mon = gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(widget)); gdk_screen_get_monitor_geometry(screen, mon, &mr); *x = mr.x; *y = mr.y; } /* position menu inside widget */ if(rtl) /* RTL */ x2 = CLAMP(x2, a.x + 1, a.x + ma.width + a.width - 1); else /* LTR */ x2 = CLAMP(x2, a.x + 1 - ma.width, a.x + a.width - 1); y2 = CLAMP(y2, a.y + 1 - ma.height, a.y + a.height - 1); /* calculate desired position for menu */ *x += x2; *y += y2; /* get monitor geometry at the pointer: for desktop we already have it */ if (parent_window) { mon = gdk_screen_get_monitor_at_point(screen, *x, *y); gdk_screen_get_monitor_geometry(screen, mon, &mr); } /* limit coordinates so menu will be not positioned outside of screen */ if(rtl) /* RTL */ { x2 = mr.x + mr.width; if (*x < mr.x + ma.width) /* out of monitor */ *x = MIN(*x + ma.width, x2); /* place menu right to cursor */ else *x = MIN(*x, x2); } else /* LTR */ { if (*x + ma.width > mr.x + mr.width) /* out of monitor */ *x = MAX(mr.x, *x - ma.width); /* place menu left to cursor */ else *x = MAX(mr.x, *x); /* place menu right to cursor */ } if (*y + ma.height > mr.y + mr.height) /* out of monitor */ *y = MAX(mr.y, *y - ma.height); /* place menu above cursor */ else *y = MAX(mr.y, *y); /* place menu below cursor */ } static void on_menu(GtkAction* act, FmFolderView* fv) { GtkUIManager *ui = g_object_get_qdata(G_OBJECT(fv), ui_quark); GtkMenu *popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); FmFolderViewInterface *iface = FM_FOLDER_VIEW_GET_IFACE(fv); FmFolderModel *model; GtkActionGroup *act_grp; GList *templates; FmFileInfo *fi; gboolean show_hidden; FmSortMode mode; GtkSortType type = GTK_SORT_ASCENDING; FmFolderModelCol by; g_return_if_fail(ui != NULL); /* update actions */ model = iface->get_model(fv); if(fm_folder_model_get_sort(model, &by, &mode)) type = FM_SORT_IS_ASCENDING(mode) ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING; act = gtk_ui_manager_get_action(ui, "/popup/Sort/Asc"); /* g_debug("set /popup/Sort/Asc: %u", type); */ gtk_radio_action_set_current_value(GTK_RADIO_ACTION(act), type); act = gtk_ui_manager_get_action(ui, "/popup/Sort/ByName"); if(by == FM_FOLDER_MODEL_COL_DEFAULT) by = FM_FOLDER_MODEL_COL_NAME; /* g_debug("set /popup/Sort/ByName: %u", by); */ gtk_radio_action_set_current_value(GTK_RADIO_ACTION(act), by); act = gtk_ui_manager_get_action(ui, "/popup/Sort/SortIgnoreCase"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), (mode & FM_SORT_CASE_SENSITIVE) == 0); act = gtk_ui_manager_get_action(ui, "/popup/Sort/MingleDirs"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), (mode & FM_SORT_NO_FOLDER_FIRST) != 0); show_hidden = iface->get_show_hidden(fv); act = gtk_ui_manager_get_action(ui, "/popup/ShowHidden"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), show_hidden); /* shadow 'Paste' if clipboard is empty and unshadow if not */ act = gtk_ui_manager_get_action(ui, "/popup/Paste"); fi = fm_folder_view_get_cwd_info(fv); if(fi && fm_file_info_is_writable_directory(fi)) gtk_action_set_sensitive(act, fm_clipboard_have_files(GTK_WIDGET(fv))); else gtk_action_set_visible(act, FALSE); if(fi == NULL) { /* hide folder-oriented actions if there is no folder */ act = gtk_ui_manager_get_action(ui, "/popup/SelAll"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/InvSel"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Sort"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Prop"); gtk_action_set_visible(act, FALSE); } /* prepare templates list */ templates = g_object_get_qdata(G_OBJECT(ui), templates_quark); /* FIXME: updating context menu is not lightweight here - we should remember all actions and ui we added, remove them, and add again. That will take some time, memory and may be error-prone as well. For simplicity we create it once here but if users will find any inconveniences this behavior should be changed later. */ if(fi == NULL || !fm_file_info_is_writable_directory(fi)) { act = gtk_ui_manager_get_action(ui, "/popup/CreateNew"); gtk_action_set_visible(act, FALSE); } else if(!templates) { templates = fm_template_list_all(fm_config->only_user_templates); if(templates) { FmTemplate *templ; FmMimeType *mime_type; FmIcon *icon; const gchar *label; GList *l; GString *xml; GtkActionEntry actent; guint i; char act_name[16]; l = gtk_ui_manager_get_action_groups(ui); act_grp = l->data; /* our action group if first one */ actent.callback = G_CALLBACK(on_create_new); actent.accelerator = NULL; actent.tooltip = NULL; actent.name = act_name; actent.stock_id = NULL; xml = g_string_new(""); for(l = templates, i = 0; l; l = l->next, i++) { templ = l->data; /* we support directories differently */ if(fm_template_is_directory(templ)) continue; mime_type = fm_template_get_mime_type(templ); label = fm_template_get_label(templ); snprintf(act_name, sizeof(act_name), "NewFile%u", i); g_string_append_printf(xml, "", act_name); icon = fm_template_get_icon(templ); if(!icon) icon = fm_mime_type_get_icon(mime_type); /* create and insert new action */ actent.label = label ? label : fm_mime_type_get_desc(mime_type); gtk_action_group_add_actions(act_grp, &actent, 1, fv); if(icon) { act = gtk_action_group_get_action(act_grp, act_name); gtk_action_set_gicon(act, G_ICON(icon)); } } g_string_append(xml, ""); gtk_ui_manager_add_ui_from_string(ui, xml->str, -1, NULL); g_string_free(xml, TRUE); } g_object_set_qdata(G_OBJECT(ui), templates_quark, templates); } /* open popup */ gtk_ui_manager_ensure_update(ui); gtk_menu_popup(popup, NULL, NULL, popup_position_func, fv, 3, gtk_get_current_event_time()); } /* handle 'Menu' and 'Shift+F10' here */ static gboolean on_key_press(GtkWidget *widget, GdkEventKey *evt, FmFolderView* fv) { int modifier = (evt->state & gtk_accelerator_get_default_mod_mask()); if((evt->keyval == GDK_KEY_Menu && !modifier) || (evt->keyval == GDK_KEY_F10 && modifier == GDK_SHIFT_MASK)) { on_file_menu(NULL, fv); return TRUE; } else if(evt->keyval == GDK_KEY_Menu && modifier == GDK_CONTROL_MASK) { on_menu(NULL, fv); return TRUE; } return FALSE; } static inline GtkMenu *_make_file_menu(FmFolderView* fv, GtkWindow *win, FmFolderViewUpdatePopup update_popup, FmLaunchFolderFunc open_folders, FmFileInfoList* files) { FmFileMenu* menu; FmFileInfo *fi; GtkUIManager *ui; GtkAction *act; FmPath *scheme; /* not-NULL if on the same scheme */ GList *l; GString *str; FmContextMenuSchemeExt *ext; gboolean single_file; menu = fm_file_menu_new_for_files(win, files, fm_folder_view_get_cwd(fv), TRUE); fm_file_menu_set_folder_func(menu, open_folders, win); /* TODO: add info message on selection if enabled in config */ /* disable some items on R/O file system */ fi = fm_folder_view_get_cwd_info(fv); if (fi == NULL || !fm_file_info_is_writable_directory(fi)) { ui = fm_file_menu_get_ui(menu); act = gtk_ui_manager_get_action(ui, "/popup/Cut"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Del"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Rename"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/ph3/Extract"); if (act) gtk_action_set_visible(act, FALSE); } /* merge some specific menu items */ if(update_popup) update_popup(fv, win, fm_file_menu_get_ui(menu), fm_file_menu_get_action_group(menu), files); /* check the scheme, reset to NULL if files are on different FS (mixed folder) */ l = fm_file_info_list_peek_head_link(files); scheme = fm_path_get_scheme_path(fm_file_info_get_path(l->data)); single_file = (l->next == NULL); while ((l = l->next)) if (fm_path_get_scheme_path(fm_file_info_get_path(l->data)) != scheme) { scheme = NULL; break; } /* we are on single scheme, good, go for it */ if (G_LIKELY(scheme)) { /* run scheme-specific extensions ("*" runs on any) */ str = g_string_sized_new(128); CHECK_MODULES(); for (l = extensions; l; l = l->next) { ext = l->data; if (ext->scheme && ext->scheme != scheme) continue; /* not NULL nor matches */ if (ext->cb.update_file_menu_for_scheme != NULL) ext->cb.update_file_menu_for_scheme(win, fm_file_menu_get_ui(menu), str, fm_file_menu_get_action_group(menu), menu, files, single_file); } if (str->len > 0) gtk_ui_manager_add_ui_from_string(fm_file_menu_get_ui(menu), str->str, str->len, NULL); g_string_free(str, TRUE); } gtk_ui_manager_ensure_update(fm_file_menu_get_ui(menu)); return fm_file_menu_get_menu(menu); } static void on_file_menu(GtkAction* act, FmFolderView* fv) { FmFolderViewInterface *iface = FM_FOLDER_VIEW_GET_IFACE(fv); GtkMenu *popup; FmFileInfoList* files; GtkWindow *win; FmFolderViewUpdatePopup update_popup; FmLaunchFolderFunc open_folders; if(iface->count_selected_files(fv) > 0) { popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); if(popup == NULL) /* no fm_folder_view_add_popup() was called before */ return; files = iface->dup_selected_files(fv); win = GTK_WINDOW(gtk_menu_get_attach_widget(popup)); iface->get_custom_menu_callbacks(fv, &update_popup, &open_folders); popup = _make_file_menu(fv, win, update_popup, open_folders, files); fm_file_info_list_unref(files); gtk_menu_popup(popup, NULL, NULL, popup_position_func, fv, 3, gtk_get_current_event_time()); } } static void on_show_hidden(GtkToggleAction* act, FmFolderView* fv) { gboolean active = gtk_toggle_action_get_active(act); fm_folder_view_set_show_hidden(fv, active); } static void on_mingle_dirs(GtkToggleAction* act, FmFolderView* fv) { gboolean active = gtk_toggle_action_get_active(act); FmFolderModel *model = fm_folder_view_get_model(fv); FmSortMode mode; if(model) { fm_folder_model_get_sort(model, NULL, &mode); mode &= ~FM_SORT_NO_FOLDER_FIRST; if (active) mode |= FM_SORT_NO_FOLDER_FIRST; fm_folder_model_set_sort(model, FM_FOLDER_MODEL_COL_DEFAULT, mode); } } static void on_ignore_case(GtkToggleAction* act, FmFolderView* fv) { gboolean active = gtk_toggle_action_get_active(act); FmFolderModel *model = fm_folder_view_get_model(fv); FmSortMode mode; if(model) { fm_folder_model_get_sort(model, NULL, &mode); mode &= ~FM_SORT_CASE_SENSITIVE; if (!active) mode |= FM_SORT_CASE_SENSITIVE; fm_folder_model_set_sort(model, FM_FOLDER_MODEL_COL_DEFAULT, mode); } } static void on_change_by(GtkRadioAction* act, GtkRadioAction* cur, FmFolderView* fv) { guint val = gtk_radio_action_get_current_value(cur); FmFolderModel *model = fm_folder_view_get_model(fv); /* g_debug("on_change_by"); */ if(model) fm_folder_model_set_sort(model, val, FM_SORT_DEFAULT); } static void on_change_type(GtkRadioAction* act, GtkRadioAction* cur, FmFolderView* fv) { guint val = gtk_radio_action_get_current_value(cur); FmFolderModel *model = fm_folder_view_get_model(fv); FmSortMode mode; /* g_debug("on_change_type"); */ if(model) { fm_folder_model_get_sort(model, NULL, &mode); mode &= ~FM_SORT_ORDER_MASK; mode |= (val == GTK_SORT_ASCENDING) ? FM_SORT_ASCENDING : FM_SORT_DESCENDING; fm_folder_model_set_sort(model, FM_FOLDER_MODEL_COL_DEFAULT, mode); } } static void on_ui_destroy(gpointer ui_ptr) { GtkUIManager* ui = (GtkUIManager*)ui_ptr; GtkMenu* popup = GTK_MENU(gtk_ui_manager_get_widget(ui, "/popup")); GtkWidget* win = gtk_menu_get_attach_widget(popup); GtkAccelGroup* accel_grp = gtk_ui_manager_get_accel_group(ui); GList *templates = g_object_get_qdata(G_OBJECT(ui), templates_quark); GSList *groups; if (win != NULL) /* it might be already destroyed */ { g_object_weak_unref(G_OBJECT(win), (GWeakNotify)gtk_menu_detach, popup); groups = gtk_accel_groups_from_object(G_OBJECT(win)); if(g_slist_find(groups, accel_grp) != NULL) gtk_window_remove_accel_group(GTK_WINDOW(win), accel_grp); } g_list_foreach(templates, (GFunc)g_object_unref, NULL); g_list_free(templates); g_object_set_qdata(G_OBJECT(ui), templates_quark, NULL); gtk_widget_destroy(GTK_WIDGET(popup)); g_object_unref(ui); } /** * fm_folder_view_add_popup * @fv: a widget to apply * @parent: parent window of @fv * @update_popup: function to extend popup menu for folder * * Adds popup menu to window @parent associated with widget @fv. This * includes hotkeys for popup menu items. Popup will be destroyed and * hotkeys will be removed from @parent when @fv is finalized or after * next call to fm_folder_view_add_popup() on the same @fv. * * Since plugins may change popup menu appearance in accordance with * the folder, implementaions are encouraged to use this API each time * the model is changed on the @fv. * * Returns: (transfer none): a new created widget. * * Since: 1.0.1 */ GtkMenu* fm_folder_view_add_popup(FmFolderView* fv, GtkWindow* parent, FmFolderViewUpdatePopup update_popup) { FmFolderViewInterface* iface; FmFolderModel* model; GtkUIManager* ui; GtkActionGroup* act_grp; GtkMenu* popup; GtkAction* act; GtkAccelGroup* accel_grp; FmPath *scheme; GList *l; FmContextMenuSchemeExt *ext; gboolean show_hidden; FmSortMode mode; GtkSortType type = (GtkSortType)-1; FmFolderModelCol by = (FmFolderModelCol)-1; iface = FM_FOLDER_VIEW_GET_IFACE(fv); show_hidden = iface->get_show_hidden(fv); model = iface->get_model(fv); if(fm_folder_model_get_sort(model, &by, &mode)) type = FM_SORT_IS_ASCENDING(mode) ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING; /* init popup from XML string */ ui = gtk_ui_manager_new(); act_grp = gtk_action_group_new("Folder"); gtk_action_group_set_translation_domain(act_grp, GETTEXT_PACKAGE); gtk_action_group_add_actions(act_grp, folder_popup_actions, G_N_ELEMENTS(folder_popup_actions), fv); gtk_action_group_add_toggle_actions(act_grp, folder_toggle_actions, G_N_ELEMENTS(folder_toggle_actions), fv); gtk_action_group_add_radio_actions(act_grp, folder_sort_type_actions, G_N_ELEMENTS(folder_sort_type_actions), type, G_CALLBACK(on_change_type), fv); gtk_action_group_add_radio_actions(act_grp, folder_sort_by_actions, G_N_ELEMENTS(folder_sort_by_actions), by, G_CALLBACK(on_change_by), fv); gtk_ui_manager_insert_action_group(ui, act_grp, 0); gtk_ui_manager_add_ui_from_string(ui, folder_popup_xml, -1, NULL); act = gtk_ui_manager_get_action(ui, "/popup/ShowHidden"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), show_hidden); act = gtk_ui_manager_get_action(ui, "/popup/Cut"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Copy"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Del"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Remove"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/FileProp"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Rename"); gtk_action_set_visible(act, FALSE); if(update_popup) update_popup(fv, parent, ui, act_grp, NULL); scheme = fm_folder_view_get_cwd(fv); if (scheme) { scheme = fm_path_get_scheme_path(scheme); CHECK_MODULES(); for (l = extensions; l; l = l->next) { ext = l->data; if (ext->scheme && ext->scheme != scheme) continue; /* not NULL nor matches */ /* FIXME: can we update menu each time it's called so take in account the selection? May be it's possible but it will require full menu rebuild with all updates and accelerators so it will be slow */ if (ext->cb.update_folder_menu != NULL) ext->cb.update_folder_menu(fv, parent, ui, act_grp, NULL); } } popup = GTK_MENU(gtk_ui_manager_get_widget(ui, "/popup")); accel_grp = gtk_ui_manager_get_accel_group(ui); gtk_window_add_accel_group(parent, accel_grp); gtk_menu_attach_to_widget(popup, GTK_WIDGET(parent), NULL); g_object_weak_ref(G_OBJECT(parent), (GWeakNotify)gtk_menu_detach, popup); g_object_unref(act_grp); g_object_set_qdata_full(G_OBJECT(fv), ui_quark, ui, on_ui_destroy); /* we bind popup to ui so don't handle qdata change here */ g_object_set_qdata(G_OBJECT(fv), popup_quark, popup); /* special handling for 'Menu' key */ g_signal_handlers_disconnect_by_func(fv, on_key_press, fv); g_signal_connect(G_OBJECT(fv), "key-press-event", G_CALLBACK(on_key_press), fv); return popup; } /** * fm_folder_view_bounce_action * @act: an action to execute * @fv: a widget to apply * * Executes the action with the same name as @act in popup menu of @fv. * The popup menu should be created with fm_folder_view_add_popup() * before this call. * * Implemented actions are: * - Cut : cut files (or text from editable) into clipboard * - Copy : copy files (or text from editable) into clipboard * - Paste : paste files (or text from editable) from clipboard * - Del : move files into trash bin (or delete text from editable) * - Remove : delete files from filesystem (for editable does Cut) * - SelAll : select all * - InvSel : invert selection * - Rename : rename the folder * - Prop : folder properties dialog * - FileProp : file properties dialog * - NewFolder : create new folder here * - NewBlank : create an empty file here * * Actions 'Cut', 'Copy', 'Paste', 'Del', 'Remove', 'SelAll' do nothing * if current keyboard focus is neither on @fv nor on some #GtkEditable. * * See also: fm_folder_view_add_popup(). * * Since: 1.0.1 */ void fm_folder_view_bounce_action(GtkAction* act, FmFolderView* fv) { const gchar *name; GtkUIManager *ui; GList *groups; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); g_return_if_fail(act != NULL); ui = g_object_get_qdata(G_OBJECT(fv), ui_quark); g_return_if_fail(ui != NULL && GTK_IS_UI_MANAGER(ui)); groups = gtk_ui_manager_get_action_groups(ui); g_return_if_fail(groups != NULL); name = gtk_action_get_name(act); act = gtk_action_group_get_action((GtkActionGroup*)groups->data, name); if(act) { /* if we get here it means menu isn't shown but some action might be set insensitive by previous invocation of menu therefore we forcing its visibility to allow activation */ gtk_action_set_sensitive(act, TRUE); gtk_action_activate(act); } else g_debug("requested action %s wasn't found in popup", name); } /** * fm_folder_view_set_active * @fv: the folder view widget to apply * @set: state of accelerators to be set * * If @set is %TRUE then activates accelerators on the @fv that were * created with fm_folder_view_add_popup() before. If @set is %FALSE * then deactivates accelerators on the @fv. This API is useful if the * application window contains more than one folder view so gestures * will be used only on active view. This API has no effect in no popup * menu was created with fm_folder_view_add_popup() before this call. * * See also: fm_folder_view_add_popup(). * * Since: 1.0.1 */ void fm_folder_view_set_active(FmFolderView* fv, gboolean set) { GtkUIManager *ui; GtkMenu *popup; GtkWindow* win; GtkAccelGroup* accel_grp; GSList *groups; gboolean active; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); ui = g_object_get_qdata(G_OBJECT(fv), ui_quark); popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); g_return_if_fail(ui != NULL && GTK_IS_UI_MANAGER(ui)); g_return_if_fail(popup != NULL && GTK_IS_MENU(popup)); win = GTK_WINDOW(gtk_menu_get_attach_widget(popup)); accel_grp = gtk_ui_manager_get_accel_group(ui); groups = gtk_accel_groups_from_object(G_OBJECT(win)); active = (g_slist_find(groups, accel_grp) != NULL); if(set && !active) gtk_window_add_accel_group(win, accel_grp); else if(!set && active) gtk_window_remove_accel_group(win, accel_grp); } /** * fm_folder_view_item_clicked * @fv: the folder view widget * @path: (allow-none): path to current pointed item * @type: what click was received * * Handles left click and right click in folder area. If some item was * left-clicked then fm_folder_view_item_clicked() tries to launch it. * If some item was right-clicked then opens file menu (applying the * update_popup returned by get_custom_menu_callbacks interface function * before opening it if it's not %NULL). If it was right-click on empty * space of folder view (so @path is %NULL) then opens folder popup * menu that was created by fm_folder_view_add_popup(). After that * emits the #FmFolderView::clicked signal. * * If open_folders callback from interface function get_custom_menu_callbacks * is %NULL then assume it was old API call so click will be not handled * by this function and signal handler will handle it instead. Otherwise * the user_data for it will be #GtkWindow the menu is attached to. * * This API is internal for #FmFolderView and should be used only in * class implementations. * * Since: 1.0.1 */ void fm_folder_view_item_clicked(FmFolderView* fv, GtkTreePath* path, FmFolderViewClickType type) { FmFolderViewInterface* iface; GtkTreeModel* model; FmFileInfo* fi; FmFileInfoList *files; GtkMenu *popup; GtkWindow *win; FmFolderViewUpdatePopup update_popup; FmLaunchFolderFunc open_folders; GtkTreeIter it; g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); iface = FM_FOLDER_VIEW_GET_IFACE(fv); if(path) { model = GTK_TREE_MODEL(iface->get_model(fv)); if(gtk_tree_model_get_iter(model, &it, path)) gtk_tree_model_get(model, &it, FM_FOLDER_MODEL_COL_INFO, &fi, -1); } else fi = NULL; popup = g_object_get_qdata(G_OBJECT(fv), popup_quark); if(popup == NULL) /* no fm_folder_view_add_popup() was called before */ goto send_signal; win = GTK_WINDOW(gtk_menu_get_attach_widget(popup)); /* handle left and rigth clicks */ iface->get_custom_menu_callbacks(fv, &update_popup, &open_folders); /* if open_folders is NULL then it's old API call so don't handle */ if(open_folders) switch(type) { case FM_FV_ACTIVATED: /* file(s) activated */ files = iface->dup_selected_files(fv); if (files == NULL) { if (fi == NULL) /* oops, nothing to activate */ goto send_signal; files = fm_file_info_list_new(); fm_file_info_list_push_tail(files, fi); } fm_launch_files_simple(win, NULL, fm_file_info_list_peek_head_link(files), open_folders, win); fm_file_info_list_unref(files); break; case FM_FV_CONTEXT_MENU: if(fi && iface->count_selected_files(fv) > 0) /* workaround on ExoTreeView bug */ { files = iface->dup_selected_files(fv); popup = _make_file_menu(fv, win, update_popup, open_folders, files); fm_file_info_list_unref(files); gtk_menu_popup(popup, NULL, NULL, popup_position_func, fv, 3, gtk_get_current_event_time()); } else /* no files are selected. Show context menu of current folder. */ on_menu(NULL, fv); break; default: ; } send_signal: /* send signal */ g_signal_emit(fv, signals[CLICKED], 0, type, fi); } /** * fm_folder_view_sel_changed * @obj: some object; unused * @fv: the folder view widget to apply * * Emits the #FmFolderView::sel-changed signal. * * This API is internal for #FmFolderView and should be used only in * class implementations. * * Since: 1.0.1 */ void fm_folder_view_sel_changed(GObject* obj, FmFolderView* fv) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); /* if someone is connected to our "sel-changed" signal. */ if(g_signal_has_handler_pending(fv, signals[SEL_CHANGED], 0, TRUE)) { FmFolderViewInterface* iface = FM_FOLDER_VIEW_GET_IFACE(fv); gint files = iface->count_selected_files(fv); /* emit a selection changed notification to the world. */ g_signal_emit(fv, signals[SEL_CHANGED], 0, files); } } #if 0 /** * fm_folder_view_chdir * @fv: the folder view widget to apply * * Emits the #FmFolderView::chdir signal. * * This API is internal for #FmFolderView and should be used only in * class implementations. * * Since: 1.0.2 */ void fm_folder_view_chdir(FmFolderView* fv, FmPath* path) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); g_signal_emit(fv, signals[CHDIR], 0, path); } #endif /** * fm_folder_view_set_columns * @fv: the folder view widget to apply * @cols: (element-type FmFolderViewColumnInfo): new list of column infos * * Changes composition (rendering) of folder view @fv in accordance to * new list of column infos. * * Returns: %TRUE in case of success. * * Since: 1.0.2 */ gboolean fm_folder_view_set_columns(FmFolderView* fv, const GSList* cols) { FmFolderViewInterface* iface; g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), FALSE); iface = FM_FOLDER_VIEW_GET_IFACE(fv); if(iface->set_columns) return iface->set_columns(fv, cols); return FALSE; } /** * fm_folder_view_get_columns * @fv: the folder view widget to query * * Retrieves current composition of @fv as list of column infos. Returned * list should be freed with g_slist_free() after usage. * * Returns: (transfer container) (element-type FmFolderViewColumnInfo): list of column infos. * * Since: 1.0.2 */ GSList* fm_folder_view_get_columns(FmFolderView* fv) { FmFolderViewInterface* iface; g_return_val_if_fail(FM_IS_FOLDER_VIEW(fv), NULL); iface = FM_FOLDER_VIEW_GET_IFACE(fv); if(iface->get_columns) return iface->get_columns(fv); return NULL; } /** * fm_folder_view_columns_changed * @fv: the folder view widget to apply * * Emits the #FmFolderView::columns-changed signal. * * This API is internal for #FmFolderView and should be used only in * class implementations. * * Since: 1.2.0 */ void fm_folder_view_columns_changed(FmFolderView* fv) { g_return_if_fail(FM_IS_FOLDER_VIEW(fv)); g_signal_emit(fv, signals[COLUMNS_CHANGED], 0); } /* modules support */ FM_MODULE_DEFINE_TYPE(gtk_menu_scheme, FmContextMenuSchemeAddonInit, 1) static gboolean fm_module_callback_gtk_menu_scheme(const char *name, gpointer init, int ver) { FmContextMenuSchemeExt *ext = g_slice_new(FmContextMenuSchemeExt); FmContextMenuSchemeAddonInit *cb = init; char *scheme_str; FmPath *path; /* not checking version, it's only 1 for now */ if (strcmp(name, "*") == 0) ext->scheme = NULL; else if (strcmp(name, "menu") == 0) /* special support */ ext->scheme = fm_path_new_for_uri("menu://applications/"); else if (strchr(name, '/') != NULL) { path = fm_path_new_for_uri(name); ext->scheme = fm_path_ref(fm_path_get_scheme_path(path)); fm_path_unref(path); } else { scheme_str = g_strdup_printf("%s://", name); path = fm_path_new_for_uri(scheme_str); ext->scheme = fm_path_ref(fm_path_get_scheme_path(path)); g_free(scheme_str); fm_path_unref(path); } ext->cb = *cb; if (cb->init != NULL) cb->init(); extensions = g_list_append(extensions, ext); return TRUE; } void _fm_folder_view_init(void) { fm_module_register_gtk_menu_scheme(); } void _fm_folder_view_finalize(void) { GList *list, *l; FmContextMenuSchemeExt *ext; list = extensions; extensions = NULL; for (l = list; l; l = l->next) { ext = l->data; if (ext->cb.finalize != NULL) ext->cb.finalize(); if (ext->scheme != NULL) fm_path_unref(ext->scheme); g_slice_free(FmContextMenuSchemeExt, ext); } g_list_free(list); fm_module_unregister_type("gtk_menu_scheme"); } /** * fm_folder_view_scroll_to_path * @fv: the folder view widget to query * @path: the item to scroll * @focus: %TRUE to set cursor focus on item * * Scrolls the view to get item defined by @path closely to center of the * view window. If @focus is %TRUE then also keyboard focus will be set * to the @path. * * Since: 1.2.0 */ void fm_folder_view_scroll_to_path(FmFolderView* fv, FmPath *path, gboolean focus) { FmFolderViewInterface* iface; g_return_if_fail(FM_IS_FOLDER_VIEW(fv) && path != NULL); iface = FM_FOLDER_VIEW_GET_IFACE(fv); if (iface->scroll_to_path) iface->scroll_to_path(fv, path, focus); } libfm-1.4.0/src/gtk/fm-folder-view.h000066400000000000000000000274171475513661000172000ustar00rootroot00000000000000/* * fm-folder-view.h * * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FOLDER_VIEW_H__ #define __FOLDER_VIEW_H__ #include "fm-file-info.h" #include "fm-module.h" #include "fm-folder-model.h" #include "fm-file-launcher.h" #include "fm-file-menu.h" #include G_BEGIN_DECLS #define FM_TYPE_FOLDER_VIEW (fm_folder_view_get_type()) #define FM_FOLDER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_FOLDER_VIEW, FmFolderView)) #define FM_IS_FOLDER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_FOLDER_VIEW)) #define FM_FOLDER_VIEW_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj),\ FM_TYPE_FOLDER_VIEW, FmFolderViewInterface)) typedef struct _FmFolderView FmFolderView; /* Dummy typedef */ typedef struct _FmFolderViewInterface FmFolderViewInterface; /** * FmFolderViewClickType * @FM_FV_CLICK_NONE: no click * @FM_FV_ACTIVATED: this can be triggered by both left single or double click depending on whether single-click activation is used or not. * @FM_FV_MIDDLE_CLICK: middle mouse button pressed * @FM_FV_CONTEXT_MENU: right mouse button pressed * * Click type for #FmFolderView::clicked signal handlers. */ typedef enum { FM_FV_CLICK_NONE, FM_FV_ACTIVATED, FM_FV_MIDDLE_CLICK, FM_FV_CONTEXT_MENU } FmFolderViewClickType; #define FM_FOLDER_VIEW_CLICK_TYPE_IS_VALID(type) (type > FM_FV_CLICK_NONE && type <= FM_FV_CONTEXT_MENU) /* callbacks */ /** * FmFolderViewUpdatePopup * @fv: the folder view widget * @window: the window where @fv is present * @ui: the object to add interface * @act_grp: group of actions to add action * @files: list of files for current popup menu * * The callback to update popup menu. It can disable items of menu, add * some new, replace actions, etc. depending of the window and files. * * If callback is called on folder context menu then @files is NULL. */ typedef void (*FmFolderViewUpdatePopup)(FmFolderView* fv, GtkWindow* window, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfoList* files); /** * FmFolderViewInterface: * @clicked: the class closure for #FmFolderView::clicked signal * @sel_changed: the class closure for #FmFolderView::sel-changed signal * @sort_changed: the class closure for #FmFolderView::sort-changed signal * @filter_changed: (since 1.2.0) the class closure for #FmFolderView::filter-changed signal * @columns_changed: (since 1.2.0) the class closure for #FmFolderView::columns-changed signal * @set_sel_mode: VTable func, see fm_folder_view_set_selection_mode() * @get_sel_mode: VTable func, see fm_folder_view_get_selection_mode() * @set_sort: unused since 1.0.2, will be removed from ABI 5 * @get_sort: unused since 1.0.2, will be removed from ABI 5 * @set_show_hidden: function to save show_hidden in the object structure * @get_show_hidden: function to retrieve show_hidden from the object structure * @get_folder: unused since 1.2.0 * @set_model: VTable func, see fm_folder_view_set_model() * @get_model: VTable func, see fm_folder_view_get_model() * @count_selected_files: VTable func, see fm_folder_view_get_n_selected_files() * @dup_selected_files: VTable func, see fm_folder_view_dup_selected_files() * @dup_selected_file_paths: VTable func, see fm_folder_view_dup_selected_file_paths() * @select_all: VTable func, see fm_folder_view_select_all() * @unselect_all: VTable func, see fm_folder_view_unselect_all() * @select_invert: VTable func, see fm_folder_view_select_invert() * @select_file_path: VTable func, see fm_folder_view_select_file_path() * @set_columns: (since 1.2.0) VTable func, see fm_folder_view_set_columns() * @get_columns: (since 1.2.0) VTable func, see fm_folder_view_get_columns() * @scroll_to_path: (since 1.2.0) VTable func, see fm_folder_view_scroll_to_path() * @get_custom_menu_callbacks: function to retrieve callbacks for popup menu setup */ struct _FmFolderViewInterface { /*< private >*/ GTypeInterface g_iface; /*< public >*/ /* signals */ void (*clicked)(FmFolderView* fv, FmFolderViewClickType type, FmFileInfo* file); void (*sel_changed)(FmFolderView* fv, gint n_sels); void (*sort_changed)(FmFolderView* fv); void (*filter_changed)(FmFolderView* fv); void (*columns_changed)(FmFolderView* fv); /*< private >*/ gpointer _reserved1; gpointer _reserved2; //void (*chdir)(FmFolderView* fv, FmPath* path); /*< public >*/ /* VTable */ void (*set_sel_mode)(FmFolderView* fv, GtkSelectionMode mode); GtkSelectionMode (*get_sel_mode)(FmFolderView* fv); void (*set_sort)(FmFolderView* fv, GtkSortType type, FmFolderModelCol by); void (*get_sort)(FmFolderView* fv, GtkSortType* type, FmFolderModelCol* by); void (*set_show_hidden)(FmFolderView* fv, gboolean show); gboolean (*get_show_hidden)(FmFolderView* fv); FmFolder* (*get_folder)(FmFolderView* fv); void (*set_model)(FmFolderView* fv, FmFolderModel* model); FmFolderModel* (*get_model)(FmFolderView* fv); gint (*count_selected_files)(FmFolderView* fv); FmFileInfoList* (*dup_selected_files)(FmFolderView* fv); FmPathList* (*dup_selected_file_paths)(FmFolderView* fv); void (*select_all)(FmFolderView* fv); void (*unselect_all)(FmFolderView* fv); void (*select_invert)(FmFolderView* fv); void (*select_file_path)(FmFolderView* fv, FmPath* path); gboolean (*set_columns)(FmFolderView* fv, const GSList* cols); GSList* (*get_columns)(FmFolderView* fv); /* for implementation internal usage */ void (*get_custom_menu_callbacks)(FmFolderView* fv, FmFolderViewUpdatePopup*, FmLaunchFolderFunc*); void (*scroll_to_path)(FmFolderView* fv, FmPath *path, gboolean focus); /*< private >*/ gpointer _reserved3; gpointer _reserved4; gpointer _reserved5; gpointer _reserved6; }; GType fm_folder_view_get_type(void); /* VTable calls */ void fm_folder_view_set_selection_mode(FmFolderView* fv, GtkSelectionMode mode); GtkSelectionMode fm_folder_view_get_selection_mode(FmFolderView* fv); void fm_folder_view_set_show_hidden(FmFolderView* fv, gboolean show); gboolean fm_folder_view_get_show_hidden(FmFolderView* fv); FmFolder* fm_folder_view_get_folder(FmFolderView* fv); FmPath* fm_folder_view_get_cwd(FmFolderView* fv); FmFileInfo* fm_folder_view_get_cwd_info(FmFolderView* fv); FmFolderModel* fm_folder_view_get_model(FmFolderView* fv); void fm_folder_view_set_model(FmFolderView* fv, FmFolderModel* model); gint fm_folder_view_get_n_selected_files(FmFolderView* fv); FmFileInfoList* fm_folder_view_dup_selected_files(FmFolderView* fv); FmPathList* fm_folder_view_dup_selected_file_paths(FmFolderView* fv); void fm_folder_view_select_all(FmFolderView* fv); void fm_folder_view_select_invert(FmFolderView* fv); void fm_folder_view_select_file_path(FmFolderView* fv, FmPath* path); void fm_folder_view_select_file_paths(FmFolderView* fv, FmPathList* paths); void fm_folder_view_unselect_all(FmFolderView* fv); void fm_folder_view_scroll_to_path(FmFolderView* fv, FmPath *path, gboolean focus); /* generate a popup menu for the window */ GtkMenu* fm_folder_view_add_popup(FmFolderView* fv, GtkWindow* parent, FmFolderViewUpdatePopup update_popup); void fm_folder_view_set_active(FmFolderView* fv, gboolean set); /* bounce action to FmFolderView stock */ void fm_folder_view_bounce_action(GtkAction* act, FmFolderView* fv); /* emit signals; for interface implementations only */ void fm_folder_view_item_clicked(FmFolderView* fv, GtkTreePath* path, FmFolderViewClickType type); void fm_folder_view_sel_changed(GObject* obj, FmFolderView* fv); void fm_folder_view_columns_changed(FmFolderView* fv); //void fm_folder_view_chdir(FmFolderView* fv, FmPath* path); #ifndef FM_DISABLE_DEPRECATED /* deprecated since 1.0.2; left until soname 5 for compatibility */ void fm_folder_view_sort(FmFolderView* fv, GtkSortType type, FmFolderModelCol by); GtkSortType fm_folder_view_get_sort_type(FmFolderView* fv); FmFolderModelCol fm_folder_view_get_sort_by(FmFolderView* fv); /* functions defined in fm-standard-view.c * are obsoleted since 1.0.1 but left until soname 5 for compatibility */ FmFolderView* fm_folder_view_new(guint mode); void fm_folder_view_set_mode(FmFolderView* fv, guint mode); guint fm_folder_view_get_mode(FmFolderView* fv); void fm_folder_view_select_custom(FmFolderView* fv, GFunc filter, gpointer user_data); #endif typedef struct _FmFolderViewColumnInfo FmFolderViewColumnInfo; /** * FmFolderViewColumnInfo: * @col_id: column type * @width: width of column; 0 for auto, >0 for fixed width, <0 to use default * * FmFolderView column setup data. */ struct _FmFolderViewColumnInfo { /*< public >*/ FmFolderModelCol col_id; gint width; /*< private >*/ gint reserved1; /* reserved members for usage by interface implementations */ gint reserved2; gint reserved3; }; gboolean fm_folder_view_set_columns(FmFolderView* fv, const GSList* cols); GSList* fm_folder_view_get_columns(FmFolderView* fv); /* plugins "gtk_menu_scheme" stuff */ typedef struct _FmContextMenuSchemeAddonInit FmContextMenuSchemeAddonInit; /** * FmContextMenuSchemeAddonInit: * @init: (allow-none): callback for plugin initialization * @finalize: (allow-none): callback to free resources allocated by @init * @update_file_menu_for_scheme: (allow-none): callback to update selection context menu * @update_folder_menu: (allow-none): callback to update folder context menu * * The @init and @finalize callbacks are called on application start and exit. * * The @update_file_menu_for_scheme callback will be called each time * context menu is created for files that are on the same file system * equal to the scheme defined as plugin name is created. * * The @update_folder_menu callback will be called each time application * runs fm_folder_view_add_popup() on folder of the same scheme. * * This structure is used for "gtk_menu_scheme" module initialization. * The key for module of this type is scheme name to support. It may be * "*" if module should be called on any file. No wildcards is allowed * otherwise. * * Since: 1.2.0 */ struct _FmContextMenuSchemeAddonInit { void (*init)(void); void (*finalize)(void); /* mask: scheme for all files ("*" allowed) */ FmFileMenuUpdatePopup update_file_menu_for_scheme; /* mask: scheme for folder ("*" allowed) */ FmFolderViewUpdatePopup update_folder_menu; }; #define FM_MODULE_gtk_menu_scheme_VERSION 1 extern FmContextMenuSchemeAddonInit fm_module_init_gtk_menu_scheme; void _fm_folder_view_init(void); void _fm_folder_view_finalize(void); G_END_DECLS #endif /* __FOLDER_VIEW_H__ */ libfm-1.4.0/src/gtk/fm-gtk-file-launcher.c000066400000000000000000001206761475513661000202520ustar00rootroot00000000000000/* * fm-gtk-file-launcher.c * * Copyright 2010-2012 Hong Jen Yee (PCMan) * Copyright 2010 Shae Smittle * Copyright 2012-2015 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-gtk-file-launcher * @short_description: Gtk file launcher utilities. * @title: Gtk file launcher * * @include: libfm/fm-gtk.h * * Utilities to launch files using libfm file launchers. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "fm-gtk-file-launcher.h" #include "fm-gtk-utils.h" #include "fm-app-chooser-dlg.h" #include "fm.h" #include "gtk-compat.h" /* for open() */ #include #include #include /* for read() */ #include /* for strtoul() */ #include typedef struct _LaunchData LaunchData; struct _LaunchData { GtkWindow* parent; FmLaunchFolderFunc folder_func; gpointer user_data; }; static GAppInfo* choose_app(GList* file_infos, FmMimeType* mime_type, gpointer user_data, GError** err) { LaunchData* data = (LaunchData*)user_data; return fm_choose_app_for_mime_type(data->parent, mime_type, mime_type != NULL); } static gboolean on_launch_error(GAppLaunchContext* ctx, GError* err, FmPath* path, gpointer user_data) { LaunchData* data = (LaunchData*)user_data; /* ask for mount if trying to launch unmounted path */ if(err->domain == G_IO_ERROR) { if(path && err->code == G_IO_ERROR_NOT_MOUNTED) { if(fm_mount_path(data->parent, path, TRUE)) return FALSE; /* ask to retry */ } else if(err->code == G_IO_ERROR_FAILED_HANDLED) return TRUE; /* don't show error message */ } fm_show_error(data->parent, NULL, err->message); return TRUE; } static gboolean on_open_folder(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data, GError** err) { LaunchData* data = (LaunchData*)user_data; if (data->folder_func) return data->folder_func(ctx, folder_infos, data->user_data, err); else return FALSE; } static int on_launch_ask(const char* msg, char* const* btn_labels, int default_btn, gpointer user_data) { LaunchData* data = (LaunchData*)user_data; /* FIXME: set default button properly */ return fm_askv(data->parent, NULL, msg, btn_labels); } static FmFileLauncherExecAction on_exec_file(FmFileInfo* file, gpointer user_data) { GtkBuilder* b; GtkDialog* dlg; GtkLabel *msg; GtkImage *icon; char* msg_str; int res; FmIcon* fi_icon; if (fm_config->quick_exec) { /* SF bug#838: open terminal for each script may be just a waste. User should open a terminal and start the script there in case if user wants to see the script output anyway. if (fm_file_info_is_text(file)) return FM_FILE_LAUNCHER_EXEC_IN_TERMINAL; */ return FM_FILE_LAUNCHER_EXEC; } b = gtk_builder_new(); fi_icon = fm_file_info_get_icon(file); gtk_builder_set_translation_domain(b, GETTEXT_PACKAGE); gtk_builder_add_from_file(b, PACKAGE_UI_DIR "/exec-file.ui", NULL); dlg = GTK_DIALOG(gtk_builder_get_object(b, "dlg")); msg = GTK_LABEL(gtk_builder_get_object(b, "msg")); icon = GTK_IMAGE(gtk_builder_get_object(b, "icon")); gtk_image_set_from_gicon(icon, G_ICON(fi_icon), GTK_ICON_SIZE_DIALOG); gtk_box_set_homogeneous(GTK_BOX(gtk_dialog_get_action_area(dlg)), FALSE); /* If we reached this point then file is executable: either script or binary */ /* If it's a script, ask the user first. */ if(fm_file_info_is_text(file)) { msg_str = g_strdup_printf(_("This text file '%s' seems to be an executable script.\nWhat do you want to do with it?"), fm_file_info_get_disp_name(file)); gtk_dialog_set_default_response(dlg, FM_FILE_LAUNCHER_EXEC_IN_TERMINAL); } else { GtkWidget* open = GTK_WIDGET(gtk_builder_get_object(b, "open")); gtk_widget_destroy(open); msg_str = g_strdup_printf(_("This file '%s' is executable. Do you want to execute it?"), fm_file_info_get_disp_name(file)); gtk_dialog_set_default_response(dlg, FM_FILE_LAUNCHER_EXEC); } gtk_label_set_text(msg, msg_str); g_free(msg_str); res = gtk_dialog_run(dlg); gtk_widget_destroy(GTK_WIDGET(dlg)); g_object_unref(b); if(res <=0) res = FM_FILE_LAUNCHER_EXEC_CANCEL; return res; } /** * fm_launch_files_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @file_infos: (element-type FmFileInfo): files to launch * @func: callback to launch folder * @user_data: data supplied for @func * * Launches files using @func to launch folders. If @ctx is %NULL * then new context on the same screen as @parent will be created for * launching. * * Returns: %TRUE if launch was succesful. * * Since: 0.1.0 */ gboolean fm_launch_files_simple(GtkWindow* parent, GAppLaunchContext* ctx, GList* file_infos, FmLaunchFolderFunc func, gpointer user_data) { FmFileLauncher launcher = { .get_app = choose_app, .open_folder = on_open_folder, .exec_file = on_exec_file, .error = on_launch_error, .ask = on_launch_ask }; LaunchData data = {parent, func, user_data}; GdkAppLaunchContext* _ctx = NULL; gboolean ret; if (!func) launcher.open_folder = NULL; if(ctx == NULL) { _ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); gdk_app_launch_context_set_screen(_ctx, parent ? gtk_widget_get_screen(GTK_WIDGET(parent)) : gdk_screen_get_default()); gdk_app_launch_context_set_timestamp(_ctx, gtk_get_current_event_time()); /* FIXME: how to handle gdk_app_launch_context_set_icon? */ ctx = G_APP_LAUNCH_CONTEXT(_ctx); } ret = fm_launch_files(ctx, file_infos, &launcher, &data); if(_ctx) g_object_unref(_ctx); return ret; } /** * fm_launch_paths_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @paths: (element-type FmPath): files to launch * @func: callback to launch folder * @user_data: data supplied for @func * * Launches files using @func to launch folders. If @ctx is %NULL * then new context on the same screen as @parent will be created for * launching. * * Returns: %TRUE if launch was succesful. * * Since: 0.1.0 */ gboolean fm_launch_paths_simple(GtkWindow* parent, GAppLaunchContext* ctx, GList* paths, FmLaunchFolderFunc func, gpointer user_data) { FmFileLauncher launcher = { .get_app = choose_app, .open_folder = on_open_folder, .exec_file = on_exec_file, .error = on_launch_error, .ask = on_launch_ask }; LaunchData data = {parent, func, user_data}; GdkAppLaunchContext* _ctx = NULL; gboolean ret; if(ctx == NULL) { _ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); gdk_app_launch_context_set_screen(_ctx, parent ? gtk_widget_get_screen(GTK_WIDGET(parent)) : gdk_screen_get_default()); gdk_app_launch_context_set_timestamp(_ctx, gtk_get_current_event_time()); /* FIXME: how to handle gdk_app_launch_context_set_icon? */ ctx = G_APP_LAUNCH_CONTEXT(_ctx); } ret = fm_launch_paths(ctx, paths, &launcher, &data); if(_ctx) g_object_unref(_ctx); return ret; } /** * fm_launch_file_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @file_info: file to launch * @func: callback to launch folder * @user_data: data supplied for @func * * Launches file. If @file_info is folder then uses @func to launch it. * If @ctx is %NULL then new context on the same screen as @parent will * be created for launching. * * Returns: %TRUE if launch was succesful. * * Since: 0.1.0 */ gboolean fm_launch_file_simple(GtkWindow* parent, GAppLaunchContext* ctx, FmFileInfo* file_info, FmLaunchFolderFunc func, gpointer user_data) { gboolean ret; GList* files = g_list_prepend(NULL, file_info); ret = fm_launch_files_simple(parent, ctx, files, func, user_data); g_list_free(files); return ret; } /** * fm_launch_path_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @path: file to launch * @func: callback to launch folder * @user_data: data supplied for @func * * Launches file. If @path is folder then uses @func to launch it. * If @ctx is %NULL then new context on the same screen as @parent will * be created for launching. * * Returns: %TRUE if launch was succesful. * * Since: 0.1.0 */ gboolean fm_launch_path_simple(GtkWindow* parent, GAppLaunchContext* ctx, FmPath* path, FmLaunchFolderFunc func, gpointer user_data) { gboolean ret; GList* files = g_list_prepend(NULL, path); ret = fm_launch_paths_simple(parent, ctx, files, func, user_data); g_list_free(files); return ret; } /** * fm_launch_desktop_entry_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @entry: desktop entry file to launch * @files: (allow-none): files to supply launch * * Launches desktop entry. @files will be supplied to launch if @entry * accepts arguments. If @ctx is %NULL then new context on the same * screen as @parent will be created for launching the application. * * Returns: %TRUE if launch was succesful. * * Since: 1.0.1 */ gboolean fm_launch_desktop_entry_simple(GtkWindow* parent, GAppLaunchContext* ctx, FmFileInfo* entry, FmPathList* files) { FmFileLauncher launcher = { .get_app = NULL, .open_folder = NULL, .exec_file = NULL, .error = on_launch_error, .ask = on_launch_ask }; LaunchData data = {parent, NULL, NULL}; GdkAppLaunchContext *_ctx = NULL; GList *l, *uris = NULL; FmPath *path; char *entry_path; gboolean ret; if(!entry || (path = fm_file_info_get_path(entry)) == NULL) return FALSE; if(ctx == NULL) { _ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); gdk_app_launch_context_set_screen(_ctx, parent ? gtk_widget_get_screen(GTK_WIDGET(parent)) : gdk_screen_get_default()); gdk_app_launch_context_set_timestamp(_ctx, gtk_get_current_event_time()); /* FIXME: how to handle gdk_app_launch_context_set_icon? */ ctx = G_APP_LAUNCH_CONTEXT(_ctx); } if(files) for(l = fm_path_list_peek_head_link(files); l; l = l->next) uris = g_list_append(uris, fm_path_to_uri(FM_PATH(l->data))); /* special handling for shortcuts */ if (fm_file_info_is_shortcut(entry)) entry_path = g_strdup(fm_file_info_get_target(entry)); else entry_path = fm_path_to_str(path); ret = fm_launch_desktop_entry(ctx, entry_path, uris, &launcher, &data); g_list_foreach(uris, (GFunc)g_free, NULL); g_list_free(uris); g_free(entry_path); if(_ctx) g_object_unref(_ctx); return ret; } /** * fm_launch_command_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @flags: flags to launch command * @cmd: command to launch * @files: (allow-none): files to supply launch * * Launches command. @files will be supplied to launch if @cmd * accepts arguments. If @ctx is %NULL then new context on the same * screen as @parent will be created for launching the command. * * Returns: %TRUE if launch was succesful. * * Since: 1.2.0 */ gboolean fm_launch_command_simple(GtkWindow *parent, GAppLaunchContext *ctx, GAppInfoCreateFlags flags, const char *cmd, FmPathList *files) { GAppInfo *appinfo; GError *error = NULL; GList *l, *fl = NULL; GdkAppLaunchContext *_ctx = NULL; gboolean ok; appinfo = fm_app_info_create_from_commandline(cmd, NULL, flags, &error); if (appinfo == NULL) { fm_show_error(parent, NULL, error->message); g_error_free(error); return FALSE; } if (ctx == NULL && parent != NULL) { _ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); gdk_app_launch_context_set_screen(_ctx, gtk_widget_get_screen(GTK_WIDGET(parent))); gdk_app_launch_context_set_timestamp(_ctx, gtk_get_current_event_time()); /* FIXME: how to handle gdk_app_launch_context_set_icon? */ ctx = G_APP_LAUNCH_CONTEXT(_ctx); } if (files) for (l = fm_path_list_peek_head_link(files); l; l = l->next) fl = g_list_append(fl, fm_path_to_gfile(FM_PATH(l->data))); ok = fm_app_info_launch(appinfo, fl, ctx, &error); if (!ok) { fm_show_error(parent, NULL, error->message); g_error_free(error); } g_list_free_full(fl, g_object_unref); g_object_unref(appinfo); if (_ctx) g_object_unref(_ctx); return ok; } /* * file-search-ui.c */ /* generated by glade-connect-gen, defined in file-search-ui.c */ static void filesearch_glade_connect_signals(GtkBuilder* builder, gpointer user_data); typedef struct { GtkDialog * dlg; GtkTreeView * path_tree_view; GtkEntry* name_entry; GtkCheckButton* name_case_insensitive_checkbutton; GtkCheckButton* name_regex_checkbutton; GtkCheckButton* search_recursive_checkbutton; GtkCheckButton* search_hidden_files_checkbutton; GtkCheckButton* text_file_checkbutton; GtkCheckButton* image_file_checkbutton; GtkCheckButton* audio_file_checkbutton; GtkCheckButton* video_file_checkbutton; GtkCheckButton* doc_file_checkbutton; GtkCheckButton* dir_file_checkbutton; GtkCheckButton* other_file_checkbutton; GtkEntry* other_file_entry; GtkEntry* content_entry; GtkCheckButton* content_case_insensitive_checkbutton; GtkCheckButton* content_regex_checkbutton; GtkSpinButton* bigger_spinbutton; GtkComboBox* bigger_unit_combo; GtkSpinButton* smaller_spinbutton; GtkComboBox* smaller_unit_combo; GtkCheckButton* min_mtime_checkbutton; GtkButton* min_mtime_button; GtkCheckButton* max_mtime_checkbutton; GtkButton* max_mtime_button; GtkListStore * path_list_store; GtkDialog* date_dlg; GtkCalendar* calendar; GtkWindow* parent; GAppLaunchContext* ctx; FmLaunchFolderFunc func; gpointer user_data; } FileSearchUI; #if 0 static gchar * document_mime_types[] = { "application/pdf", "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.oasis.opendocument.chart", "application/vnd.oasis.opendocument.database", "application/vnd.oasis.opendocument.formula", "application/vnd.oasis.opendocument.graphics", "application/vnd.oasis.opendocument.image", "application/vnd.oasis.opendocument.presentation", "application/vnd.oasis.opendocument.spreadsheet", "application/vnd.oasis.opendocument.text", "application/vnd.oasis.opendocument.text-master", "application/vnd.oasis.opendocument.text-web", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "application/vnd.openxmlformats-officedocument.presentationml.slideshow", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/x-abiword", "application/x-gnumeric", "application/x-dvi", NULL }; #endif typedef enum { FM_SAVED_SEARCH_NAME_CI = 1<<0, FM_SAVED_SEARCH_NAME_REGEXP = 1<<1, FM_SAVED_SEARCH_RECURSION = 1<<2, FM_SAVED_SEARCH_HIDDEN = 1<<3, FM_SAVED_SEARCH_TYPE_TEXT = 1<<4, FM_SAVED_SEARCH_TYPE_IMAGE = 1<<5, FM_SAVED_SEARCH_TYPE_AUDIO = 1<<6, FM_SAVED_SEARCH_TYPE_VIDEO = 1<<7, FM_SAVED_SEARCH_TYPE_DOCS = 1<<8, FM_SAVED_SEARCH_TYPE_DIRS = 1<<9, FM_SAVED_SEARCH_CONTENT_CI = 1<<10, FM_SAVED_SEARCH_CONTENT_REGEXP = 1<<11 } FmSavedSearch; /* UI Signal Handlers */ static gboolean launch_search(FileSearchUI* ui) { GString* search_uri = g_string_sized_new(1024); GdkAppLaunchContext *_ctx = NULL; GtkTreeModel* model; GtkTreeIter it; gboolean ret; FmSavedSearch saved = 0; /* build the search:// URI to perform the search */ g_string_append(search_uri, "search://"); model = GTK_TREE_MODEL(ui->path_list_store); if(gtk_tree_model_get_iter_first(model, &it)) /* we need to have at least one dir path */ { gboolean recursive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->search_recursive_checkbutton)); gboolean show_hidden = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->search_hidden_files_checkbutton)); const char* name_patterns = gtk_entry_get_text(ui->name_entry); gboolean name_ci = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->name_case_insensitive_checkbutton)); gboolean name_regex = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->name_regex_checkbutton)); const char* content_pattern = gtk_entry_get_text(ui->content_entry); gboolean content_ci = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->content_case_insensitive_checkbutton)); gboolean content_regex = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->content_regex_checkbutton)); const char *other_file_pattern = gtk_entry_get_text(ui->other_file_entry); const guint unit_bytes[] = {1, (1024), (1024*1024), (1024*1024*1024)}; GSList* mime_types = NULL; FmPath* search_path; GList* search_path_list; char *escaped; FmFileLauncher launcher = { .get_app = choose_app, .open_folder = on_open_folder, .exec_file = on_exec_file, .error = on_launch_error, .ask = on_launch_ask }; LaunchData data = {ui->parent, ui->func, ui->user_data}; /* add paths */ for(;;) { char *path_str; gtk_tree_model_get(model, &it, 0, &path_str, -1); /* escape possible '?' and ',' */ escaped = g_uri_escape_string(path_str, "!$&'()*+:;=/@", TRUE); g_free(path_str); g_string_append(search_uri, escaped); g_free(escaped); if(!gtk_tree_model_iter_next(model, &it)) /* no more items */ break; g_string_append_c(search_uri, ','); /* separator for paths */ } g_string_append_c(search_uri, '?'); g_string_append_printf(search_uri, "recursive=%c", recursive ? '1' : '0'); g_string_append_printf(search_uri, "&show_hidden=%c", show_hidden ? '1' : '0'); if(name_patterns && *name_patterns) { /* escape ampersands in pattern */ escaped = g_uri_escape_string(name_patterns, ":/?#[]@!$'()*+,;", TRUE); if(name_regex) g_string_append_printf(search_uri, "&name_regex=%s", escaped); else g_string_append_printf(search_uri, "&name=%s", escaped); if(name_ci) g_string_append_printf(search_uri, "&name_ci=%c", name_ci ? '1' : '0'); g_free(escaped); } if(content_pattern && *content_pattern) { /* escape ampersands in pattern */ escaped = g_uri_escape_string(content_pattern, ":/?#[]@!$'()*+,;^<>{}", TRUE); if(content_regex) g_string_append_printf(search_uri, "&content_regex=%s", escaped); else g_string_append_printf(search_uri, "&content=%s", escaped); g_free(escaped); if(content_ci) g_string_append_printf(search_uri, "&content_ci=%c", content_ci ? '1' : '0'); } /* search for the files of specific mime-types */ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->text_file_checkbutton))) mime_types = g_slist_prepend(mime_types, (gpointer)"text/plain"); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->image_file_checkbutton))) mime_types = g_slist_prepend(mime_types, (gpointer)"image/*"); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->audio_file_checkbutton))) mime_types = g_slist_prepend(mime_types, (gpointer)"audio/*"); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->video_file_checkbutton))) mime_types = g_slist_prepend(mime_types, (gpointer)"video/*"); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->doc_file_checkbutton))) { mime_types = g_slist_prepend(mime_types, (gpointer) "application/pdf;" /* "text/html;" */ "application/vnd.oasis.opendocument.*;" "application/vnd.openxmlformats-officedocument.*;" "application/msword;application/vnd.ms-word;" "application/msexcel;application/vnd.ms-excel" ); } if (ui->dir_file_checkbutton && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->dir_file_checkbutton))) mime_types = g_slist_prepend(mime_types, (gpointer)"inode/directory"); if (ui->other_file_checkbutton && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->other_file_checkbutton)) && other_file_pattern && other_file_pattern[0] && strchr(other_file_pattern, '&') == NULL) /* & is invalid here */ { mime_types = g_slist_prepend(mime_types, (gpointer)other_file_pattern); } else other_file_pattern = NULL; if(mime_types) { GSList* l; g_string_append(search_uri, "&mime_types="); for(l = mime_types; l; l=l->next) { const char* mime_type = (const char*)l->data; g_string_append(search_uri, mime_type); if(l->next) g_string_append_c(search_uri, ';'); } g_slist_free(mime_types); } if(gtk_widget_get_sensitive(GTK_WIDGET(ui->bigger_spinbutton))) { gdouble min_size = gtk_spin_button_get_value(ui->bigger_spinbutton); gint unit_index = gtk_combo_box_get_active(ui->bigger_unit_combo); /* convert to bytes */ min_size *= unit_bytes[unit_index]; g_string_append_printf(search_uri, "&min_size=%llu", (long long unsigned int)min_size); } if(gtk_widget_get_sensitive(GTK_WIDGET(ui->smaller_spinbutton))) { gdouble max_size = gtk_spin_button_get_value(ui->smaller_spinbutton); gint unit_index = gtk_combo_box_get_active(ui->smaller_unit_combo); /* convert to bytes */ max_size *= unit_bytes[unit_index]; g_string_append_printf(search_uri, "&max_size=%llu", (long long unsigned int)max_size); } if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->min_mtime_checkbutton))) { const char* label = gtk_button_get_label(ui->min_mtime_button); if(g_strcmp0(label, _("(None)")) != 0) g_string_append_printf(search_uri, "&min_mtime=%s", label); } if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->max_mtime_checkbutton))) { const char* label = gtk_button_get_label(ui->max_mtime_button); if(g_strcmp0(label, _("(None)")) != 0) g_string_append_printf(search_uri, "&max_mtime=%s", label); } search_path = fm_path_new_for_uri(search_uri->str); if(ui->ctx == NULL) { _ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); gdk_app_launch_context_set_screen(_ctx, ui->parent ? gtk_widget_get_screen(GTK_WIDGET(ui->parent)) : gdk_screen_get_default()); gdk_app_launch_context_set_timestamp(_ctx, gtk_get_current_event_time()); /* FIXME: how to handle gdk_app_launch_context_set_icon? */ ui->ctx = G_APP_LAUNCH_CONTEXT(_ctx); } search_path_list = g_list_append(NULL, search_path); ret = fm_launch_paths(ui->ctx, search_path_list, &launcher, &data); g_list_free(search_path_list); fm_path_unref(search_path); /* save search */ if (name_ci) saved = FM_SAVED_SEARCH_NAME_CI; if (name_regex) saved |= FM_SAVED_SEARCH_NAME_REGEXP; if (recursive) saved |= FM_SAVED_SEARCH_RECURSION; if (show_hidden) saved |= FM_SAVED_SEARCH_HIDDEN; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->text_file_checkbutton))) saved |= FM_SAVED_SEARCH_TYPE_TEXT; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->image_file_checkbutton))) saved |= FM_SAVED_SEARCH_TYPE_IMAGE; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->audio_file_checkbutton))) saved |= FM_SAVED_SEARCH_TYPE_AUDIO; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->video_file_checkbutton))) saved |= FM_SAVED_SEARCH_TYPE_VIDEO; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->doc_file_checkbutton))) saved |= FM_SAVED_SEARCH_TYPE_DOCS; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->dir_file_checkbutton))) saved |= FM_SAVED_SEARCH_TYPE_DIRS; if (content_ci) saved |= FM_SAVED_SEARCH_CONTENT_CI; if (content_regex) saved |= FM_SAVED_SEARCH_CONTENT_REGEXP; g_string_printf(search_uri, "%lx", (long int)saved); if (other_file_pattern) g_string_append_printf(search_uri, "&%s&", other_file_pattern); g_string_append_printf(search_uri, "/%s/%s", name_patterns, content_pattern); g_free(fm_config->saved_search); fm_config->saved_search = g_string_free(search_uri, FALSE); fm_config_emit_changed(fm_config, "saved_search"); if(_ctx) g_object_unref(_ctx); } else { /* show error if no paths are added */ fm_show_error(GTK_WINDOW(ui->dlg), NULL, _("No folders are specified.")); ret = FALSE; } return ret; } static void on_dlg_response(GtkDialog* dlg, int response, gpointer user_data) { FileSearchUI * ui = (FileSearchUI *)user_data; if(response == GTK_RESPONSE_OK) { if(!launch_search(ui)) return; } gtk_widget_destroy(GTK_WIDGET(ui->date_dlg)); gtk_widget_destroy(GTK_WIDGET(dlg)); } static void add_path(GtkListStore * list_store, const char* uri) { char* filename; GtkTreeIter it; gtk_list_store_append(list_store, &it); filename = g_filename_from_uri(uri, NULL, NULL); if(filename) { gtk_list_store_set(list_store, &it, 0, filename, -1); g_free(filename); } else gtk_list_store_set(list_store, &it, 0, uri, -1); } static void on_add_path_button_clicked(GtkButton * btn, gpointer user_data) { FileSearchUI * ui = (FileSearchUI *)user_data; GtkWidget* dlg = gtk_file_chooser_dialog_new( _("Select Folder"), GTK_WINDOW(ui->dlg), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL ); gtk_dialog_set_alternative_button_order(GTK_DIALOG(dlg), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dlg), TRUE); if(gtk_dialog_run(GTK_DIALOG(dlg)) == GTK_RESPONSE_OK) { GSList* uris = gtk_file_chooser_get_uris(GTK_FILE_CHOOSER(dlg)); GSList* l; for(l = uris; l; l=l->next) { char* uri = (char*)l->data; add_path(ui->path_list_store, uri); g_free(uri); } g_slist_free(uris); } gtk_widget_destroy(dlg); } static void on_remove_path_button_clicked(GtkButton * btn, gpointer user_data) { FileSearchUI * ui = (FileSearchUI *)user_data; GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection( GTK_TREE_VIEW(ui->path_tree_view) ); if( gtk_tree_selection_get_selected(sel, NULL, &it) ) gtk_list_store_remove( ui->path_list_store, &it ); } static void on_other_file_checkbutton_toggled(GtkToggleButton *btn, FileSearchUI *ui) { gboolean enabled = gtk_toggle_button_get_active(btn); gtk_widget_set_sensitive(GTK_WIDGET(ui->other_file_entry), enabled); } static void on_name_entry_changed(GtkEditable *editable, FileSearchUI *ui) { char *text, *cpt; gint pos; text = gtk_editable_get_chars(editable, 0, -1); cpt = strchr(text, G_DIR_SEPARATOR); if (cpt) /* file basename can never contain separator */ { *cpt = '\0'; pos = gtk_editable_get_position(editable); gtk_entry_set_text(GTK_ENTRY(editable), text); gtk_editable_set_position(editable, pos - 1); } g_free(text); } static void file_search_ui_free(gpointer ui) { g_slice_free(FileSearchUI, ui); } /** * fm_launch_search_simple * @parent: (allow-none): window to determine launch screen * @ctx: (allow-none): launch context * @paths: (allow-none) (element-type FmPath): paths to set initial search paths list * @func: callback to launch folder * @user_data: data supplied for @func * * Launches filesystem search. Uses @func to open folder with search * results. If @ctx is %NULL then new context on the same screen as * @parent will be created for launching. * * Returns: %TRUE if launch was succesful. * * Since: 1.0.2 */ gboolean fm_launch_search_simple(GtkWindow* parent, GAppLaunchContext* ctx, const GList* paths, FmLaunchFolderFunc func, gpointer user_data) { FileSearchUI * ui; char *c, *expr, *mask; FmSavedSearch saved; g_return_val_if_fail(func != NULL, FALSE); ui = g_slice_new0(FileSearchUI); ui->parent = parent; ui->ctx = ctx; ui->func = func; ui->user_data = user_data; GtkBuilder* builder = gtk_builder_new(); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/filesearch.ui", NULL); ui->dlg = GTK_DIALOG(gtk_builder_get_object(builder, "dlg")); gtk_dialog_set_alternative_button_order(GTK_DIALOG(ui->dlg), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL); ui->path_tree_view = GTK_TREE_VIEW(gtk_builder_get_object(builder, "path_tree_view")); ui->name_entry = GTK_ENTRY(gtk_builder_get_object(builder, "name_entry")); ui->name_case_insensitive_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "name_case_insensitive_checkbutton")); ui->name_regex_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "name_regex_checkbutton")); ui->search_recursive_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "search_recursive_checkbutton")); ui->search_hidden_files_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "search_hidden_files_checkbutton")); ui->text_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "text_file_checkbutton")); ui->image_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "image_file_checkbutton")); ui->audio_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "audio_file_checkbutton")); ui->video_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "video_file_checkbutton")); ui->doc_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "doc_file_checkbutton")); ui->dir_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "dir_file_checkbutton")); ui->other_file_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "other_file_checkbutton")); ui->other_file_entry = GTK_ENTRY(gtk_builder_get_object(builder, "other_file_entry")); if (ui->other_file_checkbutton) { gtk_widget_show(GTK_WIDGET(ui->other_file_checkbutton)); gtk_widget_show(GTK_WIDGET(ui->dir_file_checkbutton)); gtk_widget_show(GTK_WIDGET(ui->other_file_entry)); gtk_widget_set_sensitive(GTK_WIDGET(ui->other_file_entry), FALSE); g_signal_connect(ui->other_file_checkbutton, "toggled", G_CALLBACK(on_other_file_checkbutton_toggled), ui); } ui->content_entry = GTK_ENTRY(gtk_builder_get_object(builder, "content_entry")); ui->content_case_insensitive_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "content_case_insensitive_checkbutton")); ui->content_regex_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "content_regex_checkbutton")); ui->bigger_spinbutton = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "bigger_spinbutton")); ui->bigger_unit_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder, "bigger_unit_combo")); ui->smaller_spinbutton = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "smaller_spinbutton")); ui->smaller_unit_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder, "smaller_unit_combo")); ui->min_mtime_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "min_mtime_checkbutton")); ui->min_mtime_button = GTK_BUTTON(gtk_builder_get_object(builder, "min_mtime_button")); ui->max_mtime_checkbutton = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "max_mtime_checkbutton")); ui->max_mtime_button = GTK_BUTTON(gtk_builder_get_object(builder, "max_mtime_button")); ui->path_list_store = GTK_LIST_STORE(gtk_builder_get_object(builder, "path_list_store")); ui->date_dlg = GTK_DIALOG(gtk_builder_get_object(builder, "date_dlg")); gtk_dialog_set_alternative_button_order(GTK_DIALOG(ui->date_dlg), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL); ui->calendar = GTK_CALENDAR(gtk_builder_get_object(builder, "calendar")); /* check for saved config */ if (fm_config->saved_search) { saved = strtoul(fm_config->saved_search, &c, 16); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->name_case_insensitive_checkbutton), (saved & FM_SAVED_SEARCH_NAME_CI) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->name_regex_checkbutton), (saved & FM_SAVED_SEARCH_NAME_REGEXP) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->search_recursive_checkbutton), (saved & FM_SAVED_SEARCH_RECURSION) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->search_hidden_files_checkbutton), (saved & FM_SAVED_SEARCH_HIDDEN) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->text_file_checkbutton), (saved & FM_SAVED_SEARCH_TYPE_TEXT) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->image_file_checkbutton), (saved & FM_SAVED_SEARCH_TYPE_IMAGE) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->audio_file_checkbutton), (saved & FM_SAVED_SEARCH_TYPE_AUDIO) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->video_file_checkbutton), (saved & FM_SAVED_SEARCH_TYPE_VIDEO) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->doc_file_checkbutton), (saved & FM_SAVED_SEARCH_TYPE_DOCS) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->dir_file_checkbutton), (saved & FM_SAVED_SEARCH_TYPE_DIRS) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->content_case_insensitive_checkbutton), (saved & FM_SAVED_SEARCH_CONTENT_CI) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->content_regex_checkbutton), (saved & FM_SAVED_SEARCH_CONTENT_REGEXP) != 0); if (*c == '&') { expr = g_strdup(&c[1]); mask = strchr(expr, '&'); if (mask) *mask++ = '\0'; if (ui->other_file_checkbutton) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ui->other_file_checkbutton), TRUE); gtk_entry_set_text(ui->other_file_entry, expr); } } else mask = expr = g_strdup(c); if (*mask == '/') /* else corrupted */ { mask++; c = strchr(mask, '/'); if (c) *c++ = '\0'; if (mask[0]) gtk_entry_set_text(ui->name_entry, mask); if (c && c[0]) gtk_entry_set_text(ui->content_entry, c); } g_free(expr); } filesearch_glade_connect_signals(builder, ui); g_signal_connect(ui->name_entry, "changed", G_CALLBACK(on_name_entry_changed), ui); g_object_unref(builder); /* associate the data with the dialog so it can be freed as needed. */ g_object_set_qdata_full(G_OBJECT(ui->dlg), fm_qdata_id, ui, file_search_ui_free); /* add folders to search */ if(paths) { const GList* l; for(l = paths; l; l = l->next) { FmPath* folder_path = FM_PATH(l->data); char* path_str = fm_path_to_str(folder_path); add_path(ui->path_list_store, path_str); g_free(path_str); } } if(parent) gtk_window_set_transient_for(GTK_WINDOW(ui->dlg), parent); gtk_widget_show(GTK_WIDGET(ui->dlg)); return TRUE; } static void on_bigger_than_checkbutton_toggled(GtkToggleButton* btn, gpointer user_data) { FileSearchUI* ui = (FileSearchUI*)user_data; gboolean enable = gtk_toggle_button_get_active(btn); gtk_widget_set_sensitive(GTK_WIDGET(ui->bigger_spinbutton), enable); gtk_widget_set_sensitive(GTK_WIDGET(ui->bigger_unit_combo), enable); } static void on_smaller_than_checkbutton_toggled(GtkToggleButton* btn, gpointer user_data) { FileSearchUI* ui = (FileSearchUI*)user_data; gboolean enable = gtk_toggle_button_get_active(btn); gtk_widget_set_sensitive(GTK_WIDGET(ui->smaller_spinbutton), enable); gtk_widget_set_sensitive(GTK_WIDGET(ui->smaller_unit_combo), enable); } static gboolean choose_date(GtkButton* btn, FileSearchUI* ui) { const char* label = gtk_button_get_label(btn); int res; guint month, year, day; /* FIXME: we definitely need a better UI design for this part. */ if(sscanf(label, "%04d-%02d-%02d", &year, &month, &day) == 3) { gtk_calendar_select_month(ui->calendar, month, year); gtk_calendar_select_day(ui->calendar, day); } res = gtk_dialog_run(ui->date_dlg); gtk_widget_hide(GTK_WIDGET(ui->date_dlg)); if(res == GTK_RESPONSE_OK) { char str[12]; gtk_calendar_get_date(ui->calendar, &year, &month, &day); ++month; /* month returned from GtkCalendar is 0 based. */ g_snprintf(str, sizeof(str), "%04d-%02d-%02d", year, month, day); gtk_button_set_label(btn, str); return TRUE; } return FALSE; } static void on_min_mtime_button_clicked(GtkButton* btn, gpointer user_data) { FileSearchUI* ui = (FileSearchUI*)user_data; choose_date(btn, ui); } static void on_max_mtime_button_clicked(GtkButton* btn, gpointer user_data) { FileSearchUI* ui = (FileSearchUI*)user_data; choose_date(btn, ui); } static void on_min_mtime_checkbutton_toggled(GtkToggleButton* btn, gpointer user_data) { FileSearchUI* ui = (FileSearchUI*)user_data; gboolean enable = gtk_toggle_button_get_active(btn); gtk_widget_set_sensitive(GTK_WIDGET(ui->min_mtime_button), enable); } static void on_max_mtime_checkbutton_toggled(GtkToggleButton* btn, gpointer user_data) { FileSearchUI* ui = (FileSearchUI*)user_data; gboolean enable = gtk_toggle_button_get_active(btn); gtk_widget_set_sensitive(GTK_WIDGET(ui->max_mtime_button), enable); } #include "fm-file-search-ui.c" /* file generated with glade-connect-gen */ libfm-1.4.0/src/gtk/fm-gtk-file-launcher.h000066400000000000000000000042011475513661000202400ustar00rootroot00000000000000/* * fm-gtk-file-launcher.h * * Copyright 2010 Hong Jen Yee (PCMan) * Copyright 2012 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_GTK_FILE_LAUNCHER_H__ #define __FM_GTK_FILE_LAUNCHER_H__ #include #include #include #include "fm-file-info.h" #include "fm-file-launcher.h" G_BEGIN_DECLS gboolean fm_launch_files_simple(GtkWindow* parent, GAppLaunchContext* ctx, GList* file_infos, FmLaunchFolderFunc func, gpointer user_data); gboolean fm_launch_file_simple(GtkWindow* parent, GAppLaunchContext* ctx, FmFileInfo* file_info, FmLaunchFolderFunc func, gpointer user_data); gboolean fm_launch_paths_simple(GtkWindow* parent, GAppLaunchContext* ctx, GList* paths, FmLaunchFolderFunc func, gpointer user_data); gboolean fm_launch_path_simple(GtkWindow* parent, GAppLaunchContext* ctx, FmPath* path, FmLaunchFolderFunc func, gpointer user_data); gboolean fm_launch_desktop_entry_simple(GtkWindow* parent, GAppLaunchContext* ctx, FmFileInfo* entry, FmPathList* files); gboolean fm_launch_command_simple(GtkWindow *parent, GAppLaunchContext *ctx, GAppInfoCreateFlags flags, const char *cmd, FmPathList *files); gboolean fm_launch_search_simple(GtkWindow* parent, GAppLaunchContext* ctx, const GList* paths, FmLaunchFolderFunc func, gpointer user_data); G_END_DECLS #endif /* __FM_GTK_UTILS_H__ */ libfm-1.4.0/src/gtk/fm-gtk-marshal.list000066400000000000000000000001231475513661000176740ustar00rootroot00000000000000BOOL:INT,INT,UINT,UINT,POINTER VOID:BOXED,BOXED,POINTER VOID:OBJECT,OBJECT,POINTER libfm-1.4.0/src/gtk/fm-gtk-utils.c000066400000000000000000001151401475513661000166620ustar00rootroot00000000000000/* * fm-gtk-utils.c * * Copyright 2009 PCMan * Copyright 2012-2016 Andriy Grytsenko (LStranger) * Copyright 2012 Vadim Ushakov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-gtk-utils * @short_description: Different widgets and utilities that use GTK+ * @title: Libfm-gtk utils * * @include: libfm/fm-gtk.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "gtk-compat.h" #include #include #include "fm-gtk-utils.h" #include "fm-file-ops-job.h" #include "fm-progress-dlg.h" #include "fm-path-entry.h" #include "fm-app-chooser-dlg.h" #include "fm-monitor.h" #include "fm-config.h" static GtkDialog* _fm_get_user_input_dialog (GtkWindow* parent, const char* title, const char* msg); static gchar* _fm_user_input_dialog_run (GtkDialog* dlg, GtkEntry *entry, GtkWidget *extra); /** * fm_show_error * @parent: a window to place dialog over it * @title: title for dialog window * @msg: message to present * * Presents error message to user and gives user no choices but close. * * Before 0.1.16 this call had different arguments. * * Since: 0.1.0 */ void fm_show_error(GtkWindow* parent, const char* title, const char* msg) { GtkWidget* dlg = gtk_message_dialog_new(parent, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", msg); /* g_message("(!) %s", msg); */ gtk_window_set_title(GTK_WINDOW(dlg), title ? title : _("Error")); /* #3606577: error window if parent is desktop is below other windows */ gtk_window_set_keep_above(GTK_WINDOW(dlg), TRUE); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } /** * fm_yes_no * @parent: a window to place dialog over it * @title: title for dialog window * @question: the question to present to the user * @default_yes: the default answer * * Presents the question to user and gives user choices 'Yes' and 'No'. * * Before 0.1.16 this call had different arguments. * * Returns: %TRUE if user chose 'Yes'. * * Since: 0.1.0 */ gboolean fm_yes_no(GtkWindow* parent, const char* title, const char* question, gboolean default_yes) { int ret; GtkDialog* dlg = GTK_DIALOG(gtk_message_dialog_new_with_markup(parent, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", question)); gtk_window_set_title(GTK_WINDOW(dlg), title ? title : _("Confirm")); gtk_dialog_set_default_response(dlg, default_yes ? GTK_RESPONSE_YES : GTK_RESPONSE_NO); /* #3300797: Delete prompt isn't on the first layer */ gtk_window_set_keep_above(GTK_WINDOW(dlg), TRUE); ret = gtk_dialog_run(dlg); gtk_widget_destroy((GtkWidget*)dlg); return ret == GTK_RESPONSE_YES; } /** * fm_ok_cancel * @parent: a window to place dialog over it * @title: title for dialog window * @question: the question to show to the user * @default_ok: the default answer * * Presents the question to user and gives user choices 'OK' and 'Cancel'. * * Before 0.1.16 this call had different arguments. * * Returns: %TRUE if user chose 'OK'. * * Since: 0.1.0 */ gboolean fm_ok_cancel(GtkWindow* parent, const char* title, const char* question, gboolean default_ok) { int ret; GtkDialog* dlg = GTK_DIALOG(gtk_message_dialog_new_with_markup(parent, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, "%s", question)); gtk_window_set_title(GTK_WINDOW(dlg), title ? title : _("Confirm")); gtk_dialog_set_default_response(dlg, default_ok ? GTK_RESPONSE_OK : GTK_RESPONSE_CANCEL); ret = gtk_dialog_run(dlg); gtk_widget_destroy((GtkWidget*)dlg); return ret == GTK_RESPONSE_OK; } /** * fm_ask * @parent: toplevel parent widget * @title: title for the window with question * @question: the question to show to the user * @...: a NULL terminated list of button labels * * Ask the user a question with several options provided. * * Before 0.1.16 this call had different arguments. * * Return value: the index of selected button, or -1 if the dialog is closed. * * Since: 0.1.0 */ int fm_ask(GtkWindow* parent, const char* title, const char* question, ...) { int ret; va_list args; va_start (args, question); ret = fm_ask_valist(parent, title, question, args); va_end (args); return ret; } /** * fm_askv * @parent: toplevel parent widget * @title: title for the window with question * @question: the question to show to the user * @options: a NULL terminated list of button labels * * Ask the user a question with several options provided. * * Before 0.1.16 this call had different arguments. * * Return value: the index of selected button, or -1 if the dialog is closed. * * Since: 0.1.0 */ int fm_askv(GtkWindow* parent, const char* title, const char* question, char* const* options) { int ret; guint id = 1; GtkDialog* dlg = GTK_DIALOG(gtk_message_dialog_new_with_markup(parent, 0, GTK_MESSAGE_QUESTION, 0, "%s", question)); gtk_window_set_title(GTK_WINDOW(dlg), title ? title : _("Question")); /* FIXME: need to handle defualt button and alternative button * order problems. */ while(*options) { /* FIXME: handle button image and stock buttons */ /*GtkWidget* btn =*/ gtk_dialog_add_button(dlg, *options, id); ++options; ++id; } ret = gtk_dialog_run(dlg); if(ret >= 1) ret -= 1; else ret = -1; gtk_widget_destroy((GtkWidget*)dlg); return ret; } /** * fm_ask_valist * @parent: toplevel parent widget * @title: title for the window with question * @question: the question to show to the user * @options: va_arg list of button labels * * Ask the user a question with several options provided. * * Before 0.1.16 this call had different arguments. * * Return value: the index of selected button, or -1 if the dialog is closed. * * Since: 0.1.0 */ int fm_ask_valist(GtkWindow* parent, const char* title, const char* question, va_list options) { GArray* opts = g_array_sized_new(TRUE, TRUE, sizeof(char*), 6); gint ret; const char* opt = va_arg(options, const char*); while(opt) { g_array_append_val(opts, opt); opt = va_arg (options, const char *); } ret = fm_askv(parent, title, question, &opts->data); g_array_free(opts, TRUE); return ret; } /** * fm_get_user_input * @parent: a window to place dialog over it * @title: title for dialog window * @msg: the message to present to the user * @default_text: the default answer * * Presents the message to user and retrieves entered text. * Returned data should be freed with g_free() after usage. * * Returns: (transfer full): entered text. * * Since: 0.1.0 */ gchar* fm_get_user_input(GtkWindow* parent, const char* title, const char* msg, const char* default_text) { GtkDialog* dlg = _fm_get_user_input_dialog( parent, title, msg); GtkEntry* entry = GTK_ENTRY(gtk_entry_new()); gtk_entry_set_activates_default(entry, TRUE); if(default_text && default_text[0]) gtk_entry_set_text(entry, default_text); return _fm_user_input_dialog_run(dlg, entry, NULL); } /** * fm_get_user_input_n * @parent: a window to place dialog over it * @title: title for dialog window * @msg: the message to present to the user * @default_text: the default answer * @n: which part of default answer should be selected * @extra: additional widgets to display (can be focusable) * * Presents the message to user and retrieves entered text. * In presented dialog the part of @default_text with length @n will be * preselected for edition (n < 0 means select all). * Returned data should be freed with g_free() after usage. * * Returns: (transfer full): entered text. * * Since: 1.2.0 */ gchar* fm_get_user_input_n(GtkWindow* parent, const char* title, const char* msg, const char* default_text, gint n, GtkWidget* extra) { GtkDialog* dlg = _fm_get_user_input_dialog( parent, title, msg); GtkEntry* entry = GTK_ENTRY(gtk_entry_new()); gtk_entry_set_activates_default(entry, TRUE); if(default_text && default_text[0]) { gtk_entry_set_text(entry, default_text); gtk_editable_select_region(GTK_EDITABLE(entry), 0, n); } return _fm_user_input_dialog_run(dlg, entry, extra); } /** * fm_get_user_input_path * @parent: a window to place dialog over it * @title: title for dialog window * @msg: the message to present to the user * @default_path: the default path * * Presents the message to user and retrieves entered path string. * Returned data should be freed with fm_path_unref() after usage. * * Returns: (transfer full): entered text. * * Since: 0.1.0 * * Deprecated: 1.2.0: */ FmPath* fm_get_user_input_path(GtkWindow* parent, const char* title, const char* msg, FmPath* default_path) { GtkDialog* dlg = _fm_get_user_input_dialog( parent, title, msg); GtkEntry* entry = GTK_ENTRY(gtk_entry_new()); char *str, *path_str = NULL; FmPath* path; gtk_entry_set_activates_default(entry, TRUE); if(default_path) { path_str = fm_path_display_name(default_path, FALSE); gtk_entry_set_text(entry, path_str); } str = _fm_user_input_dialog_run(dlg, entry, NULL); path = fm_path_new_for_str(str); g_free(path_str); g_free(str); return path; } static gchar* fm_get_user_input_rename(GtkWindow* parent, const char* title, const char* msg, const char* default_text) { GtkDialog* dlg = _fm_get_user_input_dialog( parent, title, msg); GtkEntry* entry = GTK_ENTRY(gtk_entry_new()); gtk_entry_set_activates_default(entry, TRUE); if(default_text && default_text[0]) { gtk_entry_set_text(entry, default_text); /* only select filename part without extension name. */ if(default_text[1]) { /* FIXME: handle the special case for *.tar.gz or *.tar.bz2 * We should exam the file extension with g_content_type_guess, and * find out a longest valid extension name. * For example, the extension name of foo.tar.gz is .tar.gz, not .gz. */ const char* dot = g_utf8_strrchr(default_text, -1, '.'); if(dot) gtk_editable_select_region(GTK_EDITABLE(entry), 0, g_utf8_pointer_to_offset(default_text, dot)); else gtk_editable_select_region(GTK_EDITABLE(entry), 0, -1); /* const char* dot = default_text; while( dot = g_utf8_strchr(dot + 1, -1, '.') ) { gboolean uncertain; char* type = g_content_type_guess(dot-1, NULL, 0, &uncertain); if(!g_content_type_is_unknown(type)) { g_free(type); gtk_editable_select_region(entry, 0, g_utf8_pointer_to_offset(default_text, dot)); break; } g_free(type); } */ } } return _fm_user_input_dialog_run(dlg, entry, NULL); } static GtkDialog* _fm_get_user_input_dialog(GtkWindow* parent, const char* title, const char* msg) { GtkDialog* dlg = GTK_DIALOG(gtk_dialog_new_with_buttons(title, parent, #if GTK_CHECK_VERSION(3, 0, 0) 0, #else GTK_DIALOG_NO_SEPARATOR, #endif GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL)); GtkWidget* label = gtk_label_new(msg); GtkBox* box = (GtkBox*)gtk_dialog_get_content_area(dlg); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_dialog_set_alternative_button_order(dlg, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); gtk_box_set_spacing(box, 6); gtk_box_pack_start(box, label, FALSE, TRUE, 6); gtk_container_set_border_width(GTK_CONTAINER(box), 12); gtk_container_set_border_width(GTK_CONTAINER(dlg), 5); gtk_dialog_set_default_response(dlg, GTK_RESPONSE_OK); gtk_window_set_default_size(GTK_WINDOW(dlg), 480, -1); return dlg; } static gchar* _fm_user_input_dialog_run(GtkDialog* dlg, GtkEntry *entry, GtkWidget *extra) { char* str = NULL; GtkBox *box = GTK_BOX(gtk_dialog_get_content_area(dlg)); int sel_start, sel_end; gboolean has_sel; /* FIXME: this workaround is used to overcome bug of gtk+. * gtk+ seems to ignore select region and select all text for entry in dialog. */ has_sel = gtk_editable_get_selection_bounds(GTK_EDITABLE(entry), &sel_start, &sel_end); gtk_box_pack_start(box, GTK_WIDGET(entry), FALSE, TRUE, extra ? 0 : 6); if(extra) gtk_box_pack_start(box, extra, FALSE, TRUE, 0); gtk_widget_show_all(GTK_WIDGET(dlg)); if(has_sel) gtk_editable_select_region(GTK_EDITABLE(entry), sel_start, sel_end); while(gtk_dialog_run(dlg) == GTK_RESPONSE_OK) { const char* pstr = gtk_entry_get_text(entry); if( pstr && *pstr ) { str = g_strdup(pstr); break; } } gtk_widget_destroy(GTK_WIDGET(dlg)); return str; } static void on_update_img_preview( GtkFileChooser *chooser, GtkImage* img ) { char* file = gtk_file_chooser_get_preview_filename(chooser); GdkPixbuf* pix = NULL; if(file) { pix = gdk_pixbuf_new_from_file_at_scale( file, 128, 128, TRUE, NULL ); g_free( file ); } if(pix) { gtk_file_chooser_set_preview_widget_active(chooser, TRUE); gtk_image_set_from_pixbuf(img, pix); g_object_unref(pix); } else { gtk_image_clear(img); gtk_file_chooser_set_preview_widget_active(chooser, FALSE); } } static gulong fm_add_image_preview_to_file_chooser(GtkFileChooser* chooser) { GtkWidget* img_preview = gtk_image_new(); gtk_misc_set_alignment(GTK_MISC(img_preview), 0.5, 0.0); gtk_widget_set_size_request(img_preview, 128, 128); gtk_file_chooser_set_preview_widget(chooser, img_preview); return g_signal_connect(chooser, "update-preview", G_CALLBACK(on_update_img_preview), img_preview); } /** * fm_select_file * @parent: a window to place dialog over it * @title: title for dialog window * @default_folder: the starting folder path * @local_only: %TRUE if select only local paths * @show_preview: %TRUE to show file preview * @...: (element-type GtkFileFilter): optional filters * * Presents the message to user and lets him/her to select a file. * Returned data should be freed with fm_path_unref() after usage. * * Returns: (transfer full): selected file path or %NULL if dialog was closed. * * Since: 1.0.0 */ /* TODO: support selecting multiple files */ FmPath* fm_select_file(GtkWindow* parent, const char* title, const char* default_folder, gboolean local_only, gboolean show_preview, /* filter1, filter2, ..., NULL */ ...) { FmPath* path; GtkFileChooser* chooser; GtkFileFilter* filter; gulong handler_id = 0; va_list args; chooser = (GtkFileChooser*)gtk_file_chooser_dialog_new( title, parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_alternative_button_order(GTK_DIALOG(chooser), GTK_RESPONSE_CANCEL, GTK_RESPONSE_OK, NULL); if(local_only) gtk_file_chooser_set_local_only(chooser, TRUE); if(default_folder) gtk_file_chooser_set_current_folder(chooser, default_folder); va_start(args, show_preview); while((filter = va_arg(args, GtkFileFilter*))) { gtk_file_chooser_add_filter(chooser, filter); } va_end (args); if(show_preview) handler_id = fm_add_image_preview_to_file_chooser(chooser); if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_OK) { GFile* file = gtk_file_chooser_get_file(chooser); path = fm_path_new_for_gfile(file); g_object_unref(file); } else path = NULL; if(handler_id > 0) g_signal_handler_disconnect(chooser, handler_id); gtk_widget_destroy(GTK_WIDGET(chooser)); return path; } /** * fm_select_folder * @parent: a window to place dialog over it * @title: title for dialog window * * Presents the message to user and lets him/her to select a folder. * Returned data should be freed with fm_path_unref() after usage. * * Before 0.1.16 this call had different arguments. * * Returns: (transfer full): selected folder path or %NULL if dialog was closed. * * Since: 0.1.0 */ FmPath* fm_select_folder(GtkWindow* parent, const char* title) { FmPath* path; GtkFileChooser* chooser; chooser = (GtkFileChooser*)gtk_file_chooser_dialog_new( title ? title : _("Select Folder"), parent, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_alternative_button_order(GTK_DIALOG(chooser), GTK_RESPONSE_CANCEL, GTK_RESPONSE_OK, NULL); if( gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_OK ) { GFile* file = gtk_file_chooser_get_file(chooser); path = fm_path_new_for_gfile(file); g_object_unref(file); } else path = NULL; gtk_widget_destroy(GTK_WIDGET(chooser)); return path; } typedef enum { MOUNT_VOLUME, MOUNT_GFILE, UMOUNT_MOUNT, EJECT_MOUNT, EJECT_VOLUME }MountAction; struct MountData { GMainLoop *loop; MountAction action; GError* err; gboolean ret; }; static void on_mount_action_finished(GObject* src, GAsyncResult *res, gpointer user_data) { struct MountData* data = user_data; switch(data->action) { case MOUNT_VOLUME: data->ret = g_volume_mount_finish(G_VOLUME(src), res, &data->err); break; case MOUNT_GFILE: data->ret = g_file_mount_enclosing_volume_finish(G_FILE(src), res, &data->err); break; case UMOUNT_MOUNT: data->ret = g_mount_unmount_with_operation_finish(G_MOUNT(src), res, &data->err); break; case EJECT_MOUNT: data->ret = g_mount_eject_with_operation_finish(G_MOUNT(src), res, &data->err); break; case EJECT_VOLUME: data->ret = g_volume_eject_with_operation_finish(G_VOLUME(src), res, &data->err); break; } g_main_loop_quit(data->loop); } static void prepare_unmount(GMount* mount) { /* ensure that CWD is not on the mounted filesystem. */ char* cwd_str = g_get_current_dir(); GFile* cwd = g_file_new_for_path(cwd_str); GFile* root = g_mount_get_root(mount); g_free(cwd_str); /* FIXME: This cannot cover 100% cases since symlinks are not checked. * There may be other cases that cwd is actually under mount root * but checking prefix is not enough. We already did our best, though. */ if(g_file_has_prefix(cwd, root)) g_chdir("/"); g_object_unref(cwd); g_object_unref(root); } static gboolean fm_do_mount(GtkWindow* parent, GObject* obj, MountAction action, gboolean interactive) { gboolean ret; struct MountData* data = g_new0(struct MountData, 1); /* bug #3615234: it seems GtkMountOperations is buggy and sometimes leaves parent window reference intact while destroys itself so it leads to severe memory corruption, therefore we pass here NULL as parent window to gtk_mount_operation_new() to not bind it to anything as a workaround */ GMountOperation* op = interactive ? gtk_mount_operation_new(NULL) : NULL; GCancellable* cancellable = g_cancellable_new(); data->loop = g_main_loop_new (NULL, TRUE); data->action = action; switch(data->action) { case MOUNT_VOLUME: g_volume_mount(G_VOLUME(obj), 0, op, cancellable, on_mount_action_finished, data); break; case MOUNT_GFILE: g_file_mount_enclosing_volume(G_FILE(obj), 0, op, cancellable, on_mount_action_finished, data); break; case UMOUNT_MOUNT: prepare_unmount(G_MOUNT(obj)); g_mount_unmount_with_operation(G_MOUNT(obj), G_MOUNT_UNMOUNT_NONE, op, cancellable, on_mount_action_finished, data); break; case EJECT_MOUNT: prepare_unmount(G_MOUNT(obj)); g_mount_eject_with_operation(G_MOUNT(obj), G_MOUNT_UNMOUNT_NONE, op, cancellable, on_mount_action_finished, data); break; case EJECT_VOLUME: { GMount* mnt = g_volume_get_mount(G_VOLUME(obj)); if (mnt) /* it might be unmounted already */ { prepare_unmount(mnt); g_object_unref(mnt); } g_volume_eject_with_operation(G_VOLUME(obj), G_MOUNT_UNMOUNT_NONE, op, cancellable, on_mount_action_finished, data); } break; } /* FIXME: create progress window with busy cursor */ if (g_main_loop_is_running(data->loop)) { GDK_THREADS_LEAVE(); g_main_loop_run(data->loop); GDK_THREADS_ENTER(); } g_main_loop_unref(data->loop); ret = data->ret; if(data->err) { if(interactive) { if(data->err->domain == G_IO_ERROR) { if(data->err->code == G_IO_ERROR_FAILED) { /* Generate a more human-readable error message instead of using a gvfs one. */ /* The original error message is something like: * Error unmounting: umount exited with exit code 1: * helper failed with: umount: only root can unmount * UUID=18cbf00c-e65f-445a-bccc-11964bdea05d from /media/sda4 */ /* Why they pass this back to us? * This is not human-readable for the users at all. */ if(strstr(data->err->message, "only root can ")) { g_debug("%s", data->err->message); g_free(data->err->message); data->err->message = g_strdup(_("Only system administrators have the permission to do this.")); } } else if(data->err->code == G_IO_ERROR_FAILED_HANDLED) interactive = FALSE; } if(interactive) fm_show_error(parent, NULL, data->err->message); } g_error_free(data->err); } g_free(data); g_object_unref(cancellable); if(op) g_object_unref(op); return ret; } /** * fm_mount_path * @parent: a window to place dialog over it * @path: a path to the volume * @interactive: %TRUE to open dialog window * * Mounts a volume. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_mount_path(GtkWindow* parent, FmPath* path, gboolean interactive) { GFile* gf = fm_path_to_gfile(path); gboolean ret = fm_do_mount(parent, G_OBJECT(gf), MOUNT_GFILE, interactive); g_object_unref(gf); return ret; } /** * fm_mount_volume * @parent: a window to place dialog over it * @vol: a volume to mount * @interactive: %TRUE to open dialog window * * Mounts a volume. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_mount_volume(GtkWindow* parent, GVolume* vol, gboolean interactive) { return fm_do_mount(parent, G_OBJECT(vol), MOUNT_VOLUME, interactive); } /** * fm_unmount_mount * @parent: a window to place dialog over it * @mount: the mounted volume * @interactive: %TRUE to open dialog window * * Unmounts a volume. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_unmount_mount(GtkWindow* parent, GMount* mount, gboolean interactive) { return fm_do_mount(parent, G_OBJECT(mount), UMOUNT_MOUNT, interactive); } /** * fm_unmount_volume * @parent: a window to place dialog over it * @vol: the mounted volume * @interactive: %TRUE to open dialog window * * Unmounts a volume. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_unmount_volume(GtkWindow* parent, GVolume* vol, gboolean interactive) { GMount* mount = g_volume_get_mount(vol); gboolean ret; if(!mount) return FALSE; ret = fm_do_mount(parent, G_OBJECT(vol), UMOUNT_MOUNT, interactive); g_object_unref(mount); return ret; } /** * fm_eject_mount * @parent: a window to place dialog over it * @mount: the mounted media * @interactive: %TRUE to open dialog window * * Ejects the media in @mount. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_eject_mount(GtkWindow* parent, GMount* mount, gboolean interactive) { return fm_do_mount(parent, G_OBJECT(mount), EJECT_MOUNT, interactive); } /** * fm_eject_volume * @parent: a window to place dialog over it * @vol: the mounted media * @interactive: %TRUE to open dialog window * * Ejects the media in @vol. * * Returns: %TRUE in case of success. * * Since: 0.1.0 */ gboolean fm_eject_volume(GtkWindow* parent, GVolume* vol, gboolean interactive) { return fm_do_mount(parent, G_OBJECT(vol), EJECT_VOLUME, interactive); } /* File operations */ /* FIXME: only show the progress dialog if the job isn't finished * in 1 sec. */ /** * fm_copy_files * @parent: a window to place progress dialog over it * @files: list of files to copy * @dest_dir: target directory * * Copies files opening progress dialog if that operation takes some time. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_copy_files(GtkWindow* parent, FmPathList* files, FmPath* dest_dir) { FmFileOpsJob* job = fm_file_ops_job_new(FM_FILE_OP_COPY, files); fm_file_ops_job_set_dest(job, dest_dir); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } /** * fm_move_files * @parent: a window to place progress dialog over it * @files: list of files to move * @dest_dir: directory where to move files to * * Moves files opening progress dialog if that operation takes some time. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_move_files(GtkWindow* parent, FmPathList* files, FmPath* dest_dir) { FmFileOpsJob* job = fm_file_ops_job_new(FM_FILE_OP_MOVE, files); fm_file_ops_job_set_dest(job, dest_dir); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } /** * fm_link_files * @parent: window to base progress dialog over it * @files: list of files to make symbolic links to * @dest_dir: directory where symbolic links should be created * * Create symbolic links for some files in the target directory with * progress dialog. * * Since: 1.0.0 */ void fm_link_files(GtkWindow* parent, FmPathList* files, FmPath* dest_dir) { FmFileOpsJob* job = fm_file_ops_job_new(FM_FILE_OP_LINK, files); fm_file_ops_job_set_dest(job, dest_dir); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } /** * fm_trash_files * @parent: a window to place progress dialog over it * @files: list of files to move to trash * * Removes files into trash can opening progress dialog if that operation * takes some time. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_trash_files(GtkWindow* parent, FmPathList* files) { FmFileOpsJob *job; char *msg, *name; int len; if (fm_config->confirm_trash) { len = fm_path_list_get_length(files); if (len == 1) { name = fm_path_display_basename(fm_path_list_peek_head(files)); msg = g_strdup_printf(_("Do you want to move the file '%s' to trash can?"), name); g_free(name); } else msg = g_strdup_printf(dngettext(GETTEXT_PACKAGE, "Do you want to move the %d selected file to trash can?", "Do you want to move the %d selected files to trash can?", (gulong)len), len); if (!fm_yes_no(parent, NULL, msg, TRUE)) { g_free(msg); return; } g_free(msg); } job = fm_file_ops_job_new(FM_FILE_OP_TRASH, files); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } /** * fm_untrash_files * @parent: a window to place progress dialog over it * @files: list of files to restore * * Restores files from trash can into original place opening progress * dialog if that operation takes some time. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.11 */ void fm_untrash_files(GtkWindow* parent, FmPathList* files) { FmFileOpsJob* job = fm_file_ops_job_new(FM_FILE_OP_UNTRASH, files); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } static void fm_delete_files_internal(GtkWindow* parent, FmPathList* files) { FmFileOpsJob* job = fm_file_ops_job_new(FM_FILE_OP_DELETE, files); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } /** * fm_delete_files * @parent: a window to place progress dialog over it * @files: list of files to delete * * Wipes out files opening progress dialog if that operation takes some time. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_delete_files(GtkWindow* parent, FmPathList* files) { char *msg, *name; int len; if (fm_config->confirm_del) { len = fm_path_list_get_length(files); if (len == 1) { name = fm_path_display_basename(fm_path_list_peek_head(files)); msg = g_strdup_printf(_("Do you want to delete the file '%s'?"), name); g_free(name); } else msg = g_strdup_printf(dngettext(GETTEXT_PACKAGE, "Do you want to delete the %d selected file?", "Do you want to delete the %d selected files?", (gulong)len), len); if (!fm_yes_no(parent, NULL, msg, TRUE)) { g_free(msg); return; } g_free(msg); } fm_delete_files_internal(parent, files); } /** * fm_trash_or_delete_files * @parent: a window to place progress dialog over it * @files: list of files to delete * * Removes files into trash can if that operation is supported. * Otherwise erases them. If that operation takes some time then progress * dialog will be opened. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_trash_or_delete_files(GtkWindow* parent, FmPathList* files) { if( !fm_path_list_is_empty(files) ) { gboolean all_in_trash = TRUE; if(fm_config->use_trash) { GList* l = fm_path_list_peek_head_link(files); for(;l;l=l->next) { FmPath* path = FM_PATH(l->data); if(!fm_path_is_trash(path)) all_in_trash = FALSE; } } /* files already in trash:/// should only be deleted and cannot be trashed again. */ if(fm_config->use_trash && !all_in_trash) fm_trash_files(parent, files); else fm_delete_files(parent, files); } } /** * fm_move_or_copy_files_to * @parent: a window to place progress dialog over it * @files: list of files * @is_move: %TRUE to move, %FALSE to copy * * Opens a dialog to choose destination directory. If it was not cancelled * by user then moves or copies @files into chosen directory with progress * dialog. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_move_or_copy_files_to(GtkWindow* parent, FmPathList* files, gboolean is_move) { FmPath* dest = fm_select_folder(parent, NULL); if(dest) { if(is_move) fm_move_files(parent, files, dest); else fm_copy_files(parent, files, dest); fm_path_unref(dest); } } /** * fm_rename_file * @parent: a window to place dialog over it * @file: the file * * Opens a dialog to choose new name for @file. If it was not cancelled * by user then renames @file. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_rename_file(GtkWindow* parent, FmPath* file) { gchar *old_name, *new_name; FmPathList *files; FmFileOpsJob *job; /* NOTE: it's better to use fm_file_info_get_edit_name() to get a name but we cannot get it from FmPath */ old_name = fm_path_display_basename(file); new_name = fm_get_user_input_rename(parent, _("Rename File"), _("Please enter a new name:"), old_name); /* if file name wasn't changed then do nothing */ if (new_name == NULL || strcmp(old_name, new_name) == 0) { g_free(old_name); g_free(new_name); return; } g_free(old_name); files = fm_path_list_new(); fm_path_list_push_tail(files, file); job = fm_file_ops_job_new(FM_FILE_OP_CHANGE_ATTR, files); fm_file_ops_job_set_display_name(job, new_name); g_free(new_name); fm_path_list_unref(files); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } static void _fm_set_file_hidden(GtkWindow *parent, FmPath *file, gboolean hidden) { FmPathList *files; FmFileOpsJob *job; files = fm_path_list_new(); fm_path_list_push_tail(files, file); job = fm_file_ops_job_new(FM_FILE_OP_CHANGE_ATTR, files); fm_file_ops_job_set_hidden(job, hidden); fm_path_list_unref(files); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } /** * fm_hide_file * @parent: a window to place progress dialog over it * @file: the file * * Sets file attribute "hidden" for @file. * * Since: 1.2.0 */ void fm_hide_file(GtkWindow* parent, FmPath* file) { _fm_set_file_hidden(parent, file, TRUE); } /** * fm_unhide_file * @parent: a window to place progress dialog over it * @file: the file * * Unsets file attribute "hidden" for @file. * * Since: 1.2.0 */ void fm_unhide_file(GtkWindow* parent, FmPath* file) { _fm_set_file_hidden(parent, file, FALSE); } /** * fm_empty_trash * @parent: a window to place dialog over it * * Asks user to confirm the emptying trash can and empties it if confirmed. * * Before 0.1.15 this call had different arguments. * * Since: 0.1.0 */ void fm_empty_trash(GtkWindow* parent) { if(fm_yes_no(parent, NULL, _("Are you sure you want to empty the trash can?"), TRUE)) { FmPathList* paths = fm_path_list_new(); fm_path_list_push_tail(paths, fm_path_get_trash()); fm_delete_files_internal(parent, paths); fm_path_list_unref(paths); } } /** * fm_set_busy_cursor * @widget: a widget * * Sets cursor for @widget to "busy". * * See also: fm_unset_busy_cursor(). * * Since: 1.0.0 */ void fm_set_busy_cursor(GtkWidget* widget) { if(gtk_widget_get_realized(widget)) { GdkWindow* window = gtk_widget_get_window(widget); GdkCursor* cursor = gdk_cursor_new(GDK_WATCH); gdk_window_set_cursor(window, cursor); } else { /* FIXME: how to handle this case? */ g_warning("fm_set_busy_cursor: widget is not realized"); } } /** * fm_unset_busy_cursor * @widget: a widget * * Restores cursor for @widget to default. * * See also: fm_set_busy_cursor(). * * Since: 1.0.0 */ void fm_unset_busy_cursor(GtkWidget* widget) { if(gtk_widget_get_realized(widget)) { GdkWindow* window = gtk_widget_get_window(widget); gdk_window_set_cursor(window, NULL); } } static void assign_tooltip_from_action(GtkWidget* widget) { GtkAction* action; const gchar * tooltip; action = gtk_activatable_get_related_action(GTK_ACTIVATABLE(widget)); if (!action) return; if (!gtk_activatable_get_use_action_appearance(GTK_ACTIVATABLE(widget))) return; tooltip = gtk_action_get_tooltip(action); if (tooltip) { gtk_widget_set_tooltip_text(widget, tooltip); gtk_widget_set_has_tooltip(widget, TRUE); } else { gtk_widget_set_has_tooltip(widget, FALSE); } } static void assign_tooltips_from_actions(GtkWidget* widget) { if(G_LIKELY(GTK_IS_MENU_ITEM(widget))) { if(GTK_IS_ACTIVATABLE(widget)) assign_tooltip_from_action(widget); widget = gtk_menu_item_get_submenu((GtkMenuItem*)widget); if(widget) assign_tooltips_from_actions(widget); } else if (GTK_IS_CONTAINER(widget)) { gtk_container_forall((GtkContainer*)widget, (GtkCallback)assign_tooltips_from_actions, NULL); } } /** * fm_widget_menu_fix_tooltips * @menu: a #GtkMenu instance * * Fix on GTK bug: it does not assign tooltips of menu items from * appropriate #GtkAction objects. This API assigns them instead. * * Since: 1.2.0 */ void fm_widget_menu_fix_tooltips(GtkMenu *menu) { GtkWidget *parent; GtkSettings *settings; gboolean tooltips_enabled; g_return_if_fail(GTK_IS_MENU(menu)); parent = gtk_menu_get_attach_widget(menu); settings = parent ? gtk_settings_get_for_screen(gtk_widget_get_screen(parent)) : gtk_settings_get_default(); g_object_get(G_OBJECT(settings), "gtk-enable-tooltips", &tooltips_enabled, NULL); if(tooltips_enabled) assign_tooltips_from_actions(GTK_WIDGET(menu)); } libfm-1.4.0/src/gtk/fm-gtk-utils.h000066400000000000000000000114361475513661000166720ustar00rootroot00000000000000/* * fm-gtk-utils.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_GTK_UTILS_H__ #define __FM_GTK_UTILS_H__ #include #include #include #include "fm-path.h" G_BEGIN_DECLS /* Convinient dialog functions */ /* Display an error message to the user */ void fm_show_error(GtkWindow* parent, const char* title, const char* msg); /* Ask the user a yes-no question. */ gboolean fm_yes_no(GtkWindow* parent, const char* title, const char* question, gboolean default_yes); gboolean fm_ok_cancel(GtkWindow* parent, const char* title, const char* question, gboolean default_ok); /* Ask the user a question with a NULL-terminated array of * options provided. The return value was index of the selected option. */ int fm_ask(GtkWindow* parent, const char* title, const char* question, ...); int fm_askv(GtkWindow* parent, const char* title, const char* question, char* const* options); int fm_ask_valist(GtkWindow* parent, const char* title, const char* question, va_list options); char* fm_get_user_input(GtkWindow* parent, const char* title, const char* msg, const char* default_text); gchar* fm_get_user_input_n(GtkWindow* parent, const char* title, const char* msg, const char* default_text, gint n, GtkWidget* extra); #ifndef FM_DISABLE_DEPRECATED FmPath* fm_get_user_input_path(GtkWindow* parent, const char* title, const char* msg, FmPath* default_path); #endif /* Ask the user to select a folder. */ FmPath* fm_select_folder(GtkWindow* parent, const char* title); /* TODO: support selecting multiple files */ FmPath* fm_select_file(GtkWindow* parent, const char* title, const char* default_folder, gboolean local_only, gboolean show_preview, /* filter1, filter2, ..., NULL */ ...); /* Mount */ gboolean fm_mount_path(GtkWindow* parent, FmPath* path, gboolean interactive); gboolean fm_mount_volume(GtkWindow* parent, GVolume* vol, gboolean interactive); gboolean fm_unmount_mount(GtkWindow* parent, GMount* mount, gboolean interactive); gboolean fm_unmount_volume(GtkWindow* parent, GVolume* vol, gboolean interactive); gboolean fm_eject_mount(GtkWindow* parent, GMount* mount, gboolean interactive); gboolean fm_eject_volume(GtkWindow* parent, GVolume* vol, gboolean interactive); /* File operations */ void fm_copy_files(GtkWindow* parent, FmPathList* files, FmPath* dest_dir); void fm_move_files(GtkWindow* parent, FmPathList* files, FmPath* dest_dir); void fm_link_files(GtkWindow* parent, FmPathList* files, FmPath* dest_dir); #define fm_copy_file(parent, file, dest_dir) \ G_STMT_START { \ FmPathList* files = fm_path_list_new(); \ fm_path_list_push_tail(files, file); \ fm_copy_files(parent, files, dest_dir); \ fm_path_list_unref(files); \ } G_STMT_END #define fm_move_file(parent, file, dest_dir) \ G_STMT_START { \ FmPathList* files = fm_path_list_new(); \ fm_path_list_push_tail(files, file); \ fm_move_files(parent, files, dest_dir); \ fm_path_list_unref(files); \ } G_STMT_END void fm_move_or_copy_files_to(GtkWindow* parent, FmPathList* files, gboolean is_move); #define fm_move_files_to(parent, files) fm_move_or_copy_files_to(parent, files, TRUE) #define fm_copy_files_to(parent, files) fm_move_or_copy_files_to(parent, files, FALSE) void fm_trash_files(GtkWindow* parent, FmPathList* files); void fm_delete_files(GtkWindow* parent, FmPathList* files); /* trash or delete files according to FmConfig::use_trash. */ void fm_trash_or_delete_files(GtkWindow* parent, FmPathList* files); void fm_untrash_files(GtkWindow* parent, FmPathList* files); /* void fm_rename_files(FmPathList* files); */ void fm_rename_file(GtkWindow* parent, FmPath* file); void fm_hide_file(GtkWindow* parent, FmPath* file); void fm_unhide_file(GtkWindow* parent, FmPath* file); void fm_empty_trash(GtkWindow* parent); void fm_set_busy_cursor(GtkWidget* widget); void fm_unset_busy_cursor(GtkWidget* widget); void fm_widget_menu_fix_tooltips(GtkMenu *menu); G_END_DECLS #endif /* __FM_GTK_UTILS_H__ */ libfm-1.4.0/src/gtk/fm-icon-pixbuf.c000066400000000000000000000120211475513661000171540ustar00rootroot00000000000000/* * fm-icon-pixbuf.c * * Copyright 2009 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-icon-pixbuf * @short_description: An icon image creator. * @title: Icon image * * @include: libfm/fm-gtk.h * */ #include "fm-icon-pixbuf.h" #include "fm.h" static guint changed_handler = 0; typedef struct _PixEntry { int size; GdkPixbuf* pix; }PixEntry; static void destroy_pixbufs(gpointer data) { GSList* pixs = (GSList*)data; GSList* l; for(l = pixs; l; l=l->next) { PixEntry* ent = (PixEntry*)l->data; if(G_LIKELY(ent->pix)) g_object_unref(ent->pix); g_slice_free(PixEntry, ent); } g_slist_free(pixs); } /** * fm_pixbuf_from_icon * @icon: icon descriptor * @size: size in pixels * * Creates a #GdkPixbuf and draws icon there. * * Before 1.0.0 this call had name fm_icon_get_pixbuf. * * Returns: (transfer full): an image. * * Since: 0.1.0 */ GdkPixbuf* fm_pixbuf_from_icon(FmIcon* icon, int size) { return fm_pixbuf_from_icon_with_fallback(icon, size, NULL); } /** * fm_pixbuf_from_icon_with_fallback * @icon: icon descriptor * @size: size in pixels * @fallback: (allow-none): name of fallback icon * * Creates a #GdkPixbuf and draws icon there. If icon cannot be found then * icon with name @fallback will be loaded instead. * * Returns: (transfer full): an image. * * Since: 1.2.0 */ GdkPixbuf* fm_pixbuf_from_icon_with_fallback(FmIcon* icon, int size, const char *fallback) { GtkIconInfo* ii; GdkPixbuf* pix = NULL; GSList *pixs, *l; PixEntry* ent; /* FIXME: 1) get/add GQuark for emblem type: no emblem is fm_qdata_id 2) get/add GQuark by GQuark in the theme to support multi GdkScreen */ pixs = (GSList*)g_object_steal_qdata(G_OBJECT(icon), fm_qdata_id); for( l = pixs; l; l=l->next ) { ent = (PixEntry*)l->data; if(ent->size == size) /* cached pixbuf is found! */ { /* return stealed data back */ g_object_set_qdata_full(G_OBJECT(icon), fm_qdata_id, pixs, destroy_pixbufs); return ent->pix ? GDK_PIXBUF(g_object_ref(ent->pix)) : NULL; } } /* not found! load the icon from disk */ ii = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), G_ICON(icon), size, GTK_ICON_LOOKUP_FORCE_SIZE); if(ii) { pix = gtk_icon_info_load_icon(ii, NULL); gtk_icon_info_free(ii); /* increase ref_count to keep this pixbuf in memory even when no one is using it. */ if(pix) g_object_ref(pix); } if (pix == NULL) { char* str = g_icon_to_string(G_ICON(icon)); g_debug("unable to load icon %s", str); if(fallback) pix = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), fallback, size, GTK_ICON_LOOKUP_USE_BUILTIN|GTK_ICON_LOOKUP_FORCE_SIZE, NULL); if(pix == NULL) /* still unloadable */ pix = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), "unknown", size, GTK_ICON_LOOKUP_USE_BUILTIN|GTK_ICON_LOOKUP_FORCE_SIZE, NULL); if(G_LIKELY(pix)) g_object_ref(pix); g_free(str); } /* cache this! */ ent = g_slice_new(PixEntry); ent->size = size; ent->pix = pix; /* FIXME: maybe we should unload icons that nobody is using to reduce memory usage. */ /* g_object_weak_ref(); */ pixs = g_slist_prepend(pixs, ent); g_object_set_qdata_full(G_OBJECT(icon), fm_qdata_id, pixs, destroy_pixbufs); return pix; } static void on_icon_theme_changed(GtkIconTheme* theme, gpointer user_data) { g_debug("icon theme changed!"); /* unload pixbufs cached in FmIcon's hash table. */ fm_icon_reset_user_data_cache(fm_qdata_id); /* FIXME: gtk_icon_theme_has_icon()+gtk_icon_theme_add_builtin_icon() for symlink emblem */ } void _fm_icon_pixbuf_init() { /* FIXME: GtkIconTheme object is different on different GdkScreen */ GtkIconTheme* theme = gtk_icon_theme_get_default(); changed_handler = g_signal_connect(theme, "changed", G_CALLBACK(on_icon_theme_changed), NULL); } void _fm_icon_pixbuf_finalize() { GtkIconTheme* theme = gtk_icon_theme_get_default(); g_signal_handler_disconnect(theme, changed_handler); } libfm-1.4.0/src/gtk/fm-icon-pixbuf.h000066400000000000000000000024061475513661000171670ustar00rootroot00000000000000/* * fm-icon-pixbuf.h * * Copyright 2009 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_ICON_PIXBUF_H__ #define __FM_ICON_PIXBUF_H__ #include #include "fm-icon.h" G_BEGIN_DECLS void _fm_icon_pixbuf_init(); void _fm_icon_pixbuf_finalize(); GdkPixbuf* fm_pixbuf_from_icon(FmIcon* icon, int size); GdkPixbuf* fm_pixbuf_from_icon_with_fallback(FmIcon* icon, int size, const char *fallback); G_END_DECLS #endif /* __FM_ICON_PIXBUF_H__ */ libfm-1.4.0/src/gtk/fm-menu-tool-item.c000066400000000000000000000363661475513661000176260ustar00rootroot00000000000000/* * fm-menu-tool-item.c * * Copyright (C) 2003 Ricardo Fernandez Pascual * Copyright (C) 2004 Paolo Borelli * * Copyright (C) 2013 Andriy Grytsenko (LStranger) * * 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. */ /** * SECTION:fm-menu-tool-item * @short_description: A widget with arrow to show a menu in a tollbar. * @title: FmMenuToolItem * * @include: libfm/fm-gtk.h * * The #FmMenuToolItem shows button with arrow which shows menu when is * clicked, similar to #GtkMenuToolButton, but without any actual button, * just an arrow for menu. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-menu-tool-item.h" #define FM_MENU_TOOL_ITEM_GET_PRIVATE(object) \ (G_TYPE_INSTANCE_GET_PRIVATE((object), FM_TYPE_MENU_TOOL_ITEM, FmMenuToolItemPrivate)) struct _FmMenuToolItemPrivate { GtkWidget *arrow; GtkWidget *arrow_button; GtkMenu *menu; }; #if GTK_CHECK_VERSION(3, 0, 0) static void fm_menu_tool_item_destroy(GtkWidget *object); #else static void fm_menu_tool_item_destroy(GtkObject *object); #endif static int menu_deactivate_cb(GtkMenuShell *menu_shell, FmMenuToolItem *button); enum { SHOW_MENU, LAST_SIGNAL }; enum { PROP_0, PROP_MENU }; static gint signals[LAST_SIGNAL]; G_DEFINE_TYPE (FmMenuToolItem, fm_menu_tool_item, GTK_TYPE_TOOL_ITEM) static void fm_menu_tool_item_construct_contents (FmMenuToolItem *button) { FmMenuToolItemPrivate *priv = button->priv; GtkOrientation orientation; orientation = gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button)); if (orientation == GTK_ORIENTATION_HORIZONTAL) gtk_arrow_set (GTK_ARROW (priv->arrow), GTK_ARROW_DOWN, GTK_SHADOW_NONE); else gtk_arrow_set (GTK_ARROW (priv->arrow), GTK_ARROW_RIGHT, GTK_SHADOW_NONE); gtk_button_set_relief (GTK_BUTTON (priv->arrow_button), gtk_tool_item_get_relief_style (GTK_TOOL_ITEM (button))); gtk_widget_queue_resize (GTK_WIDGET (button)); } static void fm_menu_tool_item_toolbar_reconfigured (GtkToolItem *toolitem) { fm_menu_tool_item_construct_contents (FM_MENU_TOOL_ITEM (toolitem)); } static void fm_menu_tool_item_state_changed(GtkWidget *widget, GtkStateType previous_state) { FmMenuToolItem *button = FM_MENU_TOOL_ITEM (widget); FmMenuToolItemPrivate *priv = button->priv; if (!gtk_widget_is_sensitive(widget) && priv->menu) { gtk_menu_shell_deactivate (GTK_MENU_SHELL (priv->menu)); } } static void fm_menu_tool_item_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { FmMenuToolItem *button = FM_MENU_TOOL_ITEM (object); switch (prop_id) { case PROP_MENU: fm_menu_tool_item_set_menu (button, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void fm_menu_tool_item_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { FmMenuToolItem *button = FM_MENU_TOOL_ITEM (object); switch (prop_id) { case PROP_MENU: g_value_set_object (value, button->priv->menu); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void fm_menu_tool_item_class_init (FmMenuToolItemClass *klass) { GObjectClass *object_class; #if !GTK_CHECK_VERSION(3, 0, 0) GtkObjectClass *gtk_object_class; #endif GtkWidgetClass *widget_class; GtkToolItemClass *toolitem_class; object_class = (GObjectClass *)klass; #if !GTK_CHECK_VERSION(3, 0, 0) gtk_object_class = (GtkObjectClass *)klass; #endif widget_class = (GtkWidgetClass *)klass; toolitem_class = (GtkToolItemClass *)klass; object_class->set_property = fm_menu_tool_item_set_property; object_class->get_property = fm_menu_tool_item_get_property; #if GTK_CHECK_VERSION(3, 0, 0) widget_class->destroy = fm_menu_tool_item_destroy; #else gtk_object_class->destroy = fm_menu_tool_item_destroy; #endif widget_class->state_changed = fm_menu_tool_item_state_changed; toolitem_class->toolbar_reconfigured = fm_menu_tool_item_toolbar_reconfigured; /** * FmMenuToolItem::show-menu: * @button: the object on which the signal is emitted * * The ::show-menu signal is emitted before the menu is shown. * * It can be used to populate the menu on demand, using * fm_menu_tool_item_get_menu(). * * Note that even if you populate the menu dynamically in this way, * you must set an empty menu on the #FmMenuToolItem beforehand, * since the arrow is made insensitive if the menu is not set. */ signals[SHOW_MENU] = g_signal_new ("show-menu", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (FmMenuToolItemClass, show_menu), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_object_class_install_property (object_class, PROP_MENU, g_param_spec_object ("menu", "Menu", "The dropdown menu", GTK_TYPE_MENU, G_PARAM_READWRITE)); g_type_class_add_private (object_class, sizeof (FmMenuToolItemPrivate)); } static void menu_position_func(GtkMenu *menu, int *x, int *y, gboolean *push_in, FmMenuToolItem *button) { FmMenuToolItemPrivate *priv = button->priv; GtkWidget *widget = GTK_WIDGET (button); GtkAllocation arrow_allocation; GtkRequisition menu_req; GtkOrientation orientation; GtkTextDirection direction; GdkRectangle monitor; gint monitor_num; GdkScreen *screen; GdkWindow *window; #if GTK_CHECK_VERSION(3, 0, 0) gtk_widget_get_preferred_size (GTK_WIDGET (priv->menu), &menu_req, NULL); #else gtk_widget_size_request (GTK_WIDGET (priv->menu), &menu_req); #endif orientation = gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button)); direction = gtk_widget_get_direction (widget); window = gtk_widget_get_window (widget); screen = gtk_widget_get_screen (GTK_WIDGET (menu)); monitor_num = gdk_screen_get_monitor_at_window (screen, window); if (monitor_num < 0) monitor_num = 0; gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); if (orientation == GTK_ORIENTATION_HORIZONTAL) { GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (priv->arrow_button, &arrow_allocation); gdk_window_get_origin (window, x, y); *x += allocation.x; *y += allocation.y; if (direction == GTK_TEXT_DIR_LTR) *x += MAX (allocation.width - menu_req.width, 0); else if (menu_req.width > allocation.width) *x -= menu_req.width - allocation.width; if ((*y + arrow_allocation.height + menu_req.height) <= monitor.y + monitor.height) *y += arrow_allocation.height; else if ((*y - menu_req.height) >= monitor.y) *y -= menu_req.height; else if (monitor.y + monitor.height - (*y + arrow_allocation.height) > *y) *y += arrow_allocation.height; else *y -= menu_req.height; } else { #if GTK_CHECK_VERSION(2, 22, 0) gdk_window_get_origin (gtk_button_get_event_window (GTK_BUTTON (priv->arrow_button)), x, y); #else gdk_window_get_origin (GTK_BUTTON (priv->arrow_button)->event_window, x, y); #endif gtk_widget_get_allocation (priv->arrow_button, &arrow_allocation); if (direction == GTK_TEXT_DIR_LTR) *x += arrow_allocation.width; else *x -= menu_req.width; if (*y + menu_req.height > monitor.y + monitor.height && *y + arrow_allocation.height - monitor.y > monitor.y + monitor.height - *y) *y += arrow_allocation.height - menu_req.height; } *push_in = FALSE; } static void popup_menu_under_arrow(FmMenuToolItem *button, GdkEventButton *event) { FmMenuToolItemPrivate *priv = button->priv; g_signal_emit (button, signals[SHOW_MENU], 0); if (!priv->menu) return; gtk_menu_popup (priv->menu, NULL, NULL, (GtkMenuPositionFunc) menu_position_func, button, event ? event->button : 0, event ? event->time : gtk_get_current_event_time ()); } static void arrow_button_toggled_cb(GtkToggleButton *togglebutton, FmMenuToolItem *button) { FmMenuToolItemPrivate *priv = button->priv; if (!priv->menu) return; if (gtk_toggle_button_get_active (togglebutton) && !gtk_widget_get_visible(GTK_WIDGET(priv->menu))) { /* we get here only when the menu is activated by a key * press, so that we can select the first menu item */ popup_menu_under_arrow (button, NULL); gtk_menu_shell_select_first (GTK_MENU_SHELL (priv->menu), FALSE); } } static gboolean arrow_button_button_press_event_cb(GtkWidget *widget, GdkEventButton *event, FmMenuToolItem *button) { if (event->button == 1) { popup_menu_under_arrow (button, event); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); return TRUE; } else { return FALSE; } } static void fm_menu_tool_item_init(FmMenuToolItem *button) { GtkWidget *arrow; GtkWidget *arrow_button; button->priv = FM_MENU_TOOL_ITEM_GET_PRIVATE (button); gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), FALSE); arrow_button = gtk_toggle_button_new (); arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); gtk_container_add (GTK_CONTAINER (arrow_button), arrow); /* the arrow button is insentive until we set a menu */ gtk_widget_set_sensitive (arrow_button, FALSE); gtk_widget_show_all (arrow_button); gtk_container_add (GTK_CONTAINER (button), arrow_button); button->priv->arrow = arrow; button->priv->arrow_button = arrow_button; g_signal_connect (arrow_button, "toggled", G_CALLBACK (arrow_button_toggled_cb), button); g_signal_connect (arrow_button, "button-press-event", G_CALLBACK (arrow_button_button_press_event_cb), button); } #if GTK_CHECK_VERSION(3, 0, 0) static void fm_menu_tool_item_destroy(GtkWidget *object) #else static void fm_menu_tool_item_destroy (GtkObject *object) #endif { FmMenuToolItem *button; button = FM_MENU_TOOL_ITEM (object); if (button->priv->menu) { g_signal_handlers_disconnect_by_func (button->priv->menu, menu_deactivate_cb, button); gtk_menu_detach (button->priv->menu); g_signal_handlers_disconnect_by_func (button->priv->arrow_button, arrow_button_toggled_cb, button); g_signal_handlers_disconnect_by_func (button->priv->arrow_button, arrow_button_button_press_event_cb, button); } #if GTK_CHECK_VERSION(3, 0, 0) GTK_WIDGET_CLASS (fm_menu_tool_item_parent_class)->destroy (object); #else GTK_OBJECT_CLASS (fm_menu_tool_item_parent_class)->destroy (object); #endif } /** * fm_menu_tool_item_new: * * Creates a new #FmMenuToolItem. * * Return value: (transfer full): the new #FmMenuToolItem * * Since: 1.2.0 **/ GtkToolItem *fm_menu_tool_item_new(void) { return (GtkToolItem *)g_object_new (FM_TYPE_MENU_TOOL_ITEM, NULL); } /* Callback for the "deactivate" signal on the pop-up menu. * This is used so that we unset the state of the toggle button * when the pop-up menu disappears. */ static int menu_deactivate_cb(GtkMenuShell *menu_shell, FmMenuToolItem *button) { FmMenuToolItemPrivate *priv = button->priv; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->arrow_button), FALSE); return TRUE; } static void menu_detacher(GtkWidget *widget, GtkMenu *menu) { FmMenuToolItemPrivate *priv = FM_MENU_TOOL_ITEM (widget)->priv; g_return_if_fail (priv->menu == menu); priv->menu = NULL; } /** * fm_menu_tool_item_set_menu: * @button: a #FmMenuToolItem * @menu: the #GtkMenu associated with #FmMenuToolItem * * Sets the #GtkMenu that is popped up when the user clicks on the arrow. * If @menu is NULL, the arrow button becomes insensitive. * * Since: 1.2.0 **/ void fm_menu_tool_item_set_menu(FmMenuToolItem *button, GtkWidget *menu) { FmMenuToolItemPrivate *priv; g_return_if_fail (FM_IS_MENU_TOOL_ITEM (button)); g_return_if_fail (GTK_IS_MENU (menu) || menu == NULL); priv = button->priv; if (priv->menu != GTK_MENU (menu)) { if (priv->menu && gtk_widget_get_visible(GTK_WIDGET(priv->menu))) gtk_menu_shell_deactivate (GTK_MENU_SHELL (priv->menu)); if (priv->menu) { g_signal_handlers_disconnect_by_func (priv->menu, menu_deactivate_cb, button); gtk_menu_detach (priv->menu); } priv->menu = GTK_MENU (menu); if (priv->menu) { gtk_menu_attach_to_widget (priv->menu, GTK_WIDGET (button), menu_detacher); gtk_widget_set_sensitive (priv->arrow_button, TRUE); g_signal_connect (priv->menu, "deactivate", G_CALLBACK (menu_deactivate_cb), button); } else gtk_widget_set_sensitive (priv->arrow_button, FALSE); } g_object_notify (G_OBJECT (button), "menu"); } /** * fm_menu_tool_item_get_menu: * @button: a #FmMenuToolItem * * Gets the #GtkMenu associated with #FmMenuToolItem. * * Return value: (transfer none): the #GtkMenu associated with #FmMenuToolItem * * Since: 1.2.0 **/ GtkWidget *fm_menu_tool_item_get_menu(FmMenuToolItem *button) { g_return_val_if_fail (FM_IS_MENU_TOOL_ITEM (button), NULL); return GTK_WIDGET (button->priv->menu); } libfm-1.4.0/src/gtk/fm-menu-tool-item.h000066400000000000000000000050051475513661000176150ustar00rootroot00000000000000/* * fm-menu-tool-item.h * * Copyright (C) 2003 Ricardo Fernandez Pascual * Copyright (C) 2004 Paolo Borelli * * Copyright (C) 2013 Andriy Grytsenko (LStranger) * * 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 __FM_MENU_TOOL_ITEM_H__ #define __FM_MENU_TOOL_ITEM_H__ #include #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_MENU_TOOL_ITEM (fm_menu_tool_item_get_type ()) #define FM_MENU_TOOL_ITEM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), FM_TYPE_MENU_TOOL_ITEM, FmMenuToolItem)) #define FM_MENU_TOOL_ITEM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), FM_TYPE_MENU_TOOL_ITEM, FmMenuToolItemClass)) #define FM_IS_MENU_TOOL_ITEM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), FM_TYPE_MENU_TOOL_ITEM)) #define FM_IS_MENU_TOOL_ITEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), FM_TYPE_MENU_TOOL_ITEM)) typedef struct _FmMenuToolItemClass FmMenuToolItemClass; typedef struct _FmMenuToolItem FmMenuToolItem; typedef struct _FmMenuToolItemPrivate FmMenuToolItemPrivate; struct _FmMenuToolItem { GtkToolItem parent; /*< private >*/ FmMenuToolItemPrivate *FM_SEAL (priv); }; /** * FmMenuToolItemClass: * @parent_class: the parent class * @show_menu: the class closure for the #FmMenuToolItem::show-menu signal */ struct _FmMenuToolItemClass { GtkToolItemClass parent_class; void (*show_menu) (FmMenuToolItem *button); /*< private >*/ /* Padding for future expansion */ void (*_fm_reserved1) (void); void (*_fm_reserved2) (void); void (*_fm_reserved3) (void); void (*_fm_reserved4) (void); }; GType fm_menu_tool_item_get_type(void); GtkToolItem *fm_menu_tool_item_new(void); void fm_menu_tool_item_set_menu(FmMenuToolItem *button, GtkWidget *menu); GtkWidget *fm_menu_tool_item_get_menu(FmMenuToolItem *button); G_END_DECLS #endif /* __FM_MENU_TOOL_ITEM_H__ */ libfm-1.4.0/src/gtk/fm-path-bar.c000066400000000000000000000245721475513661000164450ustar00rootroot00000000000000/* * fm-path-bar.c * * Copyright 2011 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-path-bar * @short_description: A widget for representing current path. * @title: FmPathBar * * @include: libfm/fm-gtk.h * * The #FmPathBar represents current path as number of buttons so it is * possible to click buttons to change directory to parent or child. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-path-bar.h" #include enum{ CHDIR, N_SIGNALS }; static GQuark btn_data_id = 0; static guint signals[N_SIGNALS]; static void fm_path_bar_dispose (GObject *object); G_DEFINE_TYPE(FmPathBar, fm_path_bar, GTK_TYPE_HBOX) static void on_size_allocate(GtkWidget* widget, GtkAllocation* alloc) { FmPathBar* bar = FM_PATH_BAR(widget); GtkRequisition req; #if GTK_CHECK_VERSION(3, 0, 0) gtk_widget_get_preferred_size(bar->btn_box, &req, NULL); #else gtk_widget_size_request(bar->btn_box, &req); #endif if(req.width > alloc->width) /* required width > allocated */ { /* show scroll buttons */ gtk_widget_show(bar->left_scroll); gtk_widget_show(bar->right_scroll); } else { /* hide scroll buttons and show all buttons */ gtk_widget_hide(bar->left_scroll); gtk_widget_hide(bar->right_scroll); } GTK_WIDGET_CLASS(fm_path_bar_parent_class)->size_allocate(widget, alloc); } static void fm_path_bar_class_init(FmPathBarClass *klass) { GObjectClass *g_object_class; GtkWidgetClass* widget_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_path_bar_dispose; widget_class = GTK_WIDGET_CLASS(klass); widget_class->size_allocate = on_size_allocate; btn_data_id = g_quark_from_static_string("FmPathBtn"); /** * FmPathBar::chdir: * @bar: the object which emitted the signal * @path: (#FmPath *) new path * * The FmPathBar::chdir signal is emitted when the user toggles a path * element in the bar or when new path is set via fm_path_bar_set_path(). * * Since: 0.1.16 */ signals[CHDIR] = g_signal_new("chdir", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(FmPathBarClass, chdir), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); } static void fm_path_bar_dispose(GObject *object) { FmPathBar *bar; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_PATH_BAR(object)); bar = (FmPathBar*)object; if(bar->cur_path) { fm_path_unref(bar->cur_path); bar->cur_path = NULL; } if(bar->full_path) { fm_path_unref(bar->full_path); bar->full_path = NULL; } G_OBJECT_CLASS(fm_path_bar_parent_class)->dispose(object); } static void emit_chdir(FmPathBar* bar, FmPath* path) { g_signal_emit(bar, signals[CHDIR], 0, path); } static void on_scroll_btn_clicked(GtkButton* btn, FmPathBar* bar) { #if GTK_CHECK_VERSION(3, 0, 0) GtkAdjustment* hadj = gtk_scrollable_get_hadjustment(GTK_SCROLLABLE(bar->viewport)); #else GtkAdjustment* hadj = gtk_viewport_get_hadjustment(GTK_VIEWPORT(bar->viewport)); #endif gdouble value = gtk_adjustment_get_value(hadj); gdouble page_increment = gtk_adjustment_get_page_increment(hadj); gdouble lower = gtk_adjustment_get_lower(hadj); gdouble upper = gtk_adjustment_get_upper(hadj) - gtk_adjustment_get_page_size(hadj); if(btn == (GtkButton*)bar->left_scroll) /* scroll left */ value = value - page_increment; else value = value + page_increment; value = CLAMP (value, lower, upper); gtk_adjustment_set_value(hadj, value); } static void on_path_btn_toggled(GtkToggleButton* btn, FmPathBar* bar) { if(gtk_toggle_button_get_active(btn)) { FmPath* path = FM_PATH(g_object_get_qdata(G_OBJECT(btn), btn_data_id)); fm_path_unref(bar->cur_path); bar->cur_path = fm_path_ref(path); emit_chdir(bar, path); } } static void fm_path_bar_init(FmPathBar *bar) { bar->viewport = gtk_viewport_new(NULL, NULL); gtk_widget_set_size_request(bar->viewport, 100, -1); gtk_viewport_set_shadow_type(GTK_VIEWPORT(bar->viewport), GTK_SHADOW_NONE); #if GTK_CHECK_VERSION(3, 2, 0) /* FIXME: migrate to GtkGrid */ bar->btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else bar->btn_box = gtk_hbox_new(FALSE, 0); #endif gtk_container_add(GTK_CONTAINER(bar->viewport), bar->btn_box); bar->left_scroll = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(bar->left_scroll), GTK_RELIEF_HALF); gtk_container_add(GTK_CONTAINER(bar->left_scroll), gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE)); g_signal_connect(bar->left_scroll, "clicked", G_CALLBACK(on_scroll_btn_clicked), bar); bar->right_scroll = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(bar->right_scroll), GTK_RELIEF_HALF); gtk_container_add(GTK_CONTAINER(bar->right_scroll), gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE)); g_signal_connect(bar->right_scroll, "clicked", G_CALLBACK(on_scroll_btn_clicked), bar); gtk_box_pack_start(GTK_BOX(bar), bar->left_scroll, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(bar), bar->viewport, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(bar), bar->right_scroll, FALSE, TRUE, 0); gtk_widget_show_all(GTK_WIDGET(bar)); } /** * fm_path_bar_new * * Creates new path bar. * * Returns: (transfer full): a new #FmPathBar object. * * Since: 0.1.16 */ FmPathBar* fm_path_bar_new(void) { return (FmPathBar*)g_object_new(FM_TYPE_PATH_BAR, NULL); } /** * fm_path_bar_get_path * @bar: a path bar widget * * Retrieves current path from path bar. Returned data are owned by @bar * and should be not freed by caller. * * Returns: (transfer none): current path. * * Since: 0.1.16 */ FmPath* fm_path_bar_get_path(FmPathBar* bar) { return bar->cur_path; } static GtkRadioButton* create_btn(FmPathBar* bar, GSList* grp, FmPath* path_element) { GtkRadioButton* btn; char* label = fm_path_display_basename(path_element); if(!fm_path_get_parent(path_element)) /* this element is root */ { #if GTK_CHECK_VERSION(3, 2, 0) /* FIXME: migrate to GtkGrid */ GtkWidget* hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2); #else GtkWidget* hbox = gtk_hbox_new(FALSE, 2); #endif btn = (GtkRadioButton*)gtk_radio_button_new(grp); gtk_container_add(GTK_CONTAINER(btn), hbox); gtk_box_pack_start(GTK_BOX(hbox), gtk_image_new_from_icon_name("drive-harddisk", GTK_ICON_SIZE_BUTTON), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(label), FALSE, FALSE, 0); gtk_widget_show_all(hbox); } else { btn = (GtkRadioButton*)gtk_radio_button_new_with_label(grp, label); } g_free(label); gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(btn), FALSE); gtk_widget_show(GTK_WIDGET(btn)); g_object_set_qdata(G_OBJECT(btn), btn_data_id, path_element); g_signal_connect(btn, "toggled", G_CALLBACK(on_path_btn_toggled), bar); return btn; } /** * fm_path_bar_set_path * @bar: a path bar widget * @path: a new path to set * * Changes path for the @bar. * * Since: 0.1.16 */ void fm_path_bar_set_path(FmPathBar* bar, FmPath* path) { FmPath* path_element; GtkRadioButton* btn; GSList* grp; GList* btns, *l; if(bar->cur_path) { if(path && fm_path_equal(bar->cur_path, path)) return; fm_path_unref(bar->cur_path); } bar->cur_path = fm_path_ref(path); /* check if we already have a button for this path */ if(bar->full_path) { int n = 0; path_element = bar->full_path; while(path_element) { /* we have a button for this path */ if(fm_path_equal(path_element, path)) { /* toggle the button */ btns = gtk_container_get_children(GTK_CONTAINER(bar->btn_box)); l = g_list_nth_prev(g_list_last(btns), n); btn = GTK_RADIO_BUTTON(l->data); g_list_free(btns); /* we don't need to emit chdir signal here since later * toggled signal will be triggered on the button, which * in turns emit chdir. */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btn), TRUE); return; } path_element = fm_path_get_parent(path_element); ++n; } /* we don't have a button for it. */ fm_path_unref(bar->full_path); } bar->full_path = fm_path_ref(path); /* FIXME: if the new path is the subdir of our full_path, actually * we can append several new buttons rather than re-create * all of the buttons. */ /* destroy existing path element buttons */ gtk_container_foreach(GTK_CONTAINER(bar->btn_box), (GtkCallback)gtk_widget_destroy, NULL); grp = NULL; path_element = path; btns = NULL; /* create new buttons for the new path */ while(path_element) { btn = create_btn(bar, grp, path_element); grp = gtk_radio_button_get_group(btn); path_element = fm_path_get_parent(path_element); btns = g_list_prepend(btns, btn); } for(l = btns; l; l=l->next) { btn = GTK_RADIO_BUTTON(l->data); gtk_box_pack_start(GTK_BOX(bar->btn_box), GTK_WIDGET(btn), FALSE, TRUE, 0); } g_list_free(btns); emit_chdir(bar, path); } libfm-1.4.0/src/gtk/fm-path-bar.h000066400000000000000000000053641475513661000164500ustar00rootroot00000000000000/* * fm-path-bar.h * * Copyright 2011 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_PATH_BAR_H__ #define __FM_PATH_BAR_H__ #include #include "fm-path.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_PATH_BAR (fm_path_bar_get_type()) #define FM_PATH_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_PATH_BAR, FmPathBar)) #define FM_PATH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_PATH_BAR, FmPathBarClass)) #define FM_IS_PATH_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_PATH_BAR)) #define FM_IS_PATH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_PATH_BAR)) #define FM_PATH_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ FM_TYPE_PATH_BAR, FmPathBarClass)) typedef struct _FmPathBar FmPathBar; typedef struct _FmPathBarClass FmPathBarClass; struct _FmPathBar { /*< private >*/ GtkHBox parent; GtkWidget* FM_SEAL(viewport); /* viewport to make hbox scrollable */ GtkWidget* FM_SEAL(btn_box); /* hbox containing path element buttons */ GtkWidget* FM_SEAL(left_scroll); /* left scroll button */ GtkWidget* FM_SEAL(right_scroll); /* right scroll button */ FmPath* FM_SEAL(cur_path); /* currently active path */ FmPath* FM_SEAL(full_path); /* full path shown in the bar */ gpointer _reserved1; gpointer _reserved2; }; /** * FmPathBarClass: * @parent_class: the parent class * @chdir: the class closure for the #FmPathBar::chdir signal */ struct _FmPathBarClass { GtkHBoxClass parent_class; void (*chdir)(FmPathBar* bar, FmPath* path); /*< private >*/ gpointer _reserved1; }; GType fm_path_bar_get_type (void); FmPathBar* fm_path_bar_new (void); FmPath* fm_path_bar_get_path(FmPathBar* bar); void fm_path_bar_set_path(FmPathBar* bar, FmPath* path); G_END_DECLS #endif /* __FM_PATH_BAR_H__ */ libfm-1.4.0/src/gtk/fm-path-entry.c000066400000000000000000001017401475513661000170330ustar00rootroot00000000000000/* * fm-path-entry.c * * Copyright 2009 PCMan * Copyright 2009 Jürgen Hötzel * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-path-entry * @short_description: An entry to enter path with completion. * @title: FmPathEntry * * @include: libfm/fm-gtk.h * * The #FmPathEntry represents a widget to enter folder path for changing * current directory. The path entry supports completion and can be used * for both UNIX path or file URI entering. The path is represented in * the entry unescaped therefore there is no way to enter escape sequence * (such as \%23) into entry. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "../gtk-compat.h" #include "fm-path-entry.h" /* for completion */ #include "fm-folder-model.h" #include "fm-file.h" #include "fm-utils.h" #include #include #include struct _FmPathEntry { GtkEntry parent_instance; }; struct _FmPathEntryClass { GtkEntryClass parent_class; }; /* properties */ enum { PROP_0, PROP_HIGHLIGHT_COMPLETION_MATCH }; typedef struct _FmPathEntryModel FmPathEntryModel; #define FM_PATH_ENTRY_GET_PRIVATE(obj) ( G_TYPE_INSTANCE_GET_PRIVATE( (obj), FM_TYPE_PATH_ENTRY, FmPathEntryPrivate ) ) typedef struct _FmPathEntryPrivate FmPathEntryPrivate; struct _FmPathEntryPrivate { FmPath* path; /* model used for completion */ FmPathEntryModel* model; /* name of parent dir */ char* parent_dir; /* length of parent dir */ gint parent_len; gboolean folder_loaded : 1; gboolean highlight_completion_match : 1; gboolean long_list : 1; //gboolean complete_on_load :1; GtkEntryCompletion* completion; guint id_changed; /* cancellable for dir listing */ GCancellable* cancellable; /* length of basename typed by the user */ gint typed_basename_len; }; typedef struct { FmPathEntry* entry; GFile* dir; GList* subdirs; GCancellable* cancellable; }ListSubDirNames; //static gboolean fm_path_entry_grab_focus(GtkWidget *widget); static gboolean fm_path_entry_focus_in_event(GtkWidget *widget, GdkEventFocus *event); static gboolean fm_path_entry_focus_out_event(GtkWidget *widget, GdkEventFocus *event); static void fm_path_entry_changed(GtkEditable *editable, gpointer user_data); static void fm_path_entry_dispose(GObject *object); static void fm_path_entry_finalize(GObject *object); static gboolean fm_path_entry_match_func(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data); static void fm_path_entry_completion_render_func(GtkCellLayout *cell_layout, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); static void fm_path_entry_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void fm_path_entry_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); G_DEFINE_TYPE(FmPathEntry, fm_path_entry, GTK_TYPE_ENTRY) /* customized model used for entry completion to save memory. * GtkEntryCompletion requires that we store full paths in the model * to work, but we only want to store basenames to save memory. * So we created a custom model to do this. */ enum { COL_BASENAME, COL_FULL_PATH, N_COLS }; #define FM_TYPE_PATH_ENTRY_MODEL (fm_path_entry_model_get_type()) typedef struct _FmPathEntryModelClass FmPathEntryModelClass; struct _FmPathEntryModel { GtkListStore parent_instance; char* parent_dir; }; struct _FmPathEntryModelClass { GtkListStoreClass parent_class; }; static GType fm_path_entry_model_get_type(void); static void fm_path_entry_model_iface_init(GtkTreeModelIface *iface); static FmPathEntryModel* fm_path_entry_model_new(const char *dir); static void fm_path_entry_model_set_parent_dir(FmPathEntryModel *model, const char *dir); G_DEFINE_TYPE_EXTENDED( FmPathEntryModel, fm_path_entry_model, GTK_TYPE_LIST_STORE, 0, G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, fm_path_entry_model_iface_init) ); /* end declaration of the customized model. */ static GtkTreeModelIface *parent_tree_model_interface = NULL; #if 0 static void fm_path_entry_dispatch_properties_changed(GObject *object, guint n_pspecs, GParamSpec **pspecs) { FmPathEntry *entry = FM_PATH_ENTRY(object); //FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); guint i; G_OBJECT_CLASS(fm_path_entry_parent_class)->dispatch_properties_changed(object, n_pspecs, pspecs); /* What we are after: The text in front of the cursor was modified. * Unfortunately, there's no other way to catch this. */ for(i = 0; i < n_pspecs; i++) { if(pspecs[i]->name == g_intern_static_string("cursor-position") || pspecs[i]->name == g_intern_static_string("selection-bound") || pspecs[i]->name == g_intern_static_string("text")) { //priv->complete_on_load = FALSE; break; } } } #endif static gboolean _path_entry_is_single_match(FmPathEntry *entry, FmPathEntryPrivate *priv) { GtkTreeModel *model = GTK_TREE_MODEL(priv->model); char *model_basename; const char* typed_basename; GtkTreeIter it; gboolean partial = FALSE, match = FALSE; typed_basename = gtk_entry_get_text(GTK_ENTRY(entry)) + priv->parent_len; if (gtk_tree_model_get_iter_first(model, &it)) do { gtk_tree_model_get(model, &it, COL_BASENAME, &model_basename, -1); if (!match && strcmp(model_basename, typed_basename) == 0) match = TRUE; /* exact match */ else if (g_str_has_prefix(model_basename, typed_basename)) partial = TRUE; g_free(model_basename); } while (!partial && gtk_tree_model_iter_next(model, &it)); return (match && !partial); } static gboolean fm_path_entry_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { FmPathEntry *entry = FM_PATH_ENTRY(widget); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); GdkModifierType state; if(gtk_get_current_event_state(&state) && (state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) return FALSE; switch( event->keyval ) { case GDK_KEY_Tab: { #if 0 gtk_editable_get_selection_bounds(editable, &start, &end); if(start != end) gtk_editable_set_position(editable, MAX(start, end)); else start_explicit_completion(entry); #endif gtk_entry_completion_insert_prefix(priv->completion); gtk_editable_set_position(GTK_EDITABLE(entry), -1); if (_path_entry_is_single_match(entry, priv)) { int pos = gtk_editable_get_position(GTK_EDITABLE(entry)); gtk_editable_insert_text(GTK_EDITABLE(entry), "/", 1, &pos); gtk_editable_set_position(GTK_EDITABLE(entry), pos); } return TRUE; } } return FALSE; } static void _set_entry_text_from_path(GtkEntry *entry, FmPathEntryPrivate *priv) { char *disp_name; FmPath *path = priv->path; disp_name = fm_path_display_name(path, FALSE); /* block our handler for "changed" signal, we'll update it below */ if(priv->id_changed > 0) g_signal_handler_block(entry, priv->id_changed); gtk_entry_set_text(entry, disp_name); if(priv->id_changed > 0) g_signal_handler_unblock(entry, priv->id_changed); /* update list of items now */ fm_path_entry_changed(GTK_EDITABLE(entry), NULL); g_free(disp_name); } static void fm_path_entry_activate(GtkEntry *entry, gpointer user_data) { FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); const char* full_path; /* convert current path string to FmPath here */ full_path = gtk_entry_get_text(entry); if(priv->path) fm_path_unref(priv->path); /* special handling for home dir */ if(full_path[0] == '~' && full_path[1] == G_DIR_SEPARATOR) priv->path = fm_path_new_relative(fm_path_get_home(), full_path + 2); else if(full_path[0] == '~' && full_path[1] == 0) priv->path = fm_path_ref(fm_path_get_home()); else priv->path = fm_path_new_for_display_name(full_path); #if G_ENABLE_DEBUG { char *real_path = fm_path_to_str(priv->path); g_debug("FmPathEntry activated: '%s' => '%s'", full_path, real_path); g_free(real_path); } #endif _set_entry_text_from_path(entry, priv); gtk_editable_set_position(GTK_EDITABLE(entry), -1); } static void fm_path_entry_class_init(FmPathEntryClass *klass) { GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(klass); GObjectClass* object_class = G_OBJECT_CLASS(klass); object_class->get_property = fm_path_entry_get_property; object_class->set_property = fm_path_entry_set_property; /** * FmPathEntry:highlight-completion-match: * * The #FmPathEntry:highlight-completion-match property is the flag * whether the completion match should be highlighted or not. * * Since: 0.1.0 */ g_object_class_install_property( object_class, PROP_HIGHLIGHT_COMPLETION_MATCH, g_param_spec_boolean("highlight-completion-match", "Highlight completion match", "Whether to highlight the completion match", TRUE, G_PARAM_READWRITE) ); object_class->dispose = fm_path_entry_dispose; object_class->finalize = fm_path_entry_finalize; /* object_class->dispatch_properties_changed = fm_path_entry_dispatch_properties_changed; */ widget_class->focus_in_event = fm_path_entry_focus_in_event; /* widget_class->grab_focus = fm_path_entry_grab_focus; */ widget_class->focus_out_event = fm_path_entry_focus_out_event; g_type_class_add_private( klass, sizeof (FmPathEntryPrivate) ); } static inline void update_inline_completion(FmPathEntryPrivate* priv) { gtk_entry_completion_set_inline_completion(priv->completion, priv->folder_loaded); } static void clear_completion(FmPathEntryPrivate* priv) { if(priv->model) { priv->parent_len = 0; fm_path_entry_model_set_parent_dir(priv->model, NULL); g_free(priv->parent_dir); priv->parent_dir = NULL; /* cancel running dir-listing jobs */ if(priv->cancellable) { g_cancellable_cancel(priv->cancellable); g_object_unref(priv->cancellable); priv->cancellable = NULL; } /* clear current model */ gtk_list_store_clear(GTK_LIST_STORE(priv->model)); update_inline_completion(priv); } priv->typed_basename_len = 0; } static gboolean fm_path_entry_focus_in_event(GtkWidget *widget, GdkEventFocus *event) { FmPathEntry *entry = FM_PATH_ENTRY(widget); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); /* listen to 'changed' signal for auto-completion */ priv->id_changed = g_signal_connect(entry, "changed", G_CALLBACK(fm_path_entry_changed), NULL); return GTK_WIDGET_CLASS(fm_path_entry_parent_class)->focus_in_event(widget, event); } #if 0 static void gtk_file_chooser_entry_grab_focus(GtkWidget *widget) { GTK_WIDGET_CLASS(fm_path_entry_parent_class)->grab_focus(widget); gtk_editable_select_region(GTK_EDITABLE(widget), 0, (gint)-1); } #endif static gboolean fm_path_entry_focus_out_event(GtkWidget *widget, GdkEventFocus *event) { FmPathEntry *entry = FM_PATH_ENTRY(widget); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); /* disconnect from 'changed' signal since we don't do auto-completion * when we have no keyboard focus. */ priv->id_changed = 0; g_signal_handlers_disconnect_by_func(entry, fm_path_entry_changed, NULL); return GTK_WIDGET_CLASS(fm_path_entry_parent_class)->focus_out_event(widget, event); } #if GLIB_CHECK_VERSION(2, 36, 0) static void on_dir_list_finished(GObject *source_object, GAsyncResult *res, gpointer user_data) #else static gboolean on_dir_list_finished(gpointer user_data) #endif { ListSubDirNames* data = (ListSubDirNames*)user_data; FmPathEntry* entry = data->entry; FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); GList* l; FmPathEntryModel* new_model; /* final chance to check cancellable */ if(g_cancellable_is_cancelled(data->cancellable)) #if GLIB_CHECK_VERSION(2, 36, 0) return; #else return TRUE; #endif /* FIXME: check errors! */ new_model = fm_path_entry_model_new(priv->parent_dir); /* g_debug("dir list is finished!"); */ /* update the model */ for(l = data->subdirs; l; l=l->next) { char* name = l->data; gtk_list_store_insert_with_values((GtkListStore*)new_model, NULL, -1, COL_BASENAME, name, -1); } priv->folder_loaded = TRUE; priv->long_list = (g_list_length(data->subdirs) > 40); gtk_entry_completion_set_model(priv->completion, GTK_TREE_MODEL(new_model)); if(priv->model) g_object_unref(priv->model); priv->model = new_model; //if(entry->complete_on_load) //explicitly_complete(entry); update_inline_completion(priv); gtk_entry_completion_insert_prefix(priv->completion); gtk_entry_completion_complete(priv->completion); /* NOTE: after the content of entry gets changed, by default gtk+ installs * an timeout handler with timeout 300 ms to popup completion list. * If the dir listing takes more than 300 ms and finished after the * timeout callback is called, then the completion list is empty at * that time. So completion doesn't work. So, we trigger a 'changed' * signal here to let GtkEntry do the completion with the new model again. */ /* trigger completion popup. FIXME: this is a little bit dirty. * A even more dirty thing to do is to check if we finished after * 300 ms timeout happens. */ g_signal_emit_by_name(entry, "changed", 0); #if !GLIB_CHECK_VERSION(2, 36, 0) return TRUE; #endif } #if GLIB_CHECK_VERSION(2, 36, 0) static void list_sub_dirs(GTask *task, gpointer source_object, gpointer user_data, GCancellable *cancellable) #else static gboolean list_sub_dirs(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data) #endif { ListSubDirNames* data = (ListSubDirNames*)user_data; GError *err = NULL; /* g_debug("new dir listing job!"); */ GFileEnumerator* enu = g_file_enumerate_children(data->dir, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME"," G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME"," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, cancellable, NULL); if(enu) { while(!g_cancellable_is_cancelled(cancellable)) { GFileInfo* inf = g_file_enumerator_next_file(enu, cancellable, &err); if(inf) { GFileType type = g_file_info_get_file_type(inf); if(type == G_FILE_TYPE_DIRECTORY) { const char* name = g_file_info_get_edit_name(inf); if (!name) name = g_file_info_get_display_name(inf); data->subdirs = g_list_prepend(data->subdirs, g_strdup(name)); } g_object_unref(inf); } else { if(err) /* error happens */ g_clear_error(&err); else /* EOF */ break; } } g_object_unref(enu); } if(!g_cancellable_is_cancelled(cancellable)) #if GLIB_CHECK_VERSION(2, 36, 0) g_task_return_pointer(task, NULL, NULL); #else { /* finished! */ g_io_scheduler_job_send_to_mainloop(job, on_dir_list_finished, data, NULL); } return FALSE; #endif } static void list_sub_dir_names_free(gpointer user_data) { ListSubDirNames* data = (ListSubDirNames*)user_data; g_object_unref(data->dir); g_object_unref(data->cancellable); g_list_foreach(data->subdirs, (GFunc)g_free, NULL); g_list_free(data->subdirs); g_slice_free(ListSubDirNames, data); } static void fm_path_entry_changed(GtkEditable *editable, gpointer user_data) { FmPathEntry *entry = FM_PATH_ENTRY(editable); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); const gchar *path_str, *sep; #if GLIB_CHECK_VERSION(2, 36, 0) GTask *task; #endif if(priv->model == NULL) return; /* find parent dir of current path */ path_str = gtk_entry_get_text( GTK_ENTRY(entry) ); sep = g_utf8_strrchr(path_str, -1, G_DIR_SEPARATOR); if(sep) /* we found a parent dir */ { int parent_len = (sep - path_str) + 1; /* includes the dir separator / */ if(!priv->parent_dir || priv->parent_len != parent_len || strncmp(priv->parent_dir, path_str, parent_len )) { /* parent dir has been changed, reload dir list */ ListSubDirNames* data = g_slice_new0(ListSubDirNames); priv->folder_loaded = FALSE; clear_completion(priv); priv->parent_dir = g_strndup(path_str, parent_len); priv->parent_len = parent_len; fm_path_entry_model_set_parent_dir(priv->model, priv->parent_dir); /* g_debug("parent dir is changed to %s", priv->parent_dir); */ /* FIXME: convert utf-8 encoded path to on-disk encoding. */ data->entry = entry; if(priv->parent_dir[0] == '~') /* special case for home dir */ { char* expand = g_strconcat(fm_get_home_dir(), priv->parent_dir + 1, NULL); data->dir = fm_file_new_for_commandline_arg(expand); g_free(expand); } else { FmPath *p = fm_path_new_for_display_name(priv->parent_dir); data->dir = fm_path_to_gfile(p); fm_path_unref(p); } /* launch a new job to do dir listing */ if (G_LIKELY(priv->cancellable == NULL)) priv->cancellable = g_cancellable_new(); data->cancellable = (GCancellable*)g_object_ref(priv->cancellable); #if GLIB_CHECK_VERSION(2, 36, 0) task = g_task_new(editable, data->cancellable, on_dir_list_finished, data); g_task_set_task_data(task, data, list_sub_dir_names_free); g_task_set_priority(task, G_PRIORITY_LOW); g_task_run_in_thread(task, list_sub_dirs); g_object_unref(task); #else g_io_scheduler_push_job(list_sub_dirs, data, list_sub_dir_names_free, G_PRIORITY_LOW, data->cancellable); #endif } /* calculate the length of remaining part after / */ priv->typed_basename_len = strlen(sep + 1); } else /* clear all autocompletion thing. */ clear_completion(priv); } static void fm_path_entry_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { FmPathEntry *entry = FM_PATH_ENTRY(object); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); switch( prop_id ) { case PROP_HIGHLIGHT_COMPLETION_MATCH: priv->highlight_completion_match = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void fm_path_entry_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { FmPathEntry *entry = FM_PATH_ENTRY(object); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); switch( prop_id ) { case PROP_HIGHLIGHT_COMPLETION_MATCH: g_value_set_boolean(value, priv->highlight_completion_match); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void fm_path_entry_paste_and_go(GtkMenuItem *menuitem, GtkEntry *entry) { GtkClipboard* clipboard = gtk_clipboard_get_for_display( gtk_widget_get_display(GTK_WIDGET(menuitem)), GDK_SELECTION_CLIPBOARD); gchar* full_path = gtk_clipboard_wait_for_text(clipboard); if (full_path) { FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); if(priv->path) fm_path_unref(priv->path); /* special handling for home dir */ if(full_path[0] == '~' && full_path[1] == G_DIR_SEPARATOR) priv->path = fm_path_new_relative(fm_path_get_home(), full_path + 2); else if(full_path[0] == '~' && full_path[1] == 0) priv->path = fm_path_ref(fm_path_get_home()); else /* FIXME: use fm_path_new_for_display_name ? */ priv->path = fm_path_new_for_str(full_path); gchar * disp_name = fm_path_display_name(priv->path, FALSE); gtk_entry_set_text(entry, disp_name); g_free(disp_name); gtk_editable_set_position(GTK_EDITABLE(entry), -1); g_free(full_path); g_signal_emit_by_name(entry, "activate", 0); } } static void fm_path_entry_populate_popup(GtkEntry *entry, GtkMenu *menu, gpointer user_data) { GtkWidget* menuitem; GtkClipboard* clipboard = gtk_clipboard_get_for_display( gtk_widget_get_display(GTK_WIDGET(entry)), GDK_SELECTION_CLIPBOARD); menuitem = gtk_menu_item_new_with_mnemonic(_("Pa_ste and Go")); gtk_widget_show(menuitem); /* Insert menu item after default Paste menu item */ gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuitem, 3); g_signal_connect(menuitem, "activate", G_CALLBACK(fm_path_entry_paste_and_go), entry); if (!gtk_clipboard_wait_is_text_available(clipboard)) gtk_widget_set_sensitive(menuitem, FALSE); } static void fm_path_entry_init(FmPathEntry *entry) { FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); GtkEntryCompletion* completion = gtk_entry_completion_new(); GtkCellRenderer* render; AtkObject *obj; priv->model = fm_path_entry_model_new(NULL); priv->completion = completion; priv->cancellable = g_cancellable_new(); priv->highlight_completion_match = TRUE; gtk_entry_completion_set_minimum_key_length(completion, 1); gtk_entry_completion_set_match_func(completion, fm_path_entry_match_func, NULL, NULL); g_object_set(completion, "text_column", COL_FULL_PATH, NULL); gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(priv->model)); gtk_entry_set_completion(GTK_ENTRY(entry), completion); render = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(completion), render, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(completion), render, "text", COL_BASENAME); gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(completion), render, fm_path_entry_completion_render_func, entry, NULL); /* NOTE: this is to avoid a bug of gtk+. * The inline selection provided by GtkEntry is buggy. * If we change the content of the entry, it still stores * the old prefix sometimes so things don't work as expected. * So, unfortunately, we're not able to use this nice feature. * * Please see gtk_entry_completion_key_press() of gtk/gtkentry.c * and look for completion->priv->completion_prefix. */ /* gtk_entry_completion_set_inline_selection(completion, FALSE); */ /* gtk_entry_completion_set_inline_completion(completion, TRUE); */ gtk_entry_completion_set_popup_set_width(completion, TRUE); gtk_entry_completion_set_popup_single_match(completion, FALSE); /* connect to these signals rather than overriding default handlers since * we want to invoke our handlers before the default ones provided by Gtk. */ g_signal_connect(entry, "key-press-event", G_CALLBACK(fm_path_entry_key_press), NULL); g_signal_connect(entry, "activate", G_CALLBACK(fm_path_entry_activate), NULL); g_signal_connect(entry, "populate-popup", G_CALLBACK(fm_path_entry_populate_popup), NULL); obj = gtk_widget_get_accessible(GTK_WIDGET(entry)); atk_object_set_description(obj, _("Folder location bar")); } static void fm_path_entry_completion_render_func(GtkCellLayout *cell_layout, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gchar *model_file_name; int model_file_name_len; FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE( FM_PATH_ENTRY(data) ); gtk_tree_model_get(model, iter, COL_BASENAME, &model_file_name, -1); model_file_name_len = strlen(model_file_name); if( priv->highlight_completion_match && (model_file_name_len >= priv->typed_basename_len) ) { int buf_len = model_file_name_len + 14 + 1; gchar* markup = g_malloc(buf_len); gchar *trail = g_stpcpy(markup, ""); strncpy(trail, model_file_name, priv->typed_basename_len); trail += priv->typed_basename_len; trail = g_stpcpy(trail, ""); trail = g_stpcpy(trail, model_file_name + priv->typed_basename_len); g_object_set(cell, "markup", markup, NULL); g_free(markup); } /* FIXME: We don't need a custom render func if we don't hightlight */ else g_object_set(cell, "text", model_file_name, NULL); g_free(model_file_name); } static void fm_path_entry_dispose(GObject *object) { FmPathEntryPrivate* priv = FM_PATH_ENTRY_GET_PRIVATE(object); g_signal_handlers_disconnect_by_func(object, fm_path_entry_key_press, NULL); g_signal_handlers_disconnect_by_func(object, fm_path_entry_activate, NULL); gtk_entry_set_completion(GTK_ENTRY(object), NULL); clear_completion(priv); if(priv->completion) { gtk_entry_completion_set_model(priv->completion, NULL); g_object_unref(priv->completion); priv->completion = NULL; } if(priv->path) { fm_path_unref(priv->path); priv->path = NULL; } if(priv->model) { g_object_unref(priv->model); priv->model = NULL; } if(priv->cancellable) { g_cancellable_cancel(priv->cancellable); g_object_unref(priv->cancellable); priv->cancellable = NULL; } G_OBJECT_CLASS(fm_path_entry_parent_class)->dispose(object); } static void fm_path_entry_finalize(GObject *object) { FmPathEntryPrivate* priv = FM_PATH_ENTRY_GET_PRIVATE(object); g_free(priv->parent_dir); (*G_OBJECT_CLASS(fm_path_entry_parent_class)->finalize)(object); } /** * fm_path_entry_new * * Creates new path entry widget. * * Returns: (transfer full): a new #FmPathEntry object. * * Since: 0.1.0 */ FmPathEntry* fm_path_entry_new(void) { return g_object_new(FM_TYPE_PATH_ENTRY, NULL); } /** * fm_path_entry_set_path * @entry: a widget to apply * @path: new path to set * * Sets new path into enter field. * * Since: 0.1.10 */ void fm_path_entry_set_path(FmPathEntry *entry, FmPath* path) { FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); if(priv->path) fm_path_unref(priv->path); if(path) { priv->path = fm_path_ref(path); _set_entry_text_from_path(GTK_ENTRY(entry), priv); } else { priv->path = NULL; gtk_entry_set_text(GTK_ENTRY(entry), ""); } } static gboolean fm_path_entry_match_func(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data) { gboolean ret; GtkTreeModel *model = gtk_entry_completion_get_model(completion); FmPathEntry *entry = FM_PATH_ENTRY( gtk_entry_completion_get_entry(completion) ); FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); char *model_basename; const char* typed_basename; /* we don't use the case-insensitive key provided by entry completion here */ typed_basename = gtk_entry_get_text(GTK_ENTRY(entry)) + priv->parent_len; gtk_tree_model_get(model, iter, COL_BASENAME, &model_basename, -1); if (G_UNLIKELY(model_basename == NULL)) ret = FALSE; /* it is invalid if file name is empty but it's possible! */ else if(model_basename[0] == '.' && typed_basename[0] != '.') ret = FALSE; /* ignore hidden files when not requested. */ else if(priv->long_list && /* don't create too long lists */ (typed_basename[0] == '\0' /* "/xxx/" - no names here yet */ || (typed_basename[0] == '.' && typed_basename[1] == '\0'))) /* "/xxx/." */ ret = FALSE; else ret = g_str_has_prefix(model_basename, typed_basename); /* FIXME: should we be case insensitive here? */ g_free(model_basename); return ret; } /** * fm_path_entry_get_path * @entry: the widget to inspect * * Retrieves the current path in the @entry. Returned data are owned by * @entry and should be not freed by caller. * * Returns: (transfer none): the current path. * * Since: 0.1.10 */ FmPath* fm_path_entry_get_path(FmPathEntry *entry) { FmPathEntryPrivate *priv = FM_PATH_ENTRY_GET_PRIVATE(entry); return priv->path; } /* ------------------------------------------------------------------------ * custom tree model implementation. */ static void fm_path_entry_model_init(FmPathEntryModel *model) { GType cols[] = {G_TYPE_STRING, G_TYPE_STRING}; gtk_list_store_set_column_types(GTK_LIST_STORE(model), G_N_ELEMENTS(cols), cols); } static void fm_path_entry_model_finalize(GObject *object) { g_free(((FmPathEntryModel*)object)->parent_dir); (*G_OBJECT_CLASS(fm_path_entry_model_parent_class)->finalize)(object); } static void fm_path_entry_model_class_init(FmPathEntryModelClass *klass) { GObjectClass* object_class = G_OBJECT_CLASS(klass); object_class->finalize = fm_path_entry_model_finalize; } static void fm_path_entry_model_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) { FmPathEntryModel *model = (FmPathEntryModel*)tree_model; if(column == COL_FULL_PATH) { char* full_path; parent_tree_model_interface->get_value(tree_model, iter, COL_BASENAME, value); full_path = g_strconcat(model->parent_dir, g_value_get_string(value), NULL); g_value_take_string(value, full_path); } else parent_tree_model_interface->get_value(tree_model, iter, column, value); } static void fm_path_entry_model_iface_init(GtkTreeModelIface *iface) { parent_tree_model_interface = g_type_interface_peek_parent(iface); iface->get_value = fm_path_entry_model_get_value; } static void fm_path_entry_model_set_parent_dir(FmPathEntryModel* model, const char *dir) { g_free(model->parent_dir); model->parent_dir = dir ? g_strdup(dir) : NULL; } static FmPathEntryModel* fm_path_entry_model_new(const char *parent_dir) { FmPathEntryModel* model = g_object_new(FM_TYPE_PATH_ENTRY_MODEL, NULL); fm_path_entry_model_set_parent_dir(model, parent_dir); return model; } libfm-1.4.0/src/gtk/fm-path-entry.h000066400000000000000000000037061475513661000170430ustar00rootroot00000000000000/* * fm-path-entry.h * * Copyright 2009 PCMan * Copyright 2009 Jürgen Hötzel * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_PATH_ENTRY_H__ #define __FM_PATH_ENTRY_H__ #include #include #include "fm-path.h" G_BEGIN_DECLS #define FM_TYPE_PATH_ENTRY (fm_path_entry_get_type()) #define FM_PATH_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), FM_TYPE_PATH_ENTRY, FmPathEntry)) #define FM_PATH_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), FM_TYPE_PATH_ENTRY, FmPathEntryClass)) #define FM_IS_TYPE_PATH_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FM_TYPE_PATH_ENTRY)) #define FM_IS_TYPE_PATH_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FM_TYPE_PATH_ENTRY), FmPathEntry) typedef struct _FmPathEntry FmPathEntry; typedef struct _FmPathEntryClass FmPathEntryClass; GType fm_path_entry_get_type(void); FmPathEntry* fm_path_entry_new(); void fm_path_entry_set_path(FmPathEntry *entry, FmPath* path); /* The function does not increase ref count. The caller is responsible for calling * fm_path_ref if it wants to keep the path. */ FmPath* fm_path_entry_get_path(FmPathEntry *entry); G_END_DECLS #endif /* __FM_PATH_ENTRY_H__ */ libfm-1.4.0/src/gtk/fm-places-model.c000066400000000000000000001437061475513661000173150ustar00rootroot00000000000000/* * fm-places-model.c * * Copyright 2010 - 2012 Hong Jen Yee (PCMan) * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-places-model * @short_description: A model for side panel with places list. * @title: FmPlacesModel * * @include: libfm/fm-gtk.h * * The #FmPlacesModel represents list of pseudo-folders which contains * such items as Home directory, Trash bin, mounted removable drives, * bookmarks, etc. It is used by #FmPlacesView to display them in the * side panel. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-places-model.h" #include "fm-file.h" #include #include "fm-config.h" #include "fm-monitor.h" #include "fm-file-info-job.h" /* standard items order */ typedef enum { FM_PLACES_ID_HOME, FM_PLACES_ID_DESKTOP, FM_PLACES_ID_TRASH, FM_PLACES_ID_ROOT, FM_PLACES_ID_APPLICATIONS, FM_PLACES_ID_COMPUTER, FM_PLACES_ID_NETWORK, FM_PLACES_ID_OTHER } FmPlacesOrder; struct _FmPlacesItem { FmPlacesType type; gboolean mounted : 1; /* used if type == FM_PLACES_ITEM_VOLUME */ FmPlacesOrder id : 4; /* used if type == FM_PLACES_ITEM_PATH */ FmIcon* icon; FmFileInfo* fi; union { GVolume* volume; /* used if type == FM_PLACES_ITEM_VOLUME */ GMount* mount; /* used if type == FM_PLACES_ITEM_MOUNT */ FmBookmarkItem* bm_item; /* used if type == FM_PLACES_ITEM_PATH */ }; }; struct _FmPlacesModel { GtkListStore parent; GVolumeMonitor* vol_mon; FmBookmarks* bookmarks; GtkTreeRowReference* separator; GtkTreeRowReference* trash; GFileMonitor* trash_monitor; guint trash_idle_handler; guint theme_change_handler; guint use_trash_change_handler; guint pane_icon_size_change_handler; guint places_home_change_handler; guint places_desktop_change_handler; guint places_root_change_handler; guint places_computer_change_handler; guint places_trash_change_handler; guint places_applications_change_handler; guint places_network_change_handler; guint places_unmounted_change_handler; GdkPixbuf* eject_icon; GSList* jobs; }; struct _FmPlacesModelClass { GtkListStoreClass parent_class; }; static void create_trash_item(FmPlacesModel* model); static void place_item_free(FmPlacesItem* item) { switch(item->type) { case FM_PLACES_ITEM_VOLUME: g_object_unref(item->volume); break; case FM_PLACES_ITEM_MOUNT: g_object_unref(item->mount); break; case FM_PLACES_ITEM_PATH: if(item->bm_item) fm_bookmark_item_unref(item->bm_item); break; case FM_PLACES_ITEM_NONE: ; } if(G_LIKELY(item->icon)) g_object_unref(item->icon); if(G_LIKELY(item->fi)) fm_file_info_unref(item->fi); g_slice_free(FmPlacesItem, item); } static void on_file_info_job_finished(FmFileInfoJob* job, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); GList* l; GtkTreeIter it; FmPlacesItem* item; FmFileInfo* fi; FmPath* path; FmIcon* icon; GdkPixbuf* pix; /* g_debug("file info job finished"); */ model->jobs = g_slist_remove(model->jobs, job); g_signal_handlers_disconnect_by_func(job, on_file_info_job_finished, model); if(!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &it)) goto finished; if(fm_file_info_list_is_empty(job->file_infos)) goto finished; /* optimize for one file case */ if(fm_file_info_list_get_length(job->file_infos) == 1) { fi = fm_file_info_list_peek_head(job->file_infos); do { item = NULL; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if( item && item->fi && (path = fm_file_info_get_path(item->fi)) && fm_path_equal(path, fm_file_info_get_path(fi)) ) { fm_file_info_unref(item->fi); item->fi = fm_file_info_ref(fi); break; } }while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it)); } else { do { item = NULL; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if( item && item->fi && (path = fm_file_info_get_path(item->fi)) ) { for(l = fm_file_info_list_peek_head_link(job->file_infos); l; l = l->next ) { fi = FM_FILE_INFO(l->data); if(fm_path_equal(path, fm_file_info_get_path(fi))) { fm_file_info_unref(item->fi); item->fi = fm_file_info_ref(fi); /* only update the icon if the item is not a volume or mount. */ if(item->type == FM_PLACES_ITEM_PATH) { icon = fm_file_info_get_icon(fi); /* replace the icon with updated data */ if(icon && icon != item->icon) { g_object_unref(item->icon); item->icon = g_object_ref(icon); pix = fm_pixbuf_from_icon(icon, fm_config->pane_icon_size); gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_ICON, pix, -1); } } /* remove the file from list to speed up further loading. * This won't cause problem since nobody else if using the list. */ fm_file_info_list_delete_link(job->file_infos, l); break; } } } }while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it)); } finished: g_object_unref(job); } static void update_volume_or_mount(FmPlacesModel* model, FmPlacesItem* item, GtkTreeIter* it, FmFileInfoJob* job) { GIcon* gicon; char* name; GdkPixbuf* pix; GMount* mount; FmPath* path; if(item->type == FM_PLACES_ITEM_VOLUME) { name = g_volume_get_name(item->volume); gicon = g_volume_get_icon(item->volume); mount = g_volume_get_mount(item->volume); } else if(G_LIKELY(item->type == FM_PLACES_ITEM_MOUNT)) { name = g_mount_get_name(item->mount); gicon = g_mount_get_icon(item->mount); mount = g_object_ref(item->mount); } else return; /* FIXME: is it possible? */ if(item->icon) g_object_unref(item->icon); item->icon = fm_icon_from_gicon(gicon); g_object_unref(gicon); if(mount) { GFile* gf = g_mount_get_root(mount); path = fm_path_new_for_gfile(gf); g_object_unref(gf); g_object_unref(mount); item->mounted = TRUE; } else { path = NULL; item->mounted = FALSE; } if(!fm_path_equal(fm_file_info_get_path(item->fi), path)) { fm_file_info_set_path(item->fi, path); if(path) { if(job) fm_file_info_job_add(job, path); else { job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_FOLLOW_SYMLINK); fm_file_info_job_add(job, path); model->jobs = g_slist_prepend(model->jobs, job); g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), model); if (!fm_job_run_async(FM_JOB(job))) { model->jobs = g_slist_remove(model->jobs, job); g_object_unref(job); g_critical("fm_job_run_async() failed on mount update"); } } fm_path_unref(path); } else /* we might get it just unmounted so just reset file info */ { fm_file_info_unref(item->fi); item->fi = fm_file_info_new(); } } pix = fm_pixbuf_from_icon(item->icon, fm_config->pane_icon_size); gtk_list_store_set(GTK_LIST_STORE(model), it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, name, -1); g_object_unref(pix); g_free(name); } static inline FmPlacesItem* add_new_item(GtkListStore* model, FmPlacesType type, GtkTreeIter *it, GtkTreePath* at) { GtkTreeIter next_it; FmPlacesItem* item = g_slice_new0(FmPlacesItem); item->fi = fm_file_info_new(); item->type = type; if(at) { gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &next_it, at); gtk_list_store_insert_before(model, it, &next_it); } else gtk_list_store_append(model, it); gtk_list_store_set(model, it, FM_PLACES_MODEL_COL_INFO, item, -1); return item; } static FmPlacesItem* new_path_item(GtkListStore* model, GtkTreeIter* it, FmPath* path, FmPlacesOrder id, const char* label, const char* icon_name, FmFileInfoJob* job) { FmPlacesItem* item = g_slice_new0(FmPlacesItem); FmPlacesItem* tst; GdkPixbuf* pix; GtkTreeIter next_it; item->fi = fm_file_info_new(); item->type = FM_PLACES_ITEM_PATH; item->id = id; item->icon = fm_icon_from_name(icon_name); if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &next_it)) do { tst = NULL; gtk_tree_model_get(GTK_TREE_MODEL(model), &next_it, FM_PLACES_MODEL_COL_INFO, &tst, -1); if(!tst || tst->type != FM_PLACES_ITEM_PATH || tst->id > id) { gtk_list_store_insert_before(model, it, &next_it); goto _added; } else if(tst->id == id) { *it = next_it; place_item_free(tst); g_critical("duplicate places view item"); goto _added; } } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &next_it)); gtk_list_store_append(model, it); _added: pix = fm_pixbuf_from_icon(item->icon, fm_config->pane_icon_size); gtk_list_store_set(model, it, FM_PLACES_MODEL_COL_INFO, item, FM_PLACES_MODEL_COL_LABEL, label, FM_PLACES_MODEL_COL_ICON, pix, -1); g_object_unref(pix); fm_file_info_set_path(item->fi, path); if(job) fm_file_info_job_add(job, path); else { FmPlacesModel* self = FM_PLACES_MODEL(model); job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_FOLLOW_SYMLINK); fm_file_info_job_add(job, path); g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), model); self->jobs = g_slist_prepend(self->jobs, job); if (!fm_job_run_async(FM_JOB(job))) { self->jobs = g_slist_remove(self->jobs, job); g_object_unref(job); g_critical("fm_job_run_async() failed on update '%s'", label); } } return item; } static void remove_path_item(GtkListStore* model, FmPlacesOrder id) { FmPlacesItem* item; GtkTreeIter it; if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &it)) do { item = NULL; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(!item || item->type != FM_PLACES_ITEM_PATH || item->id > id) return; /* not found! */ if(item->id == id) { gtk_list_store_remove(model, &it); place_item_free(item); return; } } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it)); } static void add_volume_or_mount(FmPlacesModel* model, GObject* volume_or_mount, FmFileInfoJob* job) { FmPlacesItem* item; GtkTreePath* tp; GtkTreeIter it; if(G_IS_VOLUME(volume_or_mount)) { tp = gtk_tree_row_reference_get_path(model->separator); item = add_new_item(GTK_LIST_STORE(model), FM_PLACES_ITEM_VOLUME, &it, tp); gtk_tree_path_free(tp); item->volume = G_VOLUME(g_object_ref(volume_or_mount)); } else if(G_IS_MOUNT(volume_or_mount)) { tp = gtk_tree_row_reference_get_path(model->separator); item = add_new_item(GTK_LIST_STORE(model), FM_PLACES_ITEM_MOUNT, &it, tp); gtk_tree_path_free(tp); item->mount = G_MOUNT(g_object_ref(volume_or_mount)); } else { /* NOTE: this is impossible, unless a bug exists */ return; } update_volume_or_mount(model, item, &it, job); } static FmPlacesItem* find_volume(FmPlacesModel* model, GVolume* volume, GtkTreeIter* _it) { GtkTreeIter it; if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &it)) { do { FmPlacesItem* item; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item == NULL) /* separator item has all columns NULL */ return item; if(item->type == FM_PLACES_ITEM_VOLUME && item->volume == volume) { *_it = it; return item; } }while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it)); } return NULL; } static FmPlacesItem* find_mount(FmPlacesModel* model, GMount* mount, GtkTreeIter* _it) { GtkTreeIter it; if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &it)) { do { FmPlacesItem* item; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item == NULL) /* separator item has all columns NULL */ return item; if(item->type == FM_PLACES_ITEM_MOUNT && item->mount == mount) { *_it = it; return item; } }while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it)); } return NULL; } static void on_volume_added(GVolumeMonitor* vm, GVolume* volume, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); FmPlacesItem* item; GMount *mount; GtkTreeIter it; /* nothing to do if we don't show unmounted volumes */ if (!fm_config->places_unmounted) return; /* for some unknown reasons, sometimes we get repeated volume-added * signals and added a device more than one. So, make a sanity check here. */ item = find_volume(model, volume, &it); if (!item) { /* SF bug #850 - some mounts are announced before appropriate volume by GLib, see https://bugzilla.gnome.org/show_bug.cgi?id=730347 */ mount = g_volume_get_mount(volume); if (mount) { item = find_mount(model, mount, &it); if (item) { g_object_unref(item->mount); item->type = FM_PLACES_ITEM_VOLUME; item->volume = g_object_ref(volume); update_volume_or_mount(model, item, &it, NULL); } g_object_unref(mount); } } if(!item) add_volume_or_mount(model, G_OBJECT(volume), NULL); } static void on_volume_removed(GVolumeMonitor* vm, GVolume* volume, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); FmPlacesItem* item; GtkTreeIter it; item = find_volume(model, volume, &it); if(item) { gtk_list_store_remove(GTK_LIST_STORE(model), &it); place_item_free(item); } } static void on_volume_changed(GVolumeMonitor* vm, GVolume* volume, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); FmPlacesItem* item; GtkTreeIter it; /* g_debug("vol-changed"); */ item = find_volume(model, volume, &it); if(item) update_volume_or_mount(model, item, &it, NULL); } static void on_mount_added(GVolumeMonitor* vm, GMount* mount, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); GVolume* vol; if (g_mount_is_shadowed(mount)) return; vol = g_mount_get_volume(mount); if(vol) { /* mount-added is also emitted when a volume is newly mounted. */ FmPlacesItem *item; GtkTreeIter it; item = find_volume(model, vol, &it); /* update the mounted volume and show a button for eject. */ if(item && item->type == FM_PLACES_ITEM_VOLUME && !fm_file_info_get_path(item->fi)) { GtkTreePath* tp; /* we need full update for it to get adequate context menu */ update_volume_or_mount(model, item, &it, NULL); /* inform the view to update mount indicator */ tp = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &it); gtk_tree_model_row_changed(GTK_TREE_MODEL(model), tp, &it); gtk_tree_path_free(tp); } else if (!item) /* we might not get volume for it yet or ignored it before */ add_volume_or_mount(model, G_OBJECT(mount), NULL); g_object_unref(vol); } else /* network mounts and others */ { FmPlacesItem* item; GtkTreeIter it; /* for some unknown reasons, sometimes we get repeated mount-added * signals and added a device more than one. So, make a sanity check here. */ item = find_mount(model, mount, &it); if(!item) add_volume_or_mount(model, G_OBJECT(mount), NULL); } } static void on_mount_changed(GVolumeMonitor* vm, GMount* mount, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); FmPlacesItem* item; GtkTreeIter it; item = find_mount(model, mount, &it); if(item) update_volume_or_mount(model, item, &it, NULL); } static void on_mount_removed(GVolumeMonitor* vm, GMount* mount, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); GVolume* vol = g_mount_get_volume(mount); if(vol) /* we handle volumes in volume-removed handler */ g_object_unref(vol); else /* network mounts and others */ { GtkTreeIter it; FmPlacesItem* item = find_mount(model, mount, &it); if(item) { gtk_list_store_remove(GTK_LIST_STORE(model), &it); place_item_free(item); } } } static void add_bookmarks(FmPlacesModel* model, FmFileInfoJob* job) { FmPlacesItem* item; GList *bms, *l; FmIcon* icon = fm_icon_from_name("folder"); FmIcon* remote_icon = NULL; GdkPixbuf* folder_pix = fm_pixbuf_from_icon(icon, fm_config->pane_icon_size); GdkPixbuf* remote_pix = NULL; bms = fm_bookmarks_get_all(model->bookmarks); for(l=bms;l;l=l->next) { FmBookmarkItem* bm = (FmBookmarkItem*)l->data; GtkTreeIter it; GdkPixbuf* pix; FmPath* path = bm->path; item = add_new_item(GTK_LIST_STORE(model), FM_PLACES_ITEM_PATH, &it, NULL); fm_file_info_set_path(item->fi, path); fm_file_info_job_add(job, path); if(fm_path_is_native(path)) { item->icon = g_object_ref(icon); pix = folder_pix; } else { if(G_UNLIKELY(!remote_icon)) { remote_icon = fm_icon_from_name("folder-remote"); remote_pix = fm_pixbuf_from_icon(remote_icon, fm_config->pane_icon_size); } item->icon = g_object_ref(remote_icon); pix = remote_pix; } item->bm_item = bm; item->id = FM_PLACES_ID_OTHER; gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_ICON, pix, FM_PLACES_MODEL_COL_LABEL, bm->name, -1); } g_list_free(bms); g_object_unref(folder_pix); g_object_unref(icon); if(remote_icon) { g_object_unref(remote_icon); if(remote_pix) g_object_unref(remote_pix); } } static void on_bookmarks_changed(FmBookmarks* bm, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); FmFileInfoJob* job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_FOLLOW_SYMLINK); GtkTreePath* tp = gtk_tree_row_reference_get_path(model->separator); GtkTreeIter it; gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp); gtk_tree_path_free(tp); /* remove all old bookmarks */ if(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it)) { while(gtk_list_store_remove(GTK_LIST_STORE(model), &it)) continue; } add_bookmarks(model, job); g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), model); model->jobs = g_slist_prepend(model->jobs, job); if (!fm_job_run_async(FM_JOB(job))) { model->jobs = g_slist_remove(model->jobs, job); g_object_unref(job); g_critical("fm_job_run_async() failed for bookmark update"); } } static gboolean update_trash_item(gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); if(!g_source_is_destroyed(g_main_current_source()) && fm_config->use_trash && model->trash) { GFile* gf = fm_file_new_for_uri("trash:///"); GFileInfo* inf = g_file_query_info(gf, G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT, 0, NULL, NULL); g_object_unref(gf); if(inf) { FmIcon* icon; const char* icon_name; FmPlacesItem* item = NULL; GdkPixbuf* pix; GtkTreePath* tp = gtk_tree_row_reference_get_path(model->trash); GtkTreeIter it; guint32 n = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT); g_object_unref(inf); g_assert(tp != NULL); /* FIXME: how can tp be invalid here? */ icon_name = n > 0 ? "user-trash-full" : "user-trash"; icon = fm_icon_from_name(icon_name); gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp); gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item->icon) g_object_unref(item->icon); item->icon = icon; /* update the icon */ pix = fm_pixbuf_from_icon(item->icon, fm_config->pane_icon_size); gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_ICON, pix, -1); g_object_unref(pix); gtk_tree_path_free(tp); } } return FALSE; } static void on_trash_changed(GFileMonitor *monitor, GFile *gf, GFile *other, GFileMonitorEvent evt, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); if(model->trash_idle_handler) g_source_remove(model->trash_idle_handler); model->trash_idle_handler = gdk_threads_add_idle(update_trash_item, model); } static void update_icons(FmPlacesModel* model) { GtkTreeIter it; FmIcon* icon; GdkPixbuf* pix; /* update the eject icon */ icon = fm_icon_from_name("media-eject"); pix = fm_pixbuf_from_icon(icon, fm_config->pane_icon_size); g_object_unref(icon); if(model->eject_icon) g_object_unref(model->eject_icon); model->eject_icon = pix; /* reload icon for every item */ gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &it); do{ FmPlacesItem* item = NULL; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item) /* separator item has all columns NULL */ { pix = fm_pixbuf_from_icon(item->icon, fm_config->pane_icon_size); gtk_list_store_set(GTK_LIST_STORE(model), &it, FM_PLACES_MODEL_COL_ICON, pix, -1); g_object_unref(pix); } }while( gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it) ); } static void on_use_trash_changed(FmConfig* cfg, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); if(cfg->use_trash && cfg->places_trash && model->trash == NULL) create_trash_item(model); else if((!cfg->use_trash || !cfg->places_trash) && model->trash) { FmPlacesItem *item = NULL; GtkTreePath* tp = gtk_tree_row_reference_get_path(model->trash); GtkTreeIter it; gtk_tree_row_reference_free(model->trash); model->trash = NULL; gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp); gtk_tree_path_free(tp); gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); gtk_list_store_remove(GTK_LIST_STORE(model), &it); place_item_free(item); if(model->trash_monitor) { g_signal_handlers_disconnect_by_func(model->trash_monitor, on_trash_changed, model); g_object_unref(model->trash_monitor); model->trash_monitor = NULL; } if(model->trash_idle_handler) { g_source_remove(model->trash_idle_handler); model->trash_idle_handler = 0; } } } static void on_places_home_changed(FmConfig* cfg, gpointer user_data) { GtkListStore* model = GTK_LIST_STORE(user_data); GtkTreeIter it; if(cfg->places_home) { FmPath* path = fm_path_get_home(); new_path_item(model, &it, path, FM_PLACES_ID_HOME, _("Home Folder"), "user-home", NULL); } else { remove_path_item(model, FM_PLACES_ID_HOME); } } static void on_places_desktop_changed(FmConfig* cfg, gpointer user_data) { GtkListStore* model = GTK_LIST_STORE(user_data); GtkTreeIter it; if(cfg->places_desktop && g_file_test(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP), G_FILE_TEST_IS_DIR)) { new_path_item(model, &it, fm_path_get_desktop(), FM_PLACES_ID_DESKTOP, _("Desktop"), "user-desktop", NULL); } else { remove_path_item(model, FM_PLACES_ID_DESKTOP); } } static void on_places_applications_changed(FmConfig* cfg, gpointer user_data) { GtkListStore* model = GTK_LIST_STORE(user_data); GtkTreeIter it; if (!fm_module_is_in_use("vfs", "menu")) ; /* not in use */ else if(cfg->places_applications) { new_path_item(model, &it, fm_path_get_apps_menu(), FM_PLACES_ID_APPLICATIONS, _("Applications"), "system-software-install", NULL); } else { remove_path_item(model, FM_PLACES_ID_APPLICATIONS); } } static void on_places_root_changed(FmConfig* cfg, gpointer user_data) { GtkListStore* model = GTK_LIST_STORE(user_data); GtkTreeIter it; if(cfg->places_root) { new_path_item(model, &it, fm_path_get_root(), FM_PLACES_ID_ROOT, _("Filesystem Root"), "drive-harddisk", NULL); } else { remove_path_item(model, FM_PLACES_ID_ROOT); } } static void on_places_computer_changed(FmConfig* cfg, gpointer user_data) { GtkListStore* model = GTK_LIST_STORE(user_data); GtkTreeIter it; if(cfg->places_computer) { FmPath* path = fm_path_new_for_uri("computer:///"); new_path_item(model, &it, path, FM_PLACES_ID_COMPUTER, _("Devices"), "computer", NULL); fm_path_unref(path); } else { remove_path_item(model, FM_PLACES_ID_COMPUTER); } } static void on_places_network_changed(FmConfig* cfg, gpointer user_data) { GtkListStore* model = GTK_LIST_STORE(user_data); GtkTreeIter it; if(cfg->places_network) { FmPath* path = fm_path_new_for_uri("network:///"); new_path_item(model, &it, path, FM_PLACES_ID_NETWORK, _("Network"), GTK_STOCK_NETWORK, NULL); fm_path_unref(path); } else { remove_path_item(model, FM_PLACES_ID_NETWORK); } } static void on_pane_icon_size_changed(FmConfig* cfg, gpointer user_data) { FmPlacesModel* model = FM_PLACES_MODEL(user_data); update_icons(model); } static void create_trash_item(FmPlacesModel* model) { GtkTreeIter it; GtkTreePath* trash_path; GFile* gf; gf = fm_file_new_for_uri("trash:///"); if (!g_file_query_exists(gf, NULL)) { g_object_unref(gf); return; } model->trash_monitor = fm_monitor_directory(gf, NULL); g_signal_connect(model->trash_monitor, "changed", G_CALLBACK(on_trash_changed), model); g_object_unref(gf); new_path_item(GTK_LIST_STORE(model), &it, fm_path_get_trash(), FM_PLACES_ID_TRASH, _("Trash Can"), "user-trash", NULL); trash_path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &it); model->trash = gtk_tree_row_reference_new(GTK_TREE_MODEL(model), trash_path); gtk_tree_path_free(trash_path); if(0 == model->trash_idle_handler) model->trash_idle_handler = gdk_threads_add_idle(update_trash_item, model); } static void on_places_unmounted_changed(FmConfig* cfg, gpointer user_data) { FmPlacesModel *model = FM_PLACES_MODEL(user_data); GVolume *vol; FmPlacesItem *item; GList *vols, *l; FmFileInfoJob *job = NULL; GtkTreeIter it; if (cfg->places_unmounted) job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_NONE); vols = g_volume_monitor_get_volumes(model->vol_mon); for (l = vols; l; l = l->next) { vol = G_VOLUME(l->data); item = find_volume(model, vol, &it); if (item) { if (!cfg->places_unmounted) /* it is there but should be not */ { gtk_list_store_remove(GTK_LIST_STORE(model), &it); place_item_free(item); } } else if (cfg->places_unmounted) /* not found but should be added */ add_volume_or_mount(model, G_OBJECT(vol), job); g_object_unref(vol); } if (job) { g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), model); model->jobs = g_slist_prepend(model->jobs, job); if (!fm_job_run_async(FM_JOB(job))) { model->jobs = g_slist_remove(model->jobs, job); g_object_unref(job); g_critical("fm_job_run_async() failed on volumes update"); } } g_list_free(vols); } static void fm_places_model_init(FmPlacesModel *self) { GType types[] = {GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER}; GtkTreeIter it; GList *vols, *l; FmIcon *icon; FmFileInfoJob* job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_FOLLOW_SYMLINK); GtkListStore* model = &self->parent; FmPath *path; GtkTreePath* tp; gtk_list_store_set_column_types(&self->parent, FM_PLACES_MODEL_N_COLS, types); self->theme_change_handler = g_signal_connect_swapped(gtk_icon_theme_get_default(), "changed", G_CALLBACK(update_icons), self); self->use_trash_change_handler = g_signal_connect(fm_config, "changed::use_trash", G_CALLBACK(on_use_trash_changed), self); self->places_home_change_handler = g_signal_connect(fm_config, "changed::places_home", G_CALLBACK(on_places_home_changed), self); self->places_desktop_change_handler = g_signal_connect(fm_config, "changed::places_desktop", G_CALLBACK(on_places_desktop_changed), self); self->places_root_change_handler = g_signal_connect(fm_config, "changed::places_root", G_CALLBACK(on_places_root_changed), self); self->places_computer_change_handler = g_signal_connect(fm_config, "changed::places_computer", G_CALLBACK(on_places_computer_changed), self); self->places_trash_change_handler = g_signal_connect(fm_config, "changed::places_trash", G_CALLBACK(on_use_trash_changed), self); self->places_applications_change_handler = g_signal_connect(fm_config, "changed::places_applications", G_CALLBACK(on_places_applications_changed), self); self->places_network_change_handler = g_signal_connect(fm_config, "changed::places_network", G_CALLBACK(on_places_network_changed), self); self->places_unmounted_change_handler = g_signal_connect(fm_config, "changed::places_unmounted", G_CALLBACK(on_places_unmounted_changed), self); self->pane_icon_size_change_handler = g_signal_connect(fm_config, "changed::pane_icon_size", G_CALLBACK(on_pane_icon_size_changed), self); icon = fm_icon_from_name("media-eject"); self->eject_icon = fm_pixbuf_from_icon(icon, fm_config->pane_icon_size); g_object_unref(icon); if(fm_config->places_home) { path = fm_path_get_home(); new_path_item(model, &it, path, FM_PLACES_ID_HOME, _("Home Folder"), "user-home", job); } /* Only show desktop in side pane when the user has a desktop dir. */ if(fm_config->places_desktop && g_file_test(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP), G_FILE_TEST_IS_DIR)) { new_path_item(model, &it, fm_path_get_desktop(), FM_PLACES_ID_DESKTOP, _("Desktop"), "user-desktop", job); } if(fm_config->places_root) { new_path_item(model, &it, fm_path_get_root(), FM_PLACES_ID_ROOT, _("Filesystem Root"), "drive-harddisk", job); } if(fm_config->places_computer) { path = fm_path_new_for_uri("computer:///"); new_path_item(model, &it, path, FM_PLACES_ID_COMPUTER, _("Devices"), "computer", job); fm_path_unref(path); } if(fm_config->places_applications && fm_module_is_in_use("vfs", "menu")) { new_path_item(model, &it, fm_path_get_apps_menu(), FM_PLACES_ID_APPLICATIONS, _("Applications"), "system-software-install", job); } if(fm_config->places_network) { path = fm_path_new_for_uri("network:///"); new_path_item(model, &it, path, FM_PLACES_ID_NETWORK, _("Network"), GTK_STOCK_NETWORK, job); fm_path_unref(path); } /* volumes */ self->vol_mon = g_volume_monitor_get(); if(self->vol_mon) { g_signal_connect(self->vol_mon, "volume-added", G_CALLBACK(on_volume_added), self); g_signal_connect(self->vol_mon, "volume-removed", G_CALLBACK(on_volume_removed), self); g_signal_connect(self->vol_mon, "volume-changed", G_CALLBACK(on_volume_changed), self); g_signal_connect(self->vol_mon, "mount-added", G_CALLBACK(on_mount_added), self); g_signal_connect(self->vol_mon, "mount-changed", G_CALLBACK(on_mount_changed), self); g_signal_connect(self->vol_mon, "mount-removed", G_CALLBACK(on_mount_removed), self); } /* separator */ gtk_list_store_append(model, &it); tp = gtk_tree_model_get_path(GTK_TREE_MODEL(self), &it); self->separator = gtk_tree_row_reference_new(GTK_TREE_MODEL(self), tp); gtk_tree_path_free(tp); /* separator has all columns NULL */ if(fm_config->use_trash && fm_config->places_trash) create_trash_item(self); /* add volumes to side-pane */ /* respect fm_config->places_unmounted */ if (fm_config->places_unmounted) { vols = g_volume_monitor_get_volumes(self->vol_mon); for(l=vols;l;l=l->next) { GVolume* vol = G_VOLUME(l->data); add_volume_or_mount(self, G_OBJECT(vol), job); g_object_unref(vol); } g_list_free(vols); } /* add mounts to side-pane */ vols = g_volume_monitor_get_mounts(self->vol_mon); for(l=vols;l;l=l->next) { GMount* mount = G_MOUNT(l->data); GVolume* volume = g_mount_get_volume(mount); if(volume) g_object_unref(volume); else /* network mounts or others */ add_volume_or_mount(self, G_OBJECT(mount), job); g_object_unref(mount); } g_list_free(vols); self->bookmarks = fm_bookmarks_dup(); /* bookmarks */ if(self->bookmarks) g_signal_connect(self->bookmarks, "changed", G_CALLBACK(on_bookmarks_changed), self); /* add bookmarks to side pane */ add_bookmarks(self, job); g_signal_connect(job, "finished", G_CALLBACK(on_file_info_job_finished), self); self->jobs = g_slist_prepend(self->jobs, job); if (!fm_job_run_async(FM_JOB(job))) { self->jobs = g_slist_remove(self->jobs, job); g_object_unref(job); g_critical("fm_job_run_async() failed on places view init"); } } /** * fm_places_model_get_separator_path * @model: a places model instance * * Retrieves path to separator between places and bookmark items. Returned * path should be freed with gtk_tree_path_free() after usage. * * Returns: (transfer full): the path to separator. * * Since: 0.1.14 */ GtkTreePath* fm_places_model_get_separator_path(FmPlacesModel* model) { return gtk_tree_row_reference_get_path(model->separator); } /** * fm_places_model_get_bookmarks * @model: a places model instance * * Retrieves list of bookmarks that is used by the @model. Returned data * are owned by places model and should not be freed by caller. * * Returns: (transfer none): list of bookmarks. * * Since: 1.0.0 */ FmBookmarks* fm_places_model_get_bookmarks(FmPlacesModel* model) { return model->bookmarks; } /** * fm_places_model_iter_is_separator * @model: a places model instance * @it: model iterator to inspect * * Checks if the row described in @it is a separator. * * Returns: %TRUE if the row is a separator. * * Since: 0.1.14 */ gboolean fm_places_model_iter_is_separator(FmPlacesModel* model, GtkTreeIter* it) { gpointer item = NULL; if(it == NULL) return FALSE; gtk_tree_model_get(GTK_TREE_MODEL(model), it, FM_PLACES_MODEL_COL_INFO, &item, -1); return (item == NULL); } /** * fm_places_model_path_is_separator * @model: a places model instance * @tp: the row path to inspect * * Checks if the row by @tp is a separator between places and bookmarks. * * Returns: %TRUE if the row is a separator. * * Since: 0.1.14 */ gboolean fm_places_model_path_is_separator(FmPlacesModel* model, GtkTreePath* tp) { GtkTreePath* sep_tp; gboolean ret = FALSE; if(tp) { sep_tp = gtk_tree_row_reference_get_path(model->separator); ret = gtk_tree_path_compare(sep_tp, tp) == 0; gtk_tree_path_free(sep_tp); } return ret; } /** * fm_places_model_path_is_bookmark * @model: a places model instance * @tp: the row path to inspect * * Checks if the row by @tp lies within bookmark items. * * Returns: %TRUE if the row is a bookmark item. * * Since: 0.1.14 */ gboolean fm_places_model_path_is_bookmark(FmPlacesModel* model, GtkTreePath* tp) { GtkTreePath* sep_tp; gboolean ret = FALSE; if(tp) { sep_tp = gtk_tree_row_reference_get_path(model->separator); ret = gtk_tree_path_compare(sep_tp, tp) < 0; gtk_tree_path_free(sep_tp); } return ret; } /** * fm_places_model_path_is_places * @model: a places model instance * @tp: the row path to inspect * * Checks if the row by @tp lies above separator, i.e. within "places". * * Returns: %TRUE if the row is a places item. * * Since: 0.1.14 */ gboolean fm_places_model_path_is_places(FmPlacesModel* model, GtkTreePath* tp) { GtkTreePath* sep_tp; gboolean ret = FALSE; if(tp) { sep_tp = gtk_tree_row_reference_get_path(model->separator); ret = gtk_tree_path_compare(sep_tp, tp) > 0; gtk_tree_path_free(sep_tp); } return ret; } static gboolean row_draggable(GtkTreeDragSource* drag_source, GtkTreePath* tp) { FmPlacesModel* model; g_return_val_if_fail(FM_IS_PLACES_MODEL(drag_source), FALSE); model = (FmPlacesModel*)drag_source; return fm_places_model_path_is_bookmark(model, tp); } static void fm_places_model_drag_source_init(GtkTreeDragSourceIface *iface) { iface->row_draggable = row_draggable; } G_DEFINE_TYPE_WITH_CODE (FmPlacesModel, fm_places_model, GTK_TYPE_LIST_STORE, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, fm_places_model_drag_source_init)) static void fm_places_model_dispose(GObject *object) { FmPlacesModel *self; GtkTreeIter it; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_PLACES_MODEL(object)); self = (FmPlacesModel*)object; if(self->jobs) { GSList* l; for(l = self->jobs; l; l=l->next) { g_signal_handlers_disconnect_by_func(l->data, on_file_info_job_finished, self); fm_job_cancel(FM_JOB(l->data)); g_object_unref(l->data); } g_slist_free(self->jobs); self->jobs = NULL; } if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self), &it)) { do { FmPlacesItem* item; gtk_tree_model_get(GTK_TREE_MODEL(self), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(G_LIKELY(item)) place_item_free(item); }while(gtk_tree_model_iter_next(GTK_TREE_MODEL(self), &it)); } gtk_tree_row_reference_free(self->separator); self->separator = NULL; gtk_tree_row_reference_free(self->trash); self->trash = NULL; if(self->theme_change_handler) { g_signal_handler_disconnect(gtk_icon_theme_get_default(), self->theme_change_handler); self->theme_change_handler = 0; } if(self->use_trash_change_handler) { g_signal_handler_disconnect(fm_config, self->use_trash_change_handler); self->use_trash_change_handler = 0; } if(self->places_home_change_handler) { g_signal_handler_disconnect(fm_config, self->places_home_change_handler); self->places_home_change_handler = 0; } if(self->places_desktop_change_handler) { g_signal_handler_disconnect(fm_config, self->places_desktop_change_handler); self->places_desktop_change_handler = 0; } if(self->places_root_change_handler) { g_signal_handler_disconnect(fm_config, self->places_root_change_handler); self->places_root_change_handler = 0; } if(self->places_computer_change_handler) { g_signal_handler_disconnect(fm_config, self->places_computer_change_handler); self->places_computer_change_handler = 0; } if(self->places_trash_change_handler) { g_signal_handler_disconnect(fm_config, self->places_trash_change_handler); self->places_trash_change_handler = 0; } if(self->places_applications_change_handler) { g_signal_handler_disconnect(fm_config, self->places_applications_change_handler); self->places_applications_change_handler = 0; } if(self->places_network_change_handler) { g_signal_handler_disconnect(fm_config, self->places_network_change_handler); self->places_network_change_handler = 0; } if(self->places_unmounted_change_handler) { g_signal_handler_disconnect(fm_config, self->places_unmounted_change_handler); self->places_unmounted_change_handler = 0; } if(self->pane_icon_size_change_handler) { g_signal_handler_disconnect(fm_config, self->pane_icon_size_change_handler); self->pane_icon_size_change_handler = 0; } if(self->vol_mon) { g_signal_handlers_disconnect_by_func(self->vol_mon, on_volume_added, self); g_signal_handlers_disconnect_by_func(self->vol_mon, on_volume_removed, self); g_signal_handlers_disconnect_by_func(self->vol_mon, on_volume_changed, self); g_signal_handlers_disconnect_by_func(self->vol_mon, on_mount_added, self); g_signal_handlers_disconnect_by_func(self->vol_mon, on_mount_changed, self); g_signal_handlers_disconnect_by_func(self->vol_mon, on_mount_removed, self); g_object_unref(self->vol_mon); self->vol_mon = NULL; } if(self->bookmarks) { g_signal_handlers_disconnect_by_func(self->bookmarks, on_bookmarks_changed, self); g_object_unref(self->bookmarks); self->bookmarks = NULL; } if(self->trash_monitor) { g_signal_handlers_disconnect_by_func(self->trash_monitor, on_trash_changed, self); g_object_unref(self->trash_monitor); self->trash_monitor = NULL; } if(self->trash_idle_handler) { g_source_remove(self->trash_idle_handler); self->trash_idle_handler = 0; } if(self->eject_icon) g_object_unref(self->eject_icon); self->eject_icon = NULL; G_OBJECT_CLASS(fm_places_model_parent_class)->dispose(object); } static void fm_places_model_class_init(FmPlacesModelClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_places_model_dispose; } /** * fm_places_model_new * * Creates new places model. * * Returns: (transfer full): a new #FmPlacesModel object. * * Since: 0.1.14 */ FmPlacesModel *fm_places_model_new(void) { return g_object_new(FM_TYPE_PLACES_MODEL, NULL); } /** * fm_places_model_mount_indicator_cell_data_func * @cell_layout: the cell layout * @render: the cell renderer * @tree_model: a places model instance * @it: the row iterator * @user_data: unused * * * * Since: 0.1.15 */ void fm_places_model_mount_indicator_cell_data_func(GtkCellLayout *cell_layout, GtkCellRenderer *render, GtkTreeModel *tree_model, GtkTreeIter *it, gpointer user_data) { FmPlacesItem* item = NULL; GdkPixbuf* pix = NULL; g_return_if_fail(FM_IS_PLACES_MODEL(tree_model)); gtk_tree_model_get(tree_model, it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item && item->mounted) pix = ((FmPlacesModel*)tree_model)->eject_icon; g_object_set(render, "pixbuf", pix, NULL); } /** * fm_places_model_get_iter_by_fm_path * @model: a places model instance * @iter: the row iterator pointer * @path: a file path to search * * Tries to find an item in the @model by the @path. If item was found * within @model then sets @iter to match the found item. * * Returns: %TRUE if item was found. * * Since: 1.0.0 */ gboolean fm_places_model_get_iter_by_fm_path(FmPlacesModel* model, GtkTreeIter* iter, FmPath* path) { GtkTreeIter it; GtkTreeModel* model_ = GTK_TREE_MODEL(model); if(gtk_tree_model_get_iter_first(model_, &it)) { FmPlacesItem* item; do{ item = NULL; gtk_tree_model_get(model_, &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item && item->fi && fm_path_equal(fm_file_info_get_path(item->fi), path)) { *iter = it; return TRUE; } }while(gtk_tree_model_iter_next(model_, &it)); } return FALSE; } /** * fm_places_item_get_type * @item: a places model item * * Retrieves type of @item. * * Returns: type of item. * * Since: 1.0.0 */ FmPlacesType fm_places_item_get_type(FmPlacesItem* item) { return item->type; } /** * fm_places_item_is_mounted * @item: a places model item * * Checks if the row is a mounted volume. * * Returns: %TRUE if the row is a mounted volume. * * Since: 1.0.0 */ gboolean fm_places_item_is_mounted(FmPlacesItem* item) { return item->mounted ? TRUE : FALSE; } /** * fm_places_item_get_icon * @item: a places model item * * Retrieves icom image for the row. Returned data are owned by places * model and should not be freed by caller. * * Returns: (transfer none): icon descriptor. * * Since: 1.0.0 */ FmIcon* fm_places_item_get_icon(FmPlacesItem* item) { return item->icon; } /** * fm_places_item_get_info * @item: a places model item * * Retrieves file info for the row. Returned data are owned by places * model and should not be freed by caller. * * Returns: (transfer none): file info descriptor. * * Since: 1.0.0 */ FmFileInfo* fm_places_item_get_info(FmPlacesItem* item) { return item->fi; } /** * fm_places_item_get_volume * @item: a places model item * * Retrieves volume descriptor for the row. Returned data are owned by * places model and should not be freed by caller. * * Returns: (transfer none): volume descriptor or %NULL if @item isn't a * mountable volume. * * Since: 1.0.0 */ GVolume* fm_places_item_get_volume(FmPlacesItem* item) { return item->type == FM_PLACES_ITEM_VOLUME ? item->volume : NULL; } /** * fm_places_item_get_mount * @item: a places model item * * Rertieves mount descriptor for the row. Returned data are owned by * places model and should not be freed by caller. * * Returns: (transfer none): mount descriptor or %NULL if @item isn't a * mounted path. * * Since: 1.0.0 */ GMount* fm_places_item_get_mount(FmPlacesItem* item) { return item->type == FM_PLACES_ITEM_MOUNT ? item->mount : NULL; } /** * fm_places_item_get_path * @item: a places model item * * Retrieves path for the row. Returned data are owned by places model * and should not be freed by caller. * * Returns: (transfer none): item path. * * Since: 1.0.0 */ FmPath* fm_places_item_get_path(FmPlacesItem* item) { return item->fi ? fm_file_info_get_path(item->fi) : NULL; } /** * fm_places_item_get_bookmark_item * @item: a places model item * * Retrieves bookmark descriptor for the row. Returned data are owned by * places model and should not be freed by caller. * * Returns: (transfer none): bookmark descriptor or %NULL if @item isn't * a bookmark. * * Since: 1.0.0 */ FmBookmarkItem* fm_places_item_get_bookmark_item(FmPlacesItem* item) { return item->type == FM_PLACES_ITEM_PATH ? item->bm_item : NULL; } libfm-1.4.0/src/gtk/fm-places-model.h000066400000000000000000000102341475513661000173070ustar00rootroot00000000000000/* * fm-places-model.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_PLACES_MODEL_H__ #define __FM_PLACES_MODEL_H__ #include #include #include "fm-file-info.h" #include "fm-bookmarks.h" #include "fm-icon-pixbuf.h" G_BEGIN_DECLS #define FM_TYPE_PLACES_MODEL (fm_places_model_get_type()) #define FM_PLACES_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_PLACES_MODEL, FmPlacesModel)) #define FM_PLACES_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_PLACES_MODEL, FmPlacesModelClass)) #define FM_IS_PLACES_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_PLACES_MODEL)) #define FM_IS_PLACES_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_PLACES_MODEL)) #define FM_PLACES_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ FM_TYPE_PLACES_MODEL, FmPlacesModelClass)) typedef struct _FmPlacesModel FmPlacesModel; typedef struct _FmPlacesModelClass FmPlacesModelClass; /** * FmPlacesCol: * @FM_PLACES_MODEL_COL_ICON: (#GdkPixbuf *) icon if the row * @FM_PLACES_MODEL_COL_LABEL: (#char *) name of the row * @FM_PLACES_MODEL_COL_INFO: (#FmPlacesItem *) internal representation * * Data of the row in the #FmPlacesModel. */ typedef enum { FM_PLACES_MODEL_COL_ICON, FM_PLACES_MODEL_COL_LABEL, FM_PLACES_MODEL_COL_INFO, /*< private >*/ FM_PLACES_MODEL_N_COLS } FmPlacesCol; /** * FmPlacesType: * @FM_PLACES_ITEM_NONE: separator * @FM_PLACES_ITEM_PATH: some path - standard one or bookmark * @FM_PLACES_ITEM_VOLUME: a mountable device * @FM_PLACES_ITEM_MOUNT: some mounted media or virtual drive */ typedef enum { FM_PLACES_ITEM_NONE, FM_PLACES_ITEM_PATH, FM_PLACES_ITEM_VOLUME, FM_PLACES_ITEM_MOUNT } FmPlacesType; typedef struct _FmPlacesItem FmPlacesItem; GType fm_places_model_get_type (void); FmPlacesModel* fm_places_model_new (void); GtkTreePath* fm_places_model_get_separator_path(FmPlacesModel* model); FmBookmarks* fm_places_model_get_bookmarks(FmPlacesModel* model); gboolean fm_places_model_iter_is_separator(FmPlacesModel* model, GtkTreeIter* it); gboolean fm_places_model_path_is_separator(FmPlacesModel* model, GtkTreePath* tp); gboolean fm_places_model_path_is_bookmark(FmPlacesModel* model, GtkTreePath* tp); gboolean fm_places_model_path_is_places(FmPlacesModel* model, GtkTreePath* tp); void fm_places_model_mount_indicator_cell_data_func(GtkCellLayout *cell_layout, GtkCellRenderer *render, GtkTreeModel *tree_model, GtkTreeIter *it, gpointer user_data); gboolean fm_places_model_get_iter_by_fm_path(FmPlacesModel* model, GtkTreeIter* iter, FmPath* path); FmPlacesType fm_places_item_get_type(FmPlacesItem* item); gboolean fm_places_item_is_mounted(FmPlacesItem* item); FmIcon* fm_places_item_get_icon(FmPlacesItem* item); FmFileInfo* fm_places_item_get_info(FmPlacesItem* item); GVolume* fm_places_item_get_volume(FmPlacesItem* item); GMount* fm_places_item_get_mount(FmPlacesItem* item); FmPath* fm_places_item_get_path(FmPlacesItem* item); FmBookmarkItem* fm_places_item_get_bookmark_item(FmPlacesItem* item); G_END_DECLS #endif /* __FM_PLACES_MODEL_H__ */ libfm-1.4.0/src/gtk/fm-places-view.c000066400000000000000000001427641475513661000171720ustar00rootroot00000000000000/* * fm-places-view.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2024 Ingo Brückl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-places-view * @short_description: A widget for side panel with places list. * @title: FmPlacesView * * @include: libfm/fm-gtk.h * * The #FmPlacesView displays list of pseudo-folders which contains * such items as Home directory, Trash bin, mounted removable drives, * bookmarks, etc. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include #include "fm-places-view.h" #include "fm-config.h" #include "fm-utils.h" #include "fm-gtk-utils.h" #include "fm-bookmarks.h" #include "fm-file-menu.h" #include "fm-cell-renderer-pixbuf.h" #include "fm-dnd-auto-scroll.h" #include "fm-places-model.h" #include "fm-gtk-file-launcher.h" #include "fm-gtk-marshal.h" #include #include "gtk-compat.h" enum { PROP_0, PROP_HOME_DIR }; enum { CHDIR, ITEM_POPUP, N_SIGNALS }; static void activate_row(FmPlacesView* view, guint button, GtkTreePath* tree_path); static void on_row_activated( GtkTreeView* view, GtkTreePath* tree_path, GtkTreeViewColumn *col); static gboolean on_button_press(GtkWidget* view, GdkEventButton* evt); static gboolean on_button_release(GtkWidget* view, GdkEventButton* evt); static void on_mount(GtkAction* act, gpointer user_data); static void on_umount(GtkAction* act, gpointer user_data); static void on_eject(GtkAction* act, gpointer user_data); static void on_format(GtkAction* act, gpointer user_data); static void on_remove_bm(GtkAction* act, gpointer user_data); static void on_rename_bm(GtkAction* act, gpointer user_data); static void on_move_bm_up(GtkAction* act, gpointer user_data); static void on_move_bm_down(GtkAction* act, gpointer user_data); static void on_empty_trash(GtkAction* act, gpointer user_data); static gboolean on_dnd_dest_files_dropped(FmDndDest* dd, int x, int y, GdkDragAction action, FmDndDestTargetType info_type, FmPathList* files, FmPlacesView* view); //static void on_trash_changed(GFileMonitor *monitor, GFile *gf, GFile *other, GFileMonitorEvent evt, gpointer user_data); //static void on_use_trash_changed(FmConfig* cfg, gpointer unused); //static void on_pane_icon_size_changed(FmConfig* cfg, gpointer unused); G_DEFINE_TYPE(FmPlacesView, fm_places_view, GTK_TYPE_TREE_VIEW); /** One common FmPlacesModel for all FmPlacesView instances */ static FmPlacesModel* model = NULL; static guint signals[N_SIGNALS]; #define PLACES_MENU_XML \ "" \ "" \ "" \ "" \ "" \ "" \ "" static const char vol_menu_xml[]= PLACES_MENU_XML "" "" "" "" "" "" "" ""; static const char mount_menu_xml[]= PLACES_MENU_XML "" "" "" "" ""; static GtkActionEntry vol_menu_actions[]= { {"Mount", NULL, N_("_Mount Volume"), NULL, NULL, G_CALLBACK(on_mount)}, {"Unmount", NULL, N_("_Unmount Volume"), NULL, NULL, G_CALLBACK(on_umount)}, {"Eject", NULL, N_("_Eject Removable Media"), NULL, NULL, G_CALLBACK(on_eject)}, {"Format", NULL, N_("_Format Volume"), NULL, NULL, G_CALLBACK(on_format)} }; static const char bookmark_menu_xml[]= PLACES_MENU_XML "" "" "" "" "" "" "" ""; static GtkActionEntry bm_menu_actions[]= { {"RenameBm", GTK_STOCK_EDIT, N_("_Rename Bookmark Item"), NULL, NULL, G_CALLBACK(on_rename_bm)}, {"RemoveBm", GTK_STOCK_REMOVE, N_("Re_move from Bookmarks"), NULL, NULL, G_CALLBACK(on_remove_bm)}, {"MoveBmUp", GTK_STOCK_GO_UP, N_("Move Bookmark _Up"), NULL, NULL, G_CALLBACK(on_move_bm_up)}, {"MoveBmDown", GTK_STOCK_GO_DOWN, N_("Move Bookmark _Down"), NULL, NULL, G_CALLBACK(on_move_bm_down)} }; static const char trash_menu_xml[]= PLACES_MENU_XML "" "" "" "" ""; static GtkActionEntry trash_menu_actions[]= { {"EmptyTrash", NULL, N_("_Empty Trash Can"), NULL, NULL, G_CALLBACK(on_empty_trash)} }; /* targets are added to FmDndDest, also only targets for GtkTreeDragSource */ enum { FM_DND_TARGET_BOOOKMARK = N_FM_DND_DEST_DEFAULT_TARGETS }; /* Target types for dragging items of list */ static const GtkTargetEntry dnd_targets[] = { { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, FM_DND_TARGET_BOOOKMARK } }; static GdkAtom tree_model_row_atom; static gboolean sep_func( GtkTreeModel* model, GtkTreeIter* it, gpointer data ) { return fm_places_model_iter_is_separator(FM_PLACES_MODEL(model), it); } static void on_renderer_icon_size_changed(FmConfig* cfg, gpointer user_data) { FmCellRendererPixbuf* render = FM_CELL_RENDERER_PIXBUF(user_data); fm_cell_renderer_pixbuf_set_fixed_size(render, fm_config->pane_icon_size, fm_config->pane_icon_size); } static void on_cell_renderer_pixbuf_destroy(gpointer user_data, GObject* render) { g_signal_handler_disconnect(fm_config, GPOINTER_TO_UINT(user_data)); } /*---------------------------------------------------------------------- Drag source is handled by model which implements GtkTreeDragSource */ /*---------------------------------------------------------------------- Drop destination is handled by FmDndDest. We add own target there. */ /* Given a drop path retrieved by gtk_tree_view_get_dest_row_at_pos, this function * determines whether dropping a bookmark item at the specified path is allow. * If dropping is not allowed, this function tries to choose an alternative position * for the bookmark item and modified the tree path @tp passed into this function. */ static gboolean get_bookmark_drag_dest(FmPlacesView* view, GtkTreePath** tp, GtkTreeViewDropPosition* pos) { gboolean ret = TRUE; if(*tp) { /* if the drop site is below the separator (in the bookmark area) */ if(fm_places_model_path_is_bookmark(model, *tp)) { /* we cannot drop into a item */ if(*pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE || *pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER) ret = FALSE; else ret = TRUE; } else /* the drop site is above the separator (in the places area containing volumes) */ { GtkTreePath* sep = fm_places_model_get_separator_path(model); /* set drop site at the first bookmark item */ gtk_tree_path_get_indices(*tp)[0] = gtk_tree_path_get_indices(sep)[0] + 1; gtk_tree_path_free(sep); *pos = GTK_TREE_VIEW_DROP_BEFORE; ret = TRUE; } } else { /* drop at end of the bookmarks list instead */ *tp = gtk_tree_path_new_from_indices(gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model), NULL) - 1, -1); *pos = GTK_TREE_VIEW_DROP_AFTER; ret = TRUE; } /* g_debug("path: %s, pos: %d, ret: %d", gtk_tree_path_to_string(*tp), *pos, ret); */ return ret; } static gboolean on_drag_motion (GtkWidget *dest_widget, GdkDragContext *drag_context, gint x, gint y, guint time) { FmPlacesView* view = FM_PLACES_VIEW(dest_widget); /* fm_drag_context_has_target_name(drag_context, "GTK_TREE_MODEL_ROW"); */ GdkAtom target; GtkTreeViewDropPosition pos; GtkTreePath* tp = NULL; gboolean ret = FALSE; GdkDragAction action = 0; target = gtk_drag_dest_find_target(dest_widget, drag_context, NULL); if(target == GDK_NONE) return FALSE; gtk_tree_view_get_dest_row_at_pos(&view->parent, x, y, &tp, &pos); /* handle reordering bookmark items first */ if(target == tree_model_row_atom) { /* bookmark item is being dragged */ ret = get_bookmark_drag_dest(view, &tp, &pos); action = ret ? GDK_ACTION_MOVE : 0; /* bookmark items can only be moved */ } /* try FmDndDest */ else if(fm_dnd_dest_is_target_supported(view->dnd_dest, target)) { /* the user is dragging files. get FmFileInfo of drop site. */ if(pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE || pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER) /* drag into items */ { FmPlacesItem* item = NULL; GtkTreeIter it; FmFileInfo* fi; if(tp && gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp)) gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); fi = item ? fm_places_item_get_info(item) : NULL; fm_dnd_dest_set_dest_file(view->dnd_dest, fi); /* query default action (this may trigger drag-data-received signal) * FIXME: this is a dirty and bad API design definitely requires refactor. */ action = fm_dnd_dest_get_default_action(view->dnd_dest, drag_context, target); } else /* drop between items, create bookmark items for dragged files */ { fm_dnd_dest_set_dest_file(view->dnd_dest, NULL); /* FmDndDest requires this call */ fm_dnd_dest_get_default_action(view->dnd_dest, drag_context, target); if(!gtk_drag_get_source_widget(drag_context)) action = 0; /* an other application can't link */ else if( (!tp || fm_places_model_path_is_bookmark(model, tp)) && get_bookmark_drag_dest(view, &tp, &pos)) /* tp is after separator */ action = GDK_ACTION_LINK; else action = 0; } ret = (action != 0); } gdk_drag_status(drag_context, action, time); if(ret) gtk_tree_view_set_drag_dest_row(&view->parent, tp, pos); else gtk_tree_view_set_drag_dest_row(&view->parent, NULL, 0); if(tp) gtk_tree_path_free(tp); return ret; } static void on_drag_leave ( GtkWidget *dest_widget, GdkDragContext *drag_context, guint time) { gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW(dest_widget), NULL, 0); /* g_debug("drag_leave"); */ } static gboolean on_drag_drop ( GtkWidget *dest_widget, GdkDragContext *drag_context, gint x, gint y, guint time) { /* this is to reorder bookmark */ if(gtk_drag_dest_find_target(dest_widget, drag_context, NULL) == tree_model_row_atom) { gtk_drag_get_data(dest_widget, drag_context, tree_model_row_atom, time); return TRUE; } return FALSE; } static void on_drag_data_received ( GtkWidget *dest_widget, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *sel_data, guint info, guint time) { FmPlacesView* view = FM_PLACES_VIEW(dest_widget); GtkTreePath* dest_tp = NULL; GtkTreeViewDropPosition pos; gboolean ret = FALSE; switch(info) { case FM_DND_TARGET_BOOOKMARK: gtk_tree_view_get_dest_row_at_pos(&view->parent, x, y, &dest_tp, &pos); if(get_bookmark_drag_dest(view, &dest_tp, &pos)) /* got the drop position */ { GtkTreePath* src_tp; /* get the source row; the GtkTreeDragSource ensured it's bookmark */ ret = gtk_tree_get_row_drag_data(sel_data, NULL, &src_tp); if(ret) { /* don't do anything if source and dest are the same row */ if(G_UNLIKELY(gtk_tree_path_compare(src_tp, dest_tp) == 0)) ret = FALSE; else { GtkTreeIter src_it, dest_it; FmPlacesItem* item = NULL; ret = FALSE; /* get the source bookmark item */ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &src_it, src_tp)) gtk_tree_model_get(GTK_TREE_MODEL(model), &src_it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item) { /* move it to destination position */ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &dest_it, dest_tp)) { int new_pos, sep_pos; /* get index of the separator */ GtkTreePath* sep_tp = fm_places_model_get_separator_path(model); sep_pos = gtk_tree_path_get_indices(sep_tp)[0]; if(pos == GTK_TREE_VIEW_DROP_BEFORE) gtk_list_store_move_before(GTK_LIST_STORE(model), &src_it, &dest_it); else gtk_list_store_move_after(GTK_LIST_STORE(model), &src_it, &dest_it); new_pos = gtk_tree_path_get_indices(dest_tp)[0] - sep_pos - 1; /* reorder the bookmark item */ fm_bookmarks_reorder(fm_places_model_get_bookmarks(model), fm_places_item_get_bookmark_item(item), new_pos); gtk_tree_path_free(sep_tp); ret = TRUE; } } /* else it might be additional separator */ } gtk_tree_path_free(src_tp); } } gtk_drag_finish(drag_context, ret, FALSE, time); break; } if(dest_tp) gtk_tree_path_free(dest_tp); } static gboolean on_dnd_dest_files_dropped(FmDndDest* dd, int x, int y, GdkDragAction action, FmDndDestTargetType info_type, FmPathList* files, FmPlacesView* view) { FmPath* dest; GList* l; gboolean ret = FALSE; dest = fm_dnd_dest_get_dest_path(dd); /* g_debug("action= %d, %d files-dropped!, dest=%p info_type: %d", action, fm_path_list_get_length(files), dest, info_type); */ if(!dest && action == GDK_ACTION_LINK) /* add bookmarks */ { GtkTreePath* tp; GtkTreeViewDropPosition pos; gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(view), x, y, &tp, &pos); if(get_bookmark_drag_dest(view, &tp, &pos)) { GtkTreePath* sep = fm_places_model_get_separator_path(model); int idx = gtk_tree_path_get_indices(tp)[0] - gtk_tree_path_get_indices(sep)[0]; if(pos == GTK_TREE_VIEW_DROP_BEFORE) --idx; for( l=fm_path_list_peek_head_link(files); l; l=l->next, ++idx ) { FmPath* path = FM_PATH(l->data); GFile* gf = fm_path_to_gfile(path); if(g_file_query_file_type(gf, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL) == G_FILE_TYPE_DIRECTORY) { char* disp_name = fm_path_display_basename(path); fm_bookmarks_insert(fm_places_model_get_bookmarks(model), path, disp_name, idx); g_free(disp_name); } g_object_unref(gf); /* we don't need to add item to places view. Later the bookmarks will be reloaded. */ } gtk_tree_path_free(sep); } if(tp) gtk_tree_path_free(tp); ret = TRUE; } return ret; } /*---------------------------------------------------------------------- Widget initialization and finalization */ static void fm_places_view_dispose(GObject *object) { FmPlacesView* self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_PLACES_VIEW(object)); self = (FmPlacesView*)object; if(self->dnd_dest) { g_signal_handlers_disconnect_by_func(self->dnd_dest, on_dnd_dest_files_dropped, self); g_object_unref(self->dnd_dest); self->dnd_dest = NULL; } G_OBJECT_CLASS(fm_places_view_parent_class)->dispose(object); } static void fm_places_view_finalize(GObject *object) { FmPlacesView* self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_PLACES_VIEW(object)); self = (FmPlacesView*)object; if(self->clicked_row) gtk_tree_path_free(self->clicked_row); G_OBJECT_CLASS(fm_places_view_parent_class)->finalize(object); } static void fm_places_view_init(FmPlacesView *self) { GtkTreeViewColumn* col; GtkCellRenderer* renderer; AtkObject *obj; guint handler; if(G_UNLIKELY(!model)) { model = fm_places_model_new(); g_object_add_weak_pointer(G_OBJECT(model), (gpointer*)&model); } else g_object_ref(model); gtk_tree_view_set_model(GTK_TREE_VIEW(self), GTK_TREE_MODEL(model)); g_object_unref(model); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(self), FALSE); gtk_tree_view_set_row_separator_func(GTK_TREE_VIEW(self), sep_func, NULL, NULL); col = gtk_tree_view_column_new(); renderer = (GtkCellRenderer*)fm_cell_renderer_pixbuf_new(); handler = g_signal_connect(fm_config, "changed::pane_icon_size", G_CALLBACK(on_renderer_icon_size_changed), renderer); g_object_weak_ref(G_OBJECT(renderer), on_cell_renderer_pixbuf_destroy, GUINT_TO_POINTER(handler)); fm_cell_renderer_pixbuf_set_fixed_size((FmCellRendererPixbuf*)renderer, fm_config->pane_icon_size, fm_config->pane_icon_size); gtk_tree_view_column_pack_start( col, renderer, FALSE ); gtk_tree_view_column_set_attributes( col, renderer, "pixbuf", FM_PLACES_MODEL_COL_ICON, NULL ); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start( col, renderer, TRUE ); g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_tree_view_column_set_attributes( col, renderer, "text", FM_PLACES_MODEL_COL_LABEL, NULL ); renderer = gtk_cell_renderer_pixbuf_new(); self->mount_indicator_renderer = GTK_CELL_RENDERER_PIXBUF(renderer); gtk_tree_view_column_pack_start( col, renderer, FALSE ); gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(col), renderer, fm_places_model_mount_indicator_cell_data_func, NULL, NULL); gtk_tree_view_append_column ( GTK_TREE_VIEW(self), col ); gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(self), GDK_BUTTON1_MASK, dnd_targets, G_N_ELEMENTS(dnd_targets), GDK_ACTION_MOVE); self->dnd_dest = fm_dnd_dest_new_with_handlers(GTK_WIDGET(self)); /* add our own targets */ fm_dnd_dest_add_targets(GTK_WIDGET(self), dnd_targets, G_N_ELEMENTS(dnd_targets)); g_signal_connect(self->dnd_dest, "files-dropped", G_CALLBACK(on_dnd_dest_files_dropped), self); obj = gtk_widget_get_accessible(GTK_WIDGET(self)); atk_object_set_description(obj, _("Shows list of common places, devices, and bookmarks in sidebar")); } /*---------------------------------------------------------------------- Widget interface */ /** * fm_places_view_new * * Creates new #FmPlacesView widget. * * Returns: (transfer full): a new #FmPlacesView object. * * Since: 0.1.0 */ FmPlacesView *fm_places_view_new(void) { return g_object_new(FM_PLACES_VIEW_TYPE, NULL); } static void activate_row(FmPlacesView* view, guint button, GtkTreePath* tree_path) { GtkTreeIter it; if(gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tree_path)) { FmPlacesItem* item; FmPath* path; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(!item) return; switch(fm_places_item_get_type(item)) { case FM_PLACES_ITEM_PATH: case FM_PLACES_ITEM_MOUNT: path = fm_places_item_get_path(item); if (path == fm_path_get_home() && view->home_dir) path = fm_path_new_for_str(view->home_dir); else fm_path_ref(path); break; case FM_PLACES_ITEM_VOLUME: { GFile* gf; GMount* mnt = g_volume_get_mount(fm_places_item_get_volume(item)); if(!mnt) { GtkWindow* parent = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(view))); if(!fm_mount_volume(parent, fm_places_item_get_volume(item), TRUE)) return; mnt = g_volume_get_mount(fm_places_item_get_volume(item)); if(!mnt) { g_debug("GMount is invalid after successful g_volume_mount().\nThis is quite possibly a gvfs bug.\nSee https://bugzilla.gnome.org/show_bug.cgi?id=552168"); return; } } gf = g_mount_get_root(mnt); g_object_unref(mnt); if(gf) { path = fm_path_new_for_gfile(gf); g_object_unref(gf); } else path = NULL; break; } default: return; } if(path) { g_signal_emit(view, signals[CHDIR], 0, button, path); fm_path_unref(path); } } } static void on_row_activated(GtkTreeView* view, GtkTreePath* tree_path, GtkTreeViewColumn *col) { activate_row(FM_PLACES_VIEW(view), 1, tree_path); } /** * fm_places_view_chdir * @pv: a widget to apply * @path: the new path * * Changes active path and eventually sends the #FmPlacesView::chdir signal. * * Before 1.0.0 this call had name fm_places_chdir. * Before 0.1.12 this call had name fm_places_select. * * Since: 0.1.0 */ void fm_places_view_chdir(FmPlacesView* pv, FmPath* path) { GtkTreeIter it; GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(pv)); GtkTreeSelection* ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(pv)); if(fm_places_model_get_iter_by_fm_path(FM_PLACES_MODEL(model), &it, path)) { gtk_tree_selection_select_iter(ts, &it); } else gtk_tree_selection_unselect_all(ts); } static gboolean on_button_release(GtkWidget* widget, GdkEventButton* evt) { FmPlacesView* view = FM_PLACES_VIEW(widget); gboolean ret = GTK_WIDGET_CLASS(fm_places_view_parent_class)->button_release_event(widget, evt); /* we should finish the event before we do our work, otherwise gtk may activate already removed row in default handler */ if(view->clicked_row) { if(evt->button == 1) { GtkTreePath* tp; GtkTreeViewColumn* col; int cell_x; if(gtk_tree_view_get_path_at_pos(&view->parent, evt->x, evt->y, &tp, &col, &cell_x, NULL)) { /* check if we release the button on the row we previously clicked. */ if(gtk_tree_path_compare(tp, view->clicked_row) == 0) { /* check if we click on the "eject" icon. */ int start, cell_w; gtk_tree_view_column_cell_get_position(col, GTK_CELL_RENDERER(view->mount_indicator_renderer), &start, &cell_w); if(cell_x > start && cell_x < (start + cell_w)) /* click on eject icon */ { GtkTreeIter it; /* do eject if needed */ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp)) { FmPlacesItem* item; gtk_tree_model_get(GTK_TREE_MODEL(model), &it, FM_PLACES_MODEL_COL_INFO, &item, -1); if(item && fm_places_item_is_mounted(item)) { GtkWindow* toplevel = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(view))); GMount* mount; GVolume* volume; gtk_tree_path_free(view->clicked_row); view->clicked_row = NULL; gtk_tree_path_free(tp); switch(fm_places_item_get_type(item)) { case FM_PLACES_ITEM_VOLUME: volume = fm_places_item_get_volume(item); /* eject the volume */ if(g_volume_can_eject(volume)) fm_eject_volume(toplevel, volume, TRUE); else /* not ejectable, do unmount */ { mount = g_volume_get_mount(volume); if(mount) { fm_unmount_mount(toplevel, mount, TRUE); g_object_unref(mount); } } break; case FM_PLACES_ITEM_MOUNT: mount = fm_places_item_get_mount(item); if(g_mount_can_unmount(mount)) fm_unmount_mount(toplevel, mount, TRUE); break; default: break; } /* bug #3614500: if we unmount volume, the main window handlers will destroy the FmPlacesView therefore we cannot touch it at this point */ goto _out; } } } /* activate the clicked row. */ gtk_tree_view_row_activated(&view->parent, view->clicked_row, col); } gtk_tree_path_free(tp); } } gtk_tree_path_free(view->clicked_row); view->clicked_row = NULL; } _out: return ret; } static void on_selection_done(GtkMenu *menu, gpointer unused) { GtkWidget *widget = gtk_menu_get_attach_widget(menu); /* g_debug("FmPlacesView:on_selection_done(): attached widget %p", widget); */ if (widget) /* it may be destroyed and detached already */ g_object_weak_unref(G_OBJECT(widget), (GWeakNotify)gtk_menu_detach, menu); gtk_widget_destroy(GTK_WIDGET(menu)); } static void place_item_menu_unref(gpointer ui, GObject *menu) { g_object_unref(ui); } static GtkWidget* place_item_get_menu(FmPlacesItem* item, GtkWidget *widget) { GtkWidget* menu = NULL; GtkUIManager* ui = gtk_ui_manager_new(); GtkActionGroup* act_grp = gtk_action_group_new("Popup"); int sep_pos; GtkTreeIter src_it; GtkTreePath *tp, *sep_tp; GtkAction* act; gtk_action_group_set_translation_domain(act_grp, GETTEXT_PACKAGE); /* FIXME: merge with FmFileMenu when possible */ if(fm_places_item_get_type(item) == FM_PLACES_ITEM_PATH) { if(fm_places_item_get_bookmark_item(item)) { gtk_action_group_add_actions(act_grp, bm_menu_actions, G_N_ELEMENTS(bm_menu_actions), item); gtk_ui_manager_add_ui_from_string(ui, bookmark_menu_xml, -1, NULL); /* check and disable MoveBmUp and MoveBmDown */ if(fm_places_model_get_iter_by_fm_path(model, &src_it, fm_places_item_get_path(item))) { /* get index of the separator */ sep_tp = fm_places_model_get_separator_path(model); sep_pos = gtk_tree_path_get_indices(sep_tp)[0]; tp = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &src_it); if(!gtk_tree_path_prev(tp) || gtk_tree_path_get_indices(tp)[0] - sep_pos - 1 < 0) { act = gtk_action_group_get_action(act_grp, "MoveBmUp"); gtk_action_set_sensitive(act, FALSE); } if(!gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &src_it)) { act = gtk_action_group_get_action(act_grp, "MoveBmDown"); gtk_action_set_sensitive(act, FALSE); } gtk_tree_path_free(sep_tp); gtk_tree_path_free(tp); } } else if(fm_path_is_trash_root(fm_places_item_get_path(item))) { gtk_action_group_add_actions(act_grp, trash_menu_actions, G_N_ELEMENTS(trash_menu_actions), item); gtk_ui_manager_add_ui_from_string(ui, trash_menu_xml, -1, NULL); } } else if(fm_places_item_get_type(item) == FM_PLACES_ITEM_VOLUME) { GVolume *vol = fm_places_item_get_volume(item); GMount* mnt; char *unix_path = NULL; gtk_action_group_add_actions(act_grp, vol_menu_actions, G_N_ELEMENTS(vol_menu_actions), item); gtk_ui_manager_add_ui_from_string(ui, vol_menu_xml, -1, NULL); mnt = g_volume_get_mount(vol); if(mnt) /* mounted */ { g_object_unref(mnt); act = gtk_action_group_get_action(act_grp, "Mount"); gtk_action_set_visible(act, FALSE); act = gtk_action_group_get_action(act_grp, "Unmount"); gtk_action_set_sensitive(act, g_mount_can_unmount(mnt)); } else /* not mounted */ { if (fm_config->format_cmd && fm_config->format_cmd[0]) unix_path = g_volume_get_identifier(vol, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); if (unix_path && unix_path[0] != '/') /* we can format only local */ { g_free(unix_path); unix_path = NULL; } g_free(unix_path); /* use it to mark only */ act = gtk_action_group_get_action(act_grp, "Unmount"); gtk_action_set_visible(act, FALSE); act = gtk_action_group_get_action(act_grp, "Mount"); gtk_action_set_sensitive(act, g_volume_can_mount(vol)); } if (unix_path == NULL) { act = gtk_action_group_get_action(act_grp, "Format"); if (act) gtk_action_set_visible(act, FALSE); } if(!g_volume_can_eject(fm_places_item_get_volume(item))) { act = gtk_action_group_get_action(act_grp, "Eject"); gtk_action_set_visible(act, FALSE); } } else if(fm_places_item_get_type(item) == FM_PLACES_ITEM_MOUNT) { GtkAction* act; GMount* mnt; gtk_action_group_add_actions(act_grp, vol_menu_actions, G_N_ELEMENTS(vol_menu_actions), item); gtk_ui_manager_add_ui_from_string(ui, mount_menu_xml, -1, NULL); mnt = fm_places_item_get_mount(item); if(mnt) /* mounted */ { act = gtk_action_group_get_action(act_grp, "Mount"); gtk_action_set_sensitive(act, FALSE); act = gtk_action_group_get_action(act_grp, "Unmount"); gtk_action_set_sensitive(act, g_mount_can_unmount(mnt)); } else /* not mounted */ { act = gtk_action_group_get_action(act_grp, "Unmount"); gtk_action_set_sensitive(act, FALSE); } act = gtk_action_group_get_action(act_grp, "Format"); if (act) gtk_action_set_visible(act, FALSE); act = gtk_action_group_get_action(act_grp, "Eject"); gtk_action_set_visible(act, FALSE); } else goto _out; gtk_ui_manager_insert_action_group(ui, act_grp, 0); /* send the signal so popup can be altered by application */ g_signal_emit(widget, signals[ITEM_POPUP], 0, ui, act_grp, fm_places_item_get_info(item)); menu = gtk_ui_manager_get_widget(ui, "/popup"); if(menu) { g_signal_connect(menu, "selection-done", G_CALLBACK(on_selection_done), NULL); g_object_weak_ref(G_OBJECT(menu), place_item_menu_unref, g_object_ref(ui)); gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL); /* bug #3614500: widget may be destroyed in selections such as Unmount therefore we should detach menu to avoid crash note that we should remove this ref when we destroy menu */ g_object_weak_ref(G_OBJECT(widget), (GWeakNotify)gtk_menu_detach, menu); gtk_ui_manager_ensure_update(ui); } _out: g_object_unref(act_grp); g_object_unref(ui); return menu; } static void popup_position_func(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { GtkWidget *widget = gtk_menu_get_attach_widget(menu); GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreePath *path; GdkScreen *screen; gint index = GPOINTER_TO_INT(user_data); GdkRectangle cell; GtkAllocation a, ma; gint x2, y2, mon; gboolean rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); /* realize menu so we get actual size of it */ gtk_widget_realize(GTK_WIDGET(menu)); /* get all the relative coordinates */ gtk_widget_get_allocation(widget, &a); screen = gtk_widget_get_screen(widget); gdk_window_get_device_position(gtk_widget_get_window(widget), gdk_device_manager_get_client_pointer( gdk_display_get_device_manager( gdk_screen_get_display(screen))), &x2, &y2, NULL); gtk_widget_get_allocation(GTK_WIDGET(menu), &ma); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_view_get_cell_area(view, path, gtk_tree_view_get_column(view, 0), &cell); gtk_tree_path_free(path); /* position menu inside the cell if pointer isn't already in it */ if(x2 < cell.x || x2 > cell.x + cell.width) x2 = cell.x + cell.width/2; if(y2 < cell.y || y2 > cell.y + cell.height) y2 = cell.y + cell.height - cell.height/8; /* get absolute coordinate of parent window - we got coords relative to it */ gdk_window_get_origin(gtk_widget_get_parent_window(widget), x, y); /* calculate desired position for menu */ *x += a.x + x2; *y += a.y + y2; /* limit coordinates so menu will be not positioned outside of screen */ mon = gdk_screen_get_monitor_at_point(screen, *x, *y); /* get monitor geometry into the rectangle */ gdk_screen_get_monitor_geometry(screen, mon, &cell); if(rtl) /* RTL */ { x2 = cell.x + cell.width; if (*x < cell.x + ma.width) /* out of monitor */ *x = MIN(*x + ma.width, x2); /* place menu right to cursor */ else *x = MIN(*x, x2); } else /* LTR */ { if (*x + ma.width > cell.x + cell.width) /* out of monitor */ *x = MAX(cell.x, *x - ma.width); /* place menu left to cursor */ else *x = MAX(cell.x, *x); /* place menu right to cursor */ } if (*y + ma.height > cell.y + cell.height) /* out of monitor */ *y = MAX(cell.y, *y - ma.height); /* place menu above cursor */ else *y = MAX(cell.y, *y); /* place menu below cursor */ } static void fm_places_item_popup(GtkWidget *widget, GtkTreeIter *it, guint32 time) { if(!fm_places_model_iter_is_separator(model, it)) { FmPlacesItem* item; GtkMenu* menu; GtkTreePath* path; gint* indices; gtk_tree_model_get(GTK_TREE_MODEL(model), it, FM_PLACES_MODEL_COL_INFO, &item, -1); menu = GTK_MENU(place_item_get_menu(item, widget)); if(menu) { path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), it); indices = gtk_tree_path_get_indices(path); gtk_menu_popup(menu, NULL, NULL, popup_position_func, GINT_TO_POINTER(indices[0]), 3, time); gtk_tree_path_free(path); } } } static gboolean on_button_press(GtkWidget* widget, GdkEventButton* evt) { FmPlacesView* view = FM_PLACES_VIEW(widget); GtkTreePath* tp; GtkTreeViewColumn* col; GtkTreeIter it; gboolean ret = GTK_WIDGET_CLASS(fm_places_view_parent_class)->button_press_event(widget, evt); gtk_tree_view_get_path_at_pos(&view->parent, evt->x, evt->y, &tp, &col, NULL, NULL); if(view->clicked_row) /* what? more than one botton clicked? */ gtk_tree_path_free(view->clicked_row); view->clicked_row = tp; if(tp) { switch(evt->button) /* middle click */ { case 1: /* left click */ break; case 2: /* middle click */ activate_row(view, 2, tp); break; case 3: /* right click */ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &it, tp)) fm_places_item_popup(widget, &it, evt->time); break; } } return ret; } /* handle 'Menu' and 'Shift+F10' here */ static gboolean on_key_press(GtkWidget *widget, GdkEventKey *evt) { GtkTreeModel *model; GtkTreeSelection *sel; GtkTreeIter it; int modifier = (evt->state & gtk_accelerator_get_default_mod_mask()); if((evt->keyval == GDK_KEY_Menu && !modifier) || (evt->keyval == GDK_KEY_F10 && modifier == GDK_SHIFT_MASK)) { sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); if(gtk_tree_selection_get_selected(sel, &model, &it)) { fm_places_item_popup(widget, &it, evt->time); return TRUE; } } /* let others do the job */ return GTK_WIDGET_CLASS(fm_places_view_parent_class)->key_press_event(widget, evt); } static void on_mount(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; if(fm_places_item_get_type(item) == FM_PLACES_ITEM_VOLUME) { GMount* mnt = g_volume_get_mount(fm_places_item_get_volume(item)); if(!mnt) { if(!fm_mount_volume(NULL, fm_places_item_get_volume(item), TRUE)) return; } else g_object_unref(mnt); } } static void on_umount(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; GMount* mnt; switch(fm_places_item_get_type(item)) { case FM_PLACES_ITEM_VOLUME: mnt = g_volume_get_mount(fm_places_item_get_volume(item)); break; case FM_PLACES_ITEM_MOUNT: /* FIXME: this seems to be broken. */ mnt = g_object_ref(fm_places_item_get_mount(item)); break; default: mnt = NULL; } if(mnt) { fm_unmount_mount(NULL, mnt, TRUE); /* NOTE: the most probably FmPlacesView is destroyed at this point */ g_object_unref(mnt); } } static GtkWindow *_get_gtk_window_from_action(GtkAction* act) { /* FIXME: This is very dirty, but it's inevitable. :-( */ GSList* proxies = gtk_action_get_proxies(act); GtkWidget *menu, *view; menu = gtk_widget_get_parent(proxies->data); if (menu == NULL || !GTK_IS_MENU(menu)) return NULL; view = gtk_menu_get_attach_widget((GtkMenu*)menu); return view ? GTK_WINDOW(gtk_widget_get_toplevel(view)) : NULL; } static void on_eject(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; if(fm_places_item_get_type(item) == FM_PLACES_ITEM_VOLUME) { fm_eject_volume(_get_gtk_window_from_action(act), fm_places_item_get_volume(item), TRUE); /* NOTE: the most probably FmPlacesView is destroyed at this point */ } } static void on_format(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; char *unix_path; if (fm_config->format_cmd == NULL || fm_config->format_cmd[0] == 0) return; unix_path = g_volume_get_identifier(fm_places_item_get_volume(item), G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); if (unix_path) { /* call fm_config->format_cmd for device */ g_debug("formatting %s ...", unix_path); FmPath *path = fm_path_new_for_path(unix_path); g_free(unix_path); FmPathList *paths = fm_path_list_new(); fm_path_list_push_tail(paths, path); fm_path_unref(path); fm_launch_command_simple(_get_gtk_window_from_action(act), NULL, 0, fm_config->format_cmd, paths); fm_path_list_unref(paths); } } static void on_remove_bm(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; fm_bookmarks_remove(fm_places_model_get_bookmarks(model), fm_places_item_get_bookmark_item(item)); /* FIXME: remove item from FmPlacesModel or invalidate it right now so make duplicate deletions impossible */ } static void on_rename_bm(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; char* new_name = fm_get_user_input(_get_gtk_window_from_action(act), _("Rename Bookmark Item"), _("Enter a new name:"), fm_places_item_get_bookmark_item(item)->name); if(new_name) { if(strcmp(new_name, fm_places_item_get_bookmark_item(item)->name)) { fm_bookmarks_rename(fm_places_model_get_bookmarks(model), fm_places_item_get_bookmark_item(item), new_name); } g_free(new_name); } } static void on_move_bm_up(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; int new_pos, sep_pos; GtkTreeIter src_it, dest_it; GtkTreePath *tp, *sep_tp; if(!fm_places_model_get_iter_by_fm_path(model, &src_it, fm_places_item_get_path(item))) return; /* FIXME: print error message */ /* get index of the separator */ sep_tp = fm_places_model_get_separator_path(model); sep_pos = gtk_tree_path_get_indices(sep_tp)[0]; tp = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &src_it); if(!gtk_tree_path_prev(tp) || (new_pos = gtk_tree_path_get_indices(tp)[0] - sep_pos - 1) < 0 || !gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &dest_it, tp)) goto _end; /* cannot move it up */ gtk_list_store_move_before(GTK_LIST_STORE(model), &src_it, &dest_it); /* reorder the bookmark item */ fm_bookmarks_reorder(fm_places_model_get_bookmarks(model), fm_places_item_get_bookmark_item(item), new_pos); _end: gtk_tree_path_free(sep_tp); gtk_tree_path_free(tp); } static void on_move_bm_down(GtkAction* act, gpointer user_data) { FmPlacesItem* item = (FmPlacesItem*)user_data; int new_pos, sep_pos; GtkTreeIter src_it, dest_it; GtkTreePath *tp, *sep_tp; if(!fm_places_model_get_iter_by_fm_path(model, &src_it, fm_places_item_get_path(item))) return; /* FIXME: print error message */ /* get index of the separator */ sep_tp = fm_places_model_get_separator_path(model); sep_pos = gtk_tree_path_get_indices(sep_tp)[0]; dest_it = src_it; if(!gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &dest_it)) goto _end; /* cannot move it down */ gtk_list_store_move_after(GTK_LIST_STORE(model), &src_it, &dest_it); /* reorder the bookmark item */ tp = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &src_it); new_pos = gtk_tree_path_get_indices(tp)[0] - sep_pos - 1; fm_bookmarks_reorder(fm_places_model_get_bookmarks(model), fm_places_item_get_bookmark_item(item), new_pos); gtk_tree_path_free(tp); _end: gtk_tree_path_free(sep_tp); } static void on_empty_trash(GtkAction* act, gpointer user_data) { fm_empty_trash(_get_gtk_window_from_action(act)); } #if !GTK_CHECK_VERSION(3, 0, 0) static void on_set_scroll_adjustments(GtkTreeView* view, GtkAdjustment* hadj, GtkAdjustment* vadj) { /* we don't want scroll horizontally, so we pass NULL instead of hadj. */ fm_dnd_set_dest_auto_scroll(GTK_WIDGET(view), NULL, vadj); GTK_TREE_VIEW_CLASS(fm_places_view_parent_class)->set_scroll_adjustments(view, hadj, vadj); } #endif static void fm_places_view_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { FmPlacesView *view = FM_PLACES_VIEW(object); const char *home_dir; switch( prop_id ) { case PROP_HOME_DIR: home_dir = g_value_get_string(value); if (home_dir && (!*home_dir || strcmp(home_dir, fm_get_home_dir()) == 0)) home_dir = NULL; g_free(view->home_dir); view->home_dir = g_strdup(home_dir); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void fm_places_view_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { FmPlacesView *view = FM_PLACES_VIEW(object); switch( prop_id ) { case PROP_HOME_DIR: if (view->home_dir) g_value_set_string(value, view->home_dir); else g_value_set_string(value, fm_get_home_dir()); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void fm_places_view_class_init(FmPlacesViewClass *klass) { GObjectClass *g_object_class; GtkWidgetClass* widget_class; GtkTreeViewClass* tv_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_places_view_dispose; g_object_class->finalize = fm_places_view_finalize; widget_class = GTK_WIDGET_CLASS(klass); widget_class->key_press_event = on_key_press; widget_class->button_press_event = on_button_press; widget_class->button_release_event = on_button_release; widget_class->drag_motion = on_drag_motion; widget_class->drag_leave = on_drag_leave; widget_class->drag_drop = on_drag_drop; widget_class->drag_data_received = on_drag_data_received; tv_class = GTK_TREE_VIEW_CLASS(klass); tv_class->row_activated = on_row_activated; #if !GTK_CHECK_VERSION(3, 0, 0) tv_class->set_scroll_adjustments = on_set_scroll_adjustments; #endif g_object_class->get_property = fm_places_view_get_property; g_object_class->set_property = fm_places_view_set_property; /** * FmPlacesView:home-dir-path: * * The #FmPlacesView:home-dir-path property defines which path will * be used on Home item activation. Value of %NULL resets it to the * default. * * Since: 1.2.0 */ g_object_class_install_property(g_object_class, PROP_HOME_DIR, g_param_spec_string("home-dir-path", "Home item directory", "What directory path will be used for Home item", NULL, G_PARAM_READWRITE)); /** * FmPlacesView::chdir: * @view: a view instance that emitted the signal * @button: the button row was activated with * @path: (#FmPath *) new directory path * * The #FmPlacesView::chdir signal is emitted when current selected * directory in view is changed. * * Since: 0.1.0 */ signals[CHDIR] = g_signal_new("chdir", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmPlacesViewClass, chdir), NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER); /** * FmPlacesView::item-popup: * @view: a view instance that emitted the signal * @ui: the #GtkUIManager using to create the menu * @act_grp: (#GtkActionGroup *) the menu actions group * @fi: (#FmFileInfo *) the item where menu popup is activated * * The #FmPlacesView::item-popup signal is emitted when context menu * is created for any directory in the view. Handler can modify the * menu by adding or removing elements. * * Since: 1.2.0 */ signals[ITEM_POPUP] = g_signal_new("item-popup", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmPlacesViewClass, item_popup), NULL, NULL, fm_marshal_VOID__OBJECT_OBJECT_POINTER, G_TYPE_NONE, 3, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_POINTER); tree_model_row_atom = gdk_atom_intern_static_string("GTK_TREE_MODEL_ROW"); } libfm-1.4.0/src/gtk/fm-places-view.h000066400000000000000000000053111475513661000171610ustar00rootroot00000000000000/* * fm-places-view.h * * Copyright 2009 PCMan * Copyright 2013 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_PLACES_VIEW_H__ #define __FM_PLACES_VIEW_H__ #include #include #include "fm-path.h" #include "fm-dnd-dest.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_PLACES_VIEW_TYPE (fm_places_view_get_type()) #define FM_PLACES_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_PLACES_VIEW_TYPE, FmPlacesView)) #define FM_PLACES_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_PLACES_VIEW_TYPE, FmPlacesViewClass)) #define FM_IS_PLACES_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_PLACES_VIEW_TYPE)) #define FM_IS_PLACES_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_PLACES_VIEW_TYPE)) typedef struct _FmPlacesView FmPlacesView; typedef struct _FmPlacesViewClass FmPlacesViewClass; struct _FmPlacesView { /*< private >*/ GtkTreeView parent; FmDndDest* FM_SEAL(dnd_dest); GtkTreePath* FM_SEAL(clicked_row); GtkCellRendererPixbuf* FM_SEAL(mount_indicator_renderer); char* FM_SEAL(home_dir); gpointer _reserved1; gpointer _reserved2; }; /** * FmPlacesViewClass: * @parent_class: the parent class * @chdir: the class closure for the #FmPlacesView::chdir signal * @item_popup: the class closure for the #FmPlacesView::item-popup signal */ struct _FmPlacesViewClass { GtkTreeViewClass parent_class; void (*chdir)(FmPlacesView* view, guint button, FmPath* path); void (*item_popup)(FmPlacesView* view, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfo* file); /*< private >*/ gpointer _reserved1; }; GType fm_places_view_get_type (void); FmPlacesView* fm_places_view_new (void); void fm_places_view_chdir(FmPlacesView* pv, FmPath* path); G_END_DECLS #endif /* __FM_PLACES_VIEW_H__ */ libfm-1.4.0/src/gtk/fm-progress-dlg.c000066400000000000000000000700351475513661000173520ustar00rootroot00000000000000/* * fm-progress-dlg.c * * Copyright 2009 PCMan * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2017 Nathan Osman * Copyright 2019 Simon Long * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-progress-dlg * @short_description: A dialog to show progress indicator for file operations. * @title: File progress dialog * * @include: libfm/fm-gtk.h * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-progress-dlg.h" #include "fm-config.h" #include "fm-gtk-utils.h" #include "fm-utils.h" #include #define SHOW_DLG_DELAY 1000 enum { RESPONSE_OVERWRITE = 1, RESPONSE_RENAME, RESPONSE_SKIP }; struct _FmProgressDisplay { GtkWindow* parent; GtkDialog* dlg; FmFileOpsJob* job; /* private */ GtkImage* icon; GtkLabel* msg; GtkLabel* act; GtkLabel* src; GtkWidget* dest; GtkLabel* current; GtkProgressBar* progress; GtkLabel* data_transferred; GtkLabel* data_transferred_label; GtkLabel* remaining_time; GtkLabel *remaining_time_label; GtkWidget* error_pane; GtkTextView* error_msg; GtkTextBuffer* error_buf; GtkTextTag* bold_tag; GtkButton *suspend; GtkButton *cancel; FmFileOpOption default_opt; GString *str; const char *op_text; char* cur_file; char* old_cur_file; goffset data_transferred_size; goffset data_total_size; guint percent; guint delay_timeout; guint update_timeout; GTimer* timer; gboolean has_error : 1; gboolean suspended : 1; }; static void ensure_dlg(FmProgressDisplay* data); static void fm_progress_display_destroy(FmProgressDisplay* data); static FmJobErrorAction on_error(FmFileOpsJob* job, GError* err, FmJobErrorSeverity severity, FmProgressDisplay* data) { GtkTextIter it; if(err->domain == G_IO_ERROR) { if(err->code == G_IO_ERROR_CANCELLED) return FM_JOB_ABORT; else if(err->code == G_IO_ERROR_FAILED_HANDLED) return FM_JOB_CONTINUE; } if(data->timer) g_timer_stop(data->timer); data->has_error = TRUE; ensure_dlg(data); /* FIXME: Need to mount volumes on demand here, too. if( err->domain == G_IO_ERROR ) { if( err->code == G_IO_ERROR_NOT_MOUNTED && severity < FM_JOB_ERROR_CRITICAL ) if(fm_mount_path(parent, dest_path)) return FM_JOB_RETRY; } */ gtk_text_buffer_get_end_iter(data->error_buf, &it); if(data->cur_file == NULL) g_warning("FmProgressDialog on_error: assertion `cur_file != NULL' failed"); if(data->cur_file || data->old_cur_file) { gtk_text_buffer_insert_with_tags(data->error_buf, &it, data->cur_file ? data->cur_file : data->old_cur_file, -1, data->bold_tag, NULL); gtk_text_buffer_insert(data->error_buf, &it, _(": "), -1); } gtk_text_buffer_insert(data->error_buf, &it, err->message, -1); gtk_text_buffer_insert(data->error_buf, &it, "\n", 1); if(!gtk_widget_get_visible(data->error_pane)) gtk_widget_show(data->error_pane); if(data->timer) g_timer_continue(data->timer); return FM_JOB_CONTINUE; } static gint on_ask(FmFileOpsJob* job, const char* question, char* const* options, FmProgressDisplay* data) { ensure_dlg(data); return fm_askv(GTK_WINDOW(data->dlg), NULL, question, options); } static void on_filename_changed(GtkEditable* entry, GtkWidget* rename) { const char* old_name = g_object_get_data(G_OBJECT(entry), "old_name"); const char* new_name = gtk_entry_get_text(GTK_ENTRY(entry)); gboolean can_rename = new_name && *new_name && g_strcmp0(old_name, new_name); gtk_widget_set_sensitive(rename, can_rename); if(can_rename) { GtkDialog* dlg = GTK_DIALOG(gtk_widget_get_toplevel(GTK_WIDGET(entry))); gtk_dialog_set_default_response(dlg, gtk_dialog_get_response_for_widget(dlg, rename)); } } static gint on_ask_rename(FmFileOpsJob* job, FmFileInfo* src, FmFileInfo* dest, char** new_name, FmProgressDisplay* data) { int res; GtkBuilder* builder; GtkDialog *dlg; GtkImage *src_icon, *dest_icon; GtkLabel *src_fi, *dest_fi; GtkEntry *filename; GtkToggleButton *apply_all; char* tmp; const char* disp_size; FmPath* path; FmIcon* icon; FmFileOpOption options; gboolean no_valid_dest; /* return default operation if the user has set it */ if(data->default_opt) return data->default_opt; no_valid_dest = (fm_file_info_get_desc(dest) == NULL); builder = gtk_builder_new(); path = fm_file_info_get_path(dest); icon = fm_file_info_get_icon(src); if(data->timer) g_timer_stop(data->timer); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); ensure_dlg(data); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/ask-rename.ui", NULL); dlg = GTK_DIALOG(gtk_builder_get_object(builder, "dlg")); src_icon = GTK_IMAGE(gtk_builder_get_object(builder, "src_icon")); src_fi = GTK_LABEL(gtk_builder_get_object(builder, "src_fi")); dest_icon = GTK_IMAGE(gtk_builder_get_object(builder, "dest_icon")); dest_fi = GTK_LABEL(gtk_builder_get_object(builder, "dest_fi")); filename = GTK_ENTRY(gtk_builder_get_object(builder, "filename")); apply_all = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "apply_all")); gtk_window_set_transient_for(GTK_WINDOW(dlg), GTK_WINDOW(data->dlg)); gtk_image_set_from_gicon(src_icon, G_ICON(icon), GTK_ICON_SIZE_DIALOG); disp_size = fm_file_info_get_disp_size(src); if(disp_size) { tmp = g_strdup_printf(_("Type: %s\nSize: %s\nModified: %s"), fm_file_info_get_desc(src), disp_size, fm_file_info_get_disp_mtime(src)); } else { tmp = g_strdup_printf(_("Type: %s\nModified: %s"), fm_file_info_get_desc(src), fm_file_info_get_disp_mtime(src)); } gtk_label_set_text(src_fi, tmp); g_free(tmp); gtk_image_set_from_gicon(dest_icon, G_ICON(icon), GTK_ICON_SIZE_DIALOG); disp_size = fm_file_info_get_disp_size(dest); if(disp_size) { tmp = g_strdup_printf(_("Type: %s\nSize: %s\nModified: %s"), fm_file_info_get_desc(dest), disp_size, fm_file_info_get_disp_mtime(dest)); } else if (no_valid_dest) { tmp = NULL; gtk_widget_destroy(GTK_WIDGET(dest_icon)); gtk_widget_destroy(GTK_WIDGET(dest_fi)); /* FIXME: change texts in dialog appropriately */ } else { tmp = g_strdup_printf(_("Type: %s\nModified: %s"), fm_file_info_get_desc(dest), fm_file_info_get_disp_mtime(dest)); } if (tmp) gtk_label_set_text(dest_fi, tmp); g_free(tmp); options = fm_file_ops_job_get_options(job); if (!(options & FM_FILE_OP_RENAME)) { GtkWidget *widget = GTK_WIDGET(gtk_builder_get_object(builder, "rename")); gtk_widget_destroy(widget); } if (!(options & FM_FILE_OP_OVERWRITE) || no_valid_dest) { GtkWidget *widget = GTK_WIDGET(gtk_builder_get_object(builder, "overwrite")); gtk_widget_destroy(widget); } if (!(options & FM_FILE_OP_SKIP)) { GtkWidget *widget = GTK_WIDGET(gtk_builder_get_object(builder, "skip")); gtk_widget_destroy(widget); } tmp = g_filename_display_name(fm_path_get_basename(path)); gtk_entry_set_text(filename, tmp); g_object_set_data_full(G_OBJECT(filename), "old_name", tmp, g_free); g_signal_connect(filename, "changed", G_CALLBACK(on_filename_changed), gtk_builder_get_object(builder, "rename")); g_object_unref(builder); res = gtk_dialog_run(dlg); switch(res) { case RESPONSE_RENAME: *new_name = g_strdup(gtk_entry_get_text(filename)); res = FM_FILE_OP_RENAME; break; case RESPONSE_OVERWRITE: res = FM_FILE_OP_OVERWRITE; break; case RESPONSE_SKIP: res = FM_FILE_OP_SKIP; break; default: res = FM_FILE_OP_CANCEL; } if(gtk_toggle_button_get_active(apply_all)) { if(res == RESPONSE_OVERWRITE || res == FM_FILE_OP_SKIP) data->default_opt = res; } gtk_widget_destroy(GTK_WIDGET(dlg)); if(data->timer) g_timer_continue(data->timer); return res; } static void on_finished(FmFileOpsJob* job, FmProgressDisplay* data) { GtkWindow* parent = NULL; /* preserve pointers that fm_progress_display_destroy() will unreference as they may be requested by trash support below */ if(data->parent) parent = g_object_ref(data->parent); g_object_ref(job); if(data->dlg) { /* errors happened */ if(data->has_error) { gtk_widget_destroy(GTK_WIDGET(data->current)); data->current = NULL; if (data->remaining_time_label) { gtk_widget_destroy(GTK_WIDGET(data->remaining_time_label)); gtk_widget_destroy(GTK_WIDGET(data->remaining_time)); data->remaining_time = NULL; } else gtk_label_set_text(data->remaining_time, "00:00:00"); gtk_widget_hide(GTK_WIDGET(data->suspend)); gtk_widget_hide(GTK_WIDGET(data->cancel)); gtk_dialog_add_button(data->dlg, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); gtk_image_set_from_stock(data->icon, GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); gtk_widget_show(GTK_WIDGET(data->icon)); gtk_widget_show(GTK_WIDGET(data->msg)); if(fm_job_is_cancelled(FM_JOB(job))) { gtk_label_set_markup(data->msg, _("Errors occurred before file operation was stopped.")); gtk_window_set_title(GTK_WINDOW(data->dlg), _("Cancelled")); } else { gtk_label_set_markup(data->msg, _("The file operation was completed with errors.")); gtk_window_set_title(GTK_WINDOW(data->dlg), _("Finished")); } } else fm_progress_display_destroy(data); g_debug("file operation is finished!"); } else fm_progress_display_destroy(data); /* if it's not destroyed yet then it will be destroyed with dialog window */ /* sepcial handling for trash * FIXME: need to refactor this to use a more elegant way later. */ if(job->type == FM_FILE_OP_TRASH) /* FIXME: direct access to job struct! */ { FmPathList* unsupported = (FmPathList*)g_object_get_data(G_OBJECT(job), "trash-unsupported"); /* some files cannot be trashed because underlying filesystems don't support it. */ g_object_unref(job); if(unsupported) /* delete them instead */ { /* FIXME: parent window might be already destroyed! */ if(fm_yes_no(parent, NULL, _("Some files cannot be moved to trash can because " "the underlying file systems don't support this operation.\n" "Do you want to delete them instead?"), TRUE)) { job = fm_file_ops_job_new(FM_FILE_OP_DELETE, unsupported); fm_file_ops_job_run_with_progress(parent, job); /* it eats reference! */ } } } else g_object_unref(job); if(parent) g_object_unref(parent); } static void on_cancelled(FmFileOpsJob* job, FmProgressDisplay* data) { g_debug("file operation is cancelled!"); } static void on_response(GtkDialog* dlg, gint id, FmProgressDisplay* data) { /* cancel the job */ if(id == GTK_RESPONSE_CANCEL) { fm_job_cancel(FM_JOB(data->job)); if (data->suspended) { fm_job_resume(FM_JOB(data->job)); data->suspended = FALSE; } } else if(id == GTK_RESPONSE_CLOSE || id == GTK_RESPONSE_DELETE_EVENT) fm_progress_display_destroy(data); else if (id == 1 && data->suspend) { if (data->suspended) { data->suspended = FALSE; fm_job_resume(FM_JOB(data->job)); gtk_button_set_label(data->suspend, _("_Pause")); gtk_button_set_image(data->suspend, gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE, GTK_ICON_SIZE_BUTTON)); } else if (fm_job_pause(FM_JOB(data->job))) { data->suspended = TRUE; gtk_button_set_label(data->suspend, _("_Resume")); gtk_button_set_image(data->suspend, gtk_image_new_from_stock(GTK_STOCK_MEDIA_FORWARD, GTK_ICON_SIZE_BUTTON)); } else g_warning("FmJob failed to pause"); } } static gboolean on_update_dlg(gpointer user_data) { FmProgressDisplay* data = (FmProgressDisplay*)user_data; gdouble elapsed; char* data_transferred_str; char trans_size_str[128]; char total_size_str[128]; if (g_source_is_destroyed(g_main_current_source()) || data->dlg == NULL) return FALSE; data->update_timeout = 0; /* the g_strdup very probably returns the same pointer that was g_free'd so we cannot just compare data->old_cur_file with data->cur_file */ if(data->cur_file && data->current) { g_string_printf(data->str, "%s %s", data->op_text, data->cur_file); gtk_label_set_markup(data->current, data->str->str); gtk_widget_set_tooltip_text(GTK_WIDGET(data->current), data->cur_file); g_free(data->old_cur_file); data->old_cur_file = data->cur_file; data->cur_file = NULL; } g_string_printf(data->str, "%d %%", data->percent); gtk_progress_bar_set_fraction(data->progress, (gdouble)data->percent/100); gtk_progress_bar_set_text(data->progress, data->str->str); /* display the amount of data transferred */ fm_file_size_to_str(trans_size_str, sizeof(trans_size_str), data->data_transferred_size, fm_config->si_unit); fm_file_size_to_str(total_size_str, sizeof(total_size_str), data->data_total_size, fm_config->si_unit); data_transferred_str = g_strdup_printf("%s / %s", trans_size_str, total_size_str); gtk_label_set_text(data->data_transferred, data_transferred_str); g_free(data_transferred_str); elapsed = g_timer_elapsed(data->timer, NULL); if(elapsed >= 0.5 && data->percent > 0) { gdouble remaining = elapsed * (100 - data->percent) / data->percent; if(data->remaining_time) { char time_str[32]; guint secs = (guint)remaining; guint mins = 0; guint hrs = 0; if(secs >= 60) { mins = secs / 60; secs %= 60; if(mins >= 60) { hrs = mins / 60; mins %= 60; } } g_snprintf(time_str, 32, "%02d:%02d:%02d", hrs, mins, secs); gtk_label_set_text(data->remaining_time, time_str); } } return FALSE; } static void on_cur_file(FmFileOpsJob* job, const char* cur_file, FmProgressDisplay* data) { g_free(data->cur_file); data->cur_file = g_strdup(cur_file); /* NOTE: Displaying currently processed file will slow down the * operation and waste CPU source due to showing the text with pango. * Consider showing current file every 0.5 second. */ if(data->dlg && data->update_timeout == 0) data->update_timeout = gdk_threads_add_timeout(500, on_update_dlg, data); } static void on_percent(FmFileOpsJob* job, guint percent, FmProgressDisplay* data) { data->data_transferred_size = job->finished + job->current_file_finished; data->data_total_size = job->total; data->percent = percent; if(data->dlg && data->update_timeout == 0) data->update_timeout = gdk_threads_add_timeout(500, on_update_dlg, data); } static void on_progress_dialog_destroy(gpointer user_data, GObject* dlg) { FmProgressDisplay* data = (FmProgressDisplay*)user_data; data->dlg = NULL; /* it's destroying right now, don't destroy it again */ g_object_unref(data->error_buf); /* these will be not unref if no dlg */ g_object_unref(data->bold_tag); fm_progress_display_destroy(data); } static gboolean _on_show_dlg(gpointer user_data) { FmProgressDisplay* data = (FmProgressDisplay*)user_data; GtkBuilder* builder; GtkLabel* to; GtkWidget *to_label; FmPath* dest; const char* title = NULL; GtkTextTagTable* tag_table; builder = gtk_builder_new(); tag_table = gtk_text_tag_table_new(); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/progress.ui", NULL); data->dlg = GTK_DIALOG(gtk_builder_get_object(builder, "dlg")); g_object_weak_ref(G_OBJECT(data->dlg), on_progress_dialog_destroy, data); g_signal_connect(data->dlg, "response", G_CALLBACK(on_response), data); /* FIXME: connect to "close" signal */ to_label = (GtkWidget*)gtk_builder_get_object(builder, "to_label"); to = GTK_LABEL(gtk_builder_get_object(builder, "dest")); data->icon = GTK_IMAGE(gtk_builder_get_object(builder, "icon")); data->msg = GTK_LABEL(gtk_builder_get_object(builder, "msg")); data->act = GTK_LABEL(gtk_builder_get_object(builder, "action")); data->src = GTK_LABEL(gtk_builder_get_object(builder, "src")); data->dest = (GtkWidget*)gtk_builder_get_object(builder, "dest"); data->current = GTK_LABEL(gtk_builder_get_object(builder, "current")); data->progress = GTK_PROGRESS_BAR(gtk_builder_get_object(builder, "progress")); data->error_pane = (GtkWidget*)gtk_builder_get_object(builder, "error_pane"); data->error_msg = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "error_msg")); data->data_transferred = GTK_LABEL(gtk_builder_get_object(builder, "data_transferred")); data->data_transferred_label = GTK_LABEL(gtk_builder_get_object(builder, "data_transferred_label")); data->remaining_time = GTK_LABEL(gtk_builder_get_object(builder, "remaining_time")); data->remaining_time_label = GTK_LABEL(gtk_builder_get_object(builder, "remaining_time_label")); data->cancel = GTK_BUTTON(gtk_builder_get_object(builder, "cancel")); data->suspend = GTK_BUTTON(gtk_dialog_add_button(data->dlg, _("_Pause"), 1)); gtk_button_set_use_stock(data->suspend, FALSE); gtk_button_set_use_underline(data->suspend, TRUE); gtk_button_set_image(data->suspend, gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE, GTK_ICON_SIZE_BUTTON)); gtk_dialog_set_alternative_button_order(data->dlg, 1, GTK_RESPONSE_CANCEL, -1); data->bold_tag = gtk_text_tag_new("bold"); g_object_set(data->bold_tag, "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_tag_table_add(tag_table, data->bold_tag); data->error_buf = gtk_text_buffer_new(tag_table); g_object_unref(tag_table); gtk_text_view_set_buffer(data->error_msg, data->error_buf); gtk_widget_hide(GTK_WIDGET(data->icon)); g_object_unref(builder); /* set the src label */ /* FIXME: direct access to job struct! */ if(data->job->srcs) { GList* l = fm_path_list_peek_head_link(data->job->srcs); int i; char* disp; FmPath* path; GString* str = g_string_sized_new(512); path = FM_PATH(l->data); disp = fm_path_display_basename(path); g_string_assign(str, disp); g_free(disp); for( i =1, l=l->next; i < 10 && l; l=l->next, ++i) { path = FM_PATH(l->data); g_string_append(str, _(", ")); disp = fm_path_display_basename(path); g_string_append(str, disp); g_free(disp); } if(l) g_string_append(str, "..."); gtk_label_set_text(data->src, str->str); gtk_widget_set_tooltip_text(GTK_WIDGET(data->src), str->str); g_string_free(str, TRUE); } /* FIXME: use accessor functions instead */ /* FIXME: direct access to job struct! */ switch(data->job->type) { /* we set title here if text is complex so may be different from the op_text when is translated to other languages */ case FM_FILE_OP_MOVE: /* translators: it is part of "Moving files:" or "Moving xxx.txt" */ data->op_text = _("Moving"); break; case FM_FILE_OP_COPY: /* translators: it is part of "Copying files:" or "Copying xxx.txt" */ data->op_text = _("Copying"); break; case FM_FILE_OP_TRASH: /* translators: it is part of "Trashing files:" or "Trashing xxx.txt" */ data->op_text = _("Trashing"); break; case FM_FILE_OP_DELETE: /* translators: it is part of "Deleting files:" or "Deleting xxx.txt" */ data->op_text = _("Deleting"); break; case FM_FILE_OP_LINK: /* translators: it is part of "Creating link /path/xxx.txt" */ data->op_text = _("Creating link"); /* translators: 'In:' string is followed by destination folder path */ gtk_label_set_markup(GTK_LABEL(to_label), _("In:")); title = _("Creating links to files"); /* NOTE: on creating single symlink or shortcut all operation is done in single I/O therefore it should fit into 0.5s timeout and progress window will never be shown */ break; case FM_FILE_OP_CHANGE_ATTR: /* translators: it is part of "Changing attributes of xxx.txt" */ data->op_text = _("Changing attributes of"); title = _("Changing attributes of files"); /* NOTE: the same about single symlink is appliable here so there is no need to add never used string for translation */ break; case FM_FILE_OP_UNTRASH: /* translators: it is part of "Restoring files:" or "Restoring xxx.txt" */ data->op_text = _("Restoring"); break; case FM_FILE_OP_NONE: ; } data->str = g_string_sized_new(64); if (title) gtk_window_set_title(GTK_WINDOW(data->dlg), title); else { /* note to translators: resulting string is such as "Deleting files" */ g_string_printf(data->str, _("%s files"), data->op_text); gtk_window_set_title(GTK_WINDOW(data->dlg), data->str->str); } gtk_label_set_markup(data->msg, _("File operation is in progress...")); gtk_widget_show(GTK_WIDGET(data->msg)); if (title) /* we already know the exact string */ g_string_printf(data->str, "%s:", title); else if (fm_path_list_get_length(data->job->srcs) == 1) /* note to translators: resulting string is such as "Deleting file" */ g_string_printf(data->str, _("%s file:"), data->op_text); else /* note to translators: resulting string is such as "Deleting files" */ g_string_printf(data->str, _("%s files:"), data->op_text); gtk_label_set_markup(data->act, data->str->str); dest = fm_file_ops_job_get_dest(data->job); if(dest) { char* dest_str = fm_path_display_name(dest, TRUE); gtk_label_set_text(to, dest_str); gtk_widget_set_tooltip_text(GTK_WIDGET(data->dest), dest_str); g_free(dest_str); } else { gtk_widget_destroy(data->dest); gtk_widget_destroy(to_label); } gtk_window_set_transient_for(GTK_WINDOW(data->dlg), data->parent); gtk_window_present(GTK_WINDOW(data->dlg)); data->delay_timeout = 0; return FALSE; } static gboolean on_show_dlg(gpointer user_data) { if(g_source_is_destroyed(g_main_current_source())) return FALSE; return _on_show_dlg(user_data); } static void ensure_dlg(FmProgressDisplay* data) { if(data->delay_timeout) { g_source_remove(data->delay_timeout); data->delay_timeout = 0; } GDK_THREADS_ENTER(); if(!data->dlg) _on_show_dlg(data); GDK_THREADS_LEAVE(); } static void on_prepared(FmFileOpsJob* job, FmProgressDisplay* data) { data->timer = g_timer_new(); } /** * fm_file_ops_job_run_with_progress * @parent: parent window to show dialog over it * @job: (transfer full): job descriptor to run * * Runs the file operation job with a progress dialog. * The returned data structure will be freed in idle handler automatically * when it's not needed anymore. * * NOTE: INCONSISTENCY: it takes a reference from job * * Before 0.1.15 this call had different arguments. * * Return value: (transfer none): progress data; not usable; caller should not free it either. * * Since: 0.1.0 */ FmProgressDisplay* fm_file_ops_job_run_with_progress(GtkWindow* parent, FmFileOpsJob* job) { FmProgressDisplay* data; g_return_val_if_fail(job != NULL, NULL); data = g_slice_new0(FmProgressDisplay); data->job = job; if(parent) data->parent = g_object_ref(parent); data->delay_timeout = gdk_threads_add_timeout(SHOW_DLG_DELAY, on_show_dlg, data); g_signal_connect(job, "ask", G_CALLBACK(on_ask), data); g_signal_connect(job, "ask-rename", G_CALLBACK(on_ask_rename), data); g_signal_connect(job, "error", G_CALLBACK(on_error), data); g_signal_connect(job, "prepared", G_CALLBACK(on_prepared), data); g_signal_connect(job, "cur-file", G_CALLBACK(on_cur_file), data); g_signal_connect(job, "percent", G_CALLBACK(on_percent), data); g_signal_connect(job, "finished", G_CALLBACK(on_finished), data); g_signal_connect(job, "cancelled", G_CALLBACK(on_cancelled), data); if (!fm_job_run_async(FM_JOB(job))) { fm_progress_display_destroy(data); return NULL; } return data; } static void fm_progress_display_destroy(FmProgressDisplay* data) { g_signal_handlers_disconnect_by_func(data->job, on_cancelled, data); fm_job_cancel(FM_JOB(data->job)); if (data->suspended) fm_job_resume(FM_JOB(data->job)); g_signal_handlers_disconnect_by_func(data->job, on_ask, data); g_signal_handlers_disconnect_by_func(data->job, on_ask_rename, data); g_signal_handlers_disconnect_by_func(data->job, on_error, data); g_signal_handlers_disconnect_by_func(data->job, on_prepared, data); g_signal_handlers_disconnect_by_func(data->job, on_cur_file, data); g_signal_handlers_disconnect_by_func(data->job, on_percent, data); g_signal_handlers_disconnect_by_func(data->job, on_finished, data); g_object_unref(data->job); if(data->timer) g_timer_destroy(data->timer); if(data->parent) g_object_unref(data->parent); g_free(data->cur_file); g_free(data->old_cur_file); if(data->delay_timeout) g_source_remove(data->delay_timeout); if(data->update_timeout) g_source_remove(data->update_timeout); if(data->dlg) { g_object_weak_unref(G_OBJECT(data->dlg), on_progress_dialog_destroy, data); g_object_unref(data->error_buf); g_object_unref(data->bold_tag); gtk_widget_destroy(GTK_WIDGET(data->dlg)); } if (data->str) g_string_free(data->str, TRUE); g_slice_free(FmProgressDisplay, data); } libfm-1.4.0/src/gtk/fm-progress-dlg.h000066400000000000000000000026351475513661000173600ustar00rootroot00000000000000/* * fm-progress-dlg.h * * Copyright 2009 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_PROGRESS_DLG_H__ #define __FM_PROGRESS_DLG_H__ #include #include "fm-file-ops-job.h" G_BEGIN_DECLS typedef struct _FmProgressDisplay FmProgressDisplay; /* Run the file operation job with a progress dialog. * The returned data structure will be freed in idle handler automatically * when it's not needed anymore. * NOTE: INCONSISTENCY: it takes a reference from job */ FmProgressDisplay* fm_file_ops_job_run_with_progress(GtkWindow* parent, FmFileOpsJob* job); G_END_DECLS #endif /* __FM_PROGRESS_DLG_H__ */ libfm-1.4.0/src/gtk/fm-side-pane.c000066400000000000000000000467541475513661000166220ustar00rootroot00000000000000// fm-side-pane.c // // Copyright 2011 Hong Jen Yee (PCMan) // Copyright 2013-2014 Andriy Grytsenko (LStranger) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. /** * SECTION:fm-side-pane * @short_description: A widget for side pane displaying * @title: FmSidePane * * @include: libfm/fm-gtk.h * * The #FmSidePane widget displays side pane for fast navigation across * places. */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-side-pane.h" #include "fm-places-view.h" #include "fm-dir-tree-model.h" #include "fm-dir-tree-view.h" #include "fm-file-info-job.h" #include enum { CHDIR, MODE_CHANGED, N_SIGNALS }; static guint signals[N_SIGNALS]; static FmDirTreeModel* dir_tree_model = NULL; static char menu_xml[] = "" // "" "" "" // "" ""; static GtkRadioActionEntry menu_actions[]= { {"Off", NULL, N_("_Off"), NULL, NULL, FM_SP_NONE}, {"Places", NULL, N_("_Places"), NULL, NULL, FM_SP_PLACES}, {"DirTree", NULL, N_("_Directory Tree"), NULL, NULL, FM_SP_DIR_TREE}, {"Remote", NULL, N_("_Remote"), NULL, NULL, FM_SP_REMOTE}, }; static void fm_side_pane_dispose (GObject *object); G_DEFINE_TYPE(FmSidePane, fm_side_pane, GTK_TYPE_VBOX) static void fm_side_pane_class_init(FmSidePaneClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_side_pane_dispose; /** * FmSidePane::chdir: * @pane: the widget which emitted the signal * @button: the button path was activated with * @path: (#FmPath *) new directory path * * The #FmSidePane::chdir signal is emitted when current selected * directory in the @pane is changed. * * Since: 0.1.12 */ signals[CHDIR] = g_signal_new("chdir", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmSidePaneClass, chdir), NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER); /** * FmSidePane::mode-changed: * @pane: the widget which emitted the signal * * The #FmSidePane::mode-changed signal is emitted when view mode * in the pane is changed. * * Since: 0.1.12 */ signals[MODE_CHANGED] = g_signal_new("mode-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmSidePaneClass, mode_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); } /* Adopted from gtk/gtkmenutoolbutton.c * Copyright (C) 2003 Ricardo Fernandez Pascual * Copyright (C) 2004 Paolo Borelli */ static void menu_position_func(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer button) { GtkWidget *widget = GTK_WIDGET(button); GtkRequisition menu_req; GdkRectangle monitor; GtkAllocation allocation; gint monitor_num; GdkScreen *screen; GdkWindow *window; #if GTK_CHECK_VERSION(3, 0, 0) gtk_widget_get_preferred_size(GTK_WIDGET(menu), &menu_req, NULL); #else gtk_widget_size_request (GTK_WIDGET (menu), &menu_req); #endif /* make the menu as wide as the button when needed */ gtk_widget_get_allocation(widget, &allocation); if(menu_req.width < allocation.width) { menu_req.width = allocation.width; gtk_widget_set_size_request(GTK_WIDGET(menu), menu_req.width, -1); } screen = gtk_widget_get_screen (GTK_WIDGET (menu)); window = gtk_widget_get_window(widget); monitor_num = gdk_screen_get_monitor_at_window (screen, window); if (monitor_num < 0) monitor_num = 0; gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); gdk_window_get_origin (window, x, y); *x += allocation.x; *y += allocation.y; /* if (direction == GTK_TEXT_DIR_LTR) *x += MAX (widget->allocation.width - menu_req.width, 0); else if (menu_req.width > widget->allocation.width) *x -= menu_req.width - widget->allocation.width; */ if ((*y + allocation.height + menu_req.height) <= monitor.y + monitor.height) *y += allocation.height; else if ((*y - menu_req.height) >= monitor.y) *y -= menu_req.height; else if (monitor.y + monitor.height - (*y + allocation.height) > *y) *y += allocation.height; else *y -= menu_req.height; *push_in = FALSE; } static void on_menu_btn_clicked(GtkButton* btn, FmSidePane* sp) { gtk_menu_popup((GtkMenu *)sp->menu, NULL, NULL, menu_position_func, btn, 1, gtk_get_current_event_time()); } static void on_mode_changed(GtkRadioAction* act, GtkRadioAction *current, FmSidePane* sp) { FmSidePaneMode mode = gtk_radio_action_get_current_value(act); if(mode != sp->mode) fm_side_pane_set_mode(sp, mode); } static void fm_side_pane_init(FmSidePane *sp) { GtkActionGroup* act_grp = gtk_action_group_new("SidePane"); GtkWidget* hbox; gtk_action_group_set_translation_domain(act_grp, GETTEXT_PACKAGE); #if GTK_CHECK_VERSION(3, 2, 0) /* FIXME: migrate to GtkGrid */ sp->title_bar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else sp->title_bar = gtk_hbox_new(FALSE, 0); #endif sp->menu_label = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(sp->menu_label), 0.0, 0.5); sp->menu_btn = gtk_button_new(); #if GTK_CHECK_VERSION(3, 2, 0) /* FIXME: migrate to GtkGrid */ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); #else hbox = gtk_hbox_new(FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(hbox), sp->menu_label, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE), FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(sp->menu_btn), hbox); // gtk_widget_set_tooltip_text(sp->menu_btn, _("")); g_signal_connect(sp->menu_btn, "clicked", G_CALLBACK(on_menu_btn_clicked), sp); gtk_button_set_relief(GTK_BUTTON(sp->menu_btn), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(sp->title_bar), sp->menu_btn, TRUE, TRUE, 0); /* the drop down menu */ sp->ui = gtk_ui_manager_new(); gtk_ui_manager_add_ui_from_string(sp->ui, menu_xml, -1, NULL); gtk_action_group_add_radio_actions(act_grp, menu_actions, G_N_ELEMENTS(menu_actions), -1, G_CALLBACK(on_mode_changed), sp); gtk_ui_manager_insert_action_group(sp->ui, act_grp, -1); g_object_unref(act_grp); sp->menu = gtk_ui_manager_get_widget(sp->ui, "/popup"); sp->scroll = gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(sp), sp->title_bar, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(sp), sp->scroll, TRUE, TRUE, 0); gtk_widget_show_all(GTK_WIDGET(sp)); } /** * fm_side_pane_new * * Creates new side pane. * * Returns: (transfer full): a new #FmSidePane widget. * * Since: 0.1.12 */ FmSidePane *fm_side_pane_new(void) { return g_object_new(FM_TYPE_SIDE_PANE, NULL); } /** * fm_side_pane_get_cwd * @sp: a widget to inspect * * Retrieves current active path in the side pane. Returned data are * owned by side pane and should not be freed by caller. * * Returns: active file path. * * Since: 0.1.12 */ FmPath* fm_side_pane_get_cwd(FmSidePane* sp) { return sp->cwd; } /** * fm_side_pane_chdir * @sp: a widget to apply * @path: new path * * Changes active path in the side pane. * * Since: 0.1.12 */ void fm_side_pane_chdir(FmSidePane* sp, FmPath* path) { g_return_if_fail(sp->view != NULL); if(sp->cwd) fm_path_unref(sp->cwd); sp->cwd = fm_path_ref(path); switch(sp->mode) { case FM_SP_PLACES: fm_places_view_chdir(FM_PLACES_VIEW(sp->view), path); break; case FM_SP_DIR_TREE: fm_dir_tree_view_chdir(FM_DIR_TREE_VIEW(sp->view), path); break; default: break; } } static void on_places_chdir(FmPlacesView* view, guint button, FmPath* path, FmSidePane* sp) { if(sp->cwd) fm_path_unref(sp->cwd); sp->cwd = fm_path_ref(path); g_signal_emit(sp, signals[CHDIR], 0, button, path); } static void on_dirtree_chdir(FmDirTreeView* view, guint button, FmPath* path, FmSidePane* sp) { if(sp->cwd) fm_path_unref(sp->cwd); sp->cwd = fm_path_ref(path); g_signal_emit(sp, signals[CHDIR], 0, button, path); } static void on_item_popup(GtkWidget* view, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfo* file, FmSidePane* sp) { sp->update_popup(sp, ui, act_grp, file, sp->popup_user_data); } static void fm_side_pane_dispose(GObject *object) { FmSidePane *sp; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_SIDE_PANE(object)); sp = (FmSidePane*)object; if(sp->menu_btn) { g_signal_handlers_disconnect_by_func(sp->menu_btn, on_menu_btn_clicked, sp); sp->menu_btn = NULL; } if(sp->cwd) { fm_path_unref(sp->cwd); sp->cwd = NULL; } if(sp->ui) { g_object_unref(sp->ui); sp->ui = NULL; } if(sp->view) { switch(sp->mode) { case FM_SP_PLACES: if (sp->update_popup) g_signal_handlers_disconnect_by_func(sp->view, on_item_popup, sp); g_signal_handlers_disconnect_by_func(sp->view, on_places_chdir, sp); break; case FM_SP_DIR_TREE: if (sp->update_popup) g_signal_handlers_disconnect_by_func(sp->view, on_item_popup, sp); g_signal_handlers_disconnect_by_func(sp->view, on_dirtree_chdir, sp); break; default: ; /* other values are impossible, otherwise it's a bug */ } gtk_widget_destroy(sp->view); sp->view = NULL; } G_OBJECT_CLASS(fm_side_pane_parent_class)->dispose(object); } static void init_dir_tree(FmSidePane* sp) { if(dir_tree_model) g_object_ref(dir_tree_model); else { FmFileInfoJob* job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_NONE); GList* l; /* query FmFileInfo for home dir and root dir, and then, * add them to dir tree model */ fm_file_info_job_add(job, fm_path_get_home()); fm_file_info_job_add(job, fm_path_get_root()); /* FIXME: maybe it's cleaner to use run_async here? */ GDK_THREADS_LEAVE(); fm_job_run_sync_with_mainloop(FM_JOB(job)); GDK_THREADS_ENTER(); dir_tree_model = fm_dir_tree_model_new(); for(l = fm_file_info_list_peek_head_link(job->file_infos); l; l = l->next) { FmFileInfo* fi = FM_FILE_INFO(l->data); fm_dir_tree_model_add_root(dir_tree_model, fi, NULL); } g_object_unref(job); g_object_add_weak_pointer((GObject*)dir_tree_model, (gpointer*)&dir_tree_model); } gtk_tree_view_set_model(GTK_TREE_VIEW(sp->view), GTK_TREE_MODEL(dir_tree_model)); g_object_unref(dir_tree_model); } /** * fm_side_pane_set_mode * @sp: a widget to apply * @mode: new mode for the side pane * * Changes side pane view mode. * * Since: 0.1.12 */ void fm_side_pane_set_mode(FmSidePane* sp, FmSidePaneMode mode) { if(mode == sp->mode) return; if(sp->view) { if (sp->update_popup) g_signal_handlers_disconnect_by_func(sp->view, on_item_popup, sp); gtk_widget_destroy(sp->view); } sp->mode = mode; switch(mode) { case FM_SP_PLACES: gtk_label_set_text(GTK_LABEL(sp->menu_label), _("Places")); /* create places view */ sp->view = (GtkWidget*)fm_places_view_new(); fm_places_view_chdir(FM_PLACES_VIEW(sp->view), sp->cwd); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sp->scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); g_signal_connect(sp->view, "chdir", G_CALLBACK(on_places_chdir), sp); break; case FM_SP_DIR_TREE: gtk_label_set_text(GTK_LABEL(sp->menu_label), _("Directory Tree")); /* create a dir tree */ sp->view = (GtkWidget*)fm_dir_tree_view_new(); init_dir_tree(sp); fm_dir_tree_view_chdir(FM_DIR_TREE_VIEW(sp->view), sp->cwd); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sp->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); g_signal_connect(sp->view, "chdir", G_CALLBACK(on_dirtree_chdir), sp); break; default: sp->view = NULL; /* not implemented */ return; } if (sp->update_popup) g_signal_connect(sp->view, "item-popup", G_CALLBACK(on_item_popup), sp); gtk_widget_show(sp->view); gtk_container_add(GTK_CONTAINER(sp->scroll), sp->view); g_signal_emit(sp, signals[MODE_CHANGED], 0); /* update the popup menu */ gtk_radio_action_set_current_value((GtkRadioAction*)gtk_ui_manager_get_action(sp->ui, "/popup/Places"), sp->mode); } /** * fm_side_pane_get_mode * @sp: a widget to inspect * * Retrieves side pane view mode. * * Returns: current view mode. * * Since: 0.1.12 */ FmSidePaneMode fm_side_pane_get_mode(FmSidePane* sp) { return sp->mode; } /** * fm_side_pane_get_title_bar * @sp: a widget to inspect * * Retrieves side pane title bar widget. * * Returns: (transfer none): pointer to title bar of side pane. * * Since: 0.1.14 */ GtkWidget* fm_side_pane_get_title_bar(FmSidePane* sp) { return sp->title_bar; } /** * fm_side_pane_set_popup_updater * @sp: a widget to set * @update_popup: (allow-none): a callback to update popup * @user_data: user data supplied for callback * * Sets up the callback to update context menu on any item in the sidebar * widget. * * Since: 1.2.0 */ void fm_side_pane_set_popup_updater(FmSidePane* sp, FmSidePaneUpdatePopup update_popup, gpointer user_data) { gboolean was_set = (sp->update_popup != NULL); sp->update_popup = update_popup; sp->popup_user_data = user_data; if (sp->view == NULL) return; /* nothing to do yet */ if (was_set) { switch (sp->mode) { case FM_SP_PLACES: case FM_SP_DIR_TREE: if (update_popup == NULL) g_signal_handlers_disconnect_by_func(sp->view, on_item_popup, sp); break; default: ; } } else if (update_popup) { switch (sp->mode) { case FM_SP_PLACES: case FM_SP_DIR_TREE: g_signal_connect(sp->view, "item-popup", G_CALLBACK(on_item_popup), sp); break; default: ; } } } /** * fm_side_pane_get_mode_name * @mode: mode to convert * * Retrieves the name of the specified side pane @mode, or %NULL if @mode * is invalid. The name of mode may be used for config save or another * similar purpose. Returned data are owned by implementation and should * be not freed by caller. * * Returns: the name associated with @mode. * * Since: 1.2.0 */ const char *fm_side_pane_get_mode_name(FmSidePaneMode mode) { switch (mode) { case FM_SP_PLACES: return "places"; case FM_SP_DIR_TREE: return "dirtree"; default: return NULL; } } /** * fm_side_pane_get_mode_by_name * @str: the name of mode * * Finds mode which have an associated name equal to @str. * * Returns: mode or FM_SP_NONE if @str specifies invalid mode. * * Since: 1.2.0 */ FmSidePaneMode fm_side_pane_get_mode_by_name(const char *str) { if (str == NULL) return FM_SP_NONE; if (strcmp(str, "places") == 0) return FM_SP_PLACES; if (strcmp(str, "dirtree") == 0) return FM_SP_DIR_TREE; return FM_SP_NONE; } /** * fm_side_pane_get_n_modes * * Tests how many view modes are known to create #FmSidePane widget. The * returned value is the highest FmSidePaneMode that can be used due to * historical reasons since FmSidePaneMode equal to 0 is invalid. * * Returns: number of known modes for side pane. * * Since: 1.2.0 */ gint fm_side_pane_get_n_modes(void) { return (FM_SP_DIR_TREE + 1); } /** * fm_side_pane_get_mode_label * @mode: the view mode * * Retrieves label for @mode which can be used in menus. Returned * data should not be freed by caller. * * Returns: desription or %NULL if @mode is invalid. * * Since: 1.2.0 */ const char *fm_side_pane_get_mode_label(FmSidePaneMode mode) { switch (mode) { case FM_SP_PLACES: return _("Places"); case FM_SP_DIR_TREE: return _("Directory Tree"); default: return NULL; } } /** * fm_side_pane_get_mode_tooltip * @mode: the view mode * * Retrieves tooltip for @mode which can be used in menus. Returned * data should not be freed by caller. * * Returns: desription or %NULL if @mode is invalid. * * Since: 1.2.0 */ const char *fm_side_pane_get_mode_tooltip(FmSidePaneMode mode) { switch (mode) { case FM_SP_PLACES: return _("Shows list of common places, devices, and bookmarks in sidebar"); case FM_SP_DIR_TREE: return _("Shows tree of directories in sidebar"); default: return NULL; } } /** * fm_side_pane_set_show_hidden * @sp: a widget to apply * @show_hidden: %TRUE to show hidden files in side pane * * Changes visibility of hidden files in side pane @sp. * * Returns: %TRUE if current side pane mode accepts this change. * * Since: 1.2.0 */ gboolean fm_side_pane_set_show_hidden(FmSidePane *sp, gboolean show_hidden) { GObjectClass *klass; GParamSpec *spec; if (sp->view == NULL) return FALSE; klass = G_OBJECT_GET_CLASS(sp->view); spec = g_object_class_find_property(klass, "show-hidden"); if (spec == NULL || spec->value_type != G_TYPE_BOOLEAN) return FALSE; /* isn't supported by view */ g_object_set(sp->view, "show-hidden", show_hidden, NULL); return TRUE; } /** * fm_side_pane_set_home_dir * @sp: a widget to apply * @home_dir: a new path to set * * Changes path used by side pane view for "Home" items if view mode has * any such items. * * Returns: %TRUE if current side pane mode accepts this change. * * Since: 1.2.0 */ gboolean fm_side_pane_set_home_dir(FmSidePane *sp, const char *home_dir) { GObjectClass *klass; GParamSpec *spec; if (sp->view == NULL) return FALSE; klass = G_OBJECT_GET_CLASS(sp->view); spec = g_object_class_find_property(klass, "home-dir-path"); if (spec == NULL || spec->value_type != G_TYPE_STRING) return FALSE; /* isn't supported by view */ g_object_set(sp->view, "home-dir-path", home_dir, NULL); return TRUE; } libfm-1.4.0/src/gtk/fm-side-pane.h000066400000000000000000000113631475513661000166130ustar00rootroot00000000000000// fm-side-pane.h // // Copyright 2011 Hong Jen Yee (PCMan) // Copyright 2013 Andriy Grytsenko (LStranger) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __FM_SIDE_PANE_H__ #define __FM_SIDE_PANE_H__ #include #include "fm-file-info.h" #include "fm-seal.h" G_BEGIN_DECLS #define FM_TYPE_SIDE_PANE (fm_side_pane_get_type()) #define FM_SIDE_PANE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_SIDE_PANE, FmSidePane)) #define FM_SIDE_PANE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_SIDE_PANE, FmSidePaneClass)) #define FM_IS_SIDE_PANE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_SIDE_PANE)) #define FM_IS_SIDE_PANE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_SIDE_PANE)) #define FM_SIDE_PANE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ FM_TYPE_SIDE_PANE, FmSidePaneClass)) typedef struct _FmSidePane FmSidePane; typedef struct _FmSidePaneClass FmSidePaneClass; /** * FmSidePaneMode: * @FM_SP_NONE: invalid mode * @FM_SP_PLACES: #FmPlacesView mode * @FM_SP_DIR_TREE: #FmDirTreeView mode * @FM_SP_REMOTE: reserved mode * * Mode of side pane view. */ typedef enum { FM_SP_NONE, FM_SP_PLACES, FM_SP_DIR_TREE, FM_SP_REMOTE }FmSidePaneMode; /** * FmSidePaneUpdatePopup: * @sp: the side pane widget * @ui: the object to add interface * @act_grp: group of actions to add action * @file: the file the popup menu was created for * @user_data: pointer passed to fm_side_pane_set_popup_updater() * * The callback to update popup menu. It can disable items of menu, add * some new, replace actions, etc. depending of the window and files. * In some cases @file may be incomplete so callback should check that. */ typedef void (*FmSidePaneUpdatePopup)(FmSidePane* sp, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfo* file, gpointer user_data); struct _FmSidePane { /*< private >*/ GtkVBox parent; FmPath* FM_SEAL(cwd); GtkWidget* FM_SEAL(title_bar); GtkWidget* FM_SEAL(menu_btn); GtkWidget* FM_SEAL(menu_label); GtkWidget* FM_SEAL(menu); GtkWidget* FM_SEAL(scroll); GtkWidget* FM_SEAL(view); FmSidePaneMode FM_SEAL(mode); GtkUIManager* FM_SEAL(ui); FmSidePaneUpdatePopup FM_SEAL(update_popup); gpointer FM_SEAL(popup_user_data); gpointer _reserved1; gpointer _reserved2; }; /** * FmSidePaneClass: * @parent_class: the parent class * @chdir: the class closure for the #FmSidePane::chdir signal * @mode_changed: the class closure for the #FmSidePane::mode-changed signal */ struct _FmSidePaneClass { GtkVBoxClass parent_class; void (*chdir)(FmSidePane* sp, guint button, FmPath* path); void (*mode_changed)(FmSidePane* sp); /*< private >*/ gpointer _reserved1; gpointer _reserved2; }; GType fm_side_pane_get_type (void); FmSidePane* fm_side_pane_new (void); FmPath* fm_side_pane_get_cwd(FmSidePane* sp); void fm_side_pane_chdir(FmSidePane* sp, FmPath* path); void fm_side_pane_set_mode(FmSidePane* sp, FmSidePaneMode mode); FmSidePaneMode fm_side_pane_get_mode(FmSidePane* sp); GtkWidget* fm_side_pane_get_title_bar(FmSidePane* sp); /* setup a popup menu extension for the window */ void fm_side_pane_set_popup_updater(FmSidePane* sp, FmSidePaneUpdatePopup update_popup, gpointer user_data); const char *fm_side_pane_get_mode_name(FmSidePaneMode mode); FmSidePaneMode fm_side_pane_get_mode_by_name(const char *str); gint fm_side_pane_get_n_modes(void); const char *fm_side_pane_get_mode_label(FmSidePaneMode mode); const char *fm_side_pane_get_mode_tooltip(FmSidePaneMode mode); gboolean fm_side_pane_set_show_hidden(FmSidePane *sp, gboolean show_hidden); gboolean fm_side_pane_set_home_dir(FmSidePane *sp, const char *home_dir); G_END_DECLS #endif /* __FM_SIDE_PANE_H__ */ libfm-1.4.0/src/gtk/fm-sortable.h000066400000000000000000000036451475513661000165650ustar00rootroot00000000000000/* * fm-sortable.h * * Copyright 2012 Hong Jen Yee (PCMan) * Copyright 2012 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef _FM_SORTABLE_H_ #define _FM_SORTABLE_H_ 1 G_BEGIN_DECLS /** * FmSortMode: * @FM_SORT_ASCENDING: sort ascending, mutually exclusive with FM_SORT_DESCENDING * @FM_SORT_DESCENDING: sort descending, mutually exclusive with FM_SORT_ASCENDING * @FM_SORT_CASE_SENSITIVE: case sensitive file names sort * @FM_SORT_NO_FOLDER_FIRST: (since 1.2.0) don't sort folders before files * @FM_SORT_ORDER_MASK: (FM_SORT_ASCENDING|FM_SORT_DESCENDING) * * Sort mode flags supported by FmFolderModel * * Since: 1.0.2 */ typedef enum{ FM_SORT_ASCENDING = 0, FM_SORT_DESCENDING = 1 << 0, FM_SORT_CASE_SENSITIVE = 1 << 1, FM_SORT_NO_FOLDER_FIRST = 1 << 2, FM_SORT_ORDER_MASK = (FM_SORT_ASCENDING|FM_SORT_DESCENDING) } FmSortMode; /** * FM_SORT_DEFAULT: * * value which means do not change sorting mode flags. */ #define FM_SORT_DEFAULT ((FmSortMode)-1) #define FM_SORT_IS_ASCENDING(mode) ((mode & FM_SORT_ORDER_MASK) == FM_SORT_ASCENDING) G_END_DECLS #endif /* _FM_SORTABLE_H_ */ libfm-1.4.0/src/gtk/fm-standard-view.c000066400000000000000000002126011475513661000175070ustar00rootroot00000000000000/* * fm-standard-view.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2012-2015 Andriy Grytsenko (LStranger) * Copyright 2013 Mamoru TASAKA * Copyright 2024 Ingo Brückl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-standard-view * @short_description: A folder view widget based on libexo. * @title: FmStandardView * * @include: libfm/fm-gtk.h * * The #FmStandardView represents view of content of a folder with * support of drag & drop and other file/directory operations. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "gtk-compat.h" #include "fm.h" #include "fm-standard-view.h" #include "fm-gtk-marshal.h" #include "fm-cell-renderer-text.h" #include "fm-cell-renderer-pixbuf.h" #include "fm-gtk-utils.h" #include "exo/exo-icon-view.h" #include "exo/exo-tree-view.h" #include "fm-dnd-src.h" #include "fm-dnd-dest.h" #include "fm-dnd-auto-scroll.h" struct _FmStandardView { GtkScrolledWindow parent; FmStandardViewMode mode; GtkSelectionMode sel_mode; gboolean show_hidden; GtkWidget* view; /* either ExoIconView or ExoTreeView */ FmFolderModel* model; /* FmStandardView doesn't use abstract GtkTreeModel! */ FmCellRendererPixbuf* renderer_pixbuf; FmCellRendererText* renderer_text; guint icon_size_changed_handler; guint show_full_names_handler; FmDndSrc* dnd_src; /* dnd source manager */ FmDndDest* dnd_dest; /* dnd dest manager */ /* for very large folder update */ guint sel_changed_idle; gboolean sel_changed_pending; FmFileInfoList* cached_selected_files; FmPathList* cached_selected_file_paths; /* callbacks to creator */ FmFolderViewUpdatePopup update_popup; FmLaunchFolderFunc open_folders; /* internal switches */ void (*set_single_click)(GtkWidget* view, gboolean single_click); void (*set_auto_selection_delay)(GtkWidget* view, gint auto_selection_delay); void (*set_middle_click)(GtkWidget* view, gboolean middle_click); GtkTreePath* (*get_drop_path)(FmStandardView* fv, gint x, gint y); void (*set_drag_dest)(FmStandardView* fv, GtkTreePath* tp); void (*select_all)(GtkWidget* view); void (*unselect_all)(GtkWidget* view); void (*select_invert)(FmFolderModel* model, GtkWidget* view); void (*select_path)(FmFolderModel* model, GtkWidget* view, GtkTreeIter* it); /* for columns width handling */ gint updated_col; gboolean name_updated; }; struct _FmStandardViewClass { GtkScrolledWindowClass parent_class; /* signal handlers */ /* void (*column_widths_changed)(); */ }; static void fm_standard_view_dispose(GObject *object); static void fm_standard_view_view_init(FmFolderViewInterface* iface); G_DEFINE_TYPE_WITH_CODE(FmStandardView, fm_standard_view, GTK_TYPE_SCROLLED_WINDOW, G_IMPLEMENT_INTERFACE(FM_TYPE_FOLDER_VIEW, fm_standard_view_view_init)) static GList* fm_standard_view_get_selected_tree_paths(FmStandardView* fv); static gboolean on_standard_view_focus_in(GtkWidget* widget, GdkEventFocus* evt); static gboolean on_btn_pressed(GtkWidget* view, GdkEventButton* evt, FmStandardView* fv); static void on_sel_changed(GObject* obj, FmStandardView* fv); static void on_dnd_src_data_get(FmDndSrc* ds, FmStandardView* fv); static void on_single_click_changed(FmConfig* cfg, FmStandardView* fv); static void on_auto_selection_delay_changed(FmConfig* cfg, FmStandardView* fv); static void on_middle_click_changed(FmConfig* cfg, FmStandardView* fv); static void on_big_icon_size_changed(FmConfig* cfg, FmStandardView* fv); static void on_small_icon_size_changed(FmConfig* cfg, FmStandardView* fv); static void on_thumbnail_size_changed(FmConfig* cfg, FmStandardView* fv); static FmFolderViewColumnInfo* _sv_column_info_new(FmFolderModelCol col_id) { FmFolderViewColumnInfo* info = g_slice_new0(FmFolderViewColumnInfo); info->col_id = col_id; return info; } static void _sv_column_info_free(gpointer info) { g_slice_free(FmFolderViewColumnInfo, info); } /* override for GtkScrolledWindow bug - it ignores modifiers totally */ static gboolean on_standard_view_scroll_event(GtkWidget* w, GdkEventScroll* evt) { if ((evt->state & gtk_accelerator_get_default_mod_mask()) == 0 && GTK_WIDGET_CLASS(fm_standard_view_parent_class)->scroll_event) return GTK_WIDGET_CLASS(fm_standard_view_parent_class)->scroll_event(w, evt); return FALSE; } static void fm_standard_view_class_init(FmStandardViewClass *klass) { GObjectClass *g_object_class; GtkWidgetClass *widget_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_standard_view_dispose; widget_class = GTK_WIDGET_CLASS(klass); widget_class->focus_in_event = on_standard_view_focus_in; widget_class->scroll_event = on_standard_view_scroll_event; fm_standard_view_parent_class = (GtkScrolledWindowClass*)g_type_class_peek(GTK_TYPE_SCROLLED_WINDOW); } static gboolean on_standard_view_focus_in(GtkWidget* widget, GdkEventFocus* evt) { FmStandardView* fv = FM_STANDARD_VIEW(widget); if( fv->view ) { gtk_widget_grab_focus(fv->view); return TRUE; } return FALSE; } static void on_single_click_changed(FmConfig* cfg, FmStandardView* fv) { if(fv->set_single_click) fv->set_single_click(fv->view, cfg->single_click); } static void on_auto_selection_delay_changed(FmConfig* cfg, FmStandardView* fv) { if(fv->set_auto_selection_delay) fv->set_auto_selection_delay(fv->view, cfg->auto_selection_delay); } static void on_middle_click_changed(FmConfig* cfg, FmStandardView* fv) { if(fv->set_middle_click) fv->set_middle_click(fv->view, cfg->middle_click); } static void on_icon_view_item_activated(ExoIconView* iv, GtkTreePath* path, FmStandardView* fv) { fm_folder_view_item_clicked(FM_FOLDER_VIEW(fv), path, FM_FV_ACTIVATED); } static void on_tree_view_row_activated(GtkTreeView* tv, GtkTreePath* path, GtkTreeViewColumn* col, FmStandardView* fv) { fm_folder_view_item_clicked(FM_FOLDER_VIEW(fv), path, FM_FV_ACTIVATED); } static void fm_standard_view_init(FmStandardView *self) { gtk_scrolled_window_set_hadjustment((GtkScrolledWindow*)self, NULL); gtk_scrolled_window_set_vadjustment((GtkScrolledWindow*)self, NULL); gtk_scrolled_window_set_policy((GtkScrolledWindow*)self, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); /* config change notifications */ g_signal_connect(fm_config, "changed::single_click", G_CALLBACK(on_single_click_changed), self); g_signal_connect(fm_config, "changed::auto_selection_delay", G_CALLBACK(on_auto_selection_delay_changed), self); g_signal_connect(fm_config, "changed::middle_click", G_CALLBACK(on_middle_click_changed), self); /* dnd support */ self->dnd_src = fm_dnd_src_new(NULL); g_signal_connect(self->dnd_src, "data-get", G_CALLBACK(on_dnd_src_data_get), self); self->dnd_dest = fm_dnd_dest_new_with_handlers(NULL); self->mode = -1; self->updated_col = -1; } /** * fm_folder_view_new * @mode: initial mode of view * * Returns: a new #FmFolderView widget. * * Since: 0.1.0 * Deprecated: 1.0.1: Use fm_standard_view_new() instead. */ FmFolderView* fm_folder_view_new(guint mode) { return (FmFolderView*)fm_standard_view_new(mode, NULL, NULL); } /** * fm_standard_view_new * @mode: initial mode of view * @update_popup: (allow-none): callback to update context menu for files * @open_folders: (allow-none): callback to open folder on activation * * Creates new folder view. * * Returns: a new #FmStandardView widget. * * Since: 1.0.1 */ FmStandardView* fm_standard_view_new(FmStandardViewMode mode, FmFolderViewUpdatePopup update_popup, FmLaunchFolderFunc open_folders) { FmStandardView* fv = (FmStandardView*)g_object_new(FM_STANDARD_VIEW_TYPE, NULL); AtkObject *obj = gtk_widget_get_accessible(GTK_WIDGET(fv)); fm_standard_view_set_mode(fv, mode); fv->update_popup = update_popup; fv->open_folders = open_folders; atk_object_set_description(obj, _("View of folder contents")); return fv; } static void _reset_columns_widths(GtkTreeView* view) { GList* cols = gtk_tree_view_get_columns(view); GList* l; for(l = cols; l; l = l->next) { FmFolderViewColumnInfo* info = g_object_get_qdata(l->data, fm_qdata_id); if(info) info->reserved1 = 0; } g_list_free(cols); } static void on_row_changed(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, FmStandardView* fv) { if(fv->mode == FM_FV_LIST_VIEW) _reset_columns_widths(GTK_TREE_VIEW(fv->view)); } static void on_row_deleted(GtkTreeModel *tree_model, GtkTreePath *path, FmStandardView* fv) { if(fv->mode == FM_FV_LIST_VIEW) _reset_columns_widths(GTK_TREE_VIEW(fv->view)); /* reset tooltip - it may stick if mouse-over item was deleted, see how FmCellRendererText works on that regard */ g_object_set(G_OBJECT(fv->view), "tooltip-text", NULL, NULL); } static void on_row_inserted(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, FmStandardView* fv) { if(fv->mode == FM_FV_LIST_VIEW) _reset_columns_widths(GTK_TREE_VIEW(fv->view)); } static void unset_model(FmStandardView* fv) { if(fv->model) { FmFolderModel* model = fv->model; /* g_debug("unset_model: %p, n_ref = %d", model, G_OBJECT(model)->ref_count); */ g_object_unref(model); g_signal_handlers_disconnect_by_func(model, on_row_inserted, fv); g_signal_handlers_disconnect_by_func(model, on_row_deleted, fv); g_signal_handlers_disconnect_by_func(model, on_row_changed, fv); fv->model = NULL; } } static void unset_view(FmStandardView* fv); static void fm_standard_view_dispose(GObject *object) { FmStandardView *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_STANDARD_VIEW(object)); self = (FmStandardView*)object; /* g_debug("fm_standard_view_dispose: %p", self); */ unset_model(self); if(G_LIKELY(self->view)) unset_view(self); if(self->renderer_pixbuf) { g_object_unref(self->renderer_pixbuf); self->renderer_pixbuf = NULL; } if(self->renderer_text) { g_object_unref(self->renderer_text); self->renderer_text = NULL; } if(self->cached_selected_files) { fm_file_info_list_unref(self->cached_selected_files); self->cached_selected_files = NULL; } if(self->cached_selected_file_paths) { fm_path_list_unref(self->cached_selected_file_paths); self->cached_selected_file_paths = NULL; } if(self->dnd_src) { g_signal_handlers_disconnect_by_func(self->dnd_src, on_dnd_src_data_get, self); g_object_unref(self->dnd_src); self->dnd_src = NULL; } if(self->dnd_dest) { g_object_unref(self->dnd_dest); self->dnd_dest = NULL; } g_signal_handlers_disconnect_by_func(fm_config, on_single_click_changed, object); g_signal_handlers_disconnect_by_func(fm_config, on_auto_selection_delay_changed, object); g_signal_handlers_disconnect_by_func(fm_config, on_middle_click_changed, object); if(self->sel_changed_idle) { g_source_remove(self->sel_changed_idle); self->sel_changed_idle = 0; } if(self->icon_size_changed_handler) { g_signal_handler_disconnect(fm_config, self->icon_size_changed_handler); self->icon_size_changed_handler = 0; } if(self->show_full_names_handler) { g_signal_handler_disconnect(fm_config, self->show_full_names_handler); self->show_full_names_handler = 0; } (* G_OBJECT_CLASS(fm_standard_view_parent_class)->dispose)(object); } static void set_icon_size(FmStandardView* fv, guint icon_size) { FmCellRendererPixbuf* render = fv->renderer_pixbuf; fm_cell_renderer_pixbuf_set_fixed_size(render, icon_size, icon_size); if(!fv->model) return; fm_folder_model_set_icon_size(fv->model, icon_size); if( fv->mode != FM_FV_LIST_VIEW ) /* this is an ExoIconView */ { /* set row spacing in range 2...12 pixels */ gint c_size = MIN(12, 2 + icon_size / 8); exo_icon_view_set_row_spacing(EXO_ICON_VIEW(fv->view), c_size); } } static void on_big_icon_size_changed(FmConfig* cfg, FmStandardView* fv) { guint item_width = cfg->big_icon_size + 40; /* reset ExoIconView item text sizes */ g_object_set((GObject*)fv->renderer_text, "wrap-width", item_width, NULL); set_icon_size(fv, cfg->big_icon_size); } static void on_small_icon_size_changed(FmConfig* cfg, FmStandardView* fv) { set_icon_size(fv, cfg->small_icon_size); } static void on_thumbnail_size_changed(FmConfig* cfg, FmStandardView* fv) { guint item_width = MAX(cfg->thumbnail_size, 96); /* reset ExoIconView item text sizes */ g_object_set((GObject*)fv->renderer_text, "wrap-width", item_width, NULL); /* FIXME: thumbnail and icons should have different sizes */ /* maybe a separate API: fm_folder_model_set_thumbnail_size() */ set_icon_size(fv, cfg->thumbnail_size); } static void on_show_full_names_changed(FmConfig* cfg, FmStandardView* fv) { gint font_height; g_return_if_fail(fv->renderer_text); if (fm_config->show_full_names) font_height = 0; else { /* calculate text row size */ PangoContext *pc = gtk_widget_get_pango_context((GtkWidget*)fv); PangoFontMetrics *metrics = pango_context_get_metrics(pc, NULL, NULL); font_height = (pango_font_metrics_get_ascent(metrics) + pango_font_metrics_get_descent(metrics)) / PANGO_SCALE + 1; pango_font_metrics_unref(metrics); } if(fv->mode == FM_FV_ICON_VIEW) font_height *= 3; else /* thumbnail view */ font_height *= 5; g_object_set((GObject*)fv->renderer_text, "max-height", font_height, NULL); /* we cannot use gtk_widget_queue_resize() since ExoIconView does not recalculate sizes on that, therefore we do a little trick here: we reset all attributes we set before enforcing it to relayout */ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(fv->view), GTK_CELL_RENDERER(fv->renderer_text), "text", FM_FOLDER_MODEL_COL_NAME, NULL); } static void set_drag_dest_list_item(FmStandardView* fv, GtkTreePath* tp) { gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW(fv->view), tp, GTK_TREE_VIEW_DROP_INTO_OR_AFTER); } static void set_drag_dest_icon_item(FmStandardView* fv, GtkTreePath* tp) { exo_icon_view_set_drag_dest_item(EXO_ICON_VIEW(fv->view), tp, EXO_ICON_VIEW_DROP_INTO); } static GtkTreePath* get_drop_path_list_view(FmStandardView* fv, gint x, gint y) { GtkTreePath* tp = NULL; GtkTreeViewColumn* col; gtk_tree_view_convert_widget_to_bin_window_coords(GTK_TREE_VIEW(fv->view), x, y, &x, &y); if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(fv->view), x, y, &tp, &col, NULL, NULL)) { if(gtk_tree_view_column_get_sort_column_id(col)!=FM_FOLDER_MODEL_COL_NAME) { gtk_tree_path_free(tp); tp = NULL; } } return tp; } static GtkTreePath* get_drop_path_icon_view(FmStandardView* fv, gint x, gint y) { GtkTreePath* tp; tp = exo_icon_view_get_path_at_pos(EXO_ICON_VIEW(fv->view), x, y); return tp; } static gboolean on_drag_motion(GtkWidget *dest_widget, GdkDragContext *drag_context, gint x, gint y, guint time, FmStandardView* fv) { gboolean ret; GdkDragAction action = 0; GdkAtom target = fm_dnd_dest_find_target(fv->dnd_dest, drag_context); if(target == GDK_NONE) return FALSE; ret = FALSE; /* files are being dragged */ if(fm_dnd_dest_is_target_supported(fv->dnd_dest, target)) { GtkTreePath* tp = fv->get_drop_path(fv, x, y); if(tp) { GtkTreeIter it; if(gtk_tree_model_get_iter(GTK_TREE_MODEL(fv->model), &it, tp)) { FmFileInfo* fi; gtk_tree_model_get(GTK_TREE_MODEL(fv->model), &it, FM_FOLDER_MODEL_COL_INFO, &fi, -1); fm_dnd_dest_set_dest_file(fv->dnd_dest, fi); } } else { FmFolderModel* model = fv->model; if (model) { FmFolder* folder = fm_folder_model_get_folder(model); fm_dnd_dest_set_dest_file(fv->dnd_dest, fm_folder_get_info(folder)); } else fm_dnd_dest_set_dest_file(fv->dnd_dest, NULL); } action = fm_dnd_dest_get_default_action(fv->dnd_dest, drag_context, target); ret = action != 0; fv->set_drag_dest(fv, ret ? tp : NULL); if (tp) gtk_tree_path_free(tp); } gdk_drag_status(drag_context, action, time); return ret; } static inline void create_icon_view(FmStandardView* fv, GList* sels) { GList *l; GtkCellRenderer* render; FmFolderModel* model = fv->model; int icon_size = 0, item_width, font_height; fv->view = exo_icon_view_new(); if(fv->renderer_pixbuf) g_object_unref(fv->renderer_pixbuf); fv->renderer_pixbuf = g_object_ref_sink(fm_cell_renderer_pixbuf_new()); render = (GtkCellRenderer*)fv->renderer_pixbuf; g_object_set((GObject*)render, "follow-state", TRUE, NULL ); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(fv->view), render, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(fv->view), render, "pixbuf", FM_FOLDER_MODEL_COL_ICON ); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(fv->view), render, "info", FM_FOLDER_MODEL_COL_INFO ); if(fv->mode == FM_FV_COMPACT_VIEW) /* compact view */ { fv->icon_size_changed_handler = g_signal_connect(fm_config, "changed::small_icon_size", G_CALLBACK(on_small_icon_size_changed), fv); icon_size = fm_config->small_icon_size; fm_cell_renderer_pixbuf_set_fixed_size(fv->renderer_pixbuf, icon_size, icon_size); if(model) fm_folder_model_set_icon_size(model, icon_size); render = fm_cell_renderer_text_new(); g_object_set((GObject*)render, "xalign", 1.0, /* FIXME: why this needs to be 1.0? */ "yalign", 0.5, NULL ); exo_icon_view_set_layout_mode( (ExoIconView*)fv->view, EXO_ICON_VIEW_LAYOUT_COLS ); exo_icon_view_set_orientation( (ExoIconView*)fv->view, GTK_ORIENTATION_HORIZONTAL ); } else /* big icon view or thumbnail view */ { if(fv->show_full_names_handler == 0) fv->show_full_names_handler = g_signal_connect(fm_config, "changed::show_full_names", G_CALLBACK(on_show_full_names_changed), fv); if (fm_config->show_full_names) font_height = 0; else { /* calculate text row size */ PangoContext *pc = gtk_widget_get_pango_context((GtkWidget*)fv); PangoFontMetrics *metrics = pango_context_get_metrics(pc, NULL, NULL); font_height = (pango_font_metrics_get_ascent(metrics) + pango_font_metrics_get_descent(metrics)) / PANGO_SCALE + 1; pango_font_metrics_unref(metrics); } if(fv->mode == FM_FV_ICON_VIEW) { fv->icon_size_changed_handler = g_signal_connect(fm_config, "changed::big_icon_size", G_CALLBACK(on_big_icon_size_changed), fv); icon_size = fm_config->big_icon_size; fm_cell_renderer_pixbuf_set_fixed_size(fv->renderer_pixbuf, icon_size, icon_size); if(model) fm_folder_model_set_icon_size(model, icon_size); render = fm_cell_renderer_text_new(); item_width = icon_size + 40; g_object_set((GObject*)render, "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", item_width, "max-height", font_height * 3, "alignment", PANGO_ALIGN_CENTER, "xalign", 0.5, "yalign", 0.0, NULL ); exo_icon_view_set_column_spacing( (ExoIconView*)fv->view, 4 ); } else { fv->icon_size_changed_handler = g_signal_connect(fm_config, "changed::thumbnail_size", G_CALLBACK(on_thumbnail_size_changed), fv); icon_size = fm_config->thumbnail_size; fm_cell_renderer_pixbuf_set_fixed_size(fv->renderer_pixbuf, icon_size, icon_size); if(model) fm_folder_model_set_icon_size(model, icon_size); render = fm_cell_renderer_text_new(); item_width = MAX(icon_size, 96); g_object_set((GObject*)render, "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", item_width, "max-height", font_height * 5, "alignment", PANGO_ALIGN_CENTER, "xalign", 0.5, "yalign", 0.0, NULL ); exo_icon_view_set_column_spacing( (ExoIconView*)fv->view, 8 ); } } gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(fv->view), render, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(fv->view), render, "text", FM_FOLDER_MODEL_COL_NAME ); if(fv->renderer_text) g_object_unref(fv->renderer_text); fv->renderer_text = FM_CELL_RENDERER_TEXT(g_object_ref_sink(render)); exo_icon_view_set_search_column((ExoIconView*)fv->view, FM_FOLDER_MODEL_COL_NAME); g_signal_connect(fv->view, "item-activated", G_CALLBACK(on_icon_view_item_activated), fv); g_signal_connect(fv->view, "selection-changed", G_CALLBACK(on_sel_changed), fv); exo_icon_view_set_model((ExoIconView*)fv->view, (GtkTreeModel*)fv->model); exo_icon_view_set_selection_mode((ExoIconView*)fv->view, fv->sel_mode); exo_icon_view_set_single_click((ExoIconView*)fv->view, fm_config->single_click); exo_icon_view_set_single_click_timeout((ExoIconView*)fv->view, fm_config->auto_selection_delay); exo_icon_view_set_middle_click((ExoIconView*)fv->view, fm_config->middle_click); for(l = sels;l;l=l->next) exo_icon_view_select_path((ExoIconView*)fv->view, l->data); } static void _update_width_sizing(GtkTreeViewColumn* col, gint width) { if(width > 0) { gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(col, width); } else { gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_column_set_resizable(col, TRUE); } gtk_tree_view_column_queue_resize(col); } /* Each change will generate notify for all columns from first to last. * 1) on window resizing only column Name may change - the size may grow to * fill any additional space * 2) on manual column resize the resized column will change; last column * will change size too if horizontal scroll bar isn't visible */ static void on_column_width_changed(GtkTreeViewColumn* col, GParamSpec *pspec, FmStandardView* view) { FmFolderViewColumnInfo *info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); GList *cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(view->view)); int width; guint pos; pos = g_list_index(cols, col); width = gtk_tree_view_column_get_width(col); /* g_debug("column width changed: [%u] id %u: %d", pos, info->col_id, width); */ /* use info->reserved1 as 'last width' */ if(width != info->reserved1) { if(info->col_id == FM_FOLDER_MODEL_COL_NAME) view->name_updated = TRUE; else if(info->reserved1 && view->updated_col < 0) view->updated_col = pos; info->reserved1 = width; } if(pos == g_list_length(cols) - 1) /* got all columns, decide what we got */ { if(!view->name_updated && view->updated_col >= 0) { col = g_list_nth_data(cols, view->updated_col); info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); if(info) { info->width = info->reserved1; /* g_debug("column %u changed width to %d", info->col_id, info->width); */ fm_folder_view_columns_changed(FM_FOLDER_VIEW(view)); } } /* FIXME: how to detect manual change of Name mix width reliably? */ view->updated_col = -1; view->name_updated = FALSE; } g_list_free(cols); } static void on_column_hide(GtkMenuItem* menu_item, GtkTreeViewColumn* col) { GtkWidget* view = gtk_tree_view_column_get_tree_view(col); gtk_tree_view_remove_column(GTK_TREE_VIEW(view), col); fm_folder_view_columns_changed(FM_FOLDER_VIEW(gtk_widget_get_parent(view))); } static void on_column_move_left(GtkMenuItem* menu_item, GtkTreeViewColumn* col) { GtkTreeView* view = GTK_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); GList* list, *l; list = gtk_tree_view_get_columns(view); l = g_list_find(list, col); if(l && l->prev) { gtk_tree_view_move_column_after(view, col, l->prev->prev ? l->prev->prev->data : NULL); fm_folder_view_columns_changed(FM_FOLDER_VIEW(gtk_widget_get_parent(GTK_WIDGET(view)))); } g_list_free(list); } static void on_column_move_right(GtkMenuItem* menu_item, GtkTreeViewColumn* col) { GtkTreeView* view = GTK_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); GList* list, *l; list = gtk_tree_view_get_columns(view); l = g_list_find(list, col); if(l && l->next) { gtk_tree_view_move_column_after(view, col, l->next->data); fm_folder_view_columns_changed(FM_FOLDER_VIEW(gtk_widget_get_parent(GTK_WIDGET(view)))); } g_list_free(list); } static GtkTreeViewColumn* create_list_view_column(FmStandardView* fv, FmFolderViewColumnInfo *set); static void on_column_add(GtkMenuItem* menu_item, GtkTreeViewColumn* col) { GtkWidget *view = gtk_tree_view_column_get_tree_view(col); GtkWidget *fv = gtk_widget_get_parent(view); GtkTreeViewColumn *new_col; FmFolderViewColumnInfo info; g_return_if_fail(FM_IS_STANDARD_VIEW(fv)); memset(&info, 0, sizeof(info)); info.col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_item), "col_id")); new_col = create_list_view_column((FmStandardView*)fv, &info); if(new_col) /* skip it if failed */ { gtk_tree_view_move_column_after(GTK_TREE_VIEW(view), new_col, col); fm_folder_view_columns_changed(FM_FOLDER_VIEW(fv)); } } static void on_column_auto_adjust(GtkMenuItem* menu_item, GtkTreeViewColumn* col) { FmFolderViewColumnInfo* info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); info->width = 0; info->reserved1 = 0; _update_width_sizing(col, 0); /* g_debug("auto sizing column %u", info->col_id); */ fm_folder_view_columns_changed(FM_FOLDER_VIEW(gtk_widget_get_parent(gtk_tree_view_column_get_tree_view(col)))); } /* FIXME: add support for 'list_view_size_units' config setting: - on FM_FOLDER_MODEL_COL_SIZE add submenu with list of available values - on click that submenu item change the setting, emit signal, queue reload */ static gboolean on_column_button_press_event(GtkWidget *button, GdkEventButton *event, GtkTreeViewColumn* col) { if(event->button == 3) { GtkWidget* view = gtk_tree_view_column_get_tree_view(col); GtkWidget* fv = gtk_widget_get_parent(view); GList *columns, *l; GSList *cols_list, *ld; GtkMenuShell* menu; GtkWidget* menu_item; const char* label; char* menu_item_label; FmFolderViewColumnInfo* info; guint i; g_return_val_if_fail(FM_IS_STANDARD_VIEW(fv), FALSE); columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(view)); l = g_list_find(columns, col); if(l == NULL) { g_warning("column not found in GtkTreeView"); g_list_free(columns); return FALSE; } menu = GTK_MENU_SHELL(gtk_menu_new()); /* destroy the menu when selection is done. */ g_signal_connect(menu, "selection-done", G_CALLBACK(gtk_widget_destroy), NULL); info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); label = fm_folder_model_col_get_title(FM_STANDARD_VIEW(fv)->model, info->col_id); menu_item_label = g_strdup_printf(_("_Hide %s"), label); menu_item = gtk_menu_item_new_with_mnemonic(menu_item_label); g_free(menu_item_label); gtk_menu_shell_append(menu, menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_column_hide), col); if(info->col_id == FM_FOLDER_MODEL_COL_NAME) /* Name is immutable */ gtk_widget_set_sensitive(menu_item, FALSE); menu_item = gtk_menu_item_new_with_mnemonic(_("_Move Left")); gtk_menu_shell_append(menu, menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_column_move_left), col); if(NULL == l->prev) /* the left most column */ gtk_widget_set_sensitive(menu_item, FALSE); menu_item = gtk_menu_item_new_with_mnemonic(_("Move _Right")); gtk_menu_shell_append(menu, menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_column_move_right), col); if(NULL == l->next) /* the right most column */ gtk_widget_set_sensitive(menu_item, FALSE); g_list_free(columns); /* create list of missing columns for 'Add' submenu */ cols_list = fm_folder_view_get_columns(FM_FOLDER_VIEW(fv)); menu_item_label = NULL; /* mark for below */ for(i = 0; fm_folder_model_col_is_valid(i); i++) { label = fm_folder_model_col_get_title(FM_STANDARD_VIEW(fv)->model, i); if(!label) continue; for(ld = cols_list; ld; ld = ld->next) if(((FmFolderViewColumnInfo*)ld->data)->col_id == i) break; /* if the column is already in the folder view, don't add it to the menu */ if(ld) continue; if(menu_item_label == NULL) gtk_menu_shell_append(menu, gtk_separator_menu_item_new()); menu_item_label = g_strdup_printf(_("Show %s"), label); menu_item = gtk_menu_item_new_with_label(menu_item_label); g_object_set_data(G_OBJECT(menu_item), "col_id", GINT_TO_POINTER(i)); g_signal_connect(menu_item, "activate", G_CALLBACK(on_column_add), col); g_free(menu_item_label); gtk_menu_shell_append(menu, menu_item); } g_slist_free(cols_list); if(info->width > 0 && info->col_id != FM_FOLDER_MODEL_COL_NAME) { gtk_menu_shell_append(menu, gtk_separator_menu_item_new()); menu_item = gtk_menu_item_new_with_mnemonic(_("_Forget Width")); gtk_menu_shell_append(menu, menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_column_auto_adjust), col); } gtk_widget_show_all(GTK_WIDGET(menu)); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); return TRUE; } else if(event->button == 1) { GtkWidget* view = gtk_tree_view_column_get_tree_view(col); GtkWidget* fv = gtk_widget_get_parent(view); FmFolderViewColumnInfo* info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); g_return_val_if_fail(FM_IS_STANDARD_VIEW(fv), FALSE); return !fm_folder_model_col_is_sortable(FM_STANDARD_VIEW(fv)->model, info->col_id); } return FALSE; } static gboolean on_column_button_released_event(GtkWidget *button, GdkEventButton *event, GtkTreeViewColumn* col) { if(event->button == 1) { GtkWidget* view = gtk_tree_view_column_get_tree_view(col); GtkWidget* fv = gtk_widget_get_parent(view); FmFolderViewColumnInfo* info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); g_return_val_if_fail(FM_IS_STANDARD_VIEW(fv), FALSE); return !fm_folder_model_col_is_sortable(FM_STANDARD_VIEW(fv)->model, info->col_id); } return FALSE; } static GtkTreeViewColumn* create_list_view_column(FmStandardView* fv, FmFolderViewColumnInfo *set) { GtkTreeViewColumn* col; GtkCellRenderer* render; const char* title; FmFolderViewColumnInfo* info; GtkWidget *label; FmFolderModelCol col_id; g_return_val_if_fail(set != NULL, NULL); /* invalid arg */ col_id = set->col_id; title = fm_folder_model_col_get_title(fv->model, col_id); g_return_val_if_fail(title != NULL, NULL); /* invalid column */ /* g_debug("adding column id=%u", col_id); */ col = gtk_tree_view_column_new(); render = gtk_cell_renderer_text_new(); gtk_tree_view_column_set_title(col, title); info = _sv_column_info_new(col_id); info->width = set->width; g_object_set_qdata_full(G_OBJECT(col), fm_qdata_id, info, _sv_column_info_free); switch(col_id) { case FM_FOLDER_MODEL_COL_NAME: /* special handling for Name column */ gtk_tree_view_column_pack_start(col, GTK_CELL_RENDERER(fv->renderer_pixbuf), FALSE); gtk_tree_view_column_set_attributes(col, GTK_CELL_RENDERER(fv->renderer_pixbuf), "pixbuf", FM_FOLDER_MODEL_COL_ICON, "info", FM_FOLDER_MODEL_COL_INFO, NULL); g_object_set(render, "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_tree_view_column_set_expand(col, TRUE); #if GTK_CHECK_VERSION(3, 0, 0) /* Workaround for column collapse issue when double-clicking separator */ gtk_tree_view_column_set_min_width(col, 50); #endif if(set->width <= 0) info->width = 200; break; case FM_FOLDER_MODEL_COL_SIZE: g_object_set(render, "xalign", 1.0, NULL); default: if(set->width < 0) info->width = fm_folder_model_col_get_default_width(fv->model, col_id); } _update_width_sizing(col, info->width); gtk_tree_view_column_pack_start(col, render, TRUE); gtk_tree_view_column_set_attributes(col, render, "text", col_id, NULL); gtk_tree_view_column_set_resizable(col, TRUE); /* Unfortunately if we don't set it sortable we cannot right-click it too if(fm_folder_model_col_is_sortable(fv->model, col_id)) */ gtk_tree_view_column_set_sort_column_id(col, col_id); gtk_tree_view_append_column(GTK_TREE_VIEW(fv->view), col); if(G_UNLIKELY(col_id == FM_FOLDER_MODEL_COL_NAME)) /* only this column is activable */ exo_tree_view_set_activable_column((ExoTreeView*)fv->view, col); g_signal_connect(col, "notify::width", G_CALLBACK(on_column_width_changed), fv); #if GTK_CHECK_VERSION(3, 0, 0) label = gtk_tree_view_column_get_button(col); #else /* a little trick to fetch header button, taken from KIWI python library */ label = gtk_label_new(title); gtk_widget_show(label); gtk_tree_view_column_set_widget(col, label); label = gtk_tree_view_column_get_widget(col); while(label && !GTK_IS_BUTTON(label)) label = gtk_widget_get_parent(label); #endif if(label) { /* disable left-click handling for non-sortable columns */ g_signal_connect(label, "button-press-event", G_CALLBACK(on_column_button_press_event), col); /* handle right-click on column header */ g_signal_connect(label, "button-release-event", G_CALLBACK(on_column_button_released_event), col); /* FIXME: how to disconnect it later? */ } return col; } static void _check_tree_columns_defaults(FmStandardView* fv) { const FmFolderViewColumnInfo cols[] = { {FM_FOLDER_MODEL_COL_NAME}, {FM_FOLDER_MODEL_COL_DESC}, {FM_FOLDER_MODEL_COL_SIZE}, {FM_FOLDER_MODEL_COL_MTIME} }; GSList* cols_list = NULL; GList* tree_columns; guint i; tree_columns = gtk_tree_view_get_columns(GTK_TREE_VIEW(fv->view)); if(tree_columns != NULL) /* already set */ { g_list_free(tree_columns); return; } /* Set default columns to show in detailed list mode. */ for(i = 0; i < G_N_ELEMENTS(cols); i++) cols_list = g_slist_append(cols_list, (gpointer)&cols[i]); fm_folder_view_set_columns(FM_FOLDER_VIEW(fv), cols_list); g_slist_free(cols_list); } static inline void create_list_view(FmStandardView* fv, GList* sels) { GtkTreeSelection* ts; GList *l; FmFolderModel* model = fv->model; int icon_size = 0; fv->view = exo_tree_view_new(); if(fv->renderer_pixbuf) g_object_unref(fv->renderer_pixbuf); fv->renderer_pixbuf = g_object_ref_sink(fm_cell_renderer_pixbuf_new()); fv->icon_size_changed_handler = g_signal_connect(fm_config, "changed::small_icon_size", G_CALLBACK(on_small_icon_size_changed), fv); icon_size = fm_config->small_icon_size; fm_cell_renderer_pixbuf_set_fixed_size(fv->renderer_pixbuf, icon_size, icon_size); if(model) { fm_folder_model_set_icon_size(model, icon_size); _check_tree_columns_defaults(fv); gtk_tree_view_set_search_column(GTK_TREE_VIEW(fv->view), FM_FOLDER_MODEL_COL_NAME); } gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(fv->view), TRUE); gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(fv->view), TRUE); exo_tree_view_set_single_click((ExoTreeView*)fv->view, fm_config->single_click); exo_tree_view_set_single_click_timeout((ExoTreeView*)fv->view, fm_config->auto_selection_delay); exo_tree_view_set_middle_click((ExoTreeView*)fv->view, fm_config->middle_click); ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(fv->view)); g_signal_connect(fv->view, "row-activated", G_CALLBACK(on_tree_view_row_activated), fv); g_signal_connect(ts, "changed", G_CALLBACK(on_sel_changed), fv); gtk_tree_view_set_model(GTK_TREE_VIEW(fv->view), GTK_TREE_MODEL(model)); gtk_tree_selection_set_mode(ts, fv->sel_mode); for(l = sels;l;l=l->next) gtk_tree_selection_select_path(ts, (GtkTreePath*)l->data); } static void unset_view(FmStandardView* fv) { /* these signals connected by view creators */ if(fv->mode == FM_FV_LIST_VIEW) { GtkTreeSelection* ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(fv->view)); g_signal_handlers_disconnect_by_func(ts, on_sel_changed, fv); g_signal_handlers_disconnect_by_func(fv->view, on_tree_view_row_activated, fv); } else { g_signal_handlers_disconnect_by_func(fv->view, on_sel_changed, fv); g_signal_handlers_disconnect_by_func(fv->view, on_icon_view_item_activated, fv); } /* these signals connected by fm_standard_view_set_mode() */ g_signal_handlers_disconnect_by_func(fv->view, on_drag_motion, fv); g_signal_handlers_disconnect_by_func(fv->view, on_btn_pressed, fv); fm_dnd_unset_dest_auto_scroll(fv->view); gtk_widget_destroy(GTK_WIDGET(fv->view)); fv->view = NULL; } static void select_all_list_view(GtkWidget* view) { GtkTreeSelection * tree_sel; tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_select_all(tree_sel); } static void unselect_all_list_view(GtkWidget* view) { GtkTreeSelection * tree_sel; tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_unselect_all(tree_sel); } static void select_invert_list_view(FmFolderModel* model, GtkWidget* view) { GtkTreeSelection *tree_sel; GtkTreeIter it; if(!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &it)) return; tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); do { if(gtk_tree_selection_iter_is_selected(tree_sel, &it)) gtk_tree_selection_unselect_iter(tree_sel, &it); else gtk_tree_selection_select_iter(tree_sel, &it); }while( gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &it )); } static void select_invert_icon_view(FmFolderModel* model, GtkWidget* view) { GtkTreePath* path; int i, n; n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(model), NULL); if(n == 0) return; path = gtk_tree_path_new_first(); for( i=0; imode ) { GList *sels; gboolean has_focus; if( G_LIKELY(fv->view) ) { has_focus = gtk_widget_has_focus(fv->view); /* preserve old selections */ sels = fm_standard_view_get_selected_tree_paths(fv); unset_view(fv); /* it will destroy the fv->view widget */ /* FIXME: compact view and icon view actually use the same * type of widget, ExoIconView. So it may be better to * reuse the widget when available. */ } else { sels = NULL; has_focus = FALSE; } if(fv->icon_size_changed_handler) { g_signal_handler_disconnect(fm_config, fv->icon_size_changed_handler); fv->icon_size_changed_handler = 0; } if(fv->show_full_names_handler) { g_signal_handler_disconnect(fm_config, fv->show_full_names_handler); fv->show_full_names_handler = 0; } fv->mode = mode; switch(mode) { case FM_FV_COMPACT_VIEW: case FM_FV_ICON_VIEW: case FM_FV_THUMBNAIL_VIEW: create_icon_view(fv, sels); fv->set_single_click = (void(*)(GtkWidget*,gboolean))exo_icon_view_set_single_click; fv->set_auto_selection_delay = (void(*)(GtkWidget*,gint))exo_icon_view_set_single_click_timeout; fv->set_middle_click = (void(*)(GtkWidget*,gboolean))exo_icon_view_set_middle_click; fv->get_drop_path = get_drop_path_icon_view; fv->set_drag_dest = set_drag_dest_icon_item; fv->select_all = (void(*)(GtkWidget*))exo_icon_view_select_all; fv->unselect_all = (void(*)(GtkWidget*))exo_icon_view_unselect_all; fv->select_invert = select_invert_icon_view; fv->select_path = select_path_icon_view; break; case FM_FV_LIST_VIEW: /* detailed list view */ create_list_view(fv, sels); fv->set_single_click = (void(*)(GtkWidget*,gboolean))exo_tree_view_set_single_click; fv->set_auto_selection_delay = (void(*)(GtkWidget*,gint))exo_tree_view_set_single_click_timeout; fv->set_middle_click = (void(*)(GtkWidget*,gboolean))exo_tree_view_set_middle_click; fv->get_drop_path = get_drop_path_list_view; fv->set_drag_dest = set_drag_dest_list_item; fv->select_all = select_all_list_view; fv->unselect_all = unselect_all_list_view; fv->select_invert = select_invert_list_view; fv->select_path = select_path_list_view; } g_list_foreach(sels, (GFunc)gtk_tree_path_free, NULL); g_list_free(sels); fm_dnd_src_set_widget(fv->dnd_src, fv->view); fm_dnd_dest_set_widget(fv->dnd_dest, fv->view); g_signal_connect_after(fv->view, "drag-motion", G_CALLBACK(on_drag_motion), fv); /* connecting it after sometimes conflicts with system configuration (bug #3559831) so we just hope here it will be handled in order of connecting, i.e. after ExoIconView or ExoTreeView handler */ g_signal_connect(fv->view, "button-press-event", G_CALLBACK(on_btn_pressed), fv); fm_dnd_set_dest_auto_scroll(fv->view, gtk_scrolled_window_get_hadjustment((GtkScrolledWindow*)fv), gtk_scrolled_window_get_vadjustment((GtkScrolledWindow*)fv)); gtk_widget_show(fv->view); gtk_container_add(GTK_CONTAINER(fv), fv->view); if(has_focus) /* restore the focus if needed. */ gtk_widget_grab_focus(fv->view); } else { /* g_debug("same mode"); */ } } /** * fm_folder_view_get_mode * @fv: a widget to inspect * * Returns: current mode of view. * * Since: 0.1.0 * Deprecated: 1.0.1: Use fm_standard_view_get_mode() instead. */ guint fm_folder_view_get_mode(FmFolderView* fv) { g_return_val_if_fail(FM_IS_STANDARD_VIEW(fv), 0); return ((FmStandardView*)fv)->mode; } /** * fm_standard_view_get_mode * @fv: a widget to inspect * * Retrieves current view mode for folder in @fv. * * Before 1.0.1 this API had name fm_folder_view_get_mode. * * Returns: current mode of view. * * Since: 0.1.0 */ FmStandardViewMode fm_standard_view_get_mode(FmStandardView* fv) { return fv->mode; } static void fm_standard_view_set_selection_mode(FmFolderView* ffv, GtkSelectionMode mode) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); if(fv->sel_mode != mode) { fv->sel_mode = mode; switch(fv->mode) { case FM_FV_LIST_VIEW: { GtkTreeSelection* sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(fv->view)); gtk_tree_selection_set_mode(sel, mode); break; } case FM_FV_ICON_VIEW: case FM_FV_COMPACT_VIEW: case FM_FV_THUMBNAIL_VIEW: exo_icon_view_set_selection_mode(EXO_ICON_VIEW(fv->view), mode); break; } } } static GtkSelectionMode fm_standard_view_get_selection_mode(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); return fv->sel_mode; } static void fm_standard_view_set_show_hidden(FmFolderView* ffv, gboolean show) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); fv->show_hidden = show; } static gboolean fm_standard_view_get_show_hidden(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); return fv->show_hidden; } /* returned list should be freed with g_list_free_full(list, gtk_tree_path_free) */ static GList* fm_standard_view_get_selected_tree_paths(FmStandardView* fv) { GList *sels = NULL; switch(fv->mode) { case FM_FV_LIST_VIEW: { GtkTreeSelection* sel; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(fv->view)); sels = gtk_tree_selection_get_selected_rows(sel, NULL); break; } case FM_FV_ICON_VIEW: case FM_FV_COMPACT_VIEW: case FM_FV_THUMBNAIL_VIEW: sels = exo_icon_view_get_selected_items(EXO_ICON_VIEW(fv->view)); break; } return sels; } static inline FmFileInfoList* fm_standard_view_get_selected_files(FmStandardView* fv) { /* don't generate the data again if we have it cached. */ if(!fv->cached_selected_files) { GList* sels = fm_standard_view_get_selected_tree_paths(fv); GList *l, *next; if(sels) { fv->cached_selected_files = fm_file_info_list_new(); for(l = sels;l;l=next) { FmFileInfo* fi; GtkTreeIter it; GtkTreePath* tp = (GtkTreePath*)l->data; gtk_tree_model_get_iter(GTK_TREE_MODEL(fv->model), &it, l->data); gtk_tree_model_get(GTK_TREE_MODEL(fv->model), &it, FM_FOLDER_MODEL_COL_INFO, &fi, -1); gtk_tree_path_free(tp); next = l->next; l->data = fm_file_info_ref( fi ); l->prev = l->next = NULL; fm_file_info_list_push_tail_link(fv->cached_selected_files, l); } } } return fv->cached_selected_files; } static FmFileInfoList* fm_standard_view_dup_selected_files(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); return fm_file_info_list_ref(fm_standard_view_get_selected_files(fv)); } static FmPathList* fm_standard_view_dup_selected_file_paths(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); if(!fv->cached_selected_file_paths) { FmFileInfoList* files = fm_standard_view_get_selected_files(fv); if(files) fv->cached_selected_file_paths = fm_path_list_new_from_file_info_list(files); else fv->cached_selected_file_paths = NULL; } return fm_path_list_ref(fv->cached_selected_file_paths); } static gint fm_standard_view_count_selected_files(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); gint count = 0; switch(fv->mode) { case FM_FV_LIST_VIEW: { GtkTreeSelection* sel; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(fv->view)); count = gtk_tree_selection_count_selected_rows(sel); break; } case FM_FV_ICON_VIEW: case FM_FV_COMPACT_VIEW: case FM_FV_THUMBNAIL_VIEW: count = exo_icon_view_count_selected_items(EXO_ICON_VIEW(fv->view)); break; } return count; } static gboolean on_btn_pressed(GtkWidget* view, GdkEventButton* evt, FmStandardView* fv) { GList* sels = NULL; FmFolderViewClickType type = 0; GtkTreePath* tp = NULL; if(!fv->model) return FALSE; /* FIXME: handle single click activation */ if( evt->type == GDK_BUTTON_PRESS ) { /* special handling for ExoIconView */ if(evt->button != 1) { switch(fv->mode) { case FM_FV_ICON_VIEW: case FM_FV_COMPACT_VIEW: case FM_FV_THUMBNAIL_VIEW: /* select the item on right click for ExoIconView */ if(exo_icon_view_get_item_at_pos(EXO_ICON_VIEW(view), evt->x, evt->y, &tp, NULL)) { /* if the hit item is not currently selected */ if(!exo_icon_view_path_is_selected(EXO_ICON_VIEW(view), tp)) { sels = exo_icon_view_get_selected_items(EXO_ICON_VIEW(view)); if( sels ) /* if there are selected items */ { exo_icon_view_unselect_all(EXO_ICON_VIEW(view)); /* unselect all items */ g_list_foreach(sels, (GFunc)gtk_tree_path_free, NULL); g_list_free(sels); } exo_icon_view_select_path(EXO_ICON_VIEW(view), tp); exo_icon_view_set_cursor(EXO_ICON_VIEW(view), tp, NULL, FALSE); } } break; case FM_FV_LIST_VIEW: if(evt->window == gtk_tree_view_get_bin_window(GTK_TREE_VIEW(view))) { /* special handling for ExoTreeView */ /* Fix #2986834: MAJOR PROBLEM: Deletes Wrong File Frequently. */ GtkTreeViewColumn* col; if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), evt->x, evt->y, &tp, &col, NULL, NULL)) { GtkTreeSelection* tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); if(!gtk_tree_selection_path_is_selected(tree_sel, tp)) { gtk_tree_selection_unselect_all(tree_sel); if(col == exo_tree_view_get_activable_column(EXO_TREE_VIEW(view))) { gtk_tree_selection_select_path(tree_sel, tp); gtk_tree_view_set_cursor(GTK_TREE_VIEW(view), tp, NULL, FALSE); } } if(fm_config->middle_click && evt->button == 2) fm_folder_view_item_clicked(FM_FOLDER_VIEW(fv), tp, FM_FV_ACTIVATED); } } } } if(evt->button == 2 && !fm_config->middle_click) /* middle click */ type = FM_FV_MIDDLE_CLICK; else if(evt->button == 3) /* right click */ type = FM_FV_CONTEXT_MENU; } if( type != FM_FV_CLICK_NONE ) { sels = fm_standard_view_get_selected_tree_paths(fv); if( sels || type == FM_FV_CONTEXT_MENU ) { fm_folder_view_item_clicked(FM_FOLDER_VIEW(fv), tp, type); if(sels) { g_list_foreach(sels, (GFunc)gtk_tree_path_free, NULL); g_list_free(sels); } } } if(tp) gtk_tree_path_free(tp); return FALSE; } /* TODO: select files by custom func, not yet implemented */ void fm_folder_view_select_custom(FmFolderView* fv, GFunc filter, gpointer user_data) { } static void fm_standard_view_select_all(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); if(fv->select_all) fv->select_all(fv->view); } static void fm_standard_view_unselect_all(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); if(fv->unselect_all) fv->unselect_all(fv->view); } static void on_dnd_src_data_get(FmDndSrc* ds, FmStandardView* fv) { FmFileInfoList* files = fm_standard_view_dup_selected_files(FM_FOLDER_VIEW(fv)); fm_dnd_src_set_files(ds, files); if(files) fm_file_info_list_unref(files); } static gboolean on_sel_changed_real(FmStandardView* fv) { /* clear cached selected files */ if(fv->cached_selected_files) { fm_file_info_list_unref(fv->cached_selected_files); fv->cached_selected_files = NULL; } if(fv->cached_selected_file_paths) { fm_path_list_unref(fv->cached_selected_file_paths); fv->cached_selected_file_paths = NULL; } fm_folder_view_sel_changed(NULL, FM_FOLDER_VIEW(fv)); fv->sel_changed_pending = FALSE; return TRUE; } /* * We limit "sel-changed" emitting here: * - if no signal was in last 200ms then signal is emitted immidiately * - if there was < 200ms since last signal then it's marked as pending * and signal will be emitted when that 200ms timeout ends */ static gboolean on_sel_changed_idle(gpointer user_data) { FmStandardView* fv = (FmStandardView*)user_data; gboolean ret = FALSE; /* check if fv is destroyed already */ if(g_source_is_destroyed(g_main_current_source())) goto _end; if(fv->sel_changed_pending) /* fast changing detected! continue... */ ret = on_sel_changed_real(fv); fv->sel_changed_idle = 0; _end: return ret; } static void on_sel_changed(GObject* obj, FmStandardView* fv) { if(!fv->sel_changed_idle) { fv->sel_changed_idle = gdk_threads_add_timeout_full(G_PRIORITY_HIGH_IDLE, 200, on_sel_changed_idle, fv, NULL); on_sel_changed_real(fv); } else fv->sel_changed_pending = TRUE; } static void fm_standard_view_select_invert(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); if(fv->select_invert) fv->select_invert(fv->model, fv->view); } static FmFolder* fm_standard_view_get_folder(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); return fv->model ? fm_folder_model_get_folder(fv->model) : NULL; } static void fm_standard_view_select_file_path(FmFolderView* ffv, FmPath* path) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); FmFolder* folder = fm_standard_view_get_folder(ffv); FmPath* cwd = folder ? fm_folder_get_path(folder) : NULL; if(cwd && fm_path_equal(fm_path_get_parent(path), cwd)) { FmFolderModel* model = fv->model; GtkTreeIter it; if(fv->select_path && fm_folder_model_find_iter_by_filename(model, &it, fm_path_get_basename(path))) fv->select_path(model, fv->view, &it); } } static void fm_standard_view_get_custom_menu_callbacks(FmFolderView* ffv, FmFolderViewUpdatePopup *update_popup, FmLaunchFolderFunc *open_folders) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); *update_popup = fv->update_popup; *open_folders = fv->open_folders; } static FmFolderModel* fm_standard_view_get_model(FmFolderView* ffv) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); return fv->model; } static void fm_standard_view_set_model(FmFolderView* ffv, FmFolderModel* model) { FmStandardView* fv = FM_STANDARD_VIEW(ffv); int icon_size; unset_model(fv); switch(fv->mode) { case FM_FV_LIST_VIEW: _check_tree_columns_defaults(fv); if(model) { icon_size = fm_config->small_icon_size; fm_folder_model_set_icon_size(model, icon_size); } gtk_tree_view_set_model(GTK_TREE_VIEW(fv->view), GTK_TREE_MODEL(model)); _reset_columns_widths(GTK_TREE_VIEW(fv->view)); break; case FM_FV_ICON_VIEW: icon_size = fm_config->big_icon_size; if(model) fm_folder_model_set_icon_size(model, icon_size); exo_icon_view_set_model(EXO_ICON_VIEW(fv->view), GTK_TREE_MODEL(model)); break; case FM_FV_COMPACT_VIEW: if(model) { icon_size = fm_config->small_icon_size; fm_folder_model_set_icon_size(model, icon_size); } exo_icon_view_set_model(EXO_ICON_VIEW(fv->view), GTK_TREE_MODEL(model)); break; case FM_FV_THUMBNAIL_VIEW: if(model) { icon_size = fm_config->thumbnail_size; fm_folder_model_set_icon_size(model, icon_size); } exo_icon_view_set_model(EXO_ICON_VIEW(fv->view), GTK_TREE_MODEL(model)); break; } if(model) { fv->model = (FmFolderModel*)g_object_ref(model); g_signal_connect(model, "row-inserted", G_CALLBACK(on_row_inserted), fv); g_signal_connect(model, "row-deleted", G_CALLBACK(on_row_deleted), fv); g_signal_connect(model, "row-changed", G_CALLBACK(on_row_changed), fv); } else fv->model = NULL; /* reset tooltip after changing folder, it might stick from old one, see how FmCellRendererText works on that regard */ g_object_set(G_OBJECT(fv->view), "tooltip-text", NULL, NULL); } typedef struct { GtkTreeViewColumn* col; FmFolderViewColumnInfo* info; } _ColumnsCache; static gboolean _fm_standard_view_set_columns(FmFolderView* fv, const GSList* cols) { FmStandardView* view; GtkTreeViewColumn *col, *last; FmFolderViewColumnInfo* info; _ColumnsCache* old_cols = NULL; /* satisfy the compiler */ const GSList* l; GList *cols_list, *ld; guint i, n_cols; if(!FM_IS_STANDARD_VIEW(fv)) return FALSE; view = (FmStandardView*)fv; if(view->mode != FM_FV_LIST_VIEW) /* other modes aren't supported now */ return FALSE; cols_list = gtk_tree_view_get_columns(GTK_TREE_VIEW(view->view)); n_cols = g_list_length(cols_list); if(n_cols > 0) { /* create more convenient for us list of columns */ old_cols = g_new(_ColumnsCache, n_cols); for(ld = cols_list, i = 0; ld; ld = ld->next, i++) { col = ld->data; /* column */ info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); /* info */ old_cols[i].col = col; old_cols[i].info = info; } g_list_free(cols_list); } last = NULL; for(l = cols; l; l = l->next) { info = l->data; /* find old one and move here */ for(i = 0; i < n_cols; i++) if(old_cols[i].info && old_cols[i].info->col_id == info->col_id) break; if(i < n_cols) { /* we found it so just move it here */ col = old_cols[i].col; /* update all other data - width for example */ if(info->col_id != FM_FOLDER_MODEL_COL_NAME) { old_cols[i].info->width = info->width; if(info->width < 0) old_cols[i].info->width = fm_folder_model_col_get_default_width(view->model, info->col_id); old_cols[i].info->reserved1 = 0; _update_width_sizing(col, info->width); } old_cols[i].col = NULL; /* we removed it from its place */ old_cols[i].info = NULL; /* don't try to use it again */ } else if(!fm_folder_model_col_is_valid(0)) /* workaround for case when there is no model init yet, the most probably bug #3596550 is about this (it creates column with empty title), can g_return_val_if_fail() not fail somehow? */ continue; else { /* if not found then append new one */ col = create_list_view_column(view, info); if(col == NULL) /* failed! skipping it */ continue; } gtk_tree_view_move_column_after(GTK_TREE_VIEW(view->view), col, last); last = col; } /* remove abandoned columns from view */ for(i = 0; i < n_cols; i++) if(old_cols[i].col != NULL) gtk_tree_view_remove_column(GTK_TREE_VIEW(view->view), old_cols[i].col); if(n_cols > 0) g_free(old_cols); return TRUE; } static GSList* _fm_standard_view_get_columns(FmFolderView* fv) { FmStandardView* view; GSList* list; GList *cols_list, *ld; if(!FM_IS_STANDARD_VIEW(fv)) return NULL; view = (FmStandardView*)fv; if(view->mode != FM_FV_LIST_VIEW) /* other modes aren't supported now */ return NULL; cols_list = gtk_tree_view_get_columns(GTK_TREE_VIEW(view->view)); if(cols_list == NULL) return NULL; list = NULL; for(ld = cols_list; ld; ld = ld->next) { GtkTreeViewColumn *col = ld->data; FmFolderViewColumnInfo* info = g_object_get_qdata(G_OBJECT(col), fm_qdata_id); list = g_slist_append(list, info); /* info */ } g_list_free(cols_list); return list; } static void _fm_standard_view_scroll_to_path(FmFolderView* fv, FmPath *path, gboolean focus) { FmStandardView *view; GtkTreeIter it; GtkTreePath *tp; if (!FM_IS_STANDARD_VIEW(fv) || path == NULL) return; view = (FmStandardView*)fv; if (!fm_folder_model_find_iter_by_filename(view->model, &it, fm_path_get_basename(path))) return; tp = gtk_tree_model_get_path(GTK_TREE_MODEL(view->model), &it); if (tp == NULL) /* invalid child */ return; switch(view->mode) { case FM_FV_LIST_VIEW: gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(view->view), tp, NULL, TRUE, 0.5, 0.0); if (focus) gtk_tree_view_set_cursor(GTK_TREE_VIEW(view->view), tp, NULL, FALSE); break; case FM_FV_ICON_VIEW: case FM_FV_COMPACT_VIEW: case FM_FV_THUMBNAIL_VIEW: exo_icon_view_scroll_to_path(EXO_ICON_VIEW(view->view), tp, TRUE, 0.5, 0.5); if (focus) exo_icon_view_set_cursor(EXO_ICON_VIEW(view->view), tp, NULL, FALSE); break; } gtk_tree_path_free(tp); } static void fm_standard_view_view_init(FmFolderViewInterface* iface) { iface->set_sel_mode = fm_standard_view_set_selection_mode; iface->get_sel_mode = fm_standard_view_get_selection_mode; iface->set_show_hidden = fm_standard_view_set_show_hidden; iface->get_show_hidden = fm_standard_view_get_show_hidden; iface->get_folder = fm_standard_view_get_folder; iface->set_model = fm_standard_view_set_model; iface->get_model = fm_standard_view_get_model; iface->count_selected_files = fm_standard_view_count_selected_files; iface->dup_selected_files = fm_standard_view_dup_selected_files; iface->dup_selected_file_paths = fm_standard_view_dup_selected_file_paths; iface->select_all = fm_standard_view_select_all; iface->unselect_all = fm_standard_view_unselect_all; iface->select_invert = fm_standard_view_select_invert; iface->select_file_path = fm_standard_view_select_file_path; iface->get_custom_menu_callbacks = fm_standard_view_get_custom_menu_callbacks; iface->set_columns = _fm_standard_view_set_columns; iface->get_columns = _fm_standard_view_get_columns; iface->scroll_to_path = _fm_standard_view_scroll_to_path; } typedef struct { const char* name; FmStandardViewMode mode; char *icon; char *label; char *tooltip; //char *shortkey; } FmStandardViewModeinfo; static const FmStandardViewModeinfo view_mode_names[] = { { "icon", FM_FV_ICON_VIEW, NULL, N_("_Icon View"), NULL }, { "compact", FM_FV_COMPACT_VIEW, NULL, N_("_Compact View"), NULL }, { "thumbnail", FM_FV_THUMBNAIL_VIEW, NULL, N_("_Thumbnail View"), NULL }, { "list", FM_FV_LIST_VIEW, NULL, N_("Detailed _List View"), NULL } }; /** * fm_standard_view_mode_to_str * @mode: mode id * * Retrieves string name of rendering @mode. That name may be used for * config save or similar purposes. Returned data are owned by the * implementation and should be not freed by caller. * * Returns: name associated with @mode. * * Since: 1.0.2 */ const char* fm_standard_view_mode_to_str(FmStandardViewMode mode) { guint i; if(G_LIKELY(FM_STANDARD_VIEW_MODE_IS_VALID(mode))) for(i = 0; i < G_N_ELEMENTS(view_mode_names); i++) if(view_mode_names[i].mode == mode) return view_mode_names[i].name; return NULL; } /** * fm_standard_view_mode_from_str * @str: the name of mode * * Finds mode which have an associated name equal to @str. * * Returns: mode id or (FmStandardViewMode)-1 if no such mode exists. * * Since: 1.0.2 */ FmStandardViewMode fm_standard_view_mode_from_str(const char* str) { guint i; for(i = 0; i < G_N_ELEMENTS(view_mode_names); i++) if(strcmp(str, view_mode_names[i].name) == 0) return view_mode_names[i].mode; return (FmStandardViewMode)-1; } /** * fm_standard_view_get_n_modes * * Tests how many view modes are known to create #FmStandardView widget. * * Returns: number of known modes for standard folder view. * * Since: 1.2.0 */ gint fm_standard_view_get_n_modes(void) { /* FIXME: this is rough */ return (gint)FM_FV_LIST_VIEW + 1; } /** * fm_standard_view_get_mode_label * @mode: the view mode * * Retrieves label for @mode which can be used in menus. Returned * data should not be freed by caller. * * Returns: desription or %NULL if @mode is invalid. * * Since: 1.2.0 */ const char *fm_standard_view_get_mode_label(FmStandardViewMode mode) { guint i; if(G_LIKELY(FM_STANDARD_VIEW_MODE_IS_VALID(mode))) for(i = 0; i < G_N_ELEMENTS(view_mode_names); i++) if(view_mode_names[i].mode == mode && view_mode_names[i].label) return _(view_mode_names[i].label); return NULL; } /** * fm_standard_view_get_mode_tooltip * @mode: the view mode * * Retrieves detailed description for @mode which can be used in tooltip. * Returned data should not be freed by caller. * * Returns: detailed description or %NULL if it is not available. * * Since: 1.2.0 */ const char *fm_standard_view_get_mode_tooltip(FmStandardViewMode mode) { guint i; if(G_LIKELY(FM_STANDARD_VIEW_MODE_IS_VALID(mode))) for(i = 0; i < G_N_ELEMENTS(view_mode_names); i++) if(view_mode_names[i].mode == mode && view_mode_names[i].tooltip) return _(view_mode_names[i].tooltip); return NULL; } /** * fm_standard_view_get_mode_icon * @mode: the view mode * * Retrieves icon name for @mode which can be used in menus. Returned * data should not be freed by caller. * * Returns: icon name or %NULL if it is not available. * * Since: 1.2.0 */ const char *fm_standard_view_get_mode_icon(FmStandardViewMode mode) { guint i; if(G_LIKELY(FM_STANDARD_VIEW_MODE_IS_VALID(mode))) for(i = 0; i < G_N_ELEMENTS(view_mode_names); i++) if(view_mode_names[i].mode == mode) return view_mode_names[i].icon; return NULL; } libfm-1.4.0/src/gtk/fm-standard-view.h000066400000000000000000000060411475513661000175130ustar00rootroot00000000000000/* * folder-view.h * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __STANDARD_VIEW_H__ #define __STANDARD_VIEW_H__ #include #include "fm-folder-view.h" G_BEGIN_DECLS #define FM_STANDARD_VIEW_TYPE (fm_standard_view_get_type()) #define FM_STANDARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_STANDARD_VIEW_TYPE, FmStandardView)) #define FM_STANDARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_STANDARD_VIEW_TYPE, FmStandardViewClass)) #define FM_IS_STANDARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_STANDARD_VIEW_TYPE)) #define FM_IS_STANDARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_STANDARD_VIEW_TYPE)) /** * FmStandardViewMode * @FM_FV_ICON_VIEW: standard icon view * @FM_FV_COMPACT_VIEW: view with small icons and text on right of them * @FM_FV_THUMBNAIL_VIEW: view with big icons/thumbnails * @FM_FV_LIST_VIEW: table-form view */ typedef enum { FM_FV_ICON_VIEW, FM_FV_COMPACT_VIEW, FM_FV_THUMBNAIL_VIEW, FM_FV_LIST_VIEW } FmStandardViewMode; #ifndef FM_DISABLE_DEPRECATED #define FM_FOLDER_VIEW_MODE_IS_VALID(mode) FM_STANDARD_VIEW_MODE_IS_VALID(mode) #endif #define FM_STANDARD_VIEW_MODE_IS_VALID(mode) ((guint)mode <= FM_FV_LIST_VIEW) typedef struct _FmStandardView FmStandardView; typedef struct _FmStandardViewClass FmStandardViewClass; GType fm_standard_view_get_type(void); FmStandardView* fm_standard_view_new(FmStandardViewMode mode, FmFolderViewUpdatePopup update_popup, FmLaunchFolderFunc open_folders); void fm_standard_view_set_mode(FmStandardView* fv, FmStandardViewMode mode); FmStandardViewMode fm_standard_view_get_mode(FmStandardView* fv); const char* fm_standard_view_mode_to_str(FmStandardViewMode mode); FmStandardViewMode fm_standard_view_mode_from_str(const char* str); gint fm_standard_view_get_n_modes(void); const char *fm_standard_view_get_mode_label(FmStandardViewMode mode); const char *fm_standard_view_get_mode_tooltip(FmStandardViewMode mode); const char *fm_standard_view_get_mode_icon(FmStandardViewMode mode); G_END_DECLS #endif /* __STANDARD_VIEW_H__ */ libfm-1.4.0/src/gtk/fm-tab-label.c000066400000000000000000000163621475513661000165700ustar00rootroot00000000000000/* * fm-tab-label.c * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-tab-label * @short_description: A tab label widget. * @title: FmTabLabel * * @include: libfm/fm-gtk.h * * The #FmTabLabel is a widget that can be used as a label of tab in * notebook-like folders view. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm-tab-label.h" G_DEFINE_TYPE(FmTabLabel, fm_tab_label, GTK_TYPE_EVENT_BOX); #if GTK_CHECK_VERSION(3, 0, 0) GtkCssProvider *provider; #endif static void fm_tab_label_class_init(FmTabLabelClass *klass) { /* special style used by close button */ #if GTK_CHECK_VERSION(3, 0, 0) provider = gtk_css_provider_new(); gtk_css_provider_load_from_data(provider, "#tab-close-btn {\n" "-GtkWidget-focus-padding : 0;\n" "-GtkWidget-focus-line-width : 0;\n" "padding : 0;\n" "}\n", -1, NULL); #else gtk_rc_parse_string( "style \"close-btn-style\" {\n" "GtkWidget::focus-padding = 0\n" "GtkWidget::focus-line-width = 0\n" "xthickness = 0\n" "ythickness = 0\n" "}\n" "widget \"*.tab-close-btn\" style \"close-btn-style\""); #endif } /* FIXME: add g_object_unref (provider); on class destroy? */ static void on_close_btn_style_set(GtkWidget *btn, GtkRcStyle *prev, gpointer data) { gint w, h; gtk_icon_size_lookup_for_settings(gtk_widget_get_settings(btn), GTK_ICON_SIZE_MENU, &w, &h); gtk_widget_set_size_request(btn, w + 2, h + 2); } static gboolean on_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) { /* We should only show the tooltip if the text is ellipsized */ GtkLabel* label = GTK_LABEL(widget); PangoLayout* layout = gtk_label_get_layout(label); if(pango_layout_is_ellipsized(layout)) { gtk_tooltip_set_text(tooltip, gtk_label_get_text(label)); return TRUE; } return FALSE; } static void fm_tab_label_init(FmTabLabel *self) { GtkBox* hbox; #if GTK_CHECK_VERSION(3, 0, 0) GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(self)); #endif gtk_event_box_set_visible_window(GTK_EVENT_BOX(self), FALSE); #if GTK_CHECK_VERSION(3, 2, 0) /* FIXME: migrate to GtkGrid */ hbox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); #else hbox = GTK_BOX(gtk_hbox_new(FALSE, 0)); #endif self->label = (GtkLabel*)gtk_label_new(""); gtk_widget_set_has_tooltip((GtkWidget*)self->label, TRUE); gtk_box_pack_start(hbox, (GtkWidget*)self->label, FALSE, FALSE, 4 ); g_signal_connect(self->label, "query-tooltip", G_CALLBACK(on_query_tooltip), self); self->close_btn = (GtkButton*)gtk_button_new(); gtk_button_set_focus_on_click(self->close_btn, FALSE); gtk_button_set_relief(self->close_btn, GTK_RELIEF_NONE ); gtk_container_add ( GTK_CONTAINER ( self->close_btn ), gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU)); gtk_container_set_border_width(GTK_CONTAINER(self->close_btn), 0); gtk_widget_set_name((GtkWidget*)self->close_btn, "tab-close-btn"); g_signal_connect(self->close_btn, "style-set", G_CALLBACK(on_close_btn_style_set), NULL); gtk_box_pack_end( hbox, (GtkWidget*)self->close_btn, FALSE, FALSE, 0 ); gtk_container_add(GTK_CONTAINER(self), (GtkWidget*)hbox); gtk_widget_show_all((GtkWidget*)hbox); #if GTK_CHECK_VERSION(3, 0, 0) gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); #endif /* gtk_drag_dest_set ( GTK_WIDGET( evt_box ), GTK_DEST_DEFAULT_ALL, drag_targets, sizeof( drag_targets ) / sizeof( GtkTargetEntry ), GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK ); g_signal_connect ( ( gpointer ) evt_box, "drag-motion", G_CALLBACK ( on_tab_drag_motion ), file_browser ); */ } /** * fm_tab_label_new * @text: text to display as a tab label * * Creates new tab label widget. * * Returns: (transfer full): a new #FmTabLabel widget. * * Since: 0.1.10 */ FmTabLabel *fm_tab_label_new(const char* text) { FmTabLabel* label = (FmTabLabel*)g_object_new(FM_TYPE_TAB_LABEL, NULL); AtkObject *obj; obj = gtk_widget_get_accessible(GTK_WIDGET(label)); atk_object_set_description(obj, _("Changes active tab")); gtk_label_set_text(label->label, text); return label; } /** * fm_tab_label_set_text * @label: a tab label widget * @text: text to display as a tab label * * Changes text on the @label. * * Since: 0.1.10 */ void fm_tab_label_set_text(FmTabLabel* label, const char* text) { gtk_label_set_text(label->label, text); } /** * fm_tab_label_set_tooltip_text * @label: a tab label widget * @text: text to display in label tooltip * * Changes text of tooltip on the @label. * * Since: 1.0.0 */ void fm_tab_label_set_tooltip_text(FmTabLabel* label, const char* text) { gtk_widget_set_tooltip_text(GTK_WIDGET(label->label), text); } /** * fm_tab_label_set_icon * @label: a tab label widget * @icon: (allow-none): an icon to show before text or %NULL * * Sets an optional @icon to be shown before text in the @label. * * Since: 1.2.0 */ void fm_tab_label_set_icon(FmTabLabel *label, FmIcon *icon) { g_return_if_fail(FM_IS_TAB_LABEL(label)); if (icon) { gint height, width; GdkPixbuf *pixbuf; if (!gtk_icon_size_lookup(GTK_ICON_SIZE_BUTTON, &width, &height)) height = 20; /* fallback size, is that ever needed? */ pixbuf = fm_pixbuf_from_icon(icon, height); if (pixbuf == NULL) goto _no_image; if (label->image) { gtk_image_set_from_pixbuf((GtkImage*)label->image, pixbuf); gtk_widget_queue_draw(GTK_WIDGET(label)); } else { /* hbox is only child of the label */ GtkWidget *hbox = gtk_bin_get_child(GTK_BIN(label)); label->image = gtk_image_new_from_pixbuf(pixbuf); gtk_box_pack_start(GTK_BOX(hbox), label->image, FALSE, FALSE, 0); gtk_widget_show(label->image); } g_object_unref(pixbuf); return; } _no_image: if (label->image) { gtk_widget_destroy(label->image); label->image = NULL; } } libfm-1.4.0/src/gtk/fm-tab-label.h000066400000000000000000000041301475513661000165630ustar00rootroot00000000000000/* * fm-tab-label.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_TAB_LABEL_H__ #define __FM_TAB_LABEL_H__ #include #include "fm-icon-pixbuf.h" G_BEGIN_DECLS #define FM_TYPE_TAB_LABEL (fm_tab_label_get_type()) #define FM_TAB_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_TAB_LABEL, FmTabLabel)) #define FM_TAB_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_TAB_LABEL, FmTabLabelClass)) #define FM_IS_TAB_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_TAB_LABEL)) #define FM_IS_TAB_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_TAB_LABEL)) typedef struct _FmTabLabel FmTabLabel; typedef struct _FmTabLabelClass FmTabLabelClass; struct _FmTabLabel { GtkEventBox parent; GtkLabel* label; GtkButton* close_btn; /*< private >*/ GtkWidget *image; gpointer _reserved1; }; struct _FmTabLabelClass { /*< private >*/ GtkEventBoxClass parent_class; gpointer _reserved1; }; GType fm_tab_label_get_type(void); FmTabLabel* fm_tab_label_new(const char* text); void fm_tab_label_set_text(FmTabLabel* label, const char* text); void fm_tab_label_set_tooltip_text(FmTabLabel* label, const char* text); void fm_tab_label_set_icon(FmTabLabel *label, FmIcon *icon); G_END_DECLS #endif /* __FM_TAB_LABEL_H__ */ libfm-1.4.0/src/gtk/fm-thumbnail.c000066400000000000000000000157401475513661000167270ustar00rootroot00000000000000/* * fm-thumbnail.c * * Copyright 2010 - 2012 Hong Jen Yee (PCMan) * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /** * SECTION:fm-thumbnail * @short_description: A thumbnails cache loader and generator. * @title: FmThumbnailRequest * * @include: libfm/fm-gtk.h * * This API allows to generate thumbnails for files and save them on * disk then use that cache next time to display them. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-thumbnail.h" #include "fm-config.h" /* FIXME: this function prototype seems to be missing in header files of GdkPixbuf. Bug report to them. */ gboolean gdk_pixbuf_set_option(GdkPixbuf *pixbuf, const gchar *key, const gchar *value); /** * fm_thumbnail_request * @src_file: an image file * @size: thumbnail size * @callback: callback to requestor * @user_data: data provided for @callback * * Schedules loading/generation of thumbnail for @src_file. If the * request isn't cancelled then ready thumbnail will be given to the * requestor in @callback. Returned descriptor can be used to cancel * the job. * * Returns: (transfer none): request descriptor. * * Since: 0.1.0 */ /* in main loop */ FmThumbnailRequest* fm_thumbnail_request(FmFileInfo* src_file, guint size, FmThumbnailReadyCallback callback, gpointer user_data) { return fm_thumbnail_loader_load(src_file, size, callback, user_data); } /** * fm_thumbnail_request_cancel * @req: the request descriptor * * Cancels request. After return from this call the @req becomes invalid * and cannot be used. Caller will never get callback for cancelled * request either. * * Since: 0.1.0 */ /* in main loop */ void fm_thumbnail_request_cancel(FmThumbnailRequest* req) { fm_thumbnail_loader_cancel(req); } /** * fm_thumbnail_request_get_pixbuf * @req: request descriptor * * Retrieves loaded thumbnail. Returned data are owned by @req and should * be not freed by caller. * * Returns: (transfer none): thumbnail. * * Since: 0.1.0 */ /* in main loop */ GdkPixbuf* fm_thumbnail_request_get_pixbuf(FmThumbnailRequest* req) { return GDK_PIXBUF(fm_thumbnail_loader_get_data(req)); } /** * fm_thumbnail_request_get_file_info * @req: request descriptor * * Retrieves file descriptor that request is for. Returned data are * owned by @req and should be not freed by caller. * * Returns: (transfer none): file descriptor. * * Since: 0.1.0 */ /* in main loop */ FmFileInfo* fm_thumbnail_request_get_file_info(FmThumbnailRequest* req) { return fm_thumbnail_loader_get_file_info(req); } /** * fm_thumbnail_request_get_size * @req: request descriptor * * Retrieves thumbnail size that request is for. * * Returns: size in pixels. * * Since: 0.1.0 */ /* in main loop */ guint fm_thumbnail_request_get_size(FmThumbnailRequest* req) { return fm_thumbnail_loader_get_size(req); } static GObject* read_image_from_file(const char* filename) { if (fm_config->thumbnail_max > 0) { int w = 1 , h = 1; /* SF bug #895: image of big dimension can be still small due to image compression and loading that image into memory can easily overrun the available memory, so let limit image by Mpix as well */ gdk_pixbuf_get_file_info(filename, &w, &h); /* g_debug("thumbnail generator: image size %dx%d", w, h); */ if (w * h > (fm_config->thumbnail_max << 10)) return NULL; } return (GObject*)gdk_pixbuf_new_from_file(filename, NULL); } static GObject* read_image_from_stream(GInputStream* stream, guint64 len, GCancellable* cancellable) { return (GObject*)gdk_pixbuf_new_from_stream(stream, cancellable, NULL); } static gboolean write_image(GObject* image, const char* filename) { char *keys[11]; /* enough for known keys + 1 */ char *vals[11]; GdkPixbuf *pix = GDK_PIXBUF(image); char *known_keys[] = { "tEXt::Thumb::URI", "tEXt::Thumb::MTime", "tEXt::Thumb::Size", "tEXt::Thumb::Mimetype", "tEXt::Description", "tEXt::Software", "tEXt::Thumb::Image::Width", "tEXt::Thumb::Image::Height", "tEXt::Thumb::Document::Pages", "tEXt::Thumb::Movie::Length" }; guint i, x; /* unfortunately GdkPixbuf APIs does not contain API to get list of options that are set, neither there is API to save the file with all options, so all we can do now is to scan options for known ones and save them into target file */ for (i = 0, x = 0; i < G_N_ELEMENTS(known_keys); i++) { const char *val = gdk_pixbuf_get_option(pix, known_keys[i]); if (val) { keys[x] = known_keys[i]; vals[x] = (char*)val; x++; } } keys[x] = NULL; vals[x] = NULL; return gdk_pixbuf_savev(pix, filename, "png", keys, vals, NULL); } static gboolean set_image_text(GObject* image, const char* key, const char* val) { return gdk_pixbuf_set_option(GDK_PIXBUF(image), key, val); } static GObject* scale_image(GObject* ori_pix, int new_width, int new_height) { return (GObject*)gdk_pixbuf_scale_simple(GDK_PIXBUF(ori_pix), new_width, new_height, GDK_INTERP_BILINEAR); } static int get_image_width(GObject* image) { return gdk_pixbuf_get_width(GDK_PIXBUF(image)); } static int get_image_height(GObject* image) { return gdk_pixbuf_get_height(GDK_PIXBUF(image)); } static char* get_image_text(GObject* image, const char* key) { return g_strdup(gdk_pixbuf_get_option(GDK_PIXBUF(image), key)); } static GObject* rotate_image(GObject* image, int degree) { return (GObject*)gdk_pixbuf_rotate_simple(GDK_PIXBUF(image), (GdkPixbufRotation)degree); } static FmThumbnailLoaderBackend gtk_backend = { read_image_from_file, read_image_from_stream, write_image, scale_image, rotate_image, get_image_width, get_image_height, get_image_text, set_image_text }; /* in main loop */ void _fm_thumbnail_init() { if(!fm_thumbnail_loader_set_backend(>k_backend)) g_error("failed to set backend for thumbnail loader"); } void _fm_thumbnail_finalize(void) { } libfm-1.4.0/src/gtk/fm-thumbnail.h000066400000000000000000000042011475513661000167220ustar00rootroot00000000000000/* * fm-thumbnail.h * * Copyright 2010 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_THUMBNAIL_H__ #define __FM_THUMBNAIL_H__ #include #include "fm-file-info.h" #include "fm-thumbnail-loader.h" G_BEGIN_DECLS #define FmThumbnailRequest FmThumbnailLoader /** * FmThumbnailReadyCallback: * @req: request descriptor * @data: user data provided when request was made * * The callback to requestor when thumbnail is ready. * Note that this call is done outside of GTK loop so if the callback * wants to use any GTK API it should call gdk_threads_enter() and * gdk_threads_leave() for safety. * * Since: 0.1.0 */ typedef void (*FmThumbnailReadyCallback)(FmThumbnailRequest*req, gpointer data); void _fm_thumbnail_init(); void _fm_thumbnail_finalize(); FmThumbnailRequest* fm_thumbnail_request(FmFileInfo* src_file, guint size, FmThumbnailReadyCallback callback, gpointer user_data); void fm_thumbnail_request_cancel(FmThumbnailRequest* req); GdkPixbuf* fm_thumbnail_request_get_pixbuf(FmThumbnailRequest* req); FmFileInfo* fm_thumbnail_request_get_file_info(FmThumbnailRequest* req); guint fm_thumbnail_request_get_size(FmThumbnailRequest* req); G_END_DECLS #endif /* __FM_THUMBNAIL_H__ */ libfm-1.4.0/src/job/000077500000000000000000000000001475513661000141565ustar00rootroot00000000000000libfm-1.4.0/src/job/fm-deep-count-job.c000066400000000000000000000276211475513661000175450ustar00rootroot00000000000000/* * fm-deep-count-job.c * * Copyright 2009 - 2012 Hong Jen Yee (PCMan) * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-deep-count-job * @short_description: Job to gather information about file sizes. * @title: FmDeepCountJob * * @include: libfm/fm.h * * The #FmDeepCountJob can be used to recursively gather information about * some files and directories content before copy or move. It counts total * size of all given files and directories, and size on disk for them. * If flags for the job include FM_DC_JOB_PREPARE_MOVE then also count of * files to move between volumes will be counted as well. */ #include "fm-deep-count-job.h" #include #include static void fm_deep_count_job_dispose (GObject *object); G_DEFINE_TYPE(FmDeepCountJob, fm_deep_count_job, FM_TYPE_JOB); static gboolean fm_deep_count_job_run(FmJob* job); static gboolean deep_count_posix(FmDeepCountJob* job, const char* path); static gboolean deep_count_gio(FmDeepCountJob* job, GFileInfo* inf, GFile* gf); static const char query_str[] = G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL"," G_FILE_ATTRIBUTE_STANDARD_SIZE"," G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE"," G_FILE_ATTRIBUTE_ID_FILESYSTEM; static void fm_deep_count_job_class_init(FmDeepCountJobClass *klass) { GObjectClass *g_object_class; FmJobClass* job_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_deep_count_job_dispose; /* use finalize from parent class */ job_class = FM_JOB_CLASS(klass); job_class->run = fm_deep_count_job_run; } static void fm_deep_count_job_dispose(GObject *object) { FmDeepCountJob *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DEEP_COUNT_JOB(object)); self = (FmDeepCountJob*)object; if(self->paths) { fm_path_list_unref(self->paths); self->paths = NULL; } G_OBJECT_CLASS(fm_deep_count_job_parent_class)->dispose(object); } static void fm_deep_count_job_init(FmDeepCountJob *self) { fm_job_init_cancellable(FM_JOB(self)); } /** * fm_deep_count_job_new * @paths: list of files and directories to count sizes * @flags: flags of the counting behavior * * Creates a new #FmDeepCountJob which can be ran via #FmJob API. * * Returns: (transfer full): a new #FmDeepCountJob object. * * Since: 0.1.0 */ FmDeepCountJob *fm_deep_count_job_new(FmPathList* paths, FmDeepCountJobFlags flags) { FmDeepCountJob* job = (FmDeepCountJob*)g_object_new(FM_DEEP_COUNT_JOB_TYPE, NULL); job->paths = fm_path_list_ref(paths); job->flags = flags; return job; } static gboolean fm_deep_count_job_run(FmJob* job) { FmDeepCountJob* dc = (FmDeepCountJob*)job; GList* l; l = fm_path_list_peek_head_link(dc->paths); for(; !fm_job_is_cancelled(job) && l; l=l->next) { FmPath* path = FM_PATH(l->data); if(fm_path_is_native(path)) /* if it's a native file, use posix APIs */ { char *path_str = fm_path_to_str(path); deep_count_posix( dc, path_str ); g_free(path_str); } else { GFile* gf = fm_path_to_gfile(path); deep_count_gio( dc, NULL, gf ); g_object_unref(gf); } } return TRUE; } static gboolean deep_count_posix(FmDeepCountJob* job, const char *path) { FmJob* fmjob = FM_JOB(job); struct stat st; int ret; _retry_stat: if( G_UNLIKELY(job->flags & FM_DC_JOB_FOLLOW_LINKS) ) ret = stat(path, &st); else ret = lstat(path, &st); if( ret == 0 ) { ++job->count; /* SF bug #892: dir file size is not relevant in the summary */ if (!S_ISDIR(st.st_mode)) job->total_size += (goffset)st.st_size; job->total_ondisk_size += (st.st_blocks * 512); /* NOTE: if job->dest_dev is 0, that means our destination * folder is not on native UNIX filesystem. Hence it's not * on the same device. Our st.st_dev will always be non-zero * since our file is on a native UNIX filesystem. */ /* only descends into files on the same filesystem */ if( job->flags & FM_DC_JOB_SAME_FS ) { if( st.st_dev != job->dest_dev ) return TRUE; } /* only descends into files on the different filesystem */ else if( job->flags & FM_DC_JOB_PREPARE_MOVE ) { if( st.st_dev == job->dest_dev ) return TRUE; } } else { GError* err = g_error_new(G_IO_ERROR, g_io_error_from_errno(errno), "%s", g_strerror(errno)); FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_stat; return FALSE; } if(fm_job_is_cancelled(fmjob)) return FALSE; if( S_ISDIR(st.st_mode) ) /* if it's a dir */ { GDir* dir_ent = g_dir_open(path, 0, NULL); if(dir_ent) { const char* basename; while( !fm_job_is_cancelled(fmjob) && (basename = g_dir_read_name(dir_ent)) ) { char *sub = g_build_filename(path, basename, NULL); if(!fm_job_is_cancelled(fmjob)) { if(deep_count_posix(job, sub)) { /* for moving across different devices, an additional 'delete' * for source file is needed. so let's +1 for the delete.*/ if(job->flags & FM_DC_JOB_PREPARE_MOVE) { ++job->total_size; ++job->total_ondisk_size; ++job->count; } } } g_free(sub); } g_dir_close(dir_ent); } } return TRUE; } static gboolean deep_count_gio(FmDeepCountJob* job, GFileInfo* inf, GFile* gf) { FmJob* fmjob = FM_JOB(job); GError* err = NULL; GFileType type; const char* fs_id; gboolean descend; if(inf) g_object_ref(inf); else { _retry_query_info: inf = g_file_query_info(gf, query_str, (job->flags & FM_DC_JOB_FOLLOW_LINKS) ? 0 : G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if(!inf) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_query_info; return FALSE; } } if(fm_job_is_cancelled(fmjob)) { g_object_unref(inf); return FALSE; } type = g_file_info_get_file_type(inf); descend = TRUE; ++job->count; /* SF bug #892: dir file size is not relevant in the summary */ if (type != G_FILE_TYPE_DIRECTORY) job->total_size += g_file_info_get_size(inf); job->total_ondisk_size += g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE); /* prepare for moving across different devices */ if( job->flags & FM_DC_JOB_PREPARE_MOVE ) { fs_id = g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_ID_FILESYSTEM); if( g_strcmp0(fs_id, job->dest_fs_id) != 0 ) { /* files on different device requires an additional 'delete' for the source file. */ ++job->total_size; /* this is for the additional delete */ ++job->total_ondisk_size; ++job->count; } else descend = FALSE; } if( type == G_FILE_TYPE_DIRECTORY ) { FmPath* fm_path = fm_path_new_for_gfile(gf); /* check if we need to decends into the dir. */ /* trash:/// doesn't support deleting files recursively */ if(job->flags & FM_DC_JOB_PREPARE_DELETE && fm_path_is_trash(fm_path) && ! fm_path_is_trash_root(fm_path)) descend = FALSE; else { /* only descends into files on the same filesystem */ if( job->flags & FM_DC_JOB_SAME_FS ) { fs_id = g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_ID_FILESYSTEM); descend = (g_strcmp0(fs_id, job->dest_fs_id) == 0); } } fm_path_unref(fm_path); g_object_unref(inf); inf = NULL; if(descend) { GFileEnumerator* enu; _retry_enum_children: enu = g_file_enumerate_children(gf, query_str, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if(enu) { while( !fm_job_is_cancelled(fmjob) ) { inf = g_file_enumerator_next_file(enu, fm_job_get_cancellable(fmjob), &err); if(inf) { GFile* child = g_file_get_child(gf, g_file_info_get_name(inf)); deep_count_gio(job, inf, child); g_object_unref(child); g_object_unref(inf); inf = NULL; } else { if(err) /* error! */ { /* FM_JOB_RETRY is not supported */ /*FmJobErrorAction act = */ fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; } else { /* EOF is reached, do nothing. */ break; } } } g_file_enumerator_close(enu, NULL, NULL); g_object_unref(enu); } else { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_enum_children; } } } else g_object_unref(inf); return TRUE; } /** * fm_deep_count_job_set_dest * @dc: a job to set the destination * @dev: UNIX device ID * @fs_id: (allow-none): filesystem id in gio format * * Sets destination for the job @dc that will be used when the job is * ran with any of flags FM_DC_JOB_SAME_FS or FM_DC_JOB_PREPARE_MOVE. * If @dev is 0 (and @fs_id is NULL) then destination device is non on * native filesystem. * * Since: 0.1.0 */ void fm_deep_count_job_set_dest(FmDeepCountJob* dc, dev_t dev, const char* fs_id) { dc->dest_dev = dev; if(fs_id) dc->dest_fs_id = g_intern_string(fs_id); } libfm-1.4.0/src/job/fm-deep-count-job.h000066400000000000000000000066551475513661000175560ustar00rootroot00000000000000/* * fm-deep-count-job.h * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_DEEP_COUNT_JOB_H__ #define __FM_DEEP_COUNT_JOB_H__ #include "fm-job.h" #include "fm-path.h" #include #include G_BEGIN_DECLS #define FM_DEEP_COUNT_JOB_TYPE (fm_deep_count_job_get_type()) #define FM_DEEP_COUNT_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_DEEP_COUNT_JOB_TYPE, FmDeepCountJob)) #define FM_DEEP_COUNT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_DEEP_COUNT_JOB_TYPE, FmDeepCountJobClass)) #define FM_IS_DEEP_COUNT_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_DEEP_COUNT_JOB_TYPE)) #define FM_IS_DEEP_COUNT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_DEEP_COUNT_JOB_TYPE)) typedef struct _FmDeepCountJob FmDeepCountJob; typedef struct _FmDeepCountJobClass FmDeepCountJobClass; /** * FmDeepCountJobFlags * @FM_DC_JOB_DEFAULT: do deep count for all files/folders * @FM_DC_JOB_FOLLOW_LINKS: don't follow symlinks * @FM_DC_JOB_SAME_FS: only do deep count for files on the same devices. what's the use case of this? * @FM_DC_JOB_PREPARE_MOVE: special handling for moving files. only do deep count for files on different devices * @FM_DC_JOB_PREPARE_DELETE: special handling for deleting files */ typedef enum { FM_DC_JOB_DEFAULT = 0, FM_DC_JOB_FOLLOW_LINKS = 1<<0, FM_DC_JOB_SAME_FS = 1<<1, FM_DC_JOB_PREPARE_MOVE = 1<<2, FM_DC_JOB_PREPARE_DELETE = 1 <<3 } FmDeepCountJobFlags; /** * FmDeepCountJob * @parent: the parent object * @paths: list of paths to count * @flags: flags for counting * @total_size: counted total file size * @total_ondisk_size: counted total file size on disk * @count: number of files to be moved between devices */ struct _FmDeepCountJob { /*< public >*/ FmJob parent; FmPathList* paths; FmDeepCountJobFlags flags; goffset total_size; goffset total_ondisk_size; guint count; /*< private >*/ gpointer _reserved1; gpointer _reserved2; /* used to count total size used when moving files */ dev_t dest_dev; const char* dest_fs_id; }; struct _FmDeepCountJobClass { /*< private >*/ FmJobClass parent_class; }; GType fm_deep_count_job_get_type(void); FmDeepCountJob* fm_deep_count_job_new(FmPathList* paths, FmDeepCountJobFlags flags); /* dev is UNIX device ID. * fs_id is filesystem id in gio format (can be NULL). */ void fm_deep_count_job_set_dest(FmDeepCountJob* dc, dev_t dev, const char* fs_id); G_END_DECLS #endif /* __FM_DEEP_COUNT_JOB_H__ */ libfm-1.4.0/src/job/fm-dir-list-job.c000066400000000000000000000506361475513661000172330ustar00rootroot00000000000000/* * fm-dir-list-job.c * * Copyright 2009 PCMan * Copyright 2013-2015 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-dir-list-job * @short_description: Job to get listing of directory. * @title: FmDirListJob * * @include: libfm/fm.h * * The #FmDirListJob can be used to gather list of #FmFileInfo that some * directory contains. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-dir-list-job.h" #include #include #include #include #include "fm-mime-type.h" #include "fm-file-info-job.h" #include "glib-compat.h" #include "fm-file-info.h" enum { FILES_FOUND, N_SIGNALS }; static void fm_dir_list_job_dispose (GObject *object); G_DEFINE_TYPE(FmDirListJob, fm_dir_list_job, FM_TYPE_JOB); static int signals[N_SIGNALS]; static gboolean fm_dir_list_job_run(FmJob *job); static void fm_dir_list_job_finished(FmJob* job); static gboolean emit_found_files(gpointer user_data); static void fm_dir_list_job_class_init(FmDirListJobClass *klass) { GObjectClass *g_object_class; FmJobClass* job_class = FM_JOB_CLASS(klass); g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_dir_list_job_dispose; /* use finalize from parent class */ job_class->run = fm_dir_list_job_run; job_class->finished = fm_dir_list_job_finished; /** * FmDirListJob::files-found * @job: a job that emitted the signal * @files: (element-type FmFileInfo): #GSList of found files * * The #FmDirListJob::files-found signal is emitted for every file * found during directory listing. By default the signal is not * emitted for performance reason. This can be turned on by calling * fm_dir_list_job_set_incremental(). * * Since: 1.0.2 */ signals[FILES_FOUND] = g_signal_new("files-found", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmDirListJobClass, files_found), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); } static void fm_dir_list_job_init(FmDirListJob *job) { job->files = fm_file_info_list_new(); fm_job_init_cancellable(FM_JOB(job)); } /** * fm_dir_list_job_new * @path: path to directory to get listing * @dir_only: %TRUE to include only directories in the list * * Creates a new #FmDirListJob for directory listing. If @dir_only is * %TRUE then objects other than directories will be omitted from the * listing. * * Returns: (transfer full): a new #FmDirListJob object. * * Since: 0.1.0 * * Deprecated: 1.2.0: Use fm_dir_list_job_new2() instead. */ FmDirListJob* fm_dir_list_job_new(FmPath* path, gboolean dir_only) { FmDirListJob* job = (FmDirListJob*)g_object_new(FM_TYPE_DIR_LIST_JOB, NULL); job->dir_path = fm_path_ref(path); job->flags = dir_only ? FM_DIR_LIST_JOB_DIR_ONLY : FM_DIR_LIST_JOB_FAST; return job; } /** * fm_dir_list_job_new2 * @path: path to directory to get listing * @flags: listing output mode for new job * * Creates a new #FmDirListJob for directory listing. * * Returns: (transfer full): a new #FmDirListJob object. * * Since: 1.2.0 */ FmDirListJob *fm_dir_list_job_new2(FmPath *path, FmDirListJobFlags flags) { FmDirListJob* job = (FmDirListJob*)g_object_new(FM_TYPE_DIR_LIST_JOB, NULL); job->dir_path = fm_path_ref(path); job->flags = flags; return job; } /** * fm_dir_list_job_new_for_gfile * @gf: descriptor of directory to get listing * * Creates a new #FmDirListJob for listing of directory @gf. * * Returns: (transfer full): a new #FmDirListJob object. * * Since: 0.1.0 */ FmDirListJob* fm_dir_list_job_new_for_gfile(GFile* gf) { /* FIXME: should we cache this with hash table? Or, the cache * should be done at the level of FmFolder instead? */ FmDirListJob* job = (FmDirListJob*)g_object_new(FM_TYPE_DIR_LIST_JOB, NULL); job->dir_path = fm_path_new_for_gfile(gf); return job; } static void fm_dir_list_job_dispose(GObject *object) { FmDirListJob *job; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_DIR_LIST_JOB(object)); job = (FmDirListJob*)object; if(job->dir_path) { fm_path_unref(job->dir_path); job->dir_path = NULL; } if(job->dir_fi) { fm_file_info_unref(job->dir_fi); job->dir_fi = NULL; } if(job->files) { fm_file_info_list_unref(job->files); job->files = NULL; } if(job->delay_add_files_handler) { g_source_remove(job->delay_add_files_handler); job->delay_add_files_handler = 0; g_slist_free_full(job->files_to_add, (GDestroyNotify)fm_file_info_unref); job->files_to_add = NULL; } if (G_OBJECT_CLASS(fm_dir_list_job_parent_class)->dispose) (* G_OBJECT_CLASS(fm_dir_list_job_parent_class)->dispose)(object); } static inline FmFileInfo *_new_info_for_native_file(FmDirListJob* job, FmPath* path, const char* path_str, GError** err) { FmFileInfo *fi; if (fm_job_is_cancelled(FM_JOB(job))) return NULL; if (!(job->flags & FM_DIR_LIST_JOB_DETAILED)) return fm_file_info_new_from_native_file(path, path_str, err); fi = fm_file_info_new(); fm_file_info_set_path(fi, path); if (fm_file_info_set_from_native_file(fi, path_str, err)) return fi; fm_file_info_unref(fi); return NULL; } static gboolean fm_dir_list_job_run_posix(FmDirListJob* job) { FmJob* fmjob = FM_JOB(job); FmFileInfo* fi; GError *err = NULL; char* path_str; GDir* dir; path_str = fm_path_to_str(job->dir_path); fi = _new_info_for_native_file(job, job->dir_path, path_str, NULL); if(fi) { if(! fm_file_info_is_dir(fi)) { err = g_error_new(G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY, _("The specified directory '%s' is not valid"), path_str); fm_file_info_unref(fi); fm_job_emit_error(fmjob, err, FM_JOB_ERROR_CRITICAL); g_error_free(err); g_free(path_str); return FALSE; } job->dir_fi = fi; } else { err = g_error_new(G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY, _("The specified directory '%s' is not valid"), path_str); fm_job_emit_error(fmjob, err, FM_JOB_ERROR_CRITICAL); g_error_free(err); g_free(path_str); return FALSE; } dir = g_dir_open(path_str, 0, &err); if( dir ) { const char* name; GString* fpath = g_string_sized_new(4096); int dir_len = strlen(path_str); g_string_append_len(fpath, path_str, dir_len); if(fpath->str[dir_len-1] != '/') { g_string_append_c(fpath, '/'); ++dir_len; } while( ! fm_job_is_cancelled(fmjob) && (name = g_dir_read_name(dir)) ) { FmPath* new_path; g_string_truncate(fpath, dir_len); g_string_append(fpath, name); if(job->flags & FM_DIR_LIST_JOB_DIR_ONLY) /* if we only want directories */ { struct stat st; /* FIXME: this results in an additional stat() call, which is inefficient */ if(stat(fpath->str, &st) == -1 || !S_ISDIR(st.st_mode)) continue; } new_path = fm_path_new_child(job->dir_path, name); _retry: fi = _new_info_for_native_file(job, new_path, fpath->str, &err); if (fi == NULL && !fm_job_is_cancelled(fmjob)) /* we got a damaged file */ { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); GFile *gf; GFileInfo *inf; gchar *disp_basename; g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry; /* bug #3615271: Damaged mountpoint isn't shown let make a simple file info then */ inf = g_file_info_new(); gf = fm_path_to_gfile(new_path); g_file_info_set_file_type(inf, G_FILE_TYPE_UNKNOWN); g_file_info_set_name(inf, name); disp_basename = g_filename_display_basename(fpath->str); g_file_info_set_display_name(inf, disp_basename); g_free(disp_basename); g_file_info_set_content_type(inf, "inode/x-corrupted"); fi = fm_file_info_new_from_g_file_data(gf, inf, new_path); g_object_unref(inf); g_object_unref(gf); } fm_dir_list_job_add_found_file(job, fi); fm_file_info_unref(fi); fm_path_unref(new_path); } g_string_free(fpath, TRUE); g_dir_close(dir); } else { fm_job_emit_error(fmjob, err, FM_JOB_ERROR_CRITICAL); g_error_free(err); } g_free(path_str); return TRUE; } static gboolean fm_dir_list_job_run_gio(FmDirListJob* job) { GFileEnumerator *enu; GFileInfo *inf; FmFileInfo* fi; GError *err = NULL; FmJob* fmjob = FM_JOB(job); GFile* gf; const char* query; gf = fm_path_to_gfile(job->dir_path); _retry: inf = g_file_query_info(gf, gfile_info_query_attribs, 0, fm_job_get_cancellable(fmjob), &err); if(!inf ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); if( act == FM_JOB_RETRY ) { err = NULL; goto _retry; } else { g_object_unref(gf); return FALSE; } } if( g_file_info_get_file_type(inf) != G_FILE_TYPE_DIRECTORY) { char *path_str = fm_path_to_str(job->dir_path); err = g_error_new(G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY, _("The specified directory '%s' is not valid"), path_str); fm_job_emit_error(fmjob, err, FM_JOB_ERROR_CRITICAL); g_free(path_str); g_error_free(err); g_object_unref(gf); g_object_unref(inf); return FALSE; } /* check if FS is R/O and set attr. into inf */ _fm_file_info_job_update_fs_readonly(gf, inf, NULL, NULL); job->dir_fi = fm_file_info_new_from_g_file_data(gf, inf, job->dir_path); g_object_unref(inf); if(G_UNLIKELY(job->flags & FM_DIR_LIST_JOB_DIR_ONLY)) { query = G_FILE_ATTRIBUTE_STANDARD_TYPE","G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN","G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP"," G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK","G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL"," G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME","G_FILE_ATTRIBUTE_STANDARD_ICON"," G_FILE_ATTRIBUTE_STANDARD_SIZE","G_FILE_ATTRIBUTE_STANDARD_TARGET_URI"," "unix::*,time::*,access::*,id::filesystem"; } else query = gfile_info_query_attribs; enu = g_file_enumerate_children (gf, query, 0, fm_job_get_cancellable(fmjob), &err); g_object_unref(gf); if(enu) { while( ! fm_job_is_cancelled(fmjob) ) { inf = g_file_enumerator_next_file(enu, fm_job_get_cancellable(fmjob), &err); if(inf) { FmPath *dir, *sub; GFile *child; if(G_UNLIKELY(job->flags & FM_DIR_LIST_JOB_DIR_ONLY)) { /* FIXME: handle symlinks */ if(g_file_info_get_file_type(inf) != G_FILE_TYPE_DIRECTORY) { g_object_unref(inf); continue; } } /* virtual folders may return children not within them */ dir = fm_path_new_for_gfile(g_file_enumerator_get_container(enu)); if (fm_path_equal(job->dir_path, dir)) sub = fm_path_new_child(job->dir_path, g_file_info_get_name(inf)); else sub = fm_path_new_child(dir, g_file_info_get_name(inf)); child = g_file_get_child(g_file_enumerator_get_container(enu), g_file_info_get_name(inf)); if (g_file_info_get_file_type(inf) == G_FILE_TYPE_DIRECTORY) /* for dir: check if its FS is R/O and set attr. into inf */ _fm_file_info_job_update_fs_readonly(child, inf, NULL, NULL); fi = fm_file_info_new_from_g_file_data(child, inf, sub); fm_path_unref(sub); fm_path_unref(dir); g_object_unref(child); fm_dir_list_job_add_found_file(job, fi); fm_file_info_unref(fi); } else { if(err) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); /* FM_JOB_RETRY is not supported. */ if(act == FM_JOB_ABORT) fm_job_cancel(fmjob); } /* otherwise it's EOL */ break; } g_object_unref(inf); } g_file_enumerator_close(enu, NULL, &err); g_object_unref(enu); } else { fm_job_emit_error(fmjob, err, FM_JOB_ERROR_CRITICAL); g_error_free(err); return FALSE; } return TRUE; } static gboolean fm_dir_list_job_run(FmJob* fmjob) { gboolean ret; FmDirListJob* job = FM_DIR_LIST_JOB(fmjob); g_return_val_if_fail(job->dir_path != NULL, FALSE); if(fm_path_is_native(job->dir_path)) /* if this is a native file on real file system */ ret = fm_dir_list_job_run_posix(job); else /* this is a virtual path or remote file system path */ ret = fm_dir_list_job_run_gio(job); return ret; } static void fm_dir_list_job_finished(FmJob* job) { FmDirListJob* dirlist_job = FM_DIR_LIST_JOB(job); FmJobClass* job_class = FM_JOB_CLASS(fm_dir_list_job_parent_class); if(dirlist_job->emit_files_found) { if(dirlist_job->delay_add_files_handler) { g_source_remove(dirlist_job->delay_add_files_handler); emit_found_files(dirlist_job); } } if(job_class->finished) job_class->finished(job); } #if 0 /** * fm_dir_list_job_get_dir_path * @job: the job that collected listing * * Retrieves the path of the directory being listed. * * Returns: (transfer none): FmPath for the directory. * * Since: 1.0.2 */ FmPath* fm_dir_list_job_get_dir_path(FmDirListJob* job) { return job->dir_path; } /** * fm_dir_list_job_get_dir_info * @job: the job that collected listing * * Retrieves the information of the directory being listed. * * Returns: (transfer none): FmFileInfo for the directory. * * Since: 1.0.2 */ FmFileInfo* fm_dir_list_job_get_dir_info(FmDirListJob* job) { return job->dir_fi; } #endif /** * fm_dir_list_job_get_files * @job: the job that collected listing * * Retrieves gathered listing from the @job. This function may be called * only from #FmJob::finished signal handler. Returned data is owned by * the @job and should be not freed by caller. * * Before 1.0.1 this call had name fm_dir_dist_job_get_files due to typo. * * Returns: (transfer none): list of gathered data. * * Since: 0.1.0 */ FmFileInfoList* fm_dir_list_job_get_files(FmDirListJob* job) { return job->files; } #ifndef FM_DISABLE_DEPRECATED /** * fm_dir_dist_job_get_files * @job: the job that collected listing * * There is a typo in the function name. It should have been * fm_dir_list_job_get_files(). The one with typo is kept here for backward * compatibility and will be removed later. * * Since: 0.1.0 * * Deprecated: 1.0.1: Use fm_dir_list_job_get_files() instead. */ FmFileInfoList* fm_dir_dist_job_get_files(FmDirListJob* job) { return fm_dir_list_job_get_files(job); } #endif /* FM_DISABLE_DEPRECATED */ static gboolean emit_found_files(gpointer user_data) { /* this callback is called from the main thread */ FmDirListJob* job = FM_DIR_LIST_JOB(user_data); /* g_print("emit_found_files: %d\n", g_slist_length(job->files_to_add)); */ if(g_source_is_destroyed(g_main_current_source())) return FALSE; g_signal_emit(job, signals[FILES_FOUND], 0, job->files_to_add); g_slist_free_full(job->files_to_add, (GDestroyNotify)fm_file_info_unref); job->files_to_add = NULL; job->delay_add_files_handler = 0; return FALSE; } static gpointer queue_add_file(FmJob* fmjob, gpointer user_data) { FmDirListJob* job = FM_DIR_LIST_JOB(fmjob); FmFileInfo* file = FM_FILE_INFO(user_data); /* this callback is called from the main thread */ /* g_print("queue_add_file: %s\n", fm_file_info_get_disp_name(file)); */ job->files_to_add = g_slist_prepend(job->files_to_add, fm_file_info_ref(file)); if(job->delay_add_files_handler == 0) job->delay_add_files_handler = g_timeout_add_seconds_full(G_PRIORITY_LOW, 1, emit_found_files, g_object_ref(job), g_object_unref); return NULL; } /** * fm_dir_list_job_add_found_file * @job: the job that collected listing * @file: a FmFileInfo of the newly found file * * This API may be called by the classes derived of FmDirListJob only. * Application developers should not use this API. * When a new file is found in the dir being listed, implementations * of FmDirListJob should call this API with the info of the newly found * file. The FmFileInfo will be added to the found file list. * * If emission of the #FmDirListJob::files-found signal is turned on by * fm_dir_list_job_set_incremental(), the signal will be emitted * for the newly found files after several new files are added. * See the document for the signal for more detail. * * Since: 1.0.2 */ void fm_dir_list_job_add_found_file(FmDirListJob* job, FmFileInfo* file) { fm_file_info_list_push_tail(job->files, file); if(G_UNLIKELY(job->emit_files_found)) fm_job_call_main_thread(FM_JOB(job), queue_add_file, file); } #if 0 /** * fm_dir_list_job_set_dir_path * @job: the job that collected listing * @path: a FmPath of the directory being loaded. * * This API is called by the implementation of FmDirListJob only. * Application developers should not use this API most of the time. * * Since: 1.0.2 */ void fm_dir_list_job_set_dir_path(FmDirListJob* job, FmPath* path) { if(job->dir_path) fm_path_unref(job->dir_path); job->dir_path = fm_path_ref(path); } /** * fm_dir_list_job_set_dir_info * @job: the job that collected listing * @info: a FmFileInfo of the directory being loaded. * * This API is called by the implementation of FmDirListJob only. * Application developers should not use this API most of the time. * * Since: 1.0.2 */ void fm_dir_list_job_set_dir_info(FmDirListJob* job, FmFileInfo* info) { if(job->dir_fi) fm_file_info_unref(job->dir_fi); job->dir_fi = fm_file_info_ref(info); } #endif /** * fm_dir_list_job_set_incremental * @job: the job descriptor * @set: %TRUE if job should send the #FmDirListJob::files-found signal * * Sets whether @job should send the #FmDirListJob::files-found signal * on found files before the @job is finished or not. * This should only be called before the @job is launched. * * Since: 1.0.2 */ void fm_dir_list_job_set_incremental(FmDirListJob* job, gboolean set) { job->emit_files_found = set; } libfm-1.4.0/src/job/fm-dir-list-job.h000066400000000000000000000073031475513661000172310ustar00rootroot00000000000000/* * fm-dir-list-job.h * * Copyright 2009 PCMan * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_DIR_LIST_JOB_H__ #define __FM_DIR_LIST_JOB_H__ #include "fm-job.h" #include "fm-path.h" #include "fm-file-info.h" G_BEGIN_DECLS #define FM_TYPE_DIR_LIST_JOB (fm_dir_list_job_get_type()) #define FM_DIR_LIST_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_DIR_LIST_JOB, FmDirListJob)) #define FM_DIR_LIST_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_DIR_LIST_JOB, FmDirListJobClass)) #define FM_IS_DIR_LIST_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_DIR_LIST_JOB)) #define FM_IS_DIR_LIST_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_DIR_LIST_JOB)) /** * FmDirListJobFlags: * @FM_DIR_LIST_JOB_FAST: default listing mode with minimized I/O * @FM_DIR_LIST_JOB_DIR_ONLY: skip non-directories in output * @FM_DIR_LIST_JOB_DETAILED: listing with test files content types */ typedef enum { FM_DIR_LIST_JOB_FAST = 0, FM_DIR_LIST_JOB_DIR_ONLY = 1 << 0, FM_DIR_LIST_JOB_DETAILED = 1 << 1 } FmDirListJobFlags; typedef struct _FmDirListJob FmDirListJob; typedef struct _FmDirListJobClass FmDirListJobClass; /** * FmDirListJob * @parent: the parent object * @dir_path: directory to get listing * @flags: flags for the job * @dir_fi: file info of the directory * @files: the listing of the directory */ struct _FmDirListJob { /* FIXME: should seal this all */ /*< public >*/ FmJob parent; FmPath* dir_path; FmDirListJobFlags flags; FmFileInfo* dir_fi; FmFileInfoList* files; /*< private >*/ gboolean emit_files_found; guint delay_add_files_handler; GSList* files_to_add; }; struct _FmDirListJobClass { /*< private >*/ FmJobClass parent_class; /* signals */ void (*files_found)(FmDirListJob* job, GSList* files); }; GType fm_dir_list_job_get_type(void); #ifndef FM_DISABLE_DEPRECATED FmDirListJob* fm_dir_list_job_new(FmPath* path, gboolean dir_only); #endif FmDirListJob *fm_dir_list_job_new2(FmPath *path, FmDirListJobFlags flags); FmDirListJob* fm_dir_list_job_new_for_gfile(GFile* gf); FmFileInfoList* fm_dir_list_job_get_files(FmDirListJob* job); void fm_dir_list_job_set_incremental(FmDirListJob* job, gboolean set); /* FmPath* fm_dir_list_job_get_dir_path(FmDirListJob* job); FmFileInfo* fm_dir_list_job_get_dir_info(FmDirListJob* job); void fm_dir_list_job_set_dir_path(FmDirListJob* job, FmPath* path); void fm_dir_list_job_set_dir_info(FmDirListJob* job, FmFileInfo* info); void fm_dir_list_job_set_emit_files_found(FmDirListJob* job, gboolean emit_files_found); gboolean fm_dir_list_job_get_emit_files_found(FmDirListJob* job); */ void fm_dir_list_job_add_found_file(FmDirListJob* job, FmFileInfo* file); G_END_DECLS #endif /* __FM-DIR-LIST-JOB_H__ */ libfm-1.4.0/src/job/fm-file-info-job.c000066400000000000000000000250421475513661000173450ustar00rootroot00000000000000/* * fm-file-info-job.c * * Copyright 2009 PCMan * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-file-info-job * @short_description: Job to gather information about files. * @title: FmFileInfoJob * * @include: libfm/fm.h * * The #FmFileInfoJob can be used to get filled #FmFileInfo for some files. */ #include "fm-file-info-job.h" #include #include #include #include #include #include "fm-file-info.h" static void fm_file_info_job_dispose (GObject *object); static gboolean fm_file_info_job_run(FmJob* fmjob); const char gfile_info_query_attribs[]="standard::*,unix::*,time::*,access::*,id::filesystem,metadata::emblems"; enum { GOT_INFO, N_SIGNALS }; static int signals[N_SIGNALS]; G_DEFINE_TYPE(FmFileInfoJob, fm_file_info_job, FM_TYPE_JOB); static void fm_file_info_job_class_init(FmFileInfoJobClass *klass) { GObjectClass *g_object_class; FmJobClass* job_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_file_info_job_dispose; /* use finalize from parent class */ job_class = FM_JOB_CLASS(klass); job_class->run = fm_file_info_job_run; /** * FmDirInfoJob::got-info * @job: a job that emitted the signal * @info: #FmFileInfo of file which info is completed * * The #FmDirInfoJob::got-info signal is emitted for every file info * during a job with FM_FILE_INFO_JOB_EMIT_FOR_EACH_FILE flag set. * This signal may be emitted only if info retrieving was successful. * * Since: 1.2.0 */ signals[GOT_INFO] = g_signal_new("got-info", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(FmFileInfoJobClass, got_info), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); } static void fm_file_info_job_dispose(GObject *object) { FmFileInfoJob *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_FILE_INFO_JOB(object)); self = (FmFileInfoJob*)object; if(self->file_infos) { fm_file_info_list_unref(self->file_infos); self->file_infos = NULL; } if(self->current) { fm_path_unref(self->current); self->current = NULL; } G_OBJECT_CLASS(fm_file_info_job_parent_class)->dispose(object); } static void fm_file_info_job_init(FmFileInfoJob *self) { self->file_infos = fm_file_info_list_new(); fm_job_init_cancellable(FM_JOB(self)); } /** * fm_file_info_job_new * @files_to_query: (allow-none): list of paths to query informatiom * @flags: modificators of query mode * * Creates a new #FmFileInfoJob which can be used by #FmJob API. * * Returns: (transfer full): a new #FmFileInfoJob object. * * Since: 0.1.0 */ FmFileInfoJob* fm_file_info_job_new(FmPathList* files_to_query, FmFileInfoJobFlags flags) { GList* l; FmFileInfoJob* job = (FmFileInfoJob*)g_object_new(FM_TYPE_FILE_INFO_JOB, NULL); FmFileInfoList* file_infos; job->flags = flags; if(files_to_query) { file_infos = job->file_infos; for(l = fm_path_list_peek_head_link(files_to_query);l;l=l->next) { FmPath* path = FM_PATH(l->data); FmFileInfo* fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_file_info_list_push_tail_noref(file_infos, fi); } } return job; } static void _check_native_display_names(FmPath *path) { char *path_str, *disp_name; if (path == NULL || _fm_path_get_display_name(path) != NULL) return; /* all done */ path_str = fm_path_to_str(path); disp_name = g_filename_display_basename(path_str); g_free(path_str); _fm_path_set_display_name(path, disp_name); g_free(disp_name); _check_native_display_names(fm_path_get_parent(path)); /* recursion */ } static void _check_gfile_display_names(FmPath *path, GFile *child) { GFile *gf; GFileInfo *inf; if (path == NULL || _fm_path_get_display_name(path) != NULL) return; /* all done */ gf = g_file_get_parent(child); if (gf == NULL) /* file systems such as search:// don't support this */ return; inf = g_file_query_info(gf, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME"," G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL); if (inf != NULL) { const char *dname = g_file_info_get_edit_name(inf); if (!dname || strcmp(dname, "/") == 0) dname = g_file_info_get_display_name(inf); _fm_path_set_display_name(path, dname); g_object_unref(inf); } _check_gfile_display_names(fm_path_get_parent(path), gf); /* recursion */ g_object_unref(gf); } static gpointer _emit_current_file(FmJob* job, gpointer user_data) { /* this callback is called from the main thread */ g_signal_emit(job, signals[GOT_INFO], 0, user_data); return NULL; } static gboolean fm_file_info_job_run(FmJob* fmjob) { GList* l; FmFileInfoJob* job = (FmFileInfoJob*)fmjob; GError* err = NULL; if(job->file_infos == NULL) return FALSE; for(l = fm_file_info_list_peek_head_link(job->file_infos); !fm_job_is_cancelled(fmjob) && l;) { FmFileInfo* fi = (FmFileInfo*)l->data; GList* next = l->next; FmPath* path = fm_file_info_get_path(fi); if(job->current) fm_path_unref(job->current); job->current = fm_path_ref(path); if(fm_path_is_native(path)) { char* path_str = fm_path_to_str(path); if(!_fm_file_info_job_get_info_for_native_file(fmjob, fi, path_str, &err)) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) { g_free(path_str); continue; /* retry */ } fm_file_info_list_delete_link(job->file_infos, l); /* also calls unref */ } else if(G_UNLIKELY(job->flags & FM_FILE_INFO_JOB_EMIT_FOR_EACH_FILE)) fm_job_call_main_thread(fmjob, _emit_current_file, fi); g_free(path_str); /* recursively set display names for path parents */ _check_native_display_names(fm_path_get_parent(path)); } else { GFile* gf; gf = fm_path_to_gfile(path); if(!_fm_file_info_job_get_info_for_gfile(fmjob, fi, gf, &err)) { if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_NOT_MOUNTED) { GFileInfo *inf; /* location by link isn't mounted; unfortunately we cannot launch a target if we don't know what kind of target we have; lets make a simplest directory-kind GFIleInfo */ /* FIXME: this may be dirty a bit */ g_error_free(err); err = NULL; inf = g_file_info_new(); g_file_info_set_file_type(inf, G_FILE_TYPE_DIRECTORY); g_file_info_set_name(inf, fm_path_get_basename(path)); g_file_info_set_display_name(inf, fm_path_get_basename(path)); fm_file_info_set_from_g_file_data(fi, gf, inf); g_object_unref(inf); } else { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) { g_object_unref(gf); continue; /* retry */ } fm_file_info_list_delete_link(job->file_infos, l); /* also calls unref */ goto _next; } } else if(G_UNLIKELY(job->flags & FM_FILE_INFO_JOB_EMIT_FOR_EACH_FILE)) fm_job_call_main_thread(fmjob, _emit_current_file, fi); /* recursively set display names for path parents */ _check_gfile_display_names(fm_path_get_parent(path), gf); _next: g_object_unref(gf); } l = next; } return TRUE; } /** * fm_file_info_job_add * @job: a job to add file * @path: a path to add to query list * * Adds a @path to query list for the @job. * * This API may only be called before starting the @job. * * Since: 0.1.0 */ void fm_file_info_job_add(FmFileInfoJob* job, FmPath* path) { FmFileInfo* fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_file_info_list_push_tail_noref(job->file_infos, fi); } /** * fm_file_info_job_add_gfile * @job: a job to add file * @gf: a file descriptor to add to query list * * Adds a path @gf to query list for the @job. * * This API may only be called before starting the @job. * * Since: 0.1.0 */ void fm_file_info_job_add_gfile(FmFileInfoJob* job, GFile* gf) { FmPath* path = fm_path_new_for_gfile(gf); FmFileInfo* fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_path_unref(path); fm_file_info_list_push_tail_noref(job->file_infos, fi); } /** * fm_file_info_job_get_current * @job: the job to inspect * * Retrieves current the #FmPath which caused the error. * Returned data are owned by @job and shouldn't be freed by caller. * * This API may only be called in error handler. * * Returns: (transfer none): the current processing file path. * * Since: 0.1.10 */ FmPath* fm_file_info_job_get_current(FmFileInfoJob* job) { return job->current; } libfm-1.4.0/src/job/fm-file-info-job.h000066400000000000000000000113551475513661000173540ustar00rootroot00000000000000/* * fm-file-info-job.h * * Copyright 2009 PCMan * Copyright 2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_INFO_JOB_H__ #define __FM_FILE_INFO_JOB_H__ #include "fm-job.h" #include "fm-file-info.h" G_BEGIN_DECLS #define FM_TYPE_FILE_INFO_JOB (fm_file_info_job_get_type()) #define FM_FILE_INFO_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_FILE_INFO_JOB, FmFileInfoJob)) #define FM_FILE_INFO_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_FILE_INFO_JOB, FmFileInfoJobClass)) #define FM_IS_FILE_INFO_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_FILE_INFO_JOB)) #define FM_IS_FILE_INFO_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_FILE_INFO_JOB)) typedef struct _FmFileInfoJob FmFileInfoJob; typedef struct _FmFileInfoJobClass FmFileInfoJobClass; /** * FmFileInfoJobFlags: * @FM_FILE_INFO_JOB_NONE: default * @FM_FILE_INFO_JOB_FOLLOW_SYMLINK: not yet implemented * @FM_FILE_INFO_JOB_EMIT_FOR_EACH_FILE: emit #FmFileInfoJob::got-info for each file */ typedef enum { FM_FILE_INFO_JOB_NONE = 0, FM_FILE_INFO_JOB_FOLLOW_SYMLINK = 1 << 0, /* FIXME: not yet implemented */ FM_FILE_INFO_JOB_EMIT_FOR_EACH_FILE = 1 << 1 } FmFileInfoJobFlags; /** * FmFileInfoJob * @parent: the parent object * @flags: flags for the job * @file_infos: gathered data */ struct _FmFileInfoJob { /*< public >*/ FmJob parent; FmFileInfoJobFlags flags; FmFileInfoList* file_infos; /*< private >*/ FmPath* current; }; /** * FmFileInfoJobClass: * @got_info: the class closure for the #FmFileInfoJob::got-info signal. */ struct _FmFileInfoJobClass { /*< private >*/ FmJobClass parent_class; /*< public >*/ void (*got_info)(FmFileInfoJob *job, FmFileInfo *info); /*< private >*/ gpointer _reserved1; }; GType fm_file_info_job_get_type(void); FmFileInfoJob* fm_file_info_job_new(FmPathList* files_to_query, FmFileInfoJobFlags flags); /* this can only be called before running the job. */ void fm_file_info_job_add(FmFileInfoJob* job, FmPath* path); void fm_file_info_job_add_gfile(FmFileInfoJob* job, GFile* gf); /* This API should only be called in error handler */ FmPath* fm_file_info_job_get_current(FmFileInfoJob* job); #ifndef __GTK_DOC_IGNORE__ /* useful inline routines for FmJob classes */ static inline gboolean _fm_file_info_job_get_info_for_native_file(FmJob* job, FmFileInfo* fi, const char* path, GError** err) { if( ! fm_job_is_cancelled(job) ) return fm_file_info_set_from_native_file(fi, path, err); return TRUE; } extern const char gfile_info_query_attribs[]; static inline gboolean _fm_file_info_job_update_fs_readonly(GFile *gf, GFileInfo *inf, GCancellable *cancellable, GError **error) { /* check if FS is R/O and set attr. into inf */ GFileInfo *fs_inf = g_file_query_filesystem_info(gf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, cancellable, error); if (fs_inf) { if (g_file_info_has_attribute(fs_inf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY)) g_file_info_set_attribute_boolean(inf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, g_file_info_get_attribute_boolean(fs_inf, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY)); g_object_unref(fs_inf); return TRUE; } return FALSE; } static inline gboolean _fm_file_info_job_get_info_for_gfile(FmJob* job, FmFileInfo* fi, GFile* gf, GError** err) { GFileInfo *inf; inf = g_file_query_info(gf, gfile_info_query_attribs, (GFileQueryInfoFlags)0, fm_job_get_cancellable(job), err); if( !inf ) return FALSE; _fm_file_info_job_update_fs_readonly(gf, inf, NULL, NULL); fm_file_info_set_from_g_file_data(fi, gf, inf); g_object_unref(inf); return TRUE; } #endif /* __GTK_DOC_IGNORE__ */ G_END_DECLS #endif /* __FM_FILE_INFO_JOB_H__ */ libfm-1.4.0/src/job/fm-file-ops-job-change-attr.c000066400000000000000000000270321475513661000214070ustar00rootroot00000000000000/* * fm-file-ops-job-change-attr.c * * Copyright 2009 PCMan * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm-file-ops-job-change-attr.h" #include "fm-folder.h" static const char query[] = G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_UNIX_GID"," G_FILE_ATTRIBUTE_UNIX_UID"," G_FILE_ATTRIBUTE_UNIX_MODE"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME; static gboolean _fm_file_ops_job_change_attr_file(FmFileOpsJob* job, GFile* gf, GFileInfo* inf, FmFolder *folder) { GError* err = NULL; FmJob* fmjob = FM_JOB(job); GCancellable* cancellable = fm_job_get_cancellable(fmjob); FmPath *path; GFileType type; gboolean ret = TRUE; gboolean changed = FALSE; if( !inf) { _retry_query_info: inf = g_file_query_info(gf, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err); if(!inf) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_query_info; } } else g_object_ref(inf); type = g_file_info_get_file_type(inf); /* change owner */ if( !fm_job_is_cancelled(fmjob) && job->uid != -1 ) { _retry_change_owner: if(!g_file_set_attribute_uint32(gf, G_FILE_ATTRIBUTE_UNIX_UID, job->uid, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err) ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_change_owner; } else changed = TRUE; } /* change group */ if( !fm_job_is_cancelled(fmjob) && job->gid != -1 ) { _retry_change_group: if(!g_file_set_attribute_uint32(gf, G_FILE_ATTRIBUTE_UNIX_GID, job->gid, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err) ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_change_group; } else changed = TRUE; } /* change mode */ if( !fm_job_is_cancelled(fmjob) && job->new_mode_mask ) { guint32 mode = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_MODE); mode &= ~job->new_mode_mask; mode |= (job->new_mode & job->new_mode_mask); /* FIXME: this behavior should be optional. */ /* treat dirs with 'r' as 'rx' */ if(type == G_FILE_TYPE_DIRECTORY) { if((job->new_mode_mask & S_IRUSR) && (mode & S_IRUSR)) mode |= S_IXUSR; if((job->new_mode_mask & S_IRGRP) && (mode & S_IRGRP)) mode |= S_IXGRP; if((job->new_mode_mask & S_IROTH) && (mode & S_IROTH)) mode |= S_IXOTH; } /* new mode */ _retry_chmod: if( !g_file_set_attribute_uint32(gf, G_FILE_ATTRIBUTE_UNIX_MODE, mode, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err) ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_chmod; } else changed = TRUE; } /* change display name, icon, hidden, target */ if (!fm_job_is_cancelled(fmjob) && job->display_name) { GFile *renamed; _retry_disp_name: renamed = g_file_set_display_name(gf, job->display_name, cancellable, &err); if (renamed == NULL) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_clear_error(&err); if(act == FM_JOB_RETRY) goto _retry_disp_name; } else { g_object_unref(renamed); changed = TRUE; } } if (!fm_job_is_cancelled(fmjob) && job->icon) { _retry_change_icon: if (!g_file_set_attribute(gf, G_FILE_ATTRIBUTE_STANDARD_ICON, G_FILE_ATTRIBUTE_TYPE_OBJECT, job->icon, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err)) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_clear_error(&err); if(act == FM_JOB_RETRY) goto _retry_change_icon; } else changed = TRUE; } if (!fm_job_is_cancelled(fmjob) && job->set_hidden >= 0) { gboolean hidden = job->set_hidden > 0; _retry_change_hidden: if (!g_file_set_attribute(gf, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN, G_FILE_ATTRIBUTE_TYPE_BOOLEAN, &hidden, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err)) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_clear_error(&err); if(act == FM_JOB_RETRY) goto _retry_change_hidden; } else changed = TRUE; } if (!fm_job_is_cancelled(fmjob) && job->target) { _retry_change_target: if (!g_file_set_attribute_string(gf, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, job->target, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err)) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_clear_error(&err); if(act == FM_JOB_RETRY) goto _retry_change_target; } else changed = TRUE; } /* currently processed file. */ if(inf) { fm_file_ops_job_emit_cur_file(job, g_file_info_get_display_name(inf)); g_object_unref(inf); inf = NULL; } else { char* basename = g_file_get_basename(gf); char* disp = basename ? g_filename_display_name(basename) : NULL; /* FIXME: translate it */ fm_file_ops_job_emit_cur_file(job, disp ? disp : "(invalid file)"); g_free(disp); g_free(basename); } ++job->finished; fm_file_ops_job_emit_percent(job); path = fm_path_new_for_gfile(gf); if( !fm_job_is_cancelled(fmjob) && job->recursive && type == G_FILE_TYPE_DIRECTORY) { GFileEnumerator* enu; FmFolder *sub_folder; _retry_enum_children: enu = g_file_enumerate_children(gf, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, &err); if(!enu) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_enum_children; fm_path_unref(path); return FALSE; } sub_folder = fm_folder_find_by_path(path); while( ! fm_job_is_cancelled(fmjob) ) { inf = g_file_enumerator_next_file(enu, cancellable, &err); if(inf) { GFile* sub = g_file_get_child(gf, g_file_info_get_name(inf)); ret = _fm_file_ops_job_change_attr_file(job, sub, inf, sub_folder); g_object_unref(sub); g_object_unref(inf); if(!ret) /* _fm_file_ops_job_change_attr_file() failed */ break; } else { if(err) { fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD); g_error_free(err); err = NULL; /* FM_JOB_RETRY is not supported here */ } else /* EOF */ break; } } g_object_unref(enu); if (sub_folder) g_object_unref(sub_folder); if(!folder || !_fm_folder_event_file_changed(folder, path)) fm_path_unref(path); } else if (!changed || !folder || !_fm_folder_event_file_changed(folder, path)) fm_path_unref(path); return ret; } gboolean _fm_file_ops_job_change_attr_run(FmFileOpsJob* job) { GList* l; /* prepare the job, count total work needed with FmDeepCountJob */ if(job->recursive) { FmDeepCountJob* dc = fm_deep_count_job_new(job->srcs, FM_DC_JOB_DEFAULT); fm_job_run_sync(FM_JOB(dc)); job->total = dc->count; g_object_unref(dc); } else job->total = fm_path_list_get_length(job->srcs); g_debug("total number of files to change attribute: %llu", (long long unsigned int)job->total); fm_file_ops_job_emit_prepared(job); l = fm_path_list_peek_head_link(job->srcs); /* check if we trying to set display name for more than one file and fail */ if (!fm_job_is_cancelled(FM_JOB(job)) && l->next && (job->display_name || job->target)) { GError *error; if (job->display_name) error = g_error_new(G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("Setting display name can be done only for single file")); else error = g_error_new(G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("Setting target can be done only for single file")); fm_job_emit_error(FM_JOB(job), error, FM_JOB_ERROR_CRITICAL); g_error_free(error); return FALSE; } for(; ! fm_job_is_cancelled(FM_JOB(job)) && l;l=l->next) { gboolean ret; GFile* src = fm_path_to_gfile(FM_PATH(l->data)); FmFolder *folder = fm_folder_find_by_path(l->data); ret = _fm_file_ops_job_change_attr_file(job, src, NULL, folder); g_object_unref(src); if (folder) g_object_unref(folder); if(!ret) /* error! */ return FALSE; } return TRUE; } libfm-1.4.0/src/job/fm-file-ops-job-change-attr.h000066400000000000000000000024741475513661000214170ustar00rootroot00000000000000/* * fm-file-ops-job-change-attr.h * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_OPS_JOB_CHANGE_ATTR_H__ #define __FM_FILE_OPS_JOB_CHANGE_ATTR_H__ #include #include #include "fm-file-ops-job.h" G_BEGIN_DECLS /* gboolean _fm_file_ops_job_change_attr_file(FmFileOpsJob* job, GFile* gf, GFileInfo* inf); */ gboolean _fm_file_ops_job_change_attr_run(FmFileOpsJob* job); G_END_DECLS #endif /* __FM_FILE_OPS_JOB_CHANGE_ATTR_H__ */ libfm-1.4.0/src/job/fm-file-ops-job-delete.c000066400000000000000000000444331475513661000204600ustar00rootroot00000000000000/* * fm-file-ops-job-delete.c * * Copyright 2009 Hong Jen Yee (PCMan) * Copyright 2012-2016 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-file-ops-job-delete.h" #include "fm-file-ops-job-xfer.h" #include "fm-config.h" #include "fm-file.h" #include static const char query[] = G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME; gboolean _fm_file_ops_job_delete_file(FmJob* job, GFile* gf, GFileInfo* inf, FmFolder *folder, gboolean only_empty) { GError* err = NULL; FmFileOpsJob* fjob = FM_FILE_OPS_JOB(job); gboolean is_dir, is_trash_root = FALSE, ok; GFileInfo* _inf = NULL; FmPath *path; FmJobErrorAction act; while(!inf) { _inf = inf = g_file_query_info(gf, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(job), &err); if(_inf) break; act = fm_job_emit_error(job, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_ABORT) return FALSE; if(act != FM_JOB_RETRY) break; } if(!inf) { /* use basename of GFile as display name. */ char* basename = g_file_get_basename(gf); char* disp = basename ? g_filename_display_name(basename) : NULL; g_free(basename); /* FIXME: translate it */ fm_file_ops_job_emit_cur_file(fjob, disp ? disp : "(invalid file)"); g_free(disp); ++fjob->finished; return FALSE; } /* currently processed file. */ fm_file_ops_job_emit_cur_file(fjob, g_file_info_get_display_name(inf)); /* show progress */ ++fjob->finished; fm_file_ops_job_emit_percent(fjob); is_dir = (g_file_info_get_file_type(inf)==G_FILE_TYPE_DIRECTORY); if(_inf) g_object_unref(_inf); if( fm_job_is_cancelled(job) ) return FALSE; if(is_dir) { /* special handling for trash:/// */ if(!g_file_is_native(gf)) { char* scheme = g_file_get_uri_scheme(gf); if(g_strcmp0(scheme, "trash") == 0) { /* little trick: basename of trash root is /. */ char* basename = g_file_get_basename(gf); if(basename && basename[0] == G_DIR_SEPARATOR) is_trash_root = TRUE; g_free(basename); } g_free(scheme); } } while(!fm_job_is_cancelled(job)) { if(g_file_delete(gf, fm_job_get_cancellable(job), &err)) { if (folder) { path = fm_path_new_for_gfile(gf); _fm_folder_event_file_deleted(folder, path); fm_path_unref(path); } return TRUE; } if(err) { /* if it's non-empty dir then descent into it then try again */ /* trash root gives G_IO_ERROR_PERMISSION_DENIED */ if(is_trash_root || /* FIXME: need to refactor this! */ (is_dir && !only_empty && err->domain == G_IO_ERROR && err->code == G_IO_ERROR_NOT_EMPTY)) { GFileEnumerator* enu; FmFolder *sub_folder; g_error_free(err); err = NULL; enu = g_file_enumerate_children(gf, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(job), &err); if(!enu) { fm_job_emit_error(job, err, FM_JOB_ERROR_MODERATE); g_error_free(err); return FALSE; } path = fm_path_new_for_gfile(gf); sub_folder = fm_folder_find_by_path(path); fm_path_unref(path); while( ! fm_job_is_cancelled(job) ) { inf = g_file_enumerator_next_file(enu, fm_job_get_cancellable(job), &err); if(inf) { GFile* sub = g_file_get_child(gf, g_file_info_get_name(inf)); ok = _fm_file_ops_job_delete_file(job, sub, inf, sub_folder, FALSE); g_object_unref(sub); g_object_unref(inf); if (!ok) /* stop the job if error happened */ goto _failed; } else { if(err) { fm_job_emit_error(job, err, FM_JOB_ERROR_MODERATE); /* FM_JOB_RETRY is not supported here */ g_error_free(err); _failed: g_object_unref(enu); if (sub_folder) g_object_unref(sub_folder); return FALSE; } else /* EOF */ break; } } g_object_unref(enu); if (sub_folder) g_object_unref(sub_folder); is_trash_root = FALSE; /* don't go here again! */ is_dir = FALSE; continue; } else if (is_dir && only_empty) { /* special case: trying delete directory with skipped files see _fm_file_ops_job_copy_file() for details */ g_error_free(err); return TRUE; } if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_PERMISSION_DENIED) { /* special case for trash:/// */ /* FIXME: is there any better way to handle this? */ char* scheme = g_file_get_uri_scheme(gf); if(g_strcmp0(scheme, "trash") == 0) { g_free(scheme); g_error_free(err); return TRUE; } g_free(scheme); } act = fm_job_emit_error(job, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act != FM_JOB_RETRY) return FALSE; } else return FALSE; } return FALSE; } gboolean _fm_file_ops_job_delete_run(FmFileOpsJob* job) { GList* l; gboolean ret = TRUE; /* prepare the job, count total work needed with FmDeepCountJob */ FmDeepCountJob* dc = fm_deep_count_job_new(job->srcs, FM_DC_JOB_PREPARE_DELETE); FmJob* fmjob = FM_JOB(job); FmPath *path, *parent = NULL; FmFolder *parent_folder = NULL; /* let the deep count job share the same cancellable */ fm_job_set_cancellable(FM_JOB(dc), fm_job_get_cancellable(fmjob)); fm_job_run_sync(FM_JOB(dc)); job->total = dc->count; g_object_unref(dc); if(fm_job_is_cancelled(fmjob)) { g_debug("delete job is cancelled"); return FALSE; } g_debug("total number of files to delete: %llu", (long long unsigned int)job->total); fm_file_ops_job_emit_prepared(job); l = fm_path_list_peek_head_link(job->srcs); for(; ! fm_job_is_cancelled(fmjob) && l;l=l->next) { GFile* src; path = FM_PATH(l->data); if (fm_path_get_parent(path) != parent && fm_path_get_parent(path) != NULL) { FmFolder *pf = fm_folder_find_by_path(fm_path_get_parent(path)); if (pf != parent_folder) { if (parent_folder) { fm_folder_unblock_updates(parent_folder); g_object_unref(parent_folder); } if (pf) fm_folder_block_updates(pf); parent_folder = pf; } else if (pf) g_object_unref(pf); } parent = fm_path_get_parent(path); src = fm_path_to_gfile(path); ret = _fm_file_ops_job_delete_file(fmjob, src, NULL, parent_folder, FALSE); g_object_unref(src); } if (parent_folder) { fm_folder_unblock_updates(parent_folder); g_object_unref(parent_folder); } return ret; } gboolean _fm_file_ops_job_trash_run(FmFileOpsJob* job) { gboolean ret = TRUE; GList* l; FmPathList* unsupported = fm_path_list_new(); GError* err = NULL; FmJob* fmjob = FM_JOB(job); FmPath *path, *parent = NULL; FmFolder *parent_folder = NULL; g_debug("total number of files to delete: %u", fm_path_list_get_length(job->srcs)); job->total = fm_path_list_get_length(job->srcs); fm_file_ops_job_emit_prepared(job); /* FIXME: we shouldn't trash a file already in trash:/// */ l = fm_path_list_peek_head_link(job->srcs); for(; !fm_job_is_cancelled(fmjob) && l;l=l->next) { GFile* gf = fm_path_to_gfile(FM_PATH(l->data)); GFileInfo* inf; path = FM_PATH(l->data); if (fm_path_get_parent(path) != parent && fm_path_get_parent(path) != NULL) { FmFolder *pf = fm_folder_find_by_path(fm_path_get_parent(path)); if (pf != parent_folder) { if (parent_folder) { fm_folder_unblock_updates(parent_folder); g_object_unref(parent_folder); } if (pf) fm_folder_block_updates(pf); parent_folder = pf; } else if (pf) g_object_unref(pf); } parent = fm_path_get_parent(path); _retry_trash: inf = g_file_query_info(gf, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, 0, fm_job_get_cancellable(fmjob), &err); if(inf) { /* currently processed file. */ fm_file_ops_job_emit_cur_file(job, g_file_info_get_display_name(inf)); g_object_unref(inf); } else { char* basename = g_file_get_basename(gf); char* disp = basename ? g_filename_display_name(basename) : NULL; g_free(basename); ret = FALSE; /* FIXME: translate it */ fm_file_ops_job_emit_cur_file(job, disp ? disp : "(invalid file)"); g_free(disp); goto _on_error; } ret = FALSE; if(fm_config->no_usb_trash) { GMount *mnt = g_file_find_enclosing_mount(gf, NULL, &err); if(mnt) { ret = g_mount_can_unmount(mnt); /* TRUE if it's removable media */ g_object_unref(mnt); if(ret) fm_path_list_push_tail(unsupported, FM_PATH(l->data)); } else { g_error_free(err); err = NULL; } } if(!ret) { ret = g_file_trash(gf, fm_job_get_cancellable(fmjob), &err); if (ret && parent_folder) _fm_folder_event_file_deleted(parent_folder, path); /* FIXME: signal trash:/// that file added there */ } if(!ret) { _on_error: /* if trashing is not supported by the file system */ if( err->domain == G_IO_ERROR && err->code == G_IO_ERROR_NOT_SUPPORTED) fm_path_list_push_tail(unsupported, FM_PATH(l->data)); else { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_trash; else if(act == FM_JOB_ABORT) { g_object_unref(gf); fm_path_list_unref(unsupported); return FALSE; } } g_error_free(err); err = NULL; } g_object_unref(gf); ++job->finished; fm_file_ops_job_emit_percent(job); } if (parent_folder) { fm_folder_unblock_updates(parent_folder); g_object_unref(parent_folder); } /* these files cannot be trashed due to lack of support from * underlying file systems. */ if(fm_path_list_is_empty(unsupported)) fm_path_list_unref(unsupported); else { /* FIXME: this is a dirty hack to fallback to delete if trash is not available. * The API must be re-designed later. */ g_object_set_data_full(G_OBJECT(job), "trash-unsupported", unsupported, (GDestroyNotify)fm_path_list_unref); } return TRUE; } static const char trash_query[]= G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME"," G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL"," G_FILE_ATTRIBUTE_STANDARD_SIZE"," G_FILE_ATTRIBUTE_UNIX_BLOCKS"," G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE"," G_FILE_ATTRIBUTE_ID_FILESYSTEM"," "trash::orig-path"; static gboolean ensure_parent_dir(FmJob* job, GFile* orig_path) { GFile* parent = g_file_get_parent(orig_path); gboolean ret = g_file_query_exists(parent, fm_job_get_cancellable(job)); if(!ret) { GError* err = NULL; _retry_mkdir: if(!g_file_make_directory_with_parents(parent, fm_job_get_cancellable(job), &err)) { if(!fm_job_is_cancelled(job)) { FmJobErrorAction act = fm_job_emit_error(job, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_mkdir; } } else ret = TRUE; } g_object_unref(parent); return ret; } gboolean _fm_file_ops_job_untrash_run(FmFileOpsJob* job) { gboolean ret = TRUE; GList* l; GError* err = NULL; FmJob* fmjob = FM_JOB(job); job->total = fm_path_list_get_length(job->srcs); fm_file_ops_job_emit_prepared(job); l = fm_path_list_peek_head_link(job->srcs); for(; !fm_job_is_cancelled(fmjob) && l;l=l->next) { GFile* gf; GFileInfo* inf; FmPath* path = FM_PATH(l->data); if(!fm_path_is_trash(path)) continue; gf = fm_path_to_gfile(path); _retry_get_orig_path: inf = g_file_query_info(gf, trash_query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if(inf) { const char* orig_path_str = g_file_info_get_attribute_byte_string(inf, "trash::orig-path"); fm_file_ops_job_emit_cur_file(job, g_file_info_get_display_name(inf)); if(orig_path_str) { /* FIXME: what if orig_path_str is a relative path? * This is actually allowed by the horrible trash spec. */ GFile* orig_path = fm_file_new_for_commandline_arg(orig_path_str); FmFolder *src_folder = fm_folder_find_by_path(fm_path_get_parent(path)); FmPath *orig_fm_path = fm_path_new_for_gfile(orig_path); FmFolder *dst_folder = fm_folder_find_by_path(fm_path_get_parent(orig_fm_path)); fm_path_unref(orig_fm_path); /* ensure the existence of parent folder. */ if(ensure_parent_dir(fmjob, orig_path)) ret = _fm_file_ops_job_move_file(job, gf, inf, orig_path, path, src_folder, dst_folder); if (src_folder) g_object_unref(src_folder); if (dst_folder) g_object_unref(dst_folder); g_object_unref(orig_path); } else { FmJobErrorAction act; g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot untrash file '%s': original path not known"), g_file_info_get_display_name(inf)); act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_clear_error(&err); if(act == FM_JOB_ABORT) { g_object_unref(inf); g_object_unref(gf); return FALSE; } } g_object_unref(inf); } else { char* basename = g_file_get_basename(gf); char* disp = basename ? g_filename_display_name(basename) : NULL; g_free(basename); /* FIXME: translate it */ fm_file_ops_job_emit_cur_file(job, disp ? disp : "(invalid file)"); g_free(disp); if(err) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_get_orig_path; else if(act == FM_JOB_ABORT) { g_object_unref(gf); return FALSE; } } } g_object_unref(gf); ++job->finished; fm_file_ops_job_emit_percent(job); } return ret; } libfm-1.4.0/src/job/fm-file-ops-job-delete.h000066400000000000000000000031741475513661000204620ustar00rootroot00000000000000/* * fm-file-ops-job-delete.h * * Copyright 2009 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_OPS_JOB_DELETE_H__ #define __FM_FILE_OPS_JOB_DELETE_H__ #include #include #include "fm-file-ops-job.h" #include "fm-folder.h" G_BEGIN_DECLS gboolean _fm_file_ops_job_delete_file(FmJob* job, GFile* gf, GFileInfo* inf, FmFolder *folder, gboolean only_empty); gboolean _fm_file_ops_job_delete_run(FmFileOpsJob* job); /* gboolean _fm_file_ops_job_trash_file(FmJob* job, GFile* gf, GFileInfo* inf); */ gboolean _fm_file_ops_job_trash_run(FmFileOpsJob* job); /* gboolean _fm_file_ops_job_untrash_file(FmJob* job, GFile* gf, GFileInfo* inf); */ gboolean _fm_file_ops_job_untrash_run(FmFileOpsJob* job); G_END_DECLS #endif libfm-1.4.0/src/job/fm-file-ops-job-xfer.c000066400000000000000000001056401475513661000201600ustar00rootroot00000000000000/* * fm-file-ops-xfer.c * * Copyright 2009 PCMan * Copyright 2012 Vadim Ushakov * Copyright 2012-2016 Andriy Grytsenko (LStranger) * Copyright 2018 Nikita Sirgienko * * This file is a part of the Libfm library. * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-file-ops-job-xfer.h" #include "fm-file-ops-job-delete.h" #include #include #include #include #include "fm-utils.h" #include static const char query[]= G_FILE_ATTRIBUTE_STANDARD_TYPE"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME"," G_FILE_ATTRIBUTE_STANDARD_NAME"," G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL"," G_FILE_ATTRIBUTE_STANDARD_SIZE"," G_FILE_ATTRIBUTE_UNIX_BLOCKS"," G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE"," G_FILE_ATTRIBUTE_ID_FILESYSTEM; static void progress_cb(goffset cur, goffset total, gpointer job); static gboolean _fm_file_ops_job_check_paths(FmFileOpsJob* job, GFile* src, GFileInfo* src_inf, GFile* dest) { GError* err = NULL; FmJob* fmjob = FM_JOB(job); if(dest == NULL) /* as with search:/// */ { err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_FAILED, _("Destination does not exist")); } else if(job->type == FM_FILE_OP_MOVE && g_file_equal(src, dest)) { err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_FAILED, _("Source and destination are the same.")); } else if(g_file_info_get_file_type(src_inf) == G_FILE_TYPE_DIRECTORY && g_file_has_prefix(dest, src) ) { const char* msg = NULL; if(job->type == FM_FILE_OP_MOVE) msg = _("Cannot move a folder into its sub folder"); else if(job->type == FM_FILE_OP_COPY) msg = _("Cannot copy a folder into its sub folder"); else msg = _("Destination is a sub folder of source"); err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_FAILED, msg); } if(err) { if(!fm_job_is_cancelled(fmjob)) { fm_file_ops_job_emit_cur_file(job, g_file_info_get_display_name(src_inf)); fm_job_emit_error(fmjob, err, FM_JOB_ERROR_CRITICAL); } g_error_free(err); } return (err == NULL); } static gboolean _fm_file_ops_job_copy_file(FmFileOpsJob* job, GFile* src, GFileInfo* inf, GFile* dest, FmFolder *src_folder, /* if move */ FmFolder *dest_folder) { gboolean ret = FALSE; gboolean delete_src = FALSE; GError* err = NULL; GFileType type; guint64 size; GFile* new_dest = NULL; GFileCopyFlags flags; FmJob* fmjob = FM_JOB(job); FmPath *fm_dest; guint32 mode; gboolean skip_dir_content = FALSE; job->supported_options = FM_FILE_OP_RENAME | FM_FILE_OP_SKIP | FM_FILE_OP_OVERWRITE; if( G_LIKELY(inf) ) g_object_ref(inf); else { _retry_query_src_info: inf = g_file_query_info(src, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if( !inf ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_query_src_info; return FALSE; } } if(!_fm_file_ops_job_check_paths(job, src, inf, dest)) /* also checks dest */ { g_object_unref(inf); return FALSE; } /* if this is a cross-device move operation, delete source files. */ if( job->type == FM_FILE_OP_MOVE ) delete_src = TRUE; /* showing currently processed file. */ fm_file_ops_job_emit_cur_file(job, g_file_info_get_display_name(inf)); type = g_file_info_get_file_type(inf); size = g_file_info_get_size(inf); mode = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_MODE); g_object_unref(inf); inf = NULL; switch(type) { case G_FILE_TYPE_DIRECTORY: { GFileEnumerator* enu; gboolean dir_created = FALSE; _retry_mkdir: if( !fm_job_is_cancelled(fmjob) && !job->skip_dir_content && !g_file_make_directory(dest, fm_job_get_cancellable(fmjob), &err) ) { if(err->domain == G_IO_ERROR && (err->code == G_IO_ERROR_EXISTS || err->code == G_IO_ERROR_INVALID_FILENAME || err->code == G_IO_ERROR_FILENAME_TOO_LONG)) { GFile* dest_cp = new_dest; gboolean dest_exists = (err->code == G_IO_ERROR_EXISTS); FmFileOpOption opt = 0; g_error_free(err); err = NULL; new_dest = NULL; opt = _fm_file_ops_job_ask_new_name(job, src, dest, &new_dest, dest_exists); if(!new_dest) /* restoring status quo */ new_dest = dest_cp; else if(dest_cp) /* we got new new_dest, forget old one */ g_object_unref(dest_cp); switch(opt) { case FM_FILE_OP_RENAME: dest = new_dest; goto _retry_mkdir; break; case FM_FILE_OP_SKIP: /* when a dir is skipped, we need to know its total size to calculate correct progress */ job->finished += size; fm_file_ops_job_emit_percent(job); job->skip_dir_content = skip_dir_content = TRUE; dir_created = TRUE; /* pretend that dir creation succeeded */ break; case FM_FILE_OP_OVERWRITE: dir_created = TRUE; /* pretend that dir creation succeeded */ break; case FM_FILE_OP_CANCEL: fm_job_cancel(fmjob); break; case FM_FILE_OP_SKIP_ERROR: ; /* FIXME */ } } else if(!fm_job_is_cancelled(fmjob)) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_mkdir; } job->finished += size; fm_file_ops_job_emit_percent(job); } else { /* chmod the newly created dir properly */ if(!fm_job_is_cancelled(fmjob) && !job->skip_dir_content) { if(mode) { _retry_chmod_for_dir: mode |= (S_IRUSR|S_IWUSR); /* ensure we have rw permission to this file. */ if( !g_file_set_attribute_uint32(dest, G_FILE_ATTRIBUTE_UNIX_MODE, mode, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err) ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_chmod_for_dir; /* FIXME: some filesystems may not support this. */ } } dir_created = TRUE; } job->finished += size; fm_file_ops_job_emit_percent(job); } if(!dir_created) /* if target dir is not created, don't copy dir content */ { if(!job->skip_dir_content) job->skip_dir_content = skip_dir_content = TRUE; } /* the dest dir is created. let's copy its content. */ /* FIXME: handle the case when the dir cannot be created. */ else if(!fm_job_is_cancelled(fmjob)) { FmFolder *sub_folder; FmFolder *sub_src = NULL; if (delete_src) { FmPath *src_path = fm_path_new_for_gfile(src); sub_src = fm_folder_find_by_path(src_path); fm_path_unref(src_path); } fm_dest = fm_path_new_for_gfile(dest); sub_folder = fm_folder_find_by_path(fm_dest); /* inform folder we created directory */ if (!dest_folder || !_fm_folder_event_file_added(dest_folder, fm_dest)) fm_path_unref(fm_dest); _retry_enum_children: enu = g_file_enumerate_children(src, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if(enu) { int n_children = 0; int n_copied = 0; ret = TRUE; while( !fm_job_is_cancelled(fmjob) ) { inf = g_file_enumerator_next_file(enu, fm_job_get_cancellable(fmjob), &err); if( inf ) { ++n_children; /* don't overwrite dir content, only calculate progress. */ if(G_UNLIKELY(job->skip_dir_content)) { /* FIXME: this is incorrect as we don't do the calculation recursively. */ job->finished += g_file_info_get_size(inf); fm_file_ops_job_emit_percent(job); } else { gboolean ret2; GFile* sub = g_file_get_child(src, g_file_info_get_name(inf)); GFile* sub_dest; char* tmp_basename; if(g_file_is_native(src) == g_file_is_native(dest)) /* both are native or both are virtual */ tmp_basename = NULL; else if(g_file_is_native(src)) /* copy from native to virtual */ tmp_basename = g_filename_to_utf8(g_file_info_get_name(inf), -1, NULL, NULL, NULL); /* gvfs escapes it itself */ else /* copy from virtual to native */ /* display name as copying target more prefers, that basename (for example, for Google Drive) See https://debarshiray.wordpress.com/2015/09/13/google-drive-and-gnome-what-is-a-volatile-path/ for some explanations*/ tmp_basename = fm_uri_subpath_to_native_subpath(g_file_info_get_display_name(inf), NULL); sub_dest = g_file_get_child(dest, tmp_basename ? tmp_basename : g_file_info_get_name(inf)); g_free(tmp_basename); ret2 = _fm_file_ops_job_copy_file(job, sub, inf, sub_dest, sub_src, sub_folder); g_object_unref(sub); g_object_unref(sub_dest); if(ret2) ++n_copied; else ret = FALSE; } g_object_unref(inf); } else { if(err) { fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; /* FM_JOB_RETRY is not supported here */ ret = FALSE; } else /* EOF is reached */ { /* all files are successfully copied. */ if(fm_job_is_cancelled(fmjob)) ret = FALSE; else { if(dir_created) /* target dir is created */ { /* some files are not copied */ if(n_children != n_copied) { /* if the copy actions are skipped deliberately, it's ok */ if(!job->skip_dir_content) ret = FALSE; } } /* else job->skip_dir_content is TRUE */ } break; } } } g_file_enumerator_close(enu, NULL, &err); g_object_unref(enu); } else { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_enum_children; } if (sub_src) g_object_unref(sub_src); if (sub_folder) g_object_unref(sub_folder); } if(job->skip_dir_content) delete_src = FALSE; if(skip_dir_content) job->skip_dir_content = FALSE; } break; case G_FILE_TYPE_SPECIAL: /* only handle FIFO for local files */ if(g_file_is_native(src) && g_file_is_native(dest)) { char* src_path = g_file_get_path(src); struct stat src_st; int r; r = lstat(src_path, &src_st); g_free(src_path); if(r == 0) { /* Handle FIFO on native file systems. */ if(S_ISFIFO(src_st.st_mode)) { char* dest_path = g_file_get_path(dest); int r = mkfifo(dest_path, src_st.st_mode); g_free(dest_path); if( r == 0) ret = TRUE; } /* FIXME: how about block device, char device, and socket? */ } } if (!ret) { g_set_error(&err, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot copy file '%s': not supported"), g_file_info_get_display_name(inf)); fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_clear_error(&err); } goto _file_copied; default: flags = G_FILE_COPY_ALL_METADATA|G_FILE_COPY_NOFOLLOW_SYMLINKS; _retry_copy: if( !g_file_copy(src, dest, flags, fm_job_get_cancellable(fmjob), progress_cb, fmjob, &err) ) { flags &= ~G_FILE_COPY_OVERWRITE; /* handle existing files or file name conflict */ if(err->domain == G_IO_ERROR && (err->code == G_IO_ERROR_EXISTS || err->code == G_IO_ERROR_INVALID_FILENAME || err->code == G_IO_ERROR_FILENAME_TOO_LONG)) { GFile* dest_cp = new_dest; gboolean dest_exists = (err->code == G_IO_ERROR_EXISTS); FmFileOpOption opt = 0; g_error_free(err); err = NULL; new_dest = NULL; opt = _fm_file_ops_job_ask_new_name(job, src, dest, &new_dest, dest_exists); if(!new_dest) /* restoring status quo */ new_dest = dest_cp; else if(dest_cp) /* we got new new_dest, forget old one */ g_object_unref(dest_cp); switch(opt) { case FM_FILE_OP_RENAME: dest = new_dest; goto _retry_copy; break; case FM_FILE_OP_OVERWRITE: flags |= G_FILE_COPY_OVERWRITE; goto _retry_copy; break; case FM_FILE_OP_CANCEL: fm_job_cancel(fmjob); break; case FM_FILE_OP_SKIP: ret = TRUE; delete_src = FALSE; /* don't delete source file. */ break; case FM_FILE_OP_SKIP_ERROR: ; /* FIXME */ } } else { gboolean is_no_space = (err->domain == G_IO_ERROR && err->code == G_IO_ERROR_NO_SPACE); FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) { job->current_file_finished = 0; goto _retry_copy; } /* FIXME: ask to leave partial content? */ if(is_no_space) g_file_delete(dest, fm_job_get_cancellable(fmjob), NULL); ret = FALSE; delete_src = FALSE; } } else ret = TRUE; _file_copied: job->finished += size; job->current_file_finished = 0; if(ret && dest_folder) { fm_dest = fm_path_new_for_gfile(dest); if(!_fm_folder_event_file_added(dest_folder, fm_dest)) fm_path_unref(fm_dest); } /* update progress */ fm_file_ops_job_emit_percent(job); break; } /* if this is a cross-device move operation, delete source files. */ /* ret == TRUE means the copy is successful. */ if( !fm_job_is_cancelled(fmjob) && ret && delete_src ) ret = _fm_file_ops_job_delete_file(fmjob, src, inf, src_folder, TRUE); /* delete the source file. */ if(new_dest) g_object_unref(new_dest); return ret; } gboolean _fm_file_ops_job_move_file(FmFileOpsJob* job, GFile* src, GFileInfo* inf, GFile* dest, FmPath *src_path, FmFolder *src_folder, FmFolder *dest_folder) { GError* err = NULL; FmJob* fmjob = FM_JOB(job); const char* src_fs_id; gboolean ret = TRUE; GFile* new_dest = NULL; job->supported_options = FM_FILE_OP_RENAME | FM_FILE_OP_SKIP | FM_FILE_OP_OVERWRITE; if( G_LIKELY(inf) ) g_object_ref(inf); else { _retry_query_src_info: inf = g_file_query_info(src, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if( !inf ) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_query_src_info; return FALSE; } } if(!_fm_file_ops_job_check_paths(job, src, inf, dest)) { g_object_unref(inf); return FALSE; } src_fs_id = g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_ID_FILESYSTEM); /* Check if source and destination are on the same device */ if( job->type == FM_FILE_OP_UNTRASH || g_strcmp0(src_fs_id, job->dest_fs_id) == 0 ) /* same device */ { guint64 size; GFileCopyFlags flags = G_FILE_COPY_ALL_METADATA|G_FILE_COPY_NOFOLLOW_SYMLINKS; FmPath *fm_dest; fm_dest = fm_path_new_for_gfile(dest); /* showing currently processed file. */ fm_file_ops_job_emit_cur_file(job, g_file_info_get_display_name(inf)); _retry_move: if( !g_file_move(src, dest, flags, fm_job_get_cancellable(fmjob), progress_cb, job, &err)) { flags &= ~G_FILE_COPY_OVERWRITE; if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_EXISTS) { GFile* dest_cp = new_dest; FmFileOpOption opt = 0; new_dest = NULL; opt = _fm_file_ops_job_ask_new_name(job, src, dest, &new_dest, TRUE); if(!new_dest) /* restoring status quo */ new_dest = dest_cp; else if(dest_cp) /* we got new new_dest, forget old one */ g_object_unref(dest_cp); g_error_free(err); err = NULL; switch(opt) { case FM_FILE_OP_RENAME: dest = new_dest; goto _retry_move; break; case FM_FILE_OP_OVERWRITE: flags |= G_FILE_COPY_OVERWRITE; if(g_file_info_get_file_type(inf) == G_FILE_TYPE_DIRECTORY) /* merge dirs */ { GFileEnumerator* enu = g_file_enumerate_children(src, query, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, fm_job_get_cancellable(fmjob), &err); if(enu) { GFileInfo* child_inf; FmFolder *sub_src_folder = fm_folder_find_by_path(src_path); FmFolder *sub_dest_folder = fm_folder_find_by_path(fm_dest); while(!fm_job_is_cancelled(fmjob)) { child_inf = g_file_enumerator_next_file(enu, fm_job_get_cancellable(fmjob), &err); if(child_inf) { GFile* child = g_file_get_child(src, g_file_info_get_name(child_inf)); GFile* child_dest = g_file_get_child(dest, g_file_info_get_name(child_inf)); FmPath *child_path = fm_path_new_for_gfile(child); _fm_file_ops_job_move_file(job, child, child_inf, child_dest, child_path, sub_src_folder, sub_dest_folder); g_object_unref(child); g_object_unref(child_dest); g_object_unref(child_inf); fm_path_unref(child_path); } else { if(err) /* error */ { fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; } else /* EOF */ { break; } } } if (sub_src_folder) g_object_unref(sub_src_folder); if (sub_dest_folder) g_object_unref(sub_dest_folder); g_object_unref(enu); } else { /*FmJobErrorAction act = */ fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; /* if(act == FM_JOB_RETRY) goto _retry_move; */ } /* remove source dir after its content is merged with destination dir */ if(!g_file_delete(src, fm_job_get_cancellable(fmjob), &err)) { fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; /* FIXME: should this be recoverable? */ } } else /* the destination is a file, just overwrite it. */ goto _retry_move; break; case FM_FILE_OP_CANCEL: fm_job_cancel(fmjob); ret = FALSE; break; case FM_FILE_OP_SKIP: ret = TRUE; break; case FM_FILE_OP_SKIP_ERROR: ; /* FIXME */ } } if(err) { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_move; } fm_path_unref(fm_dest); } else { if (src_folder) _fm_folder_event_file_deleted(src_folder, src_path); if (!dest_folder || !_fm_folder_event_file_added(dest_folder, fm_dest)) fm_path_unref(fm_dest); } /* size = g_file_info_get_attribute_uint64(inf, G_FILE_ATTRIBUTE_UNIX_BLOCKS); size *= g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE); */ size = g_file_info_get_size(inf); job->finished += size; fm_file_ops_job_emit_percent(job); } else /* use copy if they are on different devices */ { /* use copy & delete */ /* source file will be deleted in _fm_file_ops_job_copy_file() */ ret = _fm_file_ops_job_copy_file(job, src, inf, dest, src_folder, dest_folder); } if(new_dest) g_object_unref(new_dest); g_object_unref(inf); return ret; } static void progress_cb(goffset cur, goffset total, gpointer data) { FmFileOpsJob* job = FM_FILE_OPS_JOB(data); job->current_file_finished = cur; /* update progress */ fm_file_ops_job_emit_percent(job); } gboolean _fm_file_ops_job_copy_run(FmFileOpsJob* job) { gboolean ret = TRUE; GFile *dest_dir; GList* l; FmJob* fmjob = FM_JOB(job); /* prepare the job, count total work needed with FmDeepCountJob */ FmDeepCountJob* dc = fm_deep_count_job_new(job->srcs, FM_DC_JOB_DEFAULT); FmFolder *df; /* let the deep count job share the same cancellable object. */ fm_job_set_cancellable(FM_JOB(dc), fm_job_get_cancellable(fmjob)); fm_job_run_sync(FM_JOB(dc)); job->total = dc->total_size; if(fm_job_is_cancelled(fmjob)) { g_object_unref(dc); return FALSE; } g_object_unref(dc); g_debug("total size to copy: %llu", (long long unsigned int)job->total); dest_dir = fm_path_to_gfile(job->dest); /* suspend updates for destination */ df = fm_folder_find_by_path(job->dest); if (df) fm_folder_block_updates(df); fm_file_ops_job_emit_prepared(job); for(l = fm_path_list_peek_head_link(job->srcs); !fm_job_is_cancelled(fmjob) && l; l=l->next) { FmPath* path = FM_PATH(l->data); GFile* src = fm_path_to_gfile(path); GFile* dest; char* tmp_basename; if(g_file_is_native(src) && g_file_is_native(dest_dir)) /* both are native */ tmp_basename = NULL; else if(g_file_is_native(src)) /* copy from native to virtual */ tmp_basename = g_filename_to_utf8(fm_path_get_basename(path), -1, NULL, NULL, NULL); /* gvfs escapes it itself */ else /* copy from virtual to native/virtual */ { /* if we drop URI query onto native filesystem, omit query part */ const char *basename = fm_path_get_basename(path); char *sub_name; sub_name = strchr(basename, '?'); if (sub_name) { sub_name = g_strndup(basename, sub_name - basename); basename = strrchr(sub_name, G_DIR_SEPARATOR); if (basename) basename++; else basename = sub_name; tmp_basename = fm_uri_subpath_to_native_subpath(basename, NULL); g_free(sub_name); } else /* if not URI, better use display name */ tmp_basename = fm_path_display_basename(path); } dest = g_file_get_child(dest_dir, tmp_basename ? tmp_basename : fm_path_get_basename(path)); g_free(tmp_basename); if(!_fm_file_ops_job_copy_file(job, src, NULL, dest, NULL, df)) ret = FALSE; g_object_unref(src); if(dest != NULL) g_object_unref(dest); } /* g_debug("finished: %llu, total: %llu", job->finished, job->total); */ fm_file_ops_job_emit_percent(job); /* restore updates for destination */ if (df) { fm_folder_unblock_updates(df); g_object_unref(df); } g_object_unref(dest_dir); return ret; } gboolean _fm_file_ops_job_move_run(FmFileOpsJob* job) { GFile *dest_dir; GFileInfo* inf; GList* l; GError* err = NULL; FmJob* fmjob = FM_JOB(job); dev_t dest_dev = 0; gboolean ret = TRUE; FmDeepCountJob* dc; FmPath *parent = NULL; FmFolder *df, *sf = NULL; /* get information of destination folder */ g_return_val_if_fail(job->dest, FALSE); dest_dir = fm_path_to_gfile(job->dest); _retry_query_dest_info: inf = g_file_query_info(dest_dir, G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL"," G_FILE_ATTRIBUTE_UNIX_DEVICE"," G_FILE_ATTRIBUTE_ID_FILESYSTEM"," G_FILE_ATTRIBUTE_UNIX_DEVICE, 0, fm_job_get_cancellable(fmjob), &err); if(inf) { job->dest_fs_id = g_intern_string(g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_ID_FILESYSTEM)); dest_dev = g_file_info_get_attribute_uint32(inf, G_FILE_ATTRIBUTE_UNIX_DEVICE); /* needed by deep count */ g_object_unref(inf); } else { FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MODERATE); g_error_free(err); err = NULL; if(act == FM_JOB_RETRY) goto _retry_query_dest_info; else { g_object_unref(dest_dir); return FALSE; } } /* prepare the job, count total work needed with FmDeepCountJob */ dc = fm_deep_count_job_new(job->srcs, FM_DC_JOB_PREPARE_MOVE); fm_deep_count_job_set_dest(dc, dest_dev, job->dest_fs_id); fm_job_run_sync(FM_JOB(dc)); job->total = dc->total_size; if( fm_job_is_cancelled(FM_JOB(dc)) ) { g_object_unref(dest_dir); g_object_unref(dc); return FALSE; } g_object_unref(dc); g_debug("total size to move: %llu, dest_fs: %s", (long long unsigned int)job->total, job->dest_fs_id); fm_file_ops_job_emit_prepared(job); /* suspend updates for destination */ df = fm_folder_find_by_path(job->dest); if (df) fm_folder_block_updates(df); for(l = fm_path_list_peek_head_link(job->srcs); !fm_job_is_cancelled(fmjob) && l; l=l->next) { FmPath* path = FM_PATH(l->data); GFile* src = fm_path_to_gfile(path); GFile* dest; char* tmp_basename; /* do with updates for source */ if (fm_path_get_parent(path) != parent && fm_path_get_parent(path) != NULL) { FmFolder *pf; pf = fm_folder_find_by_path(fm_path_get_parent(path)); if (pf != sf) { if (sf) { fm_folder_unblock_updates(sf); g_object_unref(sf); } if (pf) fm_folder_block_updates(pf); sf = pf; } else if (pf) g_object_unref(pf); } parent = fm_path_get_parent(path); if(g_file_is_native(src) && g_file_is_native(dest_dir)) /* both are native */ tmp_basename = NULL; else if(g_file_is_native(src)) /* move from native to virtual */ tmp_basename = g_filename_to_utf8(fm_path_get_basename(path), -1, NULL, NULL, NULL); /* gvfs escapes it itself */ else /* move from virtual to native/virtual */ { char *name = fm_path_display_basename(path); tmp_basename = fm_uri_subpath_to_native_subpath(name, NULL); g_free(name); } dest = g_file_get_child(dest_dir, tmp_basename ? tmp_basename : fm_path_get_basename(path)); g_free(tmp_basename); if(!_fm_file_ops_job_move_file(job, src, NULL, dest, path, sf, df)) ret = FALSE; g_object_unref(src); if(dest != NULL) g_object_unref(dest); if(!ret) break; } /* restore updates for destination and source */ if (df) { fm_folder_unblock_updates(df); g_object_unref(df); } if (sf) { fm_folder_unblock_updates(sf); g_object_unref(sf); } g_object_unref(dest_dir); return ret; } libfm-1.4.0/src/job/fm-file-ops-job-xfer.h000066400000000000000000000027501475513661000201630ustar00rootroot00000000000000/* * fm-file-ops-xfer.c * * Copyright 2009 PCMan * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_OPS_JOB_XFER_H__ #define __FM_FILE_OPS_JOB_XFER_H__ #include #include #include "fm-file-ops-job.h" #include "fm-folder.h" G_BEGIN_DECLS /* gboolean _fm_file_ops_job_copy_file(FmFileOpsJob* job, GFile* src, GFileInfo* inf, GFile* dest); */ gboolean _fm_file_ops_job_copy_run(FmFileOpsJob* job); gboolean _fm_file_ops_job_move_file(FmFileOpsJob* job, GFile* src, GFileInfo* inf, GFile* dest, FmPath *src_path, FmFolder *src_folder, FmFolder *dst_folder); gboolean _fm_file_ops_job_move_run(FmFileOpsJob* job); G_END_DECLS #endif libfm-1.4.0/src/job/fm-file-ops-job.c000066400000000000000000000701201475513661000172100ustar00rootroot00000000000000/* * fm-file-ops-job.c * * Copyright 2009 PCMan * Copyright 2012-2016 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-file-ops-job * @short_description: Job to do something with files. * @title: FmFileOpsJob * * @include: libfm/fm.h * * The #FmFileOpsJob can be used to do some file operation such as move, * copy, delete, change file attributes, etc. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "fm-file-ops-job.h" #include "fm-file-ops-job-xfer.h" #include "fm-file-ops-job-delete.h" #include "fm-file-ops-job-change-attr.h" #include "fm-marshal.h" #include "fm-file-info-job.h" #include "glib-compat.h" enum { PREPARED, CUR_FILE, PERCENT, ASK_RENAME, N_SIGNALS }; static guint signals[N_SIGNALS]; static void fm_file_ops_job_finalize (GObject *object); static gboolean fm_file_ops_job_run(FmJob* fm_job); /* static void fm_file_ops_job_cancel(FmJob* job); */ /* funcs for io jobs */ static gboolean _fm_file_ops_job_link_run(FmFileOpsJob* job); G_DEFINE_TYPE(FmFileOpsJob, fm_file_ops_job, FM_TYPE_JOB); static void fm_file_ops_job_dispose(GObject *object) { FmFileOpsJob *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_FILE_OPS_JOB(object)); self = (FmFileOpsJob*)object; if(self->srcs) { fm_path_list_unref(self->srcs); self->srcs = NULL; } if(self->dest) { fm_path_unref(self->dest); self->dest = NULL; } if(self->display_name) { g_free(self->display_name); self->display_name = NULL; } if(self->icon) { g_object_unref(self->icon); self->icon = NULL; } if(self->target) { g_free(self->target); self->target = NULL; } G_OBJECT_CLASS(fm_file_ops_job_parent_class)->dispose(object); } static void fm_file_ops_job_class_init(FmFileOpsJobClass *klass) { GObjectClass *g_object_class; FmJobClass* job_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_file_ops_job_dispose; g_object_class->finalize = fm_file_ops_job_finalize; job_class = FM_JOB_CLASS(klass); job_class->run = fm_file_ops_job_run; /** * FmFileOpsJob::prepared: * @job: a job object which emitted the signal * * The #FmFileOpsJob::prepared signal is emitted when preparation * of the file operation is done and @job is ready to start * copying/deleting... * * Since: 0.1.10 */ signals[PREPARED] = g_signal_new( "prepared", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFileOpsJobClass, prepared ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 ); /** * FmFileOpsJob::cur-file: * @job: a job object which emitted the signal * @file: (const char *) file which is processing * * The #FmFileOpsJob::cur-file signal is emitted when @job is about * to start operation on the @file. * * Since: 0.1.0 */ signals[CUR_FILE] = g_signal_new( "cur-file", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFileOpsJobClass, cur_file ), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER ); /** * FmFileOpsJob::percent: * @job: a job object which emitted the signal * @percent: current ratio of completed job size to full job size * * The #FmFileOpsJob::percent signal is emitted when one more file * operation is completed. * * Since: 0.1.0 */ signals[PERCENT] = g_signal_new( "percent", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmFileOpsJobClass, percent ), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT ); /** * FmFileOpsJob::ask-rename: * @job: a job object which emitted the signal * @src: (#FmFileInfo *) source file * @dest: (#FmFileInfo *) destination directory * @new_name: (char **) pointer to receive new name * * The #FmFileOpsJob::ask-rename signal is emitted when file operation * raises a conflict because file with the same name already exists * in the directory @dest. Signal handler should find a decision how * to resolve the situation. If there is more than one handler connected * to the signal then only one of them will receive it. * Implementations are expected to inspect supported options for the * decision calling fm_file_ops_job_get_options(). Behavior when * handler returns unsupported option is undefined. * * Return value: a #FmFileOpOption decision. * * Since: 0.1.0 */ signals[ASK_RENAME] = g_signal_new( "ask-rename", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET ( FmFileOpsJobClass, ask_rename ), g_signal_accumulator_first_wins, NULL, fm_marshal_INT__POINTER_POINTER_POINTER, G_TYPE_INT, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER ); } static void fm_file_ops_job_finalize(GObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_FILE_OPS_JOB(object)); G_OBJECT_CLASS(fm_file_ops_job_parent_class)->finalize(object); } static void fm_file_ops_job_init(FmFileOpsJob *self) { fm_job_init_cancellable(FM_JOB(self)); /* for chown */ self->uid = -1; self->gid = -1; self->set_hidden = -1; } /** * fm_file_ops_job_new * @type: type of file operation the new job will handle * @files: list of source files to perform operation * * Creates new #FmFileOpsJob which can be used in #FmJob API. * * Returns: a new #FmFileOpsJob object. * * Since: 0.1.0 */ FmFileOpsJob *fm_file_ops_job_new(FmFileOpType type, FmPathList* files) { FmFileOpsJob* job = (FmFileOpsJob*)g_object_new(FM_FILE_OPS_JOB_TYPE, NULL); job->srcs = fm_path_list_ref(files); job->type = type; return job; } static gboolean fm_file_ops_job_run(FmJob* fm_job) { FmFileOpsJob* job = FM_FILE_OPS_JOB(fm_job); GError *err; switch(job->type) { case FM_FILE_OP_COPY: return _fm_file_ops_job_copy_run(job); case FM_FILE_OP_MOVE: return _fm_file_ops_job_move_run(job); case FM_FILE_OP_TRASH: return _fm_file_ops_job_trash_run(job); case FM_FILE_OP_UNTRASH: return _fm_file_ops_job_untrash_run(job); case FM_FILE_OP_DELETE: return _fm_file_ops_job_delete_run(job); case FM_FILE_OP_LINK: return _fm_file_ops_job_link_run(job); case FM_FILE_OP_CHANGE_ATTR: return _fm_file_ops_job_change_attr_run(job); case FM_FILE_OP_NONE: ; } err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Operation not supported")); fm_job_emit_error(FM_JOB(job), err, FM_JOB_ERROR_CRITICAL); g_error_free(err); return FALSE; } /** * fm_file_ops_job_set_dest * @job: a job to set * @dest: destination path * * Sets destination path for operations FM_FILE_OP_MOVE, FM_FILE_OP_COPY, * or FM_FILE_OP_LINK. * * This API may be used only before @job is started. * * Since: 0.1.0 */ void fm_file_ops_job_set_dest(FmFileOpsJob* job, FmPath* dest) { job->dest = fm_path_ref(dest); } /** * fm_file_ops_job_get_dest * @job: a job to inspect * * Retrieves the destination path for operation. If type of operation * in not FM_FILE_OP_MOVE, FM_FILE_OP_COPY, or FM_FILE_OP_LINK then * result of this call is undefined. The returned value is owned by * @job and should be not freed by caller. * * Returns: (transfer none): the #FmPath which was set by previous call * to fm_file_ops_job_set_dest(). * * Since: 0.1.0 */ FmPath* fm_file_ops_job_get_dest(FmFileOpsJob* job) { return job->dest; } /** * fm_file_ops_job_set_chmod * @job: a job to set * @new_mode: which bits of file mode should be set * @new_mode_mask: which bits of file mode should be reset * * Sets that files for file operation FM_FILE_OP_CHANGE_ATTR should have * file mode changed according to @new_mode_mask and @new_mode: bits * that are present only in @new_mode_mask will be set to 0, and bits * that are present in both @new_mode_mask and @new_mode will be set to 1. * * This API may be used only before @job is started. * * Since: 0.1.0 */ void fm_file_ops_job_set_chmod(FmFileOpsJob* job, mode_t new_mode, mode_t new_mode_mask) { job->new_mode = new_mode; job->new_mode_mask = new_mode_mask; } /** * fm_file_ops_job_set_chown * @job: a job to set * @uid: user id to set as file owner * @gid: group id to set as file group * * Sets that files for file operation FM_FILE_OP_CHANGE_ATTR should have * owner or group changed. If @uid >= 0 then @job will try to change * owner of files. If @gid >= 0 then @job will try to change group of * files. * * This API may be used only before @job is started. * * Since: 0.1.0 */ void fm_file_ops_job_set_chown(FmFileOpsJob* job, gint uid, gint gid) { job->uid = uid; job->gid = gid; } /** * fm_file_ops_job_set_recursive * @job: a job to set * @recursive: recursion attribute to set * * Sets 'recursive' attribute for file operation according to @recursive. * If @recursive is %TRUE then file operation @job will try to do all * operations recursively. * * This API may be used only before @job is started. * * Since: 0.1.0 */ void fm_file_ops_job_set_recursive(FmFileOpsJob* job, gboolean recursive) { job->recursive = recursive; } static gpointer emit_cur_file(FmJob* job, gpointer cur_file) { g_signal_emit(job, signals[CUR_FILE], 0, (const char*)cur_file); return NULL; } /** * fm_file_ops_job_emit_cur_file * @job: the job to emit signal * @cur_file: the data to emit * * Emits the #FmFileOpsJob::cur-file signal in main thread. * * This API is private to #FmFileOpsJob and should not be used outside * of libfm implementation. * * Since: 0.1.0 */ void fm_file_ops_job_emit_cur_file(FmFileOpsJob* job, const char* cur_file) { fm_job_call_main_thread(FM_JOB(job), emit_cur_file, (gpointer)cur_file); } static gpointer emit_percent(FmJob* job, gpointer percent) { g_signal_emit(job, signals[PERCENT], 0, GPOINTER_TO_UINT(percent)); return NULL; } /** * fm_file_ops_job_emit_percent * @job: the job to emit signal * * Emits the #FmFileOpsJob::percent signal in main thread. * * This API is private to #FmFileOpsJob and should not be used outside * of libfm implementation. * * Since: 0.1.0 */ void fm_file_ops_job_emit_percent(FmFileOpsJob* job) { guint percent; if (fm_job_is_cancelled(FM_JOB(job))) return; if(job->total > 0) { gdouble dpercent = (gdouble)(job->finished + job->current_file_finished) / job->total; percent = (guint)(dpercent * 100); if(percent > 100) percent = 100; } else percent = 100; if( percent > job->percent ) { fm_job_call_main_thread(FM_JOB(job), emit_percent, GUINT_TO_POINTER(percent)); job->percent = percent; } } static gpointer emit_prepared(FmJob* job, gpointer user_data) { g_signal_emit(job, signals[PREPARED], 0); return NULL; } /** * fm_file_ops_job_emit_prepared * @job: the job to emit signal * * Emits the #FmFileOpsJob::prepared signal in main thread. * * This API is private to #FmFileOpsJob and should not be used outside * of libfm implementation. * * Since: 0.1.10 */ void fm_file_ops_job_emit_prepared(FmFileOpsJob* job) { fm_job_call_main_thread(FM_JOB(job), emit_prepared, NULL); } struct AskRename { FmFileInfo* src_fi; FmFileInfo* dest_fi; char* new_name; FmFileOpOption ret; }; static gpointer emit_ask_rename(FmJob* job, gpointer input_data) { #define data ((struct AskRename*)input_data) g_signal_emit(job, signals[ASK_RENAME], 0, data->src_fi, data->dest_fi, &data->new_name, &data->ret); #undef data return NULL; } /** * fm_file_ops_job_ask_rename * @job: a job which asked * @src: source file descriptor * @src_inf: source file information * @dest: destination descriptor * @new_dest: pointer to get new destination * * Asks the user in main thread how to resolve conflict if file being * copied or moved already exists in destination directory. Ask is done * by emitting the #FmFileOpsJob::ask-rename signal. * * This API is private to #FmFileOpsJob and should not be used outside * of libfm implementation. * * Returns: a decision how to resolve conflict. * * Since: 0.1.0 */ FmFileOpOption fm_file_ops_job_ask_rename(FmFileOpsJob* job, GFile* src, GFileInfo* src_inf, GFile* dest, GFile** new_dest) { struct AskRename data; FmFileInfoJob* fijob; FmFileInfo *src_fi = NULL, *dest_fi = NULL; if (fm_job_is_cancelled(FM_JOB(job))) return 0; fijob = fm_file_info_job_new(NULL, 0); if( !src_inf ) fm_file_info_job_add_gfile(fijob, src); else src_fi = fm_file_info_new_from_g_file_data(src, src_inf, NULL); fm_file_info_job_add_gfile(fijob, dest); fm_job_set_cancellable(FM_JOB(fijob), fm_job_get_cancellable(FM_JOB(job))); fm_job_run_sync(FM_JOB(fijob)); if( fm_job_is_cancelled(FM_JOB(fijob)) ) { if(src_fi) fm_file_info_unref(src_fi); g_object_unref(fijob); return 0; } if(!src_inf) src_fi = fm_file_info_list_pop_head(fijob->file_infos); dest_fi = fm_file_info_list_pop_head(fijob->file_infos); g_object_unref(fijob); if(!dest_fi) /* invalid destination directory! */ { GError *err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot access destination file")); fm_job_emit_error(FM_JOB(job), err, FM_JOB_ERROR_CRITICAL); g_error_free(err); fm_file_info_unref(src_fi); return FM_FILE_OP_CANCEL; } data.ret = 0; data.src_fi = src_fi; data.dest_fi = dest_fi; data.new_name = NULL; fm_job_call_main_thread(FM_JOB(job), emit_ask_rename, (gpointer)&data); if(data.ret == FM_FILE_OP_RENAME) { if(data.new_name) { GFile* parent = g_file_get_parent(dest); *new_dest = g_file_get_child(parent, data.new_name); g_object_unref(parent); g_free(data.new_name); } } fm_file_info_unref(src_fi); fm_file_info_unref(dest_fi); return data.ret; } /* the same as fm_file_ops_job_ask_rename() but handles the case if the destination does not exist, i.e. error such as G_IO_ERROR_FILENAME_TOO_LONG */ FmFileOpOption _fm_file_ops_job_ask_new_name(FmFileOpsJob* job, GFile* src, GFile* dest, GFile** new_dest, gboolean dest_exists) { struct AskRename data; FmFileInfoJob* fijob; FmFileInfo *src_fi = NULL, *dest_fi = NULL; if (fm_job_is_cancelled(FM_JOB(job))) return 0; fijob = fm_file_info_job_new(NULL, 0); fm_file_info_job_add_gfile(fijob, src); if (dest_exists) fm_file_info_job_add_gfile(fijob, dest); fm_job_set_cancellable(FM_JOB(fijob), fm_job_get_cancellable(FM_JOB(job))); fm_job_run_sync(FM_JOB(fijob)); if( fm_job_is_cancelled(FM_JOB(fijob)) ) { if(src_fi) fm_file_info_unref(src_fi); g_object_unref(fijob); return 0; } src_fi = fm_file_info_list_pop_head(fijob->file_infos); if (dest_exists) dest_fi = fm_file_info_list_pop_head(fijob->file_infos); else if (src_fi) { FmPath *dpath = fm_path_new_for_gfile(dest); /* forge dest_fi with just display name */ dest_fi = fm_file_info_new(); fm_file_info_set_path(dest_fi, dpath); _fm_path_set_display_name(dpath, fm_file_info_get_disp_name(src_fi)); fm_path_unref(dpath); } g_object_unref(fijob); if(!dest_fi) /* invalid destination directory! */ { GError *err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot access destination file")); fm_job_emit_error(FM_JOB(job), err, FM_JOB_ERROR_CRITICAL); g_error_free(err); if (src_fi) fm_file_info_unref(src_fi); return FM_FILE_OP_CANCEL; } data.ret = 0; data.src_fi = src_fi; data.dest_fi = dest_fi; data.new_name = NULL; fm_job_call_main_thread(FM_JOB(job), emit_ask_rename, (gpointer)&data); if(data.ret == FM_FILE_OP_RENAME) { if(data.new_name) { GFile* parent = g_file_get_parent(dest); *new_dest = g_file_get_child(parent, data.new_name); g_object_unref(parent); g_free(data.new_name); } } fm_file_info_unref(src_fi); fm_file_info_unref(dest_fi); return data.ret; } static gboolean _fm_file_ops_job_link_run(FmFileOpsJob* job) { gboolean ret = TRUE; GFile *dest_dir; GList* l; FmJob* fmjob = FM_JOB(job); FmFolder *dest_folder; job->supported_options = FM_FILE_OP_RENAME | FM_FILE_OP_SKIP; dest_dir = fm_path_to_gfile(job->dest); /* cannot create links on non-native filesystems */ if(!g_file_is_native(dest_dir)) { GError *err = g_error_new_literal(G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot create a link on non-native filesystem")); fm_job_emit_error(FM_JOB(job), err, FM_JOB_ERROR_CRITICAL); g_error_free(err); g_object_unref(dest_dir); return FALSE; } job->total = fm_path_list_get_length(job->srcs); g_debug("total files to link: %lu", (gulong)job->total); fm_file_ops_job_emit_prepared(job); dest_folder = fm_folder_find_by_path(job->dest); for(l = fm_path_list_peek_head_link(job->srcs); !fm_job_is_cancelled(fmjob) && l; l=l->next) { FmPath* path = FM_PATH(l->data); char* src = NULL; char *_basename = NULL; const char *basename = fm_path_get_basename(path); GFile* dest; GError* err = NULL; char* dname = NULL; /* if we drop URI query onto native filesystem, omit query part */ if (!fm_path_is_native(path) && g_file_is_native(dest_dir)) dname = strchr(basename, '?'); /* if basename consist only from query then use first part of it */ if (dname == basename) { basename++; dname = strchr(basename, '&'); } if (dname) { _basename = g_strndup(basename, dname - basename); dname = strrchr(_basename, G_DIR_SEPARATOR); g_debug("cutting '%s' to '%s'",basename,dname?&dname[1]:_basename); if (dname) basename = &dname[1]; else basename = _basename; } /* showing currently processed file. */ dest = g_file_get_child(dest_dir, basename); dname = g_file_get_parse_name(dest); fm_file_ops_job_emit_cur_file(job, dname); g_free(dname); g_free(_basename); _retry_link: if (fm_path_is_native(path)) { if (src == NULL) src = fm_path_to_str(path); if(!g_file_make_symbolic_link(dest, src, fm_job_get_cancellable(fmjob), &err)) { _link_error: if(err) { if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_EXISTS) { GFile *new_dest = NULL, *src_file; FmFileOpOption opt; src_file = fm_path_to_gfile(path); opt = _fm_file_ops_job_ask_new_name(job, src_file, dest, &new_dest, TRUE); g_object_unref(src_file); g_error_free(err); err = NULL; switch(opt) { case FM_FILE_OP_RENAME: if (new_dest) /* we got new dest */ { g_object_unref(dest); dest = new_dest; goto _retry_link; } break; case FM_FILE_OP_CANCEL: fm_job_cancel(fmjob); break; case FM_FILE_OP_OVERWRITE: /* we do not support overwrite */ case FM_FILE_OP_SKIP: break; case FM_FILE_OP_SKIP_ERROR: ; /* FIXME */ } if (new_dest) g_object_unref(new_dest); } } ret = FALSE; } } else /* create shortcut instead */ { gsize out_len; /* unfortunately we cannot use g_file_replace_contents() here because we should handle the case if file already exists */ GFileOutputStream *out = g_file_create(dest, G_FILE_CREATE_NONE, fm_job_get_cancellable(fmjob), &err); GFile *src_file; GFileInfo *inf; char *name = NULL, *iname = NULL; if (out == NULL) goto _link_error; src_file = fm_path_to_gfile(path); inf = g_file_query_info(src_file, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI"," G_FILE_ATTRIBUTE_STANDARD_ICON"," G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, G_FILE_QUERY_INFO_NONE, fm_job_get_cancellable(fmjob), NULL); g_object_unref(src_file); if (inf) { GIcon *icon = g_file_info_get_icon(inf); /* set target icon if available */ if (icon) { iname = g_icon_to_string(icon); if (iname && strncmp(iname, ". GThemedIcon ", 14) == 0) { char *tmp = strchr(&iname[14], ' '); /* it is a themed icon, guess "right" name from it */ if (tmp) *tmp = '\0'; tmp = g_strdup(&iname[14]); g_free(iname); iname = tmp; } } /* FIXME: guess the icon if not available */ src = g_strdup(g_file_info_get_attribute_string(inf, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI)); name = g_strdup(g_file_info_get_display_name(inf)); g_object_unref(inf); } if (src == NULL) src = fm_path_to_uri(path); if (name == NULL) name = fm_path_display_basename(path); dname = g_strdup_printf("[Desktop Entry]\n" "Type=Link\n" "Name=%s" "%s%s\n" "URL=%s\n", name, iname ? "\nIcon=" : "", iname ? iname : "", src); g_free(name); g_free(iname); if (!g_output_stream_write_all(G_OUTPUT_STREAM(out), dname, strlen(dname), &out_len, fm_job_get_cancellable(fmjob), &err) || !g_output_stream_close(G_OUTPUT_STREAM(out), fm_job_get_cancellable(fmjob), &err)) { g_object_unref(out); g_free(dname); goto _link_error; } g_object_unref(out); g_free(dname); } job->finished++; /* update progress */ fm_file_ops_job_emit_percent(job); if (ret && dest_folder) { FmPath *dest_path = fm_path_new_for_gfile(dest); if (!_fm_folder_event_file_added(dest_folder, dest_path)) fm_path_unref(dest_path); } g_free(src); g_object_unref(dest); } /* g_debug("finished: %llu, total: %llu", job->finished, job->total); */ g_object_unref(dest_dir); if (dest_folder) g_object_unref(dest_folder); return ret; } /** * fm_file_ops_job_set_display_name * @job: a job to set * @name: new display name * * Sets that file for file operation FM_FILE_OP_CHANGE_ATTR should have * display name changed according to @name. The job will fail if it will * be started for more than one file or if file doesn't support display * name change. * * This API may be used only before @job is started. * * Since: 1.2.0 */ void fm_file_ops_job_set_display_name(FmFileOpsJob *job, const char *name) { g_return_if_fail(FM_IS_FILE_OPS_JOB(job)); g_free(job->display_name); job->display_name = g_strdup(name); } /** * fm_file_ops_job_set_icon * @job: a job to set * @icon: new icon * * Sets that files for file operation FM_FILE_OP_CHANGE_ATTR should have * associated icon changed according to @icon. Error will be generated * if some of the files doesn't support icon change. * * This API may be used only before @job is started. * * Since: 1.2.0 */ void fm_file_ops_job_set_icon(FmFileOpsJob *job, GIcon *icon) { g_return_if_fail(FM_IS_FILE_OPS_JOB(job)); if (G_UNLIKELY(job->icon)) g_free(job->icon); job->icon = NULL; if (G_LIKELY(icon)) job->icon = g_object_ref(icon); } /** * fm_file_ops_job_set_hidden * @job: a job to set * @hidden: new hidden attribute * * Sets that files for file operation FM_FILE_OP_CHANGE_ATTR should have * 'hidden' attribute changed according to value @hidden. Error will be * generated if some of the files doesn't support such change. * * This API may be used only before @job is started. * * Since: 1.2.0 */ void fm_file_ops_job_set_hidden(FmFileOpsJob *job, gboolean hidden) { g_return_if_fail(FM_IS_FILE_OPS_JOB(job)); job->set_hidden = hidden ? 1 : 0; } /** * fm_file_ops_job_set_target * @job: a job to set * @url: new URL for shortcut * * Sets that shortcut file for file operation FM_FILE_OP_CHANGE_ATTR * should have its target URL changed according to @url. The job will * fail if it will be started for more than one file or if file doesn't * support target change. * * This API may be used only before @job is started. * * Since: 1.2.0 */ void fm_file_ops_job_set_target(FmFileOpsJob *job, const char *url) { g_return_if_fail(FM_IS_FILE_OPS_JOB(job)); g_free(job->target); job->target = g_strdup(url); } /** * fm_file_ops_job_get_options * @job: a job to set * * Retrieves bitmask set of options that are supported as return of the * #FmFileOpsJob::ask-rename signal handler. * * Returns: list of options. * * Since: 1.2.0 */ FmFileOpOption fm_file_ops_job_get_options(FmFileOpsJob* job) { g_return_val_if_fail(FM_IS_FILE_OPS_JOB(job), 0); return job->supported_options; } libfm-1.4.0/src/job/fm-file-ops-job.h000066400000000000000000000137421475513661000172240ustar00rootroot00000000000000/* * fm-file-ops-job.h * * Copyright 2009 PCMan * Copyright 2013-2014 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_FILE_OPS_JOB_H__ #define __FM_FILE_OPS_JOB_H__ #include "fm-job.h" #include "fm-deep-count-job.h" #include "fm-file-info.h" G_BEGIN_DECLS #define FM_FILE_OPS_JOB_TYPE (fm_file_ops_job_get_type()) #define FM_FILE_OPS_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_FILE_OPS_JOB_TYPE, FmFileOpsJob)) #define FM_FILE_OPS_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_FILE_OPS_JOB_TYPE, FmFileOpsJobClass)) #define FM_IS_FILE_OPS_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_FILE_OPS_JOB_TYPE)) #define FM_IS_FILE_OPS_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_FILE_OPS_JOB_TYPE)) typedef struct _FmFileOpsJob FmFileOpsJob; typedef struct _FmFileOpsJobClass FmFileOpsJobClass; /** * FmFileOpType: * @FM_FILE_OP_NONE: dummy * @FM_FILE_OP_MOVE: move file * @FM_FILE_OP_COPY: copy file * @FM_FILE_OP_TRASH: move file to trash can * @FM_FILE_OP_UNTRASH: restore file from trash can * @FM_FILE_OP_DELETE: erase file * @FM_FILE_OP_LINK: create symbolic link * @FM_FILE_OP_CHANGE_ATTR: change file owner and attributes * * Operation for #FmFileOpsJob */ typedef enum { FM_FILE_OP_NONE, FM_FILE_OP_MOVE, FM_FILE_OP_COPY, FM_FILE_OP_TRASH, FM_FILE_OP_UNTRASH, FM_FILE_OP_DELETE, FM_FILE_OP_LINK, FM_FILE_OP_CHANGE_ATTR } FmFileOpType; /** * FmFileOpOption: * @FM_FILE_OP_CANCEL: cancel operation * @FM_FILE_OP_OVERWRITE: overwrite existing file * @FM_FILE_OP_RENAME: change name and continue * @FM_FILE_OP_SKIP: skip this file * @FM_FILE_OP_SKIP_ERROR: not supported * * Operation selection on error. */ typedef enum { FM_FILE_OP_CANCEL = 0, FM_FILE_OP_OVERWRITE = 1<<0, FM_FILE_OP_RENAME = 1<<1, FM_FILE_OP_SKIP = 1<<2, FM_FILE_OP_SKIP_ERROR = 1<<3 } FmFileOpOption; /* FIXME: maybe we should create derived classes for different kind * of file operations rather than use one class to handle all kinds of * file operations. */ struct _FmFileOpsJob { FmJob parent; FmFileOpType type; FmPathList* srcs; FmPath* dest; const char* dest_fs_id; goffset total; goffset finished; goffset current_file_finished; /* goffset rate; */ guint percent; /* time_t started_time; time_t elapsed_time; time_t remaining_time; FmFileOpOption default_option; */ union { gboolean recursive; /* used by chmod/chown only */ gboolean skip_dir_content; /* used by _fm_file_ops_job_copy_file */ }; /* for chmod and chown */ gint32 uid; gint32 gid; mode_t new_mode; mode_t new_mode_mask; /* for change attributes */ char *display_name; GIcon *icon; char *target; gint8 set_hidden; FmFileOpOption supported_options; /*< private >*/ gpointer _reserved1; gpointer _reserved2; }; /** * FmFileOpsJobClass * @parent_class: the parent class * @prepared: the class closure for the #FmFileOpsJob::prepared signal * @cur_file: the class closure for the #FmFileOpsJob::cur-file signal * @percent: the class closure for the #FmFileOpsJob::percent signal * @ask_rename: the class closure for the #FmFileOpsJob::ask-rename signal */ struct _FmFileOpsJobClass { FmJobClass parent_class; void (*prepared)(FmFileOpsJob* job); void (*cur_file)(FmFileOpsJob* job, const char* file); void (*percent)(FmFileOpsJob* job, guint percent); FmFileOpOption (*ask_rename)(FmFileOpsJob* job, FmFileInfo* src, FmFileInfo* dest, char** new_name); }; GType fm_file_ops_job_get_type (void); FmFileOpsJob* fm_file_ops_job_new(FmFileOpType type, FmPathList* files); void fm_file_ops_job_set_dest(FmFileOpsJob* job, FmPath* dest); FmPath* fm_file_ops_job_get_dest(FmFileOpsJob* job); /* This only work for change attr jobs. */ void fm_file_ops_job_set_recursive(FmFileOpsJob* job, gboolean recursive); void fm_file_ops_job_set_chmod(FmFileOpsJob* job, mode_t new_mode, mode_t new_mode_mask); void fm_file_ops_job_set_chown(FmFileOpsJob* job, gint uid, gint gid); /* supported attributes are: display name, icon, hidden, target */ void fm_file_ops_job_set_display_name(FmFileOpsJob *job, const char *name); void fm_file_ops_job_set_icon(FmFileOpsJob *job, GIcon *icon); void fm_file_ops_job_set_hidden(FmFileOpsJob *job, gboolean hidden); void fm_file_ops_job_set_target(FmFileOpsJob *job, const char *url); void fm_file_ops_job_emit_prepared(FmFileOpsJob* job); void fm_file_ops_job_emit_cur_file(FmFileOpsJob* job, const char* cur_file); void fm_file_ops_job_emit_percent(FmFileOpsJob* job); FmFileOpOption fm_file_ops_job_ask_rename(FmFileOpsJob* job, GFile* src, GFileInfo* src_inf, GFile* dest, GFile** new_dest); FmFileOpOption _fm_file_ops_job_ask_new_name(FmFileOpsJob* job, GFile* src, GFile* dest, GFile** new_dest, gboolean dest_exists); FmFileOpOption fm_file_ops_job_get_options(FmFileOpsJob* job); G_END_DECLS #endif /* __FM_FILE_OPS_JOB_H__ */ libfm-1.4.0/src/job/fm-job.c000066400000000000000000000560711475513661000155050ustar00rootroot00000000000000/* * fm-job.c * * Copyright 2009 PCMan * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #define FM_DISABLE_SEAL #include "fm-job.h" #include "fm-marshal.h" #include "glib-compat.h" #include "fm-utils.h" /** * SECTION:fm-job * @short_description: Base class of all kinds of asynchronous jobs. * @title: FmJob * * @include: libfm/fm.h * * The #FmJob can be used to create asynchronous jobs performing some * time-consuming tasks in another worker thread. * To run a #FmJob in another thread you simply call * fm_job_run_async(), and then the task will be done in another * worker thread. Later, when the job is finished, #FmJob::finished signal is * emitted. When the job is still running, it's possible to cancel it * from main thread by calling fm_job_cancel(). Then, #FmJob::cancelled signal * will be emitted before emitting #FmJob::finished signal. You can also run * the job in blocking fashion instead of running it asynchronously by * calling fm_job_run_sync(). */ enum { FINISHED, ERROR, CANCELLED, ASK, N_SIGNALS }; typedef struct _FmIdleCall { FmJob* job; FmJobCallMainThreadFunc func; gpointer user_data; gpointer ret; }FmIdleCall; static void fm_job_finalize (GObject *object); /* static gboolean fm_job_error_accumulator(GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data); */ static void on_cancellable_cancelled(GCancellable* cancellable, FmJob* job); G_DEFINE_ABSTRACT_TYPE(FmJob, fm_job, G_TYPE_OBJECT); static gboolean fm_job_real_run_async(FmJob* job); static gboolean on_idle_cleanup(gpointer unused); static void job_thread(FmJob* job, gpointer unused); static guint idle_handler = 0; static GSList* finished = NULL; G_LOCK_DEFINE_STATIC(idle_handler); static GThreadPool* thread_pool = NULL; static guint n_jobs = 0; static guint signals[N_SIGNALS]; static void fm_job_emit_finished(FmJob* job) { g_signal_emit(job, signals[FINISHED], 0); } static void fm_job_emit_cancelled(FmJob* job) { g_signal_emit(job, signals[CANCELLED], 0); } static void fm_job_dispose(GObject *object) { FmJob *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_JOB(object)); self = (FmJob*)object; if(self->cancellable) { g_signal_handlers_disconnect_by_func(self->cancellable, on_cancellable_cancelled, self); g_object_unref(self->cancellable); self->cancellable = NULL; #if GLIB_CHECK_VERSION(2, 32, 0) g_rec_mutex_clear(&self->stop); #else g_static_rec_mutex_free(&self->stop); #endif } G_OBJECT_CLASS(fm_job_parent_class)->dispose(object); } static void fm_job_class_init(FmJobClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->dispose = fm_job_dispose; g_object_class->finalize = fm_job_finalize; klass->run_async = fm_job_real_run_async; fm_job_parent_class = (GObjectClass*)g_type_class_peek(G_TYPE_OBJECT); /** * FmJob::finished: * @job: a job that emitted the signal * * The #FmJob::finished signal is emitted after the job is finished. * The signal is never emitted if the fm_job_run_XXX function * returned %FALSE, in that case the #FmJob::cancelled signal will be * emitted instead. * * Since: 0.1.0 */ signals[FINISHED] = g_signal_new( "finished", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmJobClass, finished ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 ); /** * FmJob::error: * @job: a job that emitted the signal * @error: an error descriptor * @severity: #FmJobErrorSeverity of the error * * The #FmJob::error signal is emitted when errors happen. A case if * more than one handler is connected to this signal is ambiguous. * * Return value: #FmJobErrorAction that should be performed on that error. * * Since: 0.1.0 */ signals[ERROR] = g_signal_new( "error", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET ( FmJobClass, error ), NULL /*fm_job_error_accumulator*/, NULL, #if GLIB_CHECK_VERSION(2,26,0) fm_marshal_UINT__BOXED_UINT, G_TYPE_UINT, 2, G_TYPE_ERROR, G_TYPE_UINT ); #else fm_marshal_INT__POINTER_INT, G_TYPE_INT, 2, G_TYPE_POINTER, G_TYPE_INT ); #endif /** * FmJob::cancelled: * @job: a job that emitted the signal * * The #FmJob::cancelled signal is emitted when the job is cancelled * or aborted due to critical errors. * * Since: 0.1.0 */ signals[CANCELLED] = g_signal_new( "cancelled", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET ( FmJobClass, cancelled ), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0 ); /** * FmJob::ask: * @job: a job that emitted the signal * @question: (const gchar *) a question to ask user * @options: (gchar* const *) list of choices to ask user * * The #FmJob::ask signal is emitted when the job asks for some * user interactions. The user then will have a list of available * @options. If there is more than one handler connected to the * signal then only one of them will receive it. * * Return value: user's choice. * * Since: 0.1.0 */ signals[ASK] = g_signal_new( "ask", G_TYPE_FROM_CLASS ( klass ), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET ( FmJobClass, ask ), g_signal_accumulator_first_wins, NULL, fm_marshal_INT__POINTER_POINTER, G_TYPE_INT, 2, G_TYPE_POINTER, G_TYPE_POINTER ); } static void fm_job_init(FmJob *self) { /* create the thread pool if it doesn't exist. */ if( G_UNLIKELY(!thread_pool) ) thread_pool = g_thread_pool_new((GFunc)job_thread, NULL, -1, FALSE, NULL); ++n_jobs; } /** * fm_job_new * * Creates a new #FmJob object. * * Returns: a new #FmJob object. * * Since: 0.1.0 */ FmJob* fm_job_new(void) { return (FmJob*)g_object_new(FM_TYPE_JOB, NULL); } static void fm_job_finalize(GObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_JOB(object)); if (G_OBJECT_CLASS(fm_job_parent_class)->finalize) (* G_OBJECT_CLASS(fm_job_parent_class)->finalize)(object); --n_jobs; if(0 == n_jobs) { g_thread_pool_free(thread_pool, TRUE, FALSE); thread_pool = NULL; } } static gboolean fm_job_real_run_async(FmJob* job) { g_thread_pool_push(thread_pool, job, NULL); return TRUE; } /** * fm_job_run_async * @job: a job to run * * Starts the @job asyncronously creating new thread. If job starts * successfully then the #FmJob::finished signal will be emitted when * @job is either succeeded or was cancelled. If @job could not be * started then #FmJob::cancelled signal is emitted before return from * this function. * * Returns: %TRUE if job started successfully. * * Since: 0.1.0 */ gboolean fm_job_run_async(FmJob* job) { FmJobClass* klass = FM_JOB_CLASS(G_OBJECT_GET_CLASS(job)); gboolean ret; job->running = TRUE; g_object_ref(job); /* acquire a ref, it will be unrefed by on_idle_cleanup() */ ret = klass->run_async(job); if(G_UNLIKELY(!ret)) /* failed? */ { fm_job_emit_cancelled(job); g_object_unref(job); } return ret; } /** * fm_job_run_sync * @job: a job to run * * Runs the @job in current thread in a blocking fashion. The job will * emit either #FmJob::cancelled signal if job was cancelled * or #FmJob::finished signal if it finished successfully. * * Returns: %TRUE if @job ran successfully. * * Since: 0.1.0 */ /* run a job in current thread in a blocking fashion. */ gboolean fm_job_run_sync(FmJob* job) { FmJobClass* klass = FM_JOB_CLASS(G_OBJECT_GET_CLASS(job)); gboolean ret; job->running = TRUE; ret = klass->run(job); job->running = FALSE; if(job->cancel) fm_job_emit_cancelled(job); else fm_job_emit_finished(job); return ret; } static void on_sync_job_finished(FmJob* job, GMainLoop* mainloop) { g_main_loop_quit(mainloop); job->running = FALSE; } /** * fm_job_run_sync_with_mainloop * @job: a job to run * * Runs the @job in current thread in a blocking fashion and an additional * mainloop being created to prevent blocking of user interface. If @job * started successfully then #FmJob::finished signal is emitted when @job * is either succeeded or was cancelled. * Note: using this API from within GTK main loop will lead to deadlock * therefore if it is a GTK application then caller should unlock GDK * threads before calling this API and lock them back after return from * it. This statement is valid for any GTK application that uses locks. * * Returns: %TRUE if job started successfully. * * Since: 0.1.1 */ gboolean fm_job_run_sync_with_mainloop(FmJob* job) { GMainLoop* mainloop = g_main_loop_new(NULL, FALSE); gboolean ret; g_signal_connect(job, "finished", G_CALLBACK(on_sync_job_finished), mainloop); ret = fm_job_run_async(job); if(G_LIKELY(ret)) { g_main_loop_run(mainloop); } g_signal_handlers_disconnect_by_func(job, on_sync_job_finished, mainloop); g_main_loop_unref(mainloop); return ret; } /* this is called from working thread */ static void job_thread(FmJob* job, gpointer unused) { FmJobClass* klass = FM_JOB_CLASS(G_OBJECT_GET_CLASS(job)); klass->run(job); /* let the main thread know that we're done, and free the job * in idle handler if neede. */ fm_job_finish(job); } /** * fm_job_cancel * @job: a job to cancel * * Cancels the @job. * * Since: 0.1.0 */ /* cancel the job */ void fm_job_cancel(FmJob* job) { FmJobClass* klass = FM_JOB_CLASS(G_OBJECT_GET_CLASS(job)); job->cancel = TRUE; if(job->cancellable) g_cancellable_cancel(job->cancellable); if(klass->cancel) klass->cancel(job); } static gboolean on_idle_call(gpointer input_data) { FmIdleCall* data = (FmIdleCall*)input_data; data->ret = data->func(data->job, data->user_data); return FALSE; } /** * fm_job_call_main_thread * @job: the job that calls main thread * @func: callback to run from main thread * @user_data: user data for the callback * * Stops calling thread, waits main thread for idle, passes @user_data * to callback @func in main thread, gathers result of callback, and * returns it to caller. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * This function should be called from working thread only. * * Returns: return value from running @func. * * Since: 0.1.0 */ gpointer fm_job_call_main_thread(FmJob* job, FmJobCallMainThreadFunc func, gpointer user_data) { FmIdleCall data; data.job = job; data.func = func; data.user_data = user_data; fm_run_in_default_main_context(on_idle_call, &data); return data.ret; } /** * fm_job_finish * @job: the job that was finished * * Schedules the finishing of job. Once this function is called the * @job becomes invalid for the caller and should be not used anymore. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * This function should be called from working thread only. * * Since: 0.1.0 */ void fm_job_finish(FmJob* job) { G_LOCK(idle_handler); if(0 == idle_handler) idle_handler = g_idle_add(on_idle_cleanup, NULL); finished = g_slist_append(finished, job); job->running = FALSE; G_UNLOCK(idle_handler); } struct AskData { const char* question; gchar* const *options; }; static gpointer ask_in_main_thread(FmJob* job, gpointer input_data) { gint ret; #define data ((struct AskData*)input_data) g_signal_emit(job, signals[ASK], 0, data->question, data->options, &ret); #undef data return GINT_TO_POINTER(ret); } /** * fm_job_ask * @job: the job that calls main thread * @question: the text to ask the user * @...: list of choices to give the user * * Asks the user for some interactions. The user will have a list of * available options and should make a choice. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * This function should be called from working thread only. * * Returns: user's choice. * * Since: 0.1.0 */ gint fm_job_ask(FmJob* job, const char* question, ...) { gint ret; va_list args; va_start (args, question); ret = fm_job_ask_valist(job, question, args); va_end (args); return ret; } /** * fm_job_askv * @job: the job that calls main thread * @question: the text to ask the user * @options: list of choices to give the user * * Asks the user for some interactions. The user will have a list of * available options and should make a choice. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * This function should be called from working thread only. * * Returns: user's choice. * * Since: 0.1.0 */ gint fm_job_askv(FmJob* job, const char* question, gchar* const *options) { struct AskData data; data.question = question; data.options = options; return GPOINTER_TO_INT(fm_job_call_main_thread(job, ask_in_main_thread, &data)); } /** * fm_job_ask_valist * @job: the job that calls main thread * @question: the text to ask the user * @options: list of choices to give the user * * Asks the user for some interactions. The user will have a list of * available options and should make a choice. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * This function should be called from working thread only. * * Returns: user's choice. * * Since: 0.1.0 */ gint fm_job_ask_valist(FmJob* job, const char* question, va_list options) { GArray* opts = g_array_sized_new(TRUE, TRUE, sizeof(char*), 6); gint ret; const char* opt = va_arg(options, const char*); while(opt) { g_array_append_val(opts, opt); opt = va_arg (options, const char *); } ret = fm_job_askv(job, question, &opts->data); g_array_free(opts, TRUE); return ret; } /* unref finished job objects in main thread on idle */ static gboolean on_idle_cleanup(gpointer unused) { GSList* jobs; GSList* l; G_LOCK(idle_handler); jobs = finished; finished = NULL; idle_handler = 0; G_UNLOCK(idle_handler); for(l = jobs; l; l=l->next) { FmJob* job = FM_JOB(l->data); if(job->cancel) fm_job_emit_cancelled(job); fm_job_emit_finished(job); g_object_unref(job); } g_slist_free(jobs); return FALSE; } /** * fm_job_init_cancellable * @job: the job to init * * Used by derived classes to implement #FmJobClass:run() using gio inside. * This API tries to initialize a #GCancellable object for use with gio and * should only be called once in the constructor of derived classes which * require the use of #GCancellable. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * Since: 0.1.0 */ void fm_job_init_cancellable(FmJob* job) { #if GLIB_CHECK_VERSION(2, 32, 0) g_rec_mutex_init(&job->stop); #else g_static_rec_mutex_init(&job->stop); #endif job->cancellable = g_cancellable_new(); g_signal_connect(job->cancellable, "cancelled", G_CALLBACK(on_cancellable_cancelled), job); } /** * fm_job_get_cancellable * @job: the job to inspect * * Get an existing #GCancellable object from @job for use with gio in * another job by calling fm_job_set_cancellable(). * This can be used when you wish to share a cancellable object * among different jobs. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * Returns: a #GCancellable object if it was initialized for @job. * * Since: 0.1.9 */ GCancellable* fm_job_get_cancellable(FmJob* job) { return job->cancellable; } /** * fm_job_set_cancellable * @job: the job to set * @cancellable: (allow-none): a shared cancellable object * * Lets the job to use an existing @cancellable object. * This can be used when you wish to share a cancellable object * among different jobs. * This should only be called before the @job is launched. * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * Since: 0.1.0 */ void fm_job_set_cancellable(FmJob* job, GCancellable* cancellable) { if(G_UNLIKELY(job->cancellable)) { g_signal_handlers_disconnect_by_func(job->cancellable, on_cancellable_cancelled, job); g_object_unref(job->cancellable); } if(G_LIKELY(cancellable)) { job->cancellable = (GCancellable*)g_object_ref(cancellable); g_signal_connect(job->cancellable, "cancelled", G_CALLBACK(on_cancellable_cancelled), job); } else job->cancellable = NULL; } static void on_cancellable_cancelled(GCancellable* cancellable, FmJob* job) { job->cancel = TRUE; } struct ErrData { GError* err; FmJobErrorSeverity severity; }; static gpointer error_in_main_thread(FmJob* job, gpointer input_data) { guint ret; #define data ((struct ErrData*)input_data) g_debug("FmJob error: %s", data->err->message); g_signal_emit(job, signals[ERROR], 0, data->err, (guint)data->severity, &ret); #undef data return GUINT_TO_POINTER(ret); } /** * fm_job_emit_error * @job: a job that emitted the signal * @err: an error descriptor * @severity: severity of the error * * Emits an #FmJob::error signal in the main thread to notify it when an * error occurs. * The return value of this function is the return value returned by * the connected signal handlers. * If @severity is FM_JOB_ERROR_CRITICAL, the returned value is ignored and * fm_job_cancel() is called to abort the job. Otherwise, the signal * handler of this error can return FM_JOB_RETRY to ask for retrying the * failed operation, return FM_JOB_CONTINUE to ignore the error and * continue the remaining job, or return FM_JOB_ABORT to abort the job. * If FM_JOB_ABORT is returned by the signal handler, fm_job_cancel() * will be called in fm_job_emit_error(). * * This APIs is private to #FmJob and should only be used in the * implementation of classes derived from #FmJob. * * This function should be called from working thread only. * * Returns: action that should be performed on that error. * * Since: 0.1.0 */ FmJobErrorAction fm_job_emit_error(FmJob* job, GError* err, FmJobErrorSeverity severity) { FmJobErrorAction ret; struct ErrData data; g_return_val_if_fail(err, FM_JOB_ABORT); data.err = err; data.severity = severity; ret = GPOINTER_TO_UINT(fm_job_call_main_thread(job, error_in_main_thread, &data)); if(severity == FM_JOB_ERROR_CRITICAL || ret == FM_JOB_ABORT) { ret = FM_JOB_ABORT; fm_job_cancel(job); } /* If the job is already cancelled, retry is not allowed. */ if(ret == FM_JOB_RETRY ) { if(job->cancel || (err->domain == G_IO_ERROR && err->code == G_IO_ERROR_CANCELLED)) ret = FM_JOB_CONTINUE; } return ret; } /* FIXME: need to re-think how to do this in a correct way. */ /* gboolean fm_job_error_accumulator(GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer data) { int val = g_value_get_int(handler_return); g_debug("accumulate: %d, %d", g_value_get_int(return_accu), val); g_value_set_int(return_accu, val); return val != FM_JOB_CONTINUE; } */ #if !GLIB_CHECK_VERSION(2, 32, 0) #define g_rec_mutex_lock g_static_rec_mutex_lock #define g_rec_mutex_unlock g_static_rec_mutex_unlock #endif /* lock the job but be sure lock is single */ static void _ensure_job_locked(FmJob *job) { g_rec_mutex_lock(&job->stop); if (job->suspended) g_rec_mutex_unlock(&job->stop); /* drop extra lock */ } /** * fm_job_is_cancelled * @job: the job to inspect * * Checks if the job is already cancelled. * * Returns: %TRUE if the job is already cancelled. * * Since: 0.1.9 */ gboolean fm_job_is_cancelled(FmJob* job) { g_rec_mutex_lock(&job->stop); /* wait on lock */ g_rec_mutex_unlock(&job->stop); return job->cancel; } /** * fm_job_is_running * @job: the job to inspect * * Checks if the job is still running. * * Returns: %TRUE if the job is still running. * * Since: 0.1.9 */ gboolean fm_job_is_running(FmJob* job) { return job->running; } /** * fm_job_pause * @job: a job to apply * * Locks execution of job until next call to fm_job_resume(). This call * may be used from thread different from the thread where the job runs * in. This call may be done again (but have no extra effect) from the * same thread. Any other usage may lead to deadlock. * * Returns: %FALSE if job cannot be locked. * * Since: 1.2.0 */ gboolean fm_job_pause(FmJob *job) { g_return_val_if_fail(job != NULL && FM_IS_JOB(job), FALSE); if (!job->cancellable) return FALSE; _ensure_job_locked(job); /* acquire lock */ job->suspended = TRUE; /* mark appropriately */ return TRUE; } /** * fm_job_resume * @job: a job to apply * * Unlocks execution of @job that was made by previous call to * fm_job_pause(). This call may be used only from the same thread * where previous fm_job_pause() was made. Any other usage may lead to * deadlock. * * Since: 1.2.0 */ void fm_job_resume(FmJob *job) { g_return_if_fail(job != NULL && FM_IS_JOB(job)); if (!job->cancellable) return; _ensure_job_locked(job); /* acquire lock... */ job->suspended = FALSE; g_rec_mutex_unlock(&job->stop); /* ...and drop it */ } libfm-1.4.0/src/job/fm-job.h000066400000000000000000000212401475513661000155000ustar00rootroot00000000000000/* * fm-job.h * * Copyright 2009 PCMan * Copyright 2012-2013 Andriy Grytsenko (LStranger) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_JOB_H__ #define __FM_JOB_H__ #include #include #include #include "fm-seal.h" /* If we're not using GNU C, elide __attribute__ */ #ifndef __GNUC__ # define __attribute__(x) #endif G_BEGIN_DECLS #define FM_TYPE_JOB (fm_job_get_type()) #define FM_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_JOB, FmJob)) #define FM_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_JOB, FmJobClass)) #define FM_IS_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_JOB)) #define FM_IS_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_JOB)) typedef struct _FmJob FmJob; typedef struct _FmJobClass FmJobClass; typedef gpointer (*FmJobCallMainThreadFunc)(FmJob* job, gpointer user_data); /** * FmJobErrorSeverity * @FM_JOB_ERROR_WARNING: not an error, just a warning * @FM_JOB_ERROR_MILD: no big deal, can be ignored most of the time * @FM_JOB_ERROR_MODERATE: moderate errors * @FM_JOB_ERROR_SEVERE: severe errors, whether to abort operation depends on error handlers * @FM_JOB_ERROR_CRITICAL: critical errors, the operation is aborted */ typedef enum { FM_JOB_ERROR_WARNING, FM_JOB_ERROR_MILD, FM_JOB_ERROR_MODERATE, FM_JOB_ERROR_SEVERE, FM_JOB_ERROR_CRITICAL } FmJobErrorSeverity; /** * FmJobErrorAction * @FM_JOB_CONTINUE: ignore the error and continue remaining work * @FM_JOB_RETRY: retry the previously failed operation. (not every kind of job support this) * @FM_JOB_ABORT: abort the whole job * * The action that should be performed after error happened. * Usually chosen by user. */ typedef enum { FM_JOB_CONTINUE, FM_JOB_RETRY, FM_JOB_ABORT } FmJobErrorAction; struct _FmJob { /*< private >*/ GObject parent; /* booleans but need unlocked access */ sig_atomic_t FM_SEAL(cancel); sig_atomic_t FM_SEAL(running); /* optional, should be created if the job uses gio */ GCancellable* FM_SEAL(cancellable); /* used for suspending the job */ gboolean FM_SEAL(suspended); #if GLIB_CHECK_VERSION(2, 32, 0) GRecMutex FM_SEAL(stop); #else GStaticRecMutex FM_SEAL(stop); #endif gpointer _reserved1; gpointer _reserved2; }; /** * FmJobClass: * @parent_class: the parent class * @finished: the class closure for the #FmJob::finished signal. * @error: the class closure for the #FmJob::error signal. * @cancelled: the class closure for the #FmJob::cancelled signal. * @ask: the class closure for the #FmJob::ask signal. * @run_async: the @run_async function called to create a thread for the * job execution. Returns %TRUE if thread was created successfully. * The most probably should be not overridden by any derived class. * @run: the @run function is called to perform actual job actions. Returns * value that will be returned from call fm_job_run_sync(). Should be * set by any class derived from #FmJob. * @cancel: the @cancel function is called when the job is cancelled. * It can perform some class-specific operations then. */ struct _FmJobClass { GObjectClass parent_class; /*< public >*/ /* the class closures for signals */ void (*finished)(FmJob* job); guint (*error)(FmJob* job, GError* err, guint severity); /* guint above are: FmJobErrorAction and FmJobErrorSeverity */ void (*cancelled)(FmJob* job); gint (*ask)(FmJob* job, const gchar* question, gchar* const *options); /* routines used by methods */ gboolean (*run_async)(FmJob* job); /* for fm_job_run_async() */ gboolean (*run)(FmJob* job); /* for any fm_job_run_*() */ void (*cancel)(FmJob* job); /* for fm_job_cancel() */ /*< private >*/ gpointer _reserved1; }; /* Base type of all file I/O jobs. * not directly called by applications. */ GType fm_job_get_type (void); /* return TRUE if the job is already cancelled */ gboolean fm_job_is_cancelled(FmJob* job); /* return TRUE if the job is still running */ gboolean fm_job_is_running(FmJob* job); /* Run a job asynchronously in another working thread, and * emit 'finished' signal in the main thread after its termination. * The default implementation of FmJob::run_async() create a working * thread in thread pool, and calls FmJob::run() in it. */ gboolean fm_job_run_async(FmJob* job) __attribute__((warn_unused_result)); /* Run a job in current thread in a blocking fashion. * A job running synchronously with this function should be unrefed * later with g_object_unref when no longer needed. */ gboolean fm_job_run_sync(FmJob* job); /* Run a job in current thread in a blocking fashion and an additional * mainloop being created to prevent blocking of user interface. * A job running synchronously with this function should be unrefed * later with g_object_unref when no longer needed. */ gboolean fm_job_run_sync_with_mainloop(FmJob* job); /* Cancel the running job. can be called from any thread. */ void fm_job_cancel(FmJob* job); /* Following APIs are private to FmJob and should only be used in the * implementation of classes derived from FmJob. * Besides, they should be called from working thread only if another * isn't stated. */ gpointer fm_job_call_main_thread(FmJob* job, FmJobCallMainThreadFunc func, gpointer user_data); /* Used by derived classes to implement FmJob::run() using gio inside. * This API tried to initialize a GCancellable object for use with gio and * should only be called once in the constructor of derived classes which * require the use of GCancellable. */ void fm_job_init_cancellable(FmJob* job); /* Used to implement FmJob::run() using gio inside. * This API tried to initialize a GCancellable object for use with gio. * Prior to calling this API, fm_job_init_cancellable() should be * called first to initiate GCancellable object. Otherwise NULL is returned. */ GCancellable* fm_job_get_cancellable(FmJob* job); /* Let the job use an existing cancellable object. * This can be used when you wish to share a cancellable object * among different jobs. * This should only be called before the job is launched. */ void fm_job_set_cancellable(FmJob* job, GCancellable* cancellable); /* only call this at the end of working thread if you're going to * override FmJob::run_async() and use your own multi-threading mechnism. */ void fm_job_finish(FmJob* job); /* fm_job_emit_finished() and fm_job_emit_cancelled() can be called only * from main loop thread, You should never use it since FmJob API do it. */ /* void fm_job_emit_finished(FmJob* job); */ /* void fm_job_emit_cancelled(FmJob* job); */ /* Emit an 'error' signal to notify the main thread when an error occurs. * The return value of this function is the return value returned by * the connected signal handlers. * If severity is FM_JOB_ERROR_CRITICAL, the returned value is ignored and * fm_job_cancel() is called to abort the job. Otherwise, the signal * handler of this error can return FM_JOB_RETRY to ask for retrying the * failed operation, return FM_JOB_CONTINUE to ignore the error and * continue the remaining job, or return FM_JOB_ABORT to abort the job. * If FM_JOB_ABORT is returned by the signal handler, fm_job_cancel * will be called in fm_job_emit_error(). */ FmJobErrorAction fm_job_emit_error(FmJob* job, GError* err, FmJobErrorSeverity severity); gint fm_job_ask(FmJob* job, const char* question, ...); gint fm_job_askv(FmJob* job, const char* question, gchar* const *options); gint fm_job_ask_valist(FmJob* job, const char* question, va_list options); gboolean fm_job_pause(FmJob *job); void fm_job_resume(FmJob *job); G_END_DECLS #endif /* __FM-JOB_H__ */ libfm-1.4.0/src/job/fm-simple-job.c000066400000000000000000000071731475513661000167730ustar00rootroot00000000000000/* * fm-simple-job.c * * Copyright 2010 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ /** * SECTION:fm-simple-job * @short_description: Job to run a function asynchronously. * @title: FmSimpleJob * * @include: libfm/fm.h * * The #FmJob can be used to create asynchronous job which just run some * simple function with provided data. */ #include "fm-simple-job.h" #define FM_TYPE_SIMPLE_JOB (fm_simple_job_get_type()) #define FM_SIMPLE_JOB(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ FM_TYPE_SIMPLE_JOB, FmSimpleJob)) #define FM_SIMPLE_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ FM_TYPE_SIMPLE_JOB, FmSimpleJobClass)) #define FM_IS_SIMPLE_JOB(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ FM_TYPE_SIMPLE_JOB)) #define FM_IS_SIMPLE_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ FM_TYPE_SIMPLE_JOB)) typedef struct _FmSimpleJob FmSimpleJob; typedef struct _FmSimpleJobClass FmSimpleJobClass; struct _FmSimpleJob { FmJob parent; FmSimpleJobFunc func; gpointer user_data; GDestroyNotify destroy_data; }; struct _FmSimpleJobClass { FmJobClass parent_class; }; G_DEFINE_TYPE(FmSimpleJob, fm_simple_job, FM_TYPE_JOB); static void fm_simple_job_finalize (GObject *object); static gboolean fm_simple_job_run(FmJob *job); static void fm_simple_job_class_init(FmSimpleJobClass *klass) { GObjectClass *g_object_class; FmJobClass* job_class = FM_JOB_CLASS(klass); g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = fm_simple_job_finalize; job_class->run = fm_simple_job_run; } static void fm_simple_job_finalize(GObject *object) { FmSimpleJob *self; g_return_if_fail(object != NULL); g_return_if_fail(FM_IS_SIMPLE_JOB(object)); self = (FmSimpleJob*)object; if(self->user_data && self->destroy_data) self->destroy_data(self->user_data); G_OBJECT_CLASS(fm_simple_job_parent_class)->finalize(object); } static void fm_simple_job_init(FmSimpleJob *self) { } /** * fm_simple_job_new * @func: user function to run asynchronously * @user_data: user data provided for @func * @destroy_data: user function to free data after job finished * * Creates a new simple #FmJob for user task. * * Returns: (transfer full): a new #FmJob object. * * Since: 0.1.0 */ FmJob* fm_simple_job_new(FmSimpleJobFunc func, gpointer user_data, GDestroyNotify destroy_data) { FmSimpleJob* job = (FmSimpleJob*)g_object_new(FM_TYPE_SIMPLE_JOB, NULL); job->func = func; job->user_data = user_data; job->destroy_data = destroy_data; return (FmJob*)job; } static gboolean fm_simple_job_run(FmJob *job) { FmSimpleJob* sjob = FM_SIMPLE_JOB(job); return sjob->func ? sjob->func(job, sjob->user_data) : FALSE; } libfm-1.4.0/src/job/fm-simple-job.h000066400000000000000000000030051475513661000167660ustar00rootroot00000000000000/* * fm-simple-job.h * * Copyright 2010 Hong Jen Yee (PCMan) * * This file is a part of the Libfm library. * * 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 */ #ifndef __FM_SIMPLE_JOB_H__ #define __FM_SIMPLE_JOB_H__ #include "fm-job.h" G_BEGIN_DECLS /** * FmSimpleJobFunc * @job: the job object * @user_data: user data provided on fm_simple_job_new() call * * The user function which will be ran asynchronously by #FmJob API. * * Return value: value to return from fm_job_run_sync(). */ typedef gboolean (*FmSimpleJobFunc)(FmJob* job, gpointer user_data); GType fm_simple_job_get_type(void); FmJob* fm_simple_job_new(FmSimpleJobFunc func, gpointer user_data, GDestroyNotify destroy_data); G_END_DECLS #endif /* __FM_SIMPLE_JOB_H__ */ libfm-1.4.0/src/modules/000077500000000000000000000000001475513661000150545ustar00rootroot00000000000000libfm-1.4.0/src/modules/Makefile.am000066400000000000000000000034731475513661000171170ustar00rootroot00000000000000## Makefile.am -- Process this file with automake to produce Makefile.in NULL = # we use glib/gio/libfm only by default AM_CPPFLAGS = \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/base -I$(top_srcdir)/src/job \ -Werror-implicit-function-declaration \ $(GIO_CFLAGS) # tell libtool we compile module not library AM_LDFLAGS = \ -no-undefined -module -avoid-version -shared -export-dynamic \ -L$(libdir) \ $(GIO_LIBS) # the module should be linked only with libfm, not libfm-gtk or whatever LIBS += $(top_builddir)/src/libfm.la # change default and put modules below usual place pkglibdir = $(libdir)/@PACKAGE@/modules # modules to compile pkglib_LTLIBRARIES = \ vfs-menu.la \ vfs-search.la \ $(NULL) if ENABLE_GTK pkglib_LTLIBRARIES += \ gtk-fileprop-x-desktop.la \ gtk-fileprop-x-shortcut.la \ gtk-menu-trash.la \ gtk-menu-actions.la \ $(NULL) endif # install only .so files, we don't need .la files install-exec-hook: rm -f $(DESTDIR)$(pkglibdir)/*.la PLUGINS_INSTALLED = $(pkglib_LTLIBRARIES:.la=.so) uninstall-hook: cd $(DESTDIR)$(pkglibdir) && rm -f $(PLUGINS_INSTALLED) || true # module-specific parameters vfs_menu_la_CFLAGS = $(MENU_CACHE_CFLAGS) -I$(top_srcdir)/src/extra vfs_menu_la_LIBADD = $(MENU_CACHE_LIBS) $(top_builddir)/src/libfm-extra.la gtk_fileprop_x_desktop_la_CFLAGS = $(GTK_CFLAGS) -I$(top_srcdir)/src/gtk gtk_fileprop_x_desktop_la_LIBADD = $(GTK_LIBS) gtk_fileprop_x_shortcut_la_CFLAGS = $(GTK_CFLAGS) -I$(top_srcdir)/src/gtk gtk_fileprop_x_shortcut_la_LIBADD = $(GTK_LIBS) gtk_menu_actions_la_CFLAGS = -I$(top_srcdir)/src/actions $(GTK_CFLAGS) -I$(top_srcdir)/src/gtk gtk_menu_actions_la_LIBADD = $(GTK_LIBS) $(top_builddir)/src/@LIBFM_GTK_LTLIBRARIES@ gtk_menu_trash_la_CFLAGS = $(GTK_CFLAGS) -I$(top_srcdir)/src/gtk gtk_menu_trash_la_LIBADD = $(GTK_LIBS) $(top_builddir)/src/@LIBFM_GTK_LTLIBRARIES@ libfm-1.4.0/src/modules/gtk-fileprop-x-desktop.c000066400000000000000000000437761475513661000215600ustar00rootroot00000000000000/* * fm-dentry-properties.c * * Copyright 2008 * Copyright 2013 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /* File properties dialog extension for desktop entry type */ #include #include #include "fm.h" #include "fm-file-properties.h" #define GRP_NAME "Desktop Entry" typedef struct _FmFilePropertiesDEntryData FmFilePropertiesDEntryData; struct _FmFilePropertiesDEntryData { GFile *file; GKeyFile *kf; GObject *icon; GtkEntry *name; GtkEntry *comment; GtkEntry *exec; GtkEntry *generic_name; GtkEntry *path; GtkToggleButton *hidden; GtkToggleButton *terminal; GtkToggleButton *keep_open; GtkToggleButton *notification; gchar *lang; gchar *saved_name; gboolean was_hidden; gboolean changed; }; static gboolean exe_filter(const GtkFileFilterInfo *inf, gpointer user_data) { return g_file_test(inf->filename, G_FILE_TEST_IS_EXECUTABLE); } static void _dentry_browse_exec_event(GtkButton *button, FmFilePropertiesDEntryData *data) { /* g_debug("browse button pressed"); */ /* this handler is also taken from lxshortcut */ GtkWidget *chooser; GtkFileFilter *filter; chooser = gtk_file_chooser_dialog_new(_("Choose Executable File"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser), "/usr/bin"); filter = gtk_file_filter_new(); gtk_file_filter_set_name(GTK_FILE_FILTER(filter), _("Executable files") ); gtk_file_filter_add_custom(GTK_FILE_FILTER(filter), GTK_FILE_FILTER_FILENAME, exe_filter, NULL, NULL); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); if (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_OK) { char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); gtk_entry_set_text(data->exec, file); g_free(file); } gtk_widget_destroy(chooser); } static void _dentry_name_changed(GtkEditable *editable, FmFilePropertiesDEntryData *data) { /* g_debug("entry content changed"); */ if (data->lang) g_key_file_set_locale_string(data->kf, GRP_NAME, "Name", data->lang, gtk_entry_get_text(GTK_ENTRY(editable))); else g_key_file_set_string(data->kf, GRP_NAME, "Name", gtk_entry_get_text(GTK_ENTRY(editable))); data->changed = TRUE; } static void _dentry_tooltip_changed(GtkEditable *editable, FmFilePropertiesDEntryData *data) { /* g_debug("entry content changed"); */ if (data->lang) g_key_file_set_locale_string(data->kf, GRP_NAME, "Comment", data->lang, gtk_entry_get_text(GTK_ENTRY(editable))); else g_key_file_set_string(data->kf, GRP_NAME, "Comment", gtk_entry_get_text(GTK_ENTRY(editable))); data->changed = TRUE; } static void _dentry_exec_changed(GtkEditable *editable, FmFilePropertiesDEntryData *data) { /* g_debug("entry content changed"); */ g_key_file_set_string(data->kf, GRP_NAME, "Exec", gtk_entry_get_text(GTK_ENTRY(editable))); data->changed = TRUE; } static void _dentry_genname_changed(GtkEditable *editable, FmFilePropertiesDEntryData *data) { /* g_debug("entry content changed"); */ g_key_file_set_string(data->kf, GRP_NAME, "GenericName", gtk_entry_get_text(GTK_ENTRY(editable))); data->changed = TRUE; } static void _dentry_path_changed(GtkEditable *editable, FmFilePropertiesDEntryData *data) { /* g_debug("entry content changed"); */ g_key_file_set_string(data->kf, GRP_NAME, "Path", gtk_entry_get_text(GTK_ENTRY(editable))); data->changed = TRUE; } static void _dentry_terminal_toggled(GtkToggleButton *togglebutton, FmFilePropertiesDEntryData *data) { gboolean active = gtk_toggle_button_get_active(togglebutton); /* g_debug("run in terminal toggled"); */ g_key_file_set_boolean(data->kf, GRP_NAME, "Terminal", active); gtk_widget_set_sensitive(GTK_WIDGET(data->keep_open), active); if (!active) /* it is not reasonable to keep the key if no Terminal is set */ g_key_file_remove_key(data->kf, GRP_NAME, "X-KeepTerminal", NULL); data->changed = TRUE; } static void _dentry_keepterm_toggled(GtkToggleButton *togglebutton, FmFilePropertiesDEntryData *data) { /* g_debug("keep terminal open toggled"); */ g_key_file_set_boolean(data->kf, GRP_NAME, "X-KeepTerminal", gtk_toggle_button_get_active(togglebutton)); data->changed = TRUE; } static void _dentry_notification_toggled(GtkToggleButton *togglebutton, FmFilePropertiesDEntryData *data) { /* g_debug("startup notification toggled"); */ g_key_file_set_boolean(data->kf, GRP_NAME, "StartupNotify", gtk_toggle_button_get_active(togglebutton)); data->changed = TRUE; } static void _dentry_hidden_toggled(GtkToggleButton *togglebutton, FmFilePropertiesDEntryData *data) { /* g_debug("no display toggled"); */ g_key_file_set_boolean(data->kf, GRP_NAME, "Hidden", gtk_toggle_button_get_active(togglebutton)); data->changed = TRUE; } static gpointer _dentry_ui_init(GtkBuilder *ui, gpointer uidata, FmFileInfoList *files) { GObject *widget; GtkWidget *new_widget; FmFilePropertiesDEntryData *data; GtkTable *table; GtkLabel *label; GError *err = NULL; FmFileInfo *fi; GFile *gf; gchar *txt; gsize length; const gchar * const *langs; gboolean tmp_bool; /* disable permissions tab and open_with in any case */ #define HIDE_WIDGET(x) widget = gtk_builder_get_object(ui, x); \ gtk_widget_hide(GTK_WIDGET(widget)) /* HIDE_WIDGET("permissions_tab"); TODO: made visibility of permissions_tab configurable */ table = GTK_TABLE(gtk_builder_get_object(ui, "general_table")); HIDE_WIDGET("open_with"); HIDE_WIDGET("open_with_label"); gtk_table_set_row_spacing(table, 5, 0); /* we will do the thing only for single file! */ if (fm_file_info_list_get_length(files) != 1) return NULL; fi = fm_file_info_list_peek_head(files); gf = fm_path_to_gfile(fm_file_info_get_path(fi)); if (!g_file_load_contents(gf, NULL, &txt, &length, NULL, NULL)) { g_warning("file properties dialog: cannot access desktop entry file"); g_object_unref(gf); return NULL; } data = g_slice_new(FmFilePropertiesDEntryData); data->changed = FALSE; data->file = gf; data->kf = g_key_file_new(); g_key_file_load_from_data(data->kf, txt, length, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); g_free(txt); /* FIXME: handle errors, also do g_key_file_has_group() */ /* get locale name */ data->lang = NULL; langs = g_get_language_names(); if (strcmp(langs[0], "C") != 0) { /* remove encoding from locale name */ char *sep = strchr(langs[0], '.'); if (sep) data->lang = g_strndup(langs[0], sep - langs[0]); else data->lang = g_strdup(langs[0]); } /* enable events for icon */ widget = gtk_builder_get_object(ui, "icon_eventbox"); data->icon = gtk_builder_get_object(ui, "icon"); gtk_widget_set_can_focus(GTK_WIDGET(widget), TRUE); /* disable Name event handler in the widget */ widget = gtk_builder_get_object(ui, "name"); g_signal_handlers_block_matched(widget, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, uidata); g_signal_connect(widget, "changed", G_CALLBACK(_dentry_name_changed), data); data->name = GTK_ENTRY(widget); data->saved_name = g_strdup(gtk_entry_get_text(data->name)); /* FIXME: two lines below is temporary workaround on FIXME in widget */ gtk_widget_set_can_focus(GTK_WIDGET(widget), TRUE); gtk_editable_set_editable(GTK_EDITABLE(widget), TRUE); /* Name is set from "Name" by libfm already so don't touch it */ /* support 'hidden' option */ data->hidden = NULL; widget = gtk_builder_get_object(ui, "hidden"); if (widget && GTK_IS_TOGGLE_BUTTON(widget) && fm_file_info_is_native(fi)) { data->hidden = (GtkToggleButton*)widget; data->was_hidden = fm_file_info_is_hidden(fi); g_signal_connect(widget, "toggled", G_CALLBACK(_dentry_hidden_toggled), data); gtk_widget_set_can_focus(GTK_WIDGET(data->hidden), TRUE); /* set sensitive since it can be toggled for desktop entry */ gtk_widget_set_sensitive(GTK_WIDGET(widget), TRUE); gtk_widget_show(GTK_WIDGET(data->hidden)); } #undef HIDE_WIDGET /* FIXME: migrate to GtkGrid */ table = GTK_TABLE(gtk_table_new(8, 2, FALSE)); gtk_table_set_row_spacings(table, 4); gtk_table_set_col_spacings(table, 12); gtk_container_set_border_width(GTK_CONTAINER(table), 4); /* row 0: "Exec" GtkHBox: GtkEntry+GtkButton */ new_widget = gtk_label_new(NULL); label = GTK_LABEL(new_widget); gtk_misc_set_alignment(GTK_MISC(new_widget), 0.0, 0.0); gtk_label_set_markup_with_mnemonic(label, _("Co_mmand:")); gtk_table_attach(table, new_widget, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); #if GTK_CHECK_VERSION(3, 2, 0) /* FIXME: migrate to GtkGrid */ widget = G_OBJECT(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6)); #else widget = G_OBJECT(gtk_hbox_new(FALSE, 6)); #endif new_widget = gtk_button_new_with_mnemonic(_("_Browse...")); gtk_box_pack_end(GTK_BOX(widget), new_widget, FALSE, FALSE, 0); g_signal_connect(new_widget, "clicked", G_CALLBACK(_dentry_browse_exec_event), data); new_widget = gtk_entry_new(); data->exec = GTK_ENTRY(new_widget); txt = g_key_file_get_locale_string(data->kf, GRP_NAME, "Exec", NULL, NULL); if (txt) { gtk_entry_set_text(data->exec, txt); g_free(txt); } gtk_widget_set_tooltip_text(new_widget, _("Command to execute when the application icon is activated")); gtk_box_pack_start(GTK_BOX(widget), new_widget, TRUE, TRUE, 0); g_signal_connect(new_widget, "changed", G_CALLBACK(_dentry_exec_changed), data); gtk_table_attach(table, GTK_WIDGET(widget), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, 0, 0, 0); gtk_label_set_mnemonic_widget(label, new_widget); /* row 1: "Terminal" GtkCheckButton */ new_widget = gtk_check_button_new_with_mnemonic(_("_Execute in terminal emulator")); data->terminal = GTK_TOGGLE_BUTTON(new_widget); tmp_bool = g_key_file_get_boolean(data->kf, GRP_NAME, "Terminal", &err); if (err) /* no such key present */ { tmp_bool = FALSE; g_clear_error(&err); } gtk_toggle_button_set_active(data->terminal, tmp_bool); g_signal_connect(new_widget, "toggled", G_CALLBACK(_dentry_terminal_toggled), data); gtk_table_attach(table, new_widget, 0, 2, 1, 2, GTK_FILL, 0, 18, 0); /* row 2: "X-KeepTerminal" GtkCheckButton */ new_widget = gtk_check_button_new_with_mnemonic(_("_Keep terminal window open after command execution")); data->keep_open = GTK_TOGGLE_BUTTON(new_widget); gtk_widget_set_sensitive(new_widget, tmp_bool); /* disable if not in terminal */ tmp_bool = g_key_file_get_boolean(data->kf, GRP_NAME, "X-KeepTerminal", &err); if (err) /* no such key present */ { tmp_bool = FALSE; g_clear_error(&err); } gtk_toggle_button_set_active(data->keep_open, tmp_bool); g_signal_connect(new_widget, "toggled", G_CALLBACK(_dentry_keepterm_toggled), data); gtk_table_attach(table, new_widget, 0, 2, 2, 3, GTK_FILL, 0, 27, 0); /* row 4: "GenericName" GtkEntry */ new_widget = gtk_label_new(NULL); label = GTK_LABEL(new_widget); gtk_misc_set_alignment(GTK_MISC(new_widget), 0.0, 0.0); gtk_label_set_markup_with_mnemonic(label, _("D_escription:")); gtk_table_attach(table, new_widget, 0, 1, 4, 5, GTK_FILL, 0, 0, 0); new_widget = gtk_entry_new(); data->generic_name = GTK_ENTRY(new_widget); txt = g_key_file_get_locale_string(data->kf, GRP_NAME, "GenericName", NULL, NULL); if (txt) { gtk_entry_set_text(data->generic_name, txt); g_free(txt); } gtk_widget_set_tooltip_text(new_widget, _("Generic name of the application")); g_signal_connect(new_widget, "changed", G_CALLBACK(_dentry_genname_changed), data); gtk_table_attach(table, new_widget, 1, 2, 4, 5, GTK_FILL|GTK_EXPAND, 0, 0, 0); gtk_label_set_mnemonic_widget(label, new_widget); /* row 3: "Path" GtkEntry */ new_widget = gtk_label_new(NULL); label = GTK_LABEL(new_widget); gtk_misc_set_alignment(GTK_MISC(new_widget), 0.0, 0.0); gtk_label_set_markup_with_mnemonic(label, _("_Working directory:")); gtk_table_attach(table, new_widget, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); new_widget = gtk_entry_new(); data->path = GTK_ENTRY(new_widget); txt = g_key_file_get_locale_string(data->kf, GRP_NAME, "Path", NULL, NULL); if (txt) { gtk_entry_set_text(data->path, txt); g_free(txt); } gtk_widget_set_tooltip_text(new_widget, _("The working directory to run the program in")); g_signal_connect(new_widget, "changed", G_CALLBACK(_dentry_path_changed), data); gtk_table_attach(table, new_widget, 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, 0, 0, 0); gtk_label_set_mnemonic_widget(label, new_widget); /* row 5: "Comment" GtkEntry */ new_widget = gtk_label_new(NULL); label = GTK_LABEL(new_widget); gtk_misc_set_alignment(GTK_MISC(new_widget), 0.0, 0.0); gtk_label_set_markup_with_mnemonic(label, _("_Tooltip:")); gtk_table_attach(table, new_widget, 0, 1, 5, 6, GTK_FILL, 0, 0, 0); new_widget = gtk_entry_new(); data->comment = GTK_ENTRY(new_widget); txt = g_key_file_get_locale_string(data->kf, GRP_NAME, "Comment", NULL, NULL); if (txt) { gtk_entry_set_text(data->comment, txt); g_free(txt); } gtk_widget_set_tooltip_text(new_widget, _("Tooltip to show on application")); g_signal_connect(new_widget, "changed", G_CALLBACK(_dentry_tooltip_changed), data); gtk_table_attach(table, new_widget, 1, 2, 5, 6, GTK_FILL|GTK_EXPAND, 0, 0, 0); gtk_label_set_mnemonic_widget(label, new_widget); /* TODO: handle "TryExec" field ? */ /* row 7: "StartupNotify" GtkCheckButton */ new_widget = gtk_check_button_new_with_mnemonic(_("_Use startup notification")); data->notification = GTK_TOGGLE_BUTTON(new_widget); tmp_bool = g_key_file_get_boolean(data->kf, GRP_NAME, "StartupNotify", &err); if (err) /* no such key present */ { tmp_bool = FALSE; g_clear_error(&err); } gtk_toggle_button_set_active(data->notification, tmp_bool); g_signal_connect(new_widget, "toggled", G_CALLBACK(_dentry_notification_toggled), data); gtk_table_attach(table, new_widget, 0, 2, 7, 8, GTK_FILL, 0, 0, 0); /* put the table into third tab and enable it */ widget = gtk_builder_get_object(ui, "extra_tab_label"); gtk_label_set_markup_with_mnemonic(GTK_LABEL(widget), _("_Desktop Entry")); widget = gtk_builder_get_object(ui, "extra_tab"); gtk_container_add(GTK_CONTAINER(widget), GTK_WIDGET(table)); gtk_widget_show_all(GTK_WIDGET(widget)); return data; } static void _dentry_ui_finish(gpointer pdata, gboolean cancelled) { FmFilePropertiesDEntryData *data = pdata; gsize len; char *text; if (data == NULL) return; if (!cancelled) { text = g_object_get_qdata(data->icon, fm_qdata_id); if (text) { g_key_file_set_string(data->kf, GRP_NAME, "Icon", text); /* disable default handler for icon change since we'll do it below */ g_object_set_qdata(data->icon, fm_qdata_id, NULL); data->changed = TRUE; } } if (!cancelled && data->changed) { text = g_key_file_to_data(data->kf, &len, NULL); g_file_replace_contents(data->file, text, len, NULL, FALSE, 0, NULL, NULL, NULL); /* FIXME: handle errors */ g_free(text); } g_object_unref(data->file); g_key_file_free(data->kf); /* disable own handler on data->name */ g_signal_handlers_disconnect_by_func(data->name, _dentry_name_changed, data); /* restore the field so properties dialog will not do own processing */ gtk_entry_set_text(data->name, data->saved_name); if (data->hidden) { /* disable own handler on data->hidden */ g_signal_handlers_disconnect_by_func(data->hidden, _dentry_hidden_toggled, data); /* disable default handler returning previous value */ gtk_toggle_button_set_active(data->hidden, data->was_hidden); } g_free(data->saved_name); g_free(data->lang); g_slice_free(FmFilePropertiesDEntryData, data); } FM_DEFINE_MODULE(gtk_file_prop, application/x-desktop) FmFilePropertiesExtensionInit fm_module_init_gtk_file_prop = { &_dentry_ui_init, &_dentry_ui_finish }; libfm-1.4.0/src/modules/gtk-fileprop-x-shortcut.c000066400000000000000000000173311475513661000217460ustar00rootroot00000000000000/* * gtk-fileprop-x-shortcut.c * * Copyright 2013 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /* File properties dialog extension for desktop entry shortcut type */ #include #include "fm.h" #include "fm-file-properties.h" #include typedef struct _FmFilePropertiesShortcutData FmFilePropertiesShortcutData; struct _FmFilePropertiesShortcutData { GFile *file; GKeyFile *kf; GObject *icon; GtkEntry *name; GtkWidget *hidden; gchar *lang; gchar *saved_name; gboolean was_hidden; gboolean changed; }; static void _shortcut_name_changed(GtkEditable *editable, FmFilePropertiesShortcutData *data) { /* g_debug("entry content changed"); */ if (data->lang) g_key_file_set_locale_string(data->kf, G_KEY_FILE_DESKTOP_GROUP, "Name", data->lang, gtk_entry_get_text(GTK_ENTRY(editable))); else g_key_file_set_string(data->kf, G_KEY_FILE_DESKTOP_GROUP, "Name", gtk_entry_get_text(GTK_ENTRY(editable))); data->changed = TRUE; } static void _shortcut_hidden_toggled(GtkToggleButton *togglebutton, FmFilePropertiesShortcutData *data) { gboolean active = gtk_toggle_button_get_active(togglebutton); g_key_file_set_boolean(data->kf, G_KEY_FILE_DESKTOP_GROUP, "Hidden", active); data->changed = TRUE; } static gpointer _shortcut_ui_init(GtkBuilder *ui, gpointer uidata, FmFileInfoList *files) { GObject *widget; FmFilePropertiesShortcutData *data; GtkTable *table; GFile *gf; gchar *txt; gsize length; GKeyFile *kf; const gchar * const *langs; gboolean ok; /* test the file if it is really an desktop entry */ /* we will do the thing only for single file! */ if (fm_file_info_list_get_length(files) != 1) return NULL; gf = fm_path_to_gfile(fm_file_info_get_path(fm_file_info_list_peek_head(files))); if (!g_file_load_contents(gf, NULL, &txt, &length, NULL, NULL)) { g_warning("file properties dialog: cannot access shortcut file"); g_object_unref(gf); return NULL; } kf = g_key_file_new(); ok = g_key_file_load_from_data(kf, txt, length, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); g_free(txt); if (!ok || !g_key_file_has_group(kf, G_KEY_FILE_DESKTOP_GROUP)) goto _not_the_file; txt = g_key_file_get_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, NULL); if (txt == NULL) goto _not_the_file; ok = (strcmp(txt, G_KEY_FILE_DESKTOP_TYPE_LINK) == 0); g_free(txt); if (!ok) { _not_the_file: g_key_file_free(kf); g_object_unref(gf); return NULL; } /* disable open_with in any case */ #define HIDE_WIDGET(x) widget = gtk_builder_get_object(ui, x); \ gtk_widget_hide(GTK_WIDGET(widget)) /* HIDE_WIDGET("permissions_tab"); TODO: made visibility of permissions_tab configurable */ HIDE_WIDGET("open_with"); HIDE_WIDGET("open_with_label"); table = GTK_TABLE(gtk_builder_get_object(ui, "general_table")); gtk_table_set_row_spacing(table, 5, 0); data = g_slice_new(FmFilePropertiesShortcutData); data->changed = FALSE; data->file = gf; data->kf = kf; /* get locale name */ data->lang = NULL; langs = g_get_language_names(); if (strcmp(langs[0], "C") != 0) { /* remove encoding from locale name */ char *sep = strchr(langs[0], '.'); if (sep) data->lang = g_strndup(langs[0], sep - langs[0]); else data->lang = g_strdup(langs[0]); } /* enable events for icon */ widget = gtk_builder_get_object(ui, "icon_eventbox"); data->icon = gtk_builder_get_object(ui, "icon"); gtk_widget_set_can_focus(GTK_WIDGET(widget), TRUE); /* disable Name event handler in the widget */ widget = gtk_builder_get_object(ui, "name"); g_signal_handlers_block_matched(widget, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, uidata); g_signal_connect(widget, "changed", G_CALLBACK(_shortcut_name_changed), data); data->name = GTK_ENTRY(widget); data->saved_name = g_strdup(gtk_entry_get_text(data->name)); /* make Name field editable */ gtk_widget_set_can_focus(GTK_WIDGET(widget), TRUE); gtk_editable_set_editable(GTK_EDITABLE(widget), TRUE); /* Name is set from "Name" by libfm already so don't touch it */ widget = gtk_builder_get_object(ui, "hidden"); data->hidden = NULL; if (widget && GTK_IS_TOGGLE_BUTTON(widget)) { data->hidden = GTK_WIDGET(widget); data->was_hidden = fm_file_info_is_hidden(fm_file_info_list_peek_head(files)); gtk_widget_set_can_focus(data->hidden, TRUE); gtk_widget_set_sensitive(data->hidden, TRUE); g_signal_connect(widget, "toggled", G_CALLBACK(_shortcut_hidden_toggled), data); gtk_widget_show(data->hidden); } /* FIXME: make Target changeable - external little window probably? */ #undef HIDE_WIDGET return data; } static void _shortcut_ui_finish(gpointer pdata, gboolean cancelled) { FmFilePropertiesShortcutData *data = pdata; gsize len; char *text; if (data == NULL) return; if (!cancelled) { text = g_object_get_qdata(data->icon, fm_qdata_id); if (text) { g_key_file_set_string(data->kf, G_KEY_FILE_DESKTOP_GROUP, "Icon", text); /* disable default handler for icon change since we'll do it below */ g_object_set_qdata(data->icon, fm_qdata_id, NULL); data->changed = TRUE; } if (data->changed) { text = g_key_file_to_data(data->kf, &len, NULL); g_file_replace_contents(data->file, text, len, NULL, FALSE, 0, NULL, NULL, NULL); /* FIXME: handle errors */ g_free(text); } } g_object_unref(data->file); g_key_file_free(data->kf); /* disable own handler on data->name */ g_signal_handlers_disconnect_by_func(data->name, _shortcut_name_changed, data); /* restore the field so properties dialog will not do own processing */ gtk_entry_set_text(data->name, data->saved_name); if (data->hidden) { /* disable own handler on data->hidden */ g_signal_handlers_disconnect_by_func(data->hidden, _shortcut_hidden_toggled, data); /* disable default handler returning previous value */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->hidden), data->was_hidden); } g_free(data->saved_name); g_free(data->lang); g_slice_free(FmFilePropertiesShortcutData, data); } FM_DEFINE_MODULE(gtk_file_prop, inode/x-shortcut) FmFilePropertiesExtensionInit fm_module_init_gtk_file_prop = { .init = &_shortcut_ui_init, .finish = &_shortcut_ui_finish }; libfm-1.4.0/src/modules/gtk-menu-actions.c000066400000000000000000000173731475513661000204200ustar00rootroot00000000000000/* * fm-file-menu.c * * Copyright 2009 PCMan * Copyright 2018 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm.h" #include "fm-folder-view.h" #include "fm-gtk-utils.h" #include "gtk-compat.h" #include "fm-action.h" static GQuark _fm_actions_qdata_id = 0; static FmActionCache *_fm_actions_cache = NULL; static void on_custom_action_file(GtkAction* act, gpointer menu) { GAppInfo* item = g_object_get_qdata(G_OBJECT(act), fm_qdata_id); GdkAppLaunchContext* ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); GList* files = fm_file_info_list_peek_head_link(fm_file_menu_get_file_info_list(menu)); GError *err = NULL; gdk_app_launch_context_set_screen(ctx, gtk_widget_get_screen(GTK_WIDGET(fm_file_menu_get_menu(menu)))); gdk_app_launch_context_set_timestamp(ctx, gtk_get_current_event_time()); /* g_debug("item: %s is activated, id:%s", fm_file_action_item_get_name(item), fm_file_action_item_get_id(item)); */ g_app_info_launch(item, files, G_APP_LAUNCH_CONTEXT(ctx), &err); if (err) { fm_show_error(NULL, "output", err->message); g_error_free(err); } g_object_unref(ctx); } static void on_custom_action_folder(GtkAction* act, gpointer folder_view) { GAppInfo* item = g_object_get_qdata(G_OBJECT(act), fm_qdata_id); GdkAppLaunchContext* ctx = gdk_display_get_app_launch_context(gdk_display_get_default()); GList* files = g_list_prepend(NULL, fm_folder_view_get_cwd_info(folder_view)); GError *err = NULL; gdk_app_launch_context_set_screen(ctx, gtk_widget_get_screen(folder_view)); gdk_app_launch_context_set_timestamp(ctx, gtk_get_current_event_time()); /* g_debug("item: %s is activated, id:%s", fm_file_action_item_get_name(item), fm_file_action_item_get_id(item)); */ g_app_info_launch(item, files, G_APP_LAUNCH_CONTEXT(ctx), &err); if (err) { fm_show_error(NULL, "output", err->message); g_error_free(err); } g_object_unref(ctx); g_list_free(files); } static void add_custom_action_item(GString* xml, FmActionMenu *root_menu, GAppInfo* item, GtkActionGroup* act_grp, GCallback cb, gpointer cb_data) { GtkAction* act; if(!item) /* separator */ { g_string_append(xml, ""); return; } act = gtk_action_new(g_app_info_get_id(item), #if GLIB_CHECK_VERSION(2, 24, 0) g_app_info_get_display_name(item), #else g_app_info_get_name(item), #endif g_app_info_get_description(item), NULL); if (FM_IS_ACTION(item)) g_signal_connect(act, "activate", cb, cb_data); gtk_action_set_gicon(act, g_app_info_get_icon(item)); gtk_action_group_add_action(act_grp, act); g_object_unref(act); /* hold a reference on the root FmActionMenu object */ g_object_set_qdata_full(G_OBJECT(act), _fm_actions_qdata_id, g_object_ref(root_menu), g_object_unref); /* associate the app info object with the action */ g_object_set_qdata(G_OBJECT(act), fm_qdata_id, item); if (FM_IS_ACTION_MENU(item)) { const GList* subitems = fm_action_menu_get_children(FM_ACTION_MENU(item)); const GList* l; g_string_append_printf(xml, "", g_app_info_get_id(item)); for(l=subitems; l; l=l->next) { GAppInfo *subitem = l->data; add_custom_action_item(xml, root_menu, subitem, act_grp, cb, cb_data); } g_string_append(xml, ""); } else { g_string_append_printf(xml, "", g_app_info_get_id(item)); } } static void _fm_actions_init(void) { if (!_fm_actions_cache) _fm_actions_cache = fm_action_cache_new(); if (!_fm_actions_qdata_id) _fm_actions_qdata_id = g_quark_from_string("_fm_actions_qdata_id"); } static void _fm_actions_finalize(void) { if (_fm_actions_cache) g_object_unref(G_OBJECT(_fm_actions_cache)); _fm_actions_cache = NULL; } static void _fm_actions_update_file_menu_for_scheme(GtkWindow* window, GtkUIManager* ui, GString* xml, GtkActionGroup* act_grp, FmFileMenu* menu, FmFileInfoList* files, gboolean single_file) { FmActionMenu *root_menu; FmPath *cwd = fm_file_menu_get_cwd(menu); FmFolder *folder; FmFileInfo *location = NULL; const GList *items; g_return_if_fail(_fm_actions_cache != NULL && cwd != NULL); folder = fm_folder_find_by_path(cwd); if (folder) location = fm_folder_get_info(folder); if (!location) return; /* add custom file actions */ root_menu = fm_action_get_for_context(_fm_actions_cache, location, files); items = fm_action_menu_get_children(root_menu); if(items) { g_string_append(xml, ""); const GList* l; for(l=items; l; l=l->next) { GAppInfo *item = l->data; add_custom_action_item(xml, root_menu, item, act_grp, G_CALLBACK(on_custom_action_file), menu); } g_string_append(xml, ""); } g_object_unref(root_menu); } static void _fm_actions_update_folder_menu_for_scheme(FmFolderView* fv, GtkWindow* window, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfoList* files) { FmFileInfo *fi = fm_folder_view_get_cwd_info(fv); FmActionMenu *root_menu; const GList *items; g_return_if_fail(_fm_actions_cache != NULL); if (fi == NULL) /* incremental folder - no info yet - ignore it */ return; root_menu = fm_action_get_for_location(_fm_actions_cache, fi); items = fm_action_menu_get_children(root_menu); if(items) { GString *xml = g_string_new(""); const GList* l; for(l=items; l; l=l->next) { GAppInfo *item = l->data; add_custom_action_item(xml, root_menu, item, act_grp, G_CALLBACK(on_custom_action_folder), fv); } g_string_append(xml, ""); gtk_ui_manager_add_ui_from_string(ui, xml->str, xml->len, NULL); g_string_free(xml, TRUE); } g_object_unref(root_menu); } /* we catch all schemes to be available on every one */ FM_DEFINE_MODULE(gtk_menu_scheme, *) FmContextMenuSchemeAddonInit fm_module_init_gtk_menu_scheme = { .init = _fm_actions_init, .finalize = _fm_actions_finalize, .update_file_menu_for_scheme = _fm_actions_update_file_menu_for_scheme, .update_folder_menu = _fm_actions_update_folder_menu_for_scheme }; libfm-1.4.0/src/modules/gtk-menu-trash.c000066400000000000000000000127221475513661000200720ustar00rootroot00000000000000/* * gtk-menu-trash.c * * Copyright 2009 PCMan * Copyright 2013-2016 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-folder-view.h" #include "fm-gtk-utils.h" #include static void on_untrash(GtkAction* action, gpointer user_data) { FmFileMenu *data = (FmFileMenu*)user_data; GtkMenu *menu = fm_file_menu_get_menu(data); GtkWindow *window = GTK_WINDOW(gtk_menu_get_attach_widget(menu)); FmFileInfoList *file_infos = fm_file_menu_get_file_info_list(data); FmPathList *files = fm_path_list_new_from_file_info_list(file_infos); fm_untrash_files(window, files); fm_path_list_unref(files); } static void on_empty_trash(GtkAction* act, gpointer user_data) { GtkWindow *window = GTK_WINDOW(user_data); fm_empty_trash(window); } static void _update_file_menu_for_trash(GtkWindow* window, GtkUIManager* ui, GString* xml, GtkActionGroup* act_grp, FmFileMenu* menu, FmFileInfoList* files, gboolean single_file) { gboolean can_restore = TRUE, is_trash_root = FALSE; GList *l; GtkAction *act; /* only immediate children of trash:/// can be restored. */ for(l = fm_file_info_list_peek_head_link(files);l;l=l->next) { FmPath *trash_path = fm_file_info_get_path(FM_FILE_INFO(l->data)); if(single_file) is_trash_root = fm_path_is_trash_root(trash_path); if(!fm_path_get_parent(trash_path) || !fm_path_is_trash_root(fm_path_get_parent(trash_path))) { can_restore = FALSE; break; } } if(can_restore) { act = gtk_action_new("UnTrash", _("_Restore"), _("Restore trashed files to original paths"), NULL); g_signal_connect(act, "activate", G_CALLBACK(on_untrash), menu); gtk_action_group_add_action(act_grp, act); g_object_unref(act); g_string_append(xml, "" "" ""); } else if (is_trash_root) { act = gtk_action_new("EmptyTrash", _("_Empty Trash Can"), NULL, NULL); g_signal_connect(act, "activate", G_CALLBACK(on_empty_trash), window); gtk_action_group_add_action(act_grp, act); g_string_append(xml, "" "" ""); } act = gtk_ui_manager_get_action(ui, "/popup/Open"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Rename"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Copy"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/Paste"); gtk_action_set_visible(act, FALSE); /* FIXME: can we cut files here? */ } static void _update_folder_menu_for_trash(FmFolderView* fv, GtkWindow* window, GtkUIManager* ui, GtkActionGroup* act_grp, FmFileInfoList* files) { GtkAction *act; /* FIXME: should we show this item for trash root only? */ act = gtk_action_new("EmptyTrash", _("_Empty Trash Can"), NULL, NULL); g_signal_connect(act, "activate", G_CALLBACK(on_empty_trash), window); gtk_action_group_add_action(act_grp, act); g_object_unref(act); gtk_ui_manager_add_ui_from_string(ui, "" "" "" "" "", -1, NULL); act = gtk_ui_manager_get_action(ui, "/popup/Rename"); gtk_action_set_visible(act, FALSE); act = gtk_ui_manager_get_action(ui, "/popup/CreateNew"); gtk_action_set_visible(act, FALSE); if (!fm_path_is_trash_root(fm_folder_view_get_cwd(fv))) { /* we can paste (i.e. trash) files only into trash root */ act = gtk_ui_manager_get_action(ui, "/popup/Paste"); gtk_action_set_visible(act, FALSE); } } FM_DEFINE_MODULE(gtk_menu_scheme, trash) FmContextMenuSchemeAddonInit fm_module_init_gtk_menu_scheme = { NULL, NULL, _update_file_menu_for_trash, _update_folder_menu_for_trash }; libfm-1.4.0/src/modules/vfs-menu.c000066400000000000000000003301141475513661000167620ustar00rootroot00000000000000/* * fm-vfs-menu.c * VFS for "menu://applications/" path using menu-cache library. * * Copyright 2012-2014 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-file.h" #include "glib-compat.h" #include "fm-utils.h" #include "fm-xml-file.h" #include #include /* support for libmenu-cache 0.4.x */ #ifndef MENU_CACHE_CHECK_VERSION # ifdef HAVE_MENU_CACHE_DIR_LIST_CHILDREN # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) (_a == 0 && _b < 5) /* < 0.5.0 */ # else # define MENU_CACHE_CHECK_VERSION(_a,_b,_c) 0 /* not even 0.4.0 */ # endif #endif /* libmenu-cache is multithreaded since 0.4.x */ #if MENU_CACHE_CHECK_VERSION(0, 4, 0) # define RUN_WITH_MENU_CACHE(__func,__data) __func(__data) #else # define RUN_WITH_MENU_CACHE(__func,__data) fm_run_in_default_main_context(__func,__data) #endif /* beforehand declarations */ static GFile *_fm_vfs_menu_new_for_uri(const char *uri); /* ---- applications.menu manipulations ---- */ typedef struct _FmMenuMenuTree FmMenuMenuTree; struct _FmMenuMenuTree { FmXmlFile *menu; /* composite tree to analyze */ char *file_path; /* current file */ GCancellable *cancellable; gint line, pos; /* we remember position in deepest file */ }; G_LOCK_DEFINE_STATIC(menuTree); /* locks all .menu file access data below */ static FmXmlFileTag menuTag_Menu = 0; /* tags that are supported */ static FmXmlFileTag menuTag_Include = 0; static FmXmlFileTag menuTag_Exclude = 0; static FmXmlFileTag menuTag_Filename = 0; static FmXmlFileTag menuTag_Category = 0; static FmXmlFileTag menuTag_MergeFile = 0; static FmXmlFileTag menuTag_Directory = 0; static FmXmlFileTag menuTag_Name = 0; static FmXmlFileTag menuTag_Deleted = 0; static FmXmlFileTag menuTag_NotDeleted = 0; /* this handler does nothing, used just to remember its id */ static gboolean _menu_xml_handler_pass(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data) { FmMenuMenuTree *data = user_data; return !g_cancellable_set_error_if_cancelled(data->cancellable, error); } /* FIXME: handle ...... */ static inline const char *_get_menu_name(FmXmlFileItem *item) { if (fm_xml_file_item_get_tag(item) != menuTag_Menu) /* skip not menu */ return NULL; item = fm_xml_file_item_find_child(item, menuTag_Name); if (item == NULL) /* no Name tag? */ return NULL; item = fm_xml_file_item_find_child(item, FM_XML_FILE_TEXT); if (item == NULL) /* empty Name tag? */ return NULL; return fm_xml_file_item_get_data(item, NULL); } static FmXmlFileItem *_find_in_children(GList *list, const char *path) { const char *ptr; char *_ptr; if (list == NULL) return NULL; g_debug("menu tree: searching for '%s'", path); ptr = strchr(path, '/'); if (ptr == NULL) { ptr = path; path = _ptr = NULL; } else { _ptr = g_strndup(path, ptr - path); path = ptr + 1; ptr = _ptr; } while (list) { const char *elem_name = _get_menu_name(list->data); /* g_debug("got child %d: %s", fm_xml_file_item_get_tag(list->data), elem_name); */ if (g_strcmp0(elem_name, ptr) == 0) break; else list = list->next; } g_free(_ptr); if (list && path) { FmXmlFileItem *item; list = fm_xml_file_item_get_children(list->data); item = _find_in_children(list, path); g_list_free(list); return item; } return list ? list->data : NULL; } /* returns only child */ static FmXmlFileItem *_set_default_contents(FmXmlFile *file, const char *basename) { FmXmlFileItem *item, *child; char *path; /* set DTD */ fm_xml_file_set_dtd(file, "Menu PUBLIC '-//freedesktop//DTD Menu 1.0//EN'\n" " 'http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd'", NULL); /* set content: Applications /etc/xgd/menus/%s */ item = fm_xml_file_item_new(menuTag_Menu); fm_xml_file_insert_first(file, item); child = fm_xml_file_item_new(menuTag_Name); fm_xml_file_item_append_text(child, "Applications", -1, FALSE); fm_xml_file_item_append_child(item, child); child = fm_xml_file_item_new(menuTag_MergeFile); fm_xml_file_item_set_attribute(child, "type", "parent"); /* FIXME: what is correct way to handle this? is it required at all? */ path = g_strdup_printf("/etc/xgd/menus/%s", basename); fm_xml_file_item_append_text(child, path, -1, FALSE); g_free(path); fm_xml_file_item_append_child(item, child); return item; /* FIXME: can errors happen above? */ } /* tries to create ... path in children list and returns for it */ static FmXmlFileItem *_create_path_in_tree(FmXmlFileItem *parent, const char *path) { const char *ptr; char *_ptr; GList *list, *l; FmXmlFileItem *item, *name; if (path == NULL) return NULL; list = fm_xml_file_item_get_children(parent); /* g_debug("menu tree: creating '%s'", path); */ ptr = strchr(path, '/'); if (ptr == NULL) { ptr = path; path = _ptr = NULL; } else { _ptr = g_strndup(path, ptr - path); path = ptr + 1; ptr = _ptr; } for (l = list; l; l = l->next) { const char *elem_name = _get_menu_name(l->data); /* g_debug("got child %d: %s", fm_xml_file_item_get_tag(list->data), elem_name); */ if (g_strcmp0(elem_name, ptr) == 0) break; } if (l) /* subpath already exists */ { item = l->data; g_list_free(list); g_free(_ptr); return _create_path_in_tree(item, path); } g_list_free(list); /* create subtag */ name = fm_xml_file_item_new(menuTag_Name); fm_xml_file_item_append_text(name, ptr, -1, FALSE); g_free(_ptr); /* create and insert it */ item = fm_xml_file_item_new(menuTag_Menu); if (!fm_xml_file_item_append_child(parent, item) || !fm_xml_file_item_append_child(item, name)) { /* FIXME: it cannot fail on newly created items! */ fm_xml_file_item_destroy(name); fm_xml_file_item_destroy(item); return NULL; } /* path is NULL if it is a final subpath */ return path ? _create_path_in_tree(item, path) : item; } /* locks menuTree, sets fields in data, sets gf returns "Applications" menu on success and NULL on failure */ static FmXmlFileItem *_prepare_contents(FmMenuMenuTree *data, GCancellable *cancellable, GError **error, GFile **gf) { const char *xdg_menu_prefix; char *contents; gsize len; GList *xml = NULL; FmXmlFileItem *apps; gboolean ok; /* do it in compatibility with lxpanel */ xdg_menu_prefix = g_getenv("XDG_MENU_PREFIX"); contents = g_strdup_printf("%sapplications.menu", xdg_menu_prefix ? xdg_menu_prefix : "lxde-"); data->file_path = g_build_filename(g_get_user_config_dir(), "menus", contents, NULL); *gf = g_file_new_for_path(data->file_path); data->menu = fm_xml_file_new(NULL); data->line = data->pos = -1; data->cancellable = cancellable; G_LOCK(menuTree); /* set tags, ignore errors */ menuTag_Menu = fm_xml_file_set_handler(data->menu, "Menu", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Name = fm_xml_file_set_handler(data->menu, "Name", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Deleted = fm_xml_file_set_handler(data->menu, "Deleted", &_menu_xml_handler_pass, FALSE, NULL); menuTag_NotDeleted = fm_xml_file_set_handler(data->menu, "NotDeleted", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Directory = fm_xml_file_set_handler(data->menu, "Directory", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Include = fm_xml_file_set_handler(data->menu, "Include", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Exclude = fm_xml_file_set_handler(data->menu, "Exclude", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Filename = fm_xml_file_set_handler(data->menu, "Filename", &_menu_xml_handler_pass, FALSE, NULL); menuTag_MergeFile = fm_xml_file_set_handler(data->menu, "MergeFile", &_menu_xml_handler_pass, FALSE, NULL); menuTag_Category = fm_xml_file_set_handler(data->menu, "Category", &_menu_xml_handler_pass, FALSE, NULL); if (!g_file_query_exists(*gf, cancellable)) { /* if file doesn't exist then it should be created with default contents */ apps = _set_default_contents(data->menu, contents); g_free(contents); return apps; } g_free(contents); /* we used it temporarily */ contents = NULL; ok = g_file_load_contents(*gf, cancellable, &contents, &len, NULL, error); if (!ok) return NULL; ok = fm_xml_file_parse_data(data->menu, contents, len, error, data); g_free(contents); if (ok) xml = fm_xml_file_finish_parse(data->menu, error); if (xml == NULL) /* error is set by failed function */ { if (data->line == -1) data->line = fm_xml_file_get_current_line(data->menu, &data->pos); g_prefix_error(error, _("XML file '%s' error (%d:%d): "), data->file_path, data->line, data->pos); } else { apps = _find_in_children(xml, "Applications"); g_list_free(xml); if (apps) return apps; g_set_error_literal(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("XML file doesn't contain Applications root")); } return NULL; } /* replaces invalid chars in path with minus sign */ static inline char *_get_pathtag_for_path(const char *path) { char *pathtag, *c; pathtag = g_strdup(path); for (c = pathtag; *c; c++) if (*c == '/' || *c == '\t' || *c == '\n' || *c == '\r' || *c == ' ') *c = '-'; return pathtag; } static gboolean _save_new_menu_file(GFile *gf, FmXmlFile *file, GCancellable *cancellable, GError **error) { gsize len; char *contents = fm_xml_file_to_data(file, &len, error); gboolean result = FALSE; if (contents == NULL) return FALSE; /* g_debug("new menu file: %s", contents); */ result = g_file_replace_contents(gf, contents, len, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, cancellable, error); g_free(contents); return result; } #if MENU_CACHE_CHECK_VERSION(0, 5, 0) /* changes .menu XML file */ static gboolean _remove_directory(const char *path, GCancellable *cancellable, GError **error) { GList *xml = NULL, *it; GFile *gf; FmXmlFileItem *apps, *item; FmMenuMenuTree data; gboolean ok = TRUE; /* g_debug("deleting menu folder '%s'", path); */ /* FIXME: check if there is that path in the XML tree before doing anything */ apps = _prepare_contents(&data, cancellable, error, &gf); if (apps == NULL) { /* either failed to load contents or cancelled */ ok = FALSE; } else if ((xml = fm_xml_file_item_get_children(apps)) != NULL && (item = _find_in_children(xml, path)) != NULL) { /* if path is found and has then replace it with */ g_list_free(xml); xml = fm_xml_file_item_get_children(item); for (it = xml; it; it = it->next) { FmXmlFileTag tag = fm_xml_file_item_get_tag(it->data); if (tag == menuTag_Deleted || tag == menuTag_NotDeleted) fm_xml_file_item_destroy(it->data); } goto _add_deleted_tag; } else { /* else create path and add to it */ item = _create_path_in_tree(apps, path); if (item == NULL) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("Cannot create XML definition for '%s'"), path); ok = FALSE; } else { FmXmlFileItem *item2; _add_deleted_tag: item2 = fm_xml_file_item_new(menuTag_Deleted); fm_xml_file_item_set_comment(item2, "deleted by LibFM"); fm_xml_file_item_append_child(item, item2); /* NOTE: it cannot fail */ } } if (ok) ok = _save_new_menu_file(gf, data.menu, cancellable, error); G_UNLOCK(menuTree); g_object_unref(gf); g_object_unref(data.menu); g_free(data.file_path); g_list_free(xml); return ok; } /* changes .menu XML file */ static gboolean _add_directory(const char *path, GCancellable *cancellable, GError **error) { GList *xml = NULL, *it; GFile *gf; FmXmlFileItem *apps, *item, *child; FmMenuMenuTree data; gboolean ok = TRUE; /* g_debug("adding menu folder '%s'", path); */ /* FIXME: fail if such Menu Name already not deleted in XML tree */ apps = _prepare_contents(&data, cancellable, error, &gf); if (apps == NULL) { /* either failed to load contents or cancelled */ ok = FALSE; } else if ((xml = fm_xml_file_item_get_children(apps)) != NULL && (item = _find_in_children(xml, path)) != NULL) { /* "undelete" the directory: */ /* if path is found and has then replace it with */ g_list_free(xml); xml = fm_xml_file_item_get_children(item); ok = FALSE; /* it should be Deleted, otherwise error, see FIXME above */ for (it = xml; it; it = it->next) { FmXmlFileTag tag = fm_xml_file_item_get_tag(it->data); if (tag == menuTag_Deleted) { fm_xml_file_item_destroy(it->data); ok = TRUE; /* see FIXME above */ } else if (tag == menuTag_NotDeleted) { fm_xml_file_item_destroy(it->data); ok = FALSE; /* see FIXME above */ } } if (!ok) /* see FIXME above */ g_set_error(error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Menu path '%s' already exists"), path); else { child = fm_xml_file_item_new(menuTag_NotDeleted); fm_xml_file_item_set_comment(child, "undeleted by LibFM"); fm_xml_file_item_append_child(item, child); /* NOTE: it cannot fail */ } } else { /* else create path and add content to it */ item = _create_path_in_tree(apps, path); if (item == NULL) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Cannot create XML definition for '%s'"), path); ok = FALSE; } else { char *pathtag, *dir, *contents; GString *str; /* add */ child = fm_xml_file_item_new(menuTag_NotDeleted); fm_xml_file_item_append_child(item, child); /* touch .directory file, ignore errors */ dir = strrchr(path, '/'); /* use it as a storage for basename */ if (dir) dir++; else dir = (char *)path; contents = g_strdup_printf("[" G_KEY_FILE_DESKTOP_GROUP "]\n" G_KEY_FILE_DESKTOP_KEY_TYPE "=" G_KEY_FILE_DESKTOP_TYPE_DIRECTORY "\n" G_KEY_FILE_DESKTOP_KEY_NAME "=%s", dir); pathtag = _get_pathtag_for_path(path); dir = g_build_filename(g_get_user_data_dir(), "desktop-directories", pathtag, NULL); str = g_string_new(dir); g_free(dir); g_string_append(str, ".directory"); g_file_set_contents(str->str, contents, -1, NULL); /* FIXME: report errors */ g_free(contents); /* add ..... */ child = fm_xml_file_item_new(menuTag_Directory); g_string_printf(str, "%s.directory", pathtag); fm_xml_file_item_append_text(child, str->str, str->len, FALSE); fm_xml_file_item_append_child(item, child); /* add ...... */ child = fm_xml_file_item_new(menuTag_Include); fm_xml_file_item_append_child(item, child); g_string_printf(str, "X-%s", pathtag); g_free(pathtag); item = fm_xml_file_item_new(menuTag_Category); /* reuse item var. */ fm_xml_file_item_append_text(item, str->str, str->len, FALSE); fm_xml_file_item_append_child(child, item); g_string_free(str, TRUE); /* ignoring errors since new created items cannot fail on append */ } } if (ok) ok = _save_new_menu_file(gf, data.menu, cancellable, error); G_UNLOCK(menuTree); g_object_unref(gf); g_object_unref(data.menu); g_free(data.file_path); g_list_free(xml); return ok; } #endif /* changes .menu XML file */ static gboolean _add_application(const char *path, GCancellable *cancellable, GError **error) { const char *id; char *dir; GList *xml = NULL, *it; GFile *gf; FmXmlFileItem *apps, *item, *child; FmMenuMenuTree data; gboolean ok = TRUE; id = strrchr(path, '/'); if (id == NULL) { dir = NULL; id = path; } else { dir = g_strndup(path, id - path); id++; } apps = _prepare_contents(&data, cancellable, error, &gf); if (apps == NULL) { /* either failed to load contents or cancelled */ ok = FALSE; } else if (dir == NULL) /* adding to root, use apps as target */ { item = apps; goto _set; } else if ((xml = fm_xml_file_item_get_children(apps)) != NULL && (item = _find_in_children(xml, dir)) != NULL) { /* already found that path */ goto _set; } else { /* else create path and add content to it */ item = _create_path_in_tree(apps, dir); if (item == NULL) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Cannot create XML definition for '%s'"), path); ok = FALSE; } else { _set: g_list_free(xml); xml = fm_xml_file_item_get_children(item); ok = FALSE; /* check if Include is already there */ /* remove id */ for (it = xml; it; it = it->next) { FmXmlFileTag tag = fm_xml_file_item_get_tag(it->data); if (tag == menuTag_Exclude) { /* get Filename tag */ child = fm_xml_file_item_find_child(it->data, menuTag_Filename); if (child == NULL) continue; /* get contents of the tag */ child = fm_xml_file_item_find_child(child, FM_XML_FILE_TEXT); if (child == NULL) continue; if (strcmp(fm_xml_file_item_get_data(child, NULL), id) != 0) continue; fm_xml_file_item_destroy(it->data); /* it was excluded before so removing exclude will add it */ ok = TRUE; } else if (!ok && tag == menuTag_Include) { /* get Filename tag */ child = fm_xml_file_item_find_child(it->data, menuTag_Filename); if (child == NULL) continue; /* get contents of the tag */ child = fm_xml_file_item_find_child(child, FM_XML_FILE_TEXT); if (child == NULL) continue; if (strcmp(fm_xml_file_item_get_data(child, NULL), id) == 0) ok = TRUE; /* found! */ } } if (!ok) { /* add id */ child = fm_xml_file_item_new(menuTag_Include); fm_xml_file_item_set_comment(child, "added by LibFM"); fm_xml_file_item_append_child(item, child); item = fm_xml_file_item_new(menuTag_Filename); fm_xml_file_item_append_text(item, id, -1, FALSE); fm_xml_file_item_append_child(child, item); ok = TRUE; } } } if (ok) ok = _save_new_menu_file(gf, data.menu, cancellable, error); G_UNLOCK(menuTree); g_object_unref(gf); g_object_unref(data.menu); g_free(data.file_path); g_list_free(xml); g_free(dir); return ok; } /* changes .menu XML file */ static gboolean _remove_application(const char *path, GCancellable *cancellable, GError **error) { const char *id; char *dir; GList *xml = NULL, *it; GFile *gf; FmXmlFileItem *apps, *item, *child; FmMenuMenuTree data; gboolean ok = TRUE; id = strrchr(path, '/'); if (id == NULL) { dir = NULL; id = path; } else { dir = g_strndup(path, id - path); id++; } apps = _prepare_contents(&data, cancellable, error, &gf); if (apps == NULL) { /* either failed to load contents or cancelled */ ok = FALSE; } else if (dir == NULL) /* removing from root, use apps as target */ { item = apps; goto _set; } else if ((xml = fm_xml_file_item_get_children(apps)) != NULL && (item = _find_in_children(xml, dir)) != NULL) { /* already found that path */ goto _set; } else { /* else create path and add content to it */ item = _create_path_in_tree(apps, dir); if (item == NULL) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Cannot create XML definition for '%s'"), path); ok = FALSE; } else { _set: g_list_free(xml); xml = fm_xml_file_item_get_children(item); ok = FALSE; /* check if Include is already there */ /* remove id */ for (it = xml; it; it = it->next) { FmXmlFileTag tag = fm_xml_file_item_get_tag(it->data); if (tag == menuTag_Include) { /* get Filename tag */ child = fm_xml_file_item_find_child(it->data, menuTag_Filename); if (child == NULL) continue; /* get contents of the tag */ child = fm_xml_file_item_find_child(child, FM_XML_FILE_TEXT); if (child == NULL) continue; if (strcmp(fm_xml_file_item_get_data(child, NULL), id) != 0) continue; fm_xml_file_item_destroy(it->data); /* it was included before so removing include will remove it */ ok = TRUE; } else if (!ok && tag == menuTag_Exclude) { /* get Filename tag */ child = fm_xml_file_item_find_child(it->data, menuTag_Filename); if (child == NULL) continue; /* get contents of the tag */ child = fm_xml_file_item_find_child(child, FM_XML_FILE_TEXT); if (child == NULL) continue; if (strcmp(fm_xml_file_item_get_data(child, NULL), id) == 0) ok = TRUE; /* found! */ } } if (!ok) { /* add id */ child = fm_xml_file_item_new(menuTag_Exclude); fm_xml_file_item_set_comment(child, "deleted by LibFM"); fm_xml_file_item_append_child(item, child); item = fm_xml_file_item_new(menuTag_Filename); fm_xml_file_item_append_text(item, id, -1, FALSE); fm_xml_file_item_append_child(child, item); ok = TRUE; } } } if (ok) ok = _save_new_menu_file(gf, data.menu, cancellable, error); G_UNLOCK(menuTree); g_object_unref(gf); g_object_unref(data.menu); g_free(data.file_path); g_list_free(xml); g_free(dir); return ok; } /* ---- FmMenuVFile class ---- */ #define FM_TYPE_MENU_VFILE (fm_vfs_menu_file_get_type()) #define FM_MENU_VFILE(o) (G_TYPE_CHECK_INSTANCE_CAST((o), \ FM_TYPE_MENU_VFILE, FmMenuVFile)) typedef struct _FmMenuVFile FmMenuVFile; typedef struct _FmMenuVFileClass FmMenuVFileClass; static GType fm_vfs_menu_file_get_type (void); struct _FmMenuVFile { GObject parent_object; char *path; }; struct _FmMenuVFileClass { GObjectClass parent_class; }; static void fm_menu_g_file_init(GFileIface *iface); static void fm_menu_fm_file_init(FmFileInterface *iface); G_DEFINE_TYPE_WITH_CODE(FmMenuVFile, fm_vfs_menu_file, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_FILE, fm_menu_g_file_init) G_IMPLEMENT_INTERFACE(FM_TYPE_FILE, fm_menu_fm_file_init)) static void fm_vfs_menu_file_finalize(GObject *object) { FmMenuVFile *item = FM_MENU_VFILE(object); g_free(item->path); G_OBJECT_CLASS(fm_vfs_menu_file_parent_class)->finalize(object); } static void fm_vfs_menu_file_class_init(FmMenuVFileClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = fm_vfs_menu_file_finalize; } static void fm_vfs_menu_file_init(FmMenuVFile *item) { /* nothing */ } static FmMenuVFile *_fm_menu_vfile_new(void) { return (FmMenuVFile*)g_object_new(FM_TYPE_MENU_VFILE, NULL); } /* ---- menu enumerator class ---- */ #define FM_TYPE_VFS_MENU_ENUMERATOR (fm_vfs_menu_enumerator_get_type()) #define FM_VFS_MENU_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST((o), \ FM_TYPE_VFS_MENU_ENUMERATOR, FmVfsMenuEnumerator)) typedef struct _FmVfsMenuEnumerator FmVfsMenuEnumerator; typedef struct _FmVfsMenuEnumeratorClass FmVfsMenuEnumeratorClass; struct _FmVfsMenuEnumerator { GFileEnumerator parent; MenuCache *mc; GSList *child; guint32 de_flag; }; struct _FmVfsMenuEnumeratorClass { GFileEnumeratorClass parent_class; }; static GType fm_vfs_menu_enumerator_get_type (void); G_DEFINE_TYPE(FmVfsMenuEnumerator, fm_vfs_menu_enumerator, G_TYPE_FILE_ENUMERATOR) static void _fm_vfs_menu_enumerator_dispose(GObject *object) { FmVfsMenuEnumerator *enu = FM_VFS_MENU_ENUMERATOR(object); if(enu->mc) { menu_cache_unref(enu->mc); enu->mc = NULL; } G_OBJECT_CLASS(fm_vfs_menu_enumerator_parent_class)->dispose(object); } static GFileInfo *_g_file_info_from_menu_cache_item(MenuCacheItem *item, // GFileAttributeMatcher *attribute_matcher, guint32 de_flag) { GFileInfo *fileinfo = g_file_info_new(); const char *icon_name; GIcon* icon; /* FIXME: use g_uri_escape_string() for item name */ g_file_info_set_name(fileinfo, menu_cache_item_get_id(item)); if(menu_cache_item_get_name(item) != NULL) g_file_info_set_display_name(fileinfo, menu_cache_item_get_name(item)); /* the setup below was in fm_file_info_set_from_menu_cache_item() so this setup makes latter API deprecated */ icon_name = menu_cache_item_get_icon(item); if(icon_name) { icon = G_ICON(fm_icon_from_name(icon_name)); if(G_LIKELY(icon)) { g_file_info_set_icon(fileinfo, icon); g_object_unref(icon); } } if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) { g_file_info_set_file_type(fileinfo, G_FILE_TYPE_DIRECTORY); #if MENU_CACHE_CHECK_VERSION(0, 5, 0) g_file_info_set_is_hidden(fileinfo, !menu_cache_dir_is_visible(MENU_CACHE_DIR(item))); #else g_file_info_set_is_hidden(fileinfo, FALSE); #endif } else /* MENU_CACHE_TYPE_APP */ { char *path = menu_cache_item_get_file_path(item); g_file_info_set_file_type(fileinfo, G_FILE_TYPE_SHORTCUT); g_file_info_set_attribute_string(fileinfo, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, path); g_free(path); g_file_info_set_content_type(fileinfo, "application/x-desktop"); g_file_info_set_is_hidden(fileinfo, !menu_cache_app_get_is_visible(MENU_CACHE_APP(item), de_flag)); } // FIXME: use attribute_matcher and set G_FILE_ATTRIBUTE_ACCESS_CAN_{WRITE,READ,EXECUTE,DELETE} g_file_info_set_attribute_string(fileinfo, G_FILE_ATTRIBUTE_ID_FILESYSTEM, "menu-Applications"); g_file_info_set_attribute_boolean(fileinfo, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, TRUE); g_file_info_set_attribute_boolean(fileinfo, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH, FALSE); return fileinfo; } typedef struct { union { FmVfsMenuEnumerator *enumerator; const char *path_str; }; union { FmMenuVFile *destination; // const char *attributes; const char *display_name; GFileInfo *info; }; // GFileQueryInfoFlags flags; union { GCancellable *cancellable; GFile *file; }; GError **error; gpointer result; } FmVfsMenuMainThreadData; static gboolean _fm_vfs_menu_enumerator_next_file_real(gpointer data) { FmVfsMenuMainThreadData *init = data; FmVfsMenuEnumerator *enu = init->enumerator; GSList *child = enu->child; MenuCacheItem *item; init->result = NULL; if(child == NULL) goto done; for(; child; child = child->next) { if(g_cancellable_set_error_if_cancelled(init->cancellable, init->error)) break; item = MENU_CACHE_ITEM(child->data); if(!item || menu_cache_item_get_type(item) == MENU_CACHE_TYPE_SEP || menu_cache_item_get_type(item) == MENU_CACHE_TYPE_NONE) continue; #if 0 /* also hide menu items which should be hidden in current DE. */ if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP && !menu_cache_app_get_is_visible(MENU_CACHE_APP(item), enu->de_flag)) continue; #endif init->result = _g_file_info_from_menu_cache_item(item, enu->de_flag); child = child->next; break; } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) while(enu->child != child) /* free skipped/used elements */ { GSList *ch = enu->child; enu->child = ch->next; menu_cache_item_unref(ch->data); g_slist_free_1(ch); } #else enu->child = child; #endif done: return FALSE; } static GFileInfo *_fm_vfs_menu_enumerator_next_file(GFileEnumerator *enumerator, GCancellable *cancellable, GError **error) { FmVfsMenuMainThreadData init; init.enumerator = FM_VFS_MENU_ENUMERATOR(enumerator); init.cancellable = cancellable; init.error = error; RUN_WITH_MENU_CACHE(_fm_vfs_menu_enumerator_next_file_real, &init); return init.result; } static gboolean _fm_vfs_menu_enumerator_close(GFileEnumerator *enumerator, GCancellable *cancellable, GError **error) { FmVfsMenuEnumerator *enu = FM_VFS_MENU_ENUMERATOR(enumerator); if(enu->mc) { menu_cache_unref(enu->mc); enu->mc = NULL; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) g_slist_free_full(enu->child, (GDestroyNotify)menu_cache_item_unref); #endif enu->child = NULL; } return TRUE; } static void fm_vfs_menu_enumerator_class_init(FmVfsMenuEnumeratorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GFileEnumeratorClass *enumerator_class = G_FILE_ENUMERATOR_CLASS(klass); gobject_class->dispose = _fm_vfs_menu_enumerator_dispose; enumerator_class->next_file = _fm_vfs_menu_enumerator_next_file; enumerator_class->close_fn = _fm_vfs_menu_enumerator_close; } static void fm_vfs_menu_enumerator_init(FmVfsMenuEnumerator *enumerator) { /* nothing */ } static MenuCacheItem *_vfile_path_to_menu_cache_item(MenuCache* mc, const char *path) { MenuCacheItem *dir; char *unescaped, *tmp = NULL; unescaped = g_uri_unescape_string(path, NULL); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) dir = MENU_CACHE_ITEM(menu_cache_dup_root_dir(mc)); #else dir = MENU_CACHE_ITEM(menu_cache_get_root_dir(mc)); #endif if(dir) { #if !MENU_CACHE_CHECK_VERSION(0, 5, 0) char *id; #if !MENU_CACHE_CHECK_VERSION(0, 4, 0) GSList *child; #endif #endif tmp = g_strconcat("/", menu_cache_item_get_id(dir), "/", unescaped, NULL); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) menu_cache_item_unref(dir); dir = menu_cache_item_from_path(mc, tmp); #else /* access not dir is a bit tricky */ id = strrchr(tmp, '/'); *id++ = '\0'; dir = MENU_CACHE_ITEM(menu_cache_get_dir_from_path(mc, tmp)); child = menu_cache_dir_get_children(MENU_CACHE_DIR(dir)); dir = NULL; while (child) { if (g_strcmp0(id, menu_cache_item_get_id(child->data)) == 0) { dir = child->data; break; } child = child->next; } #endif #if !MENU_CACHE_CHECK_VERSION(0, 5, 0) /* The menu-cache is buggy and returns parent for invalid path instead of failure so we check what we got here. Unfortunately we cannot detect if requested name is the same as its parent and menu-cache returned the parent. */ id = strrchr(unescaped, '/'); if(id) id++; else id = unescaped; if(dir != NULL && strcmp(id, menu_cache_item_get_id(dir)) != 0) dir = NULL; #endif } g_free(unescaped); g_free(tmp); /* NOTE: returned value is referenced for >= 0.4.0 only */ return dir; } static MenuCache *_get_menu_cache(GError **error) { MenuCache *mc; static gboolean environment_tested = FALSE; static gboolean requires_prefix = FALSE; /* do it in compatibility with lxpanel */ if(!environment_tested) { requires_prefix = (g_getenv("XDG_MENU_PREFIX") == NULL); environment_tested = TRUE; } #if MENU_CACHE_CHECK_VERSION(0, 5, 0) mc = menu_cache_lookup_sync(requires_prefix ? "lxde-applications.menu+hidden" : "applications.menu+hidden"); #else mc = menu_cache_lookup_sync(requires_prefix ? "lxde-applications.menu" : "applications.menu"); #endif /* FIXME: may be it is reasonable to set XDG_MENU_PREFIX ? */ if(mc == NULL) /* initialization failed */ g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Menu cache error")); return mc; } static gboolean _fm_vfs_menu_enumerator_new_real(gpointer data) { FmVfsMenuMainThreadData *init = data; FmVfsMenuEnumerator *enumerator; MenuCache* mc; const char *de_name; MenuCacheItem *dir; mc = _get_menu_cache(init->error); if(mc == NULL) /* initialization failed */ return FALSE; enumerator = g_object_new(FM_TYPE_VFS_MENU_ENUMERATOR, "container", init->file, NULL); enumerator->mc = mc; de_name = g_getenv("XDG_CURRENT_DESKTOP"); if(de_name) enumerator->de_flag = menu_cache_get_desktop_env_flag(mc, de_name); else enumerator->de_flag = (guint32)-1; /* the menu should be loaded now */ if(init->path_str) dir = _vfile_path_to_menu_cache_item(mc, init->path_str); else #if MENU_CACHE_CHECK_VERSION(0, 4, 0) dir = MENU_CACHE_ITEM(menu_cache_dup_root_dir(mc)); #else dir = MENU_CACHE_ITEM(menu_cache_get_root_dir(mc)); #endif if(dir) { #if MENU_CACHE_CHECK_VERSION(0, 4, 0) enumerator->child = menu_cache_dir_list_children(MENU_CACHE_DIR(dir)); menu_cache_item_unref(dir); #else enumerator->child = menu_cache_dir_get_children(MENU_CACHE_DIR(dir)); #endif } /* FIXME: do something with attributes and flags */ init->result = enumerator; return FALSE; } static GFileEnumerator *_fm_vfs_menu_enumerator_new(GFile *file, const char *path_str, const char *attributes, GFileQueryInfoFlags flags, GError **error) { FmVfsMenuMainThreadData enu; enu.path_str = path_str; // enu.attributes = attributes; // enu.flags = flags; enu.file = file; enu.error = error; enu.result = NULL; RUN_WITH_MENU_CACHE(_fm_vfs_menu_enumerator_new_real, &enu); return enu.result; } /* ---- GFile implementation ---- */ static GFileAttributeInfoList *_fm_vfs_menu_settable_attributes = NULL; #define ERROR_UNSUPPORTED(err) g_set_error_literal(err, G_IO_ERROR, \ G_IO_ERROR_NOT_SUPPORTED, _("Operation not supported")) static GFile *_fm_vfs_menu_dup(GFile *file) { FmMenuVFile *item, *new_item; item = FM_MENU_VFILE(file); new_item = _fm_menu_vfile_new(); if(item->path) new_item->path = g_strdup(item->path); return (GFile*)new_item; } static guint _fm_vfs_menu_hash(GFile *file) { return g_str_hash(FM_MENU_VFILE(file)->path ? FM_MENU_VFILE(file)->path : "/"); } static gboolean _fm_vfs_menu_equal(GFile *file1, GFile *file2) { char *path1 = FM_MENU_VFILE(file1)->path; char *path2 = FM_MENU_VFILE(file2)->path; return g_strcmp0(path1, path2) == 0; } static gboolean _fm_vfs_menu_is_native(GFile *file) { return FALSE; } static gboolean _fm_vfs_menu_has_uri_scheme(GFile *file, const char *uri_scheme) { return g_ascii_strcasecmp(uri_scheme, "menu") == 0; } static char *_fm_vfs_menu_get_uri_scheme(GFile *file) { return g_strdup("menu"); } static char *_fm_vfs_menu_get_basename(GFile *file) { /* g_debug("_fm_vfs_menu_get_basename %s", FM_MENU_VFILE(file)->path); */ if(FM_MENU_VFILE(file)->path == NULL) return g_strdup("/"); return g_path_get_basename(FM_MENU_VFILE(file)->path); } static char *_fm_vfs_menu_get_path(GFile *file) { return NULL; } static char *_fm_vfs_menu_get_uri(GFile *file) { return g_strconcat("menu://applications/", FM_MENU_VFILE(file)->path, NULL); } static char *_fm_vfs_menu_get_parse_name(GFile *file) { char *unescaped, *path; /* g_debug("_fm_vfs_menu_get_parse_name %s", FM_MENU_VFILE(file)->path); */ unescaped = g_uri_unescape_string(FM_MENU_VFILE(file)->path, NULL); path = g_strconcat("menu://applications/", unescaped, NULL); g_free(unescaped); return path; } static GFile *_fm_vfs_menu_get_parent(GFile *file) { char *path = FM_MENU_VFILE(file)->path; char *dirname; GFile *parent; /* g_debug("_fm_vfs_menu_get_parent %s", path); */ if(path) { dirname = g_path_get_dirname(path); if(strcmp(dirname, ".") == 0) { g_free(dirname); path = NULL; } else path = dirname; } parent = _fm_vfs_menu_new_for_uri(path); if(path) g_free(path); return parent; } /* this function is taken from GLocalFile implementation */ static const char *match_prefix (const char *path, const char *prefix) { int prefix_len; prefix_len = strlen (prefix); if (strncmp (path, prefix, prefix_len) != 0) return NULL; if (prefix_len > 0 && (prefix[prefix_len-1]) == '/') prefix_len--; return path + prefix_len; } static gboolean _fm_vfs_menu_prefix_matches(GFile *prefix, GFile *file) { const char *path = FM_MENU_VFILE(file)->path; const char *pp = FM_MENU_VFILE(prefix)->path; const char *remainder; if(pp == NULL) return TRUE; if(path == NULL) return FALSE; remainder = match_prefix(path, pp); if(remainder != NULL && *remainder == '/') return TRUE; return FALSE; } static char *_fm_vfs_menu_get_relative_path(GFile *parent, GFile *descendant) { const char *path = FM_MENU_VFILE(descendant)->path; const char *pp = FM_MENU_VFILE(parent)->path; const char *remainder; if(pp == NULL) return g_strdup(path); if(path == NULL) return NULL; remainder = match_prefix(path, pp); if(remainder != NULL && *remainder == '/') return g_uri_unescape_string(&remainder[1], NULL); return NULL; } static GFile *_fm_vfs_menu_resolve_relative_path(GFile *file, const char *relative_path) { const char *path = FM_MENU_VFILE(file)->path; FmMenuVFile *new_item = _fm_menu_vfile_new(); /* g_debug("_fm_vfs_menu_resolve_relative_path %s %s", path, relative_path); */ /* FIXME: handle if relative_path is invalid */ if(relative_path == NULL || *relative_path == '\0') new_item->path = g_strdup(path); else if(path == NULL) new_item->path = g_strdup(relative_path); else { /* relative_path is the most probably unescaped string (at least GFVS works such way) so we have to escape invalid chars here. */ char *escaped = g_uri_escape_string(relative_path, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE); new_item->path = g_strconcat(path, "/", relative_path, NULL); g_free(escaped); } return (GFile*)new_item; } static gboolean _fm_vfs_menu_get_child_for_display_name_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; MenuCacheItem *dir; gboolean is_invalid = FALSE; init->result = NULL; mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; if(init->path_str) { dir = _vfile_path_to_menu_cache_item(mc, init->path_str); if(dir == NULL || menu_cache_item_get_type(dir) != MENU_CACHE_TYPE_DIR) is_invalid = TRUE; } else #if MENU_CACHE_CHECK_VERSION(0, 4, 0) dir = MENU_CACHE_ITEM(menu_cache_dup_root_dir(mc)); #else dir = MENU_CACHE_ITEM(menu_cache_get_root_dir(mc)); #endif if(is_invalid) g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Invalid menu directory")); else if(dir) { #if MENU_CACHE_CHECK_VERSION(0, 5, 0) MenuCacheItem *item = menu_cache_find_child_by_name(MENU_CACHE_DIR(dir), init->display_name); g_debug("searched for child '%s' found '%s'", init->display_name, item ? menu_cache_item_get_id(item) : "(nil)"); if (item == NULL) init->result = _fm_vfs_menu_resolve_relative_path(init->file, init->display_name); else { init->result = _fm_vfs_menu_resolve_relative_path(init->file, menu_cache_item_get_id(item)); menu_cache_item_unref(item); } #else /* < 0.5.0 */ GSList *l; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) GSList *children = menu_cache_dir_list_children(MENU_CACHE_DIR(dir)); #else GSList *children = menu_cache_dir_get_children(MENU_CACHE_DIR(dir)); #endif for (l = children; l; l = l->next) if (g_strcmp0(init->display_name, menu_cache_item_get_name(l->data)) == 0) break; if (l == NULL) /* not found */ init->result = _fm_vfs_menu_resolve_relative_path(init->file, init->display_name); else init->result = _fm_vfs_menu_resolve_relative_path(init->file, menu_cache_item_get_id(l->data)); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) g_slist_free_full(children, (GDestroyNotify)menu_cache_item_unref); #endif #endif /* < 0.5.0 */ } else /* menu_cache_get_root_dir failed */ g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Menu cache error")); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(dir) menu_cache_item_unref(dir); #endif menu_cache_unref(mc); _mc_failed: return FALSE; } static GFile *_fm_vfs_menu_get_child_for_display_name(GFile *file, const char *display_name, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_get_child_for_display_name: '%s' '%s'", item->path, display_name); */ if (display_name == NULL || *display_name == '\0') { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Menu item name cannot be empty")); return NULL; } /* NOTE: this violates GFile requirement that this API should not do I/O but there is no way to do this without dirty tricks which may lead to failure */ enu.path_str = item->path; enu.error = error; enu.display_name = display_name; enu.file = file; RUN_WITH_MENU_CACHE(_fm_vfs_menu_get_child_for_display_name_real, &enu); return enu.result; } static GFileEnumerator *_fm_vfs_menu_enumerate_children(GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { const char *path = FM_MENU_VFILE(file)->path; return _fm_vfs_menu_enumerator_new(file, path, attributes, flags, error); } static gboolean _fm_vfs_menu_query_info_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; MenuCacheItem *dir; gboolean is_invalid = FALSE; init->result = NULL; mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; if(init->path_str) { dir = _vfile_path_to_menu_cache_item(mc, init->path_str); if(dir == NULL) is_invalid = TRUE; } else #if MENU_CACHE_CHECK_VERSION(0, 4, 0) dir = MENU_CACHE_ITEM(menu_cache_dup_root_dir(mc)); #else dir = MENU_CACHE_ITEM(menu_cache_get_root_dir(mc)); #endif if(is_invalid) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Invalid menu directory '%s'"), init->path_str); else if(dir) { const char *de_name = g_getenv("XDG_CURRENT_DESKTOP"); if(de_name) init->result = _g_file_info_from_menu_cache_item(dir, menu_cache_get_desktop_env_flag(mc, de_name)); else init->result = _g_file_info_from_menu_cache_item(dir, (guint32)-1); } else /* menu_cache_get_root_dir failed */ g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Menu cache error")); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(dir) menu_cache_item_unref(dir); #endif menu_cache_unref(mc); _mc_failed: return FALSE; } static GFileInfo *_fm_vfs_menu_query_info(GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); GFileInfo *info; GFileAttributeMatcher *matcher; char *basename, *id; FmVfsMenuMainThreadData enu; matcher = g_file_attribute_matcher_new(attributes); if(item->path == NULL) /* menu root */ { info = g_file_info_new(); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_NAME)) g_file_info_set_name(info, "/"); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ID_FILESYSTEM)) g_file_info_set_attribute_string(info, G_FILE_ATTRIBUTE_ID_FILESYSTEM, "menu-Applications"); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_TYPE)) g_file_info_set_file_type(info, G_FILE_TYPE_DIRECTORY); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_ICON)) { GIcon *icon = g_themed_icon_new("system-software-install"); g_file_info_set_icon(info, icon); g_object_unref(icon); } if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN)) g_file_info_set_is_hidden(info, FALSE); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME)) g_file_info_set_display_name(info, _("Applications")); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME)) g_file_info_set_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME, FALSE); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH)) g_file_info_set_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH, FALSE); #if 0 /* FIXME: is this ever needed? */ if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE)) g_file_info_set_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, TRUE); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ACCESS_CAN_READ)) g_file_info_set_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ, TRUE); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE)) g_file_info_set_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE, FALSE); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE)) g_file_info_set_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, FALSE); #endif } else if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_TYPE) || g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_ICON) || g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI) || g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE) || g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) || g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME)) { /* retrieve matching attributes from menu-cache */ enu.path_str = item->path; // enu.attributes = attributes; // enu.flags = flags; enu.cancellable = cancellable; enu.error = error; RUN_WITH_MENU_CACHE(_fm_vfs_menu_query_info_real, &enu); info = enu.result; } else { info = g_file_info_new(); if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_STANDARD_NAME)) { basename = g_path_get_basename(item->path); id = g_uri_unescape_string(basename, NULL); g_free(basename); g_file_info_set_name(info, id); g_free(id); } if(g_file_attribute_matcher_matches(matcher, G_FILE_ATTRIBUTE_ID_FILESYSTEM)) g_file_info_set_attribute_string(info, G_FILE_ATTRIBUTE_ID_FILESYSTEM, "menu-Applications"); } g_file_attribute_matcher_unref(matcher); return info; } static GFileInfo *_fm_vfs_menu_query_filesystem_info(GFile *file, const char *attributes, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GMount *_fm_vfs_menu_find_enclosing_mount(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static gboolean _fm_vfs_menu_set_display_name_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; MenuCacheItem *dir; gboolean ok = FALSE; mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; dir = _vfile_path_to_menu_cache_item(mc, init->path_str); if(dir == NULL) g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Invalid menu item")); else if (menu_cache_item_get_file_basename(dir) == NULL || menu_cache_item_get_file_dirname(dir) == NULL) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("The menu item '%s' doesn't have appropriate entry file"), menu_cache_item_get_id(dir)); else if (!g_cancellable_set_error_if_cancelled(init->cancellable, init->error)) { char *path = menu_cache_item_get_file_path(dir); GKeyFile *kf = g_key_file_new(); ok = g_key_file_load_from_file(kf, path, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, init->error); g_free(path); if (ok) { /* get locale name */ const gchar * const *langs = g_get_language_names(); char *contents; gsize length; if (strcmp(langs[0], "C") != 0) { char *lang; /* remove encoding from locale name */ char *sep = strchr(langs[0], '.'); if (sep) lang = g_strndup(langs[0], sep - langs[0]); else lang = g_strdup(langs[0]); g_key_file_set_locale_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, lang, init->display_name); g_free(lang); } else g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, init->display_name); contents = g_key_file_to_data(kf, &length, init->error); if (contents == NULL) ok = FALSE; else { path = g_build_filename(g_get_user_data_dir(), (menu_cache_item_get_type(dir) == MENU_CACHE_TYPE_DIR) ? "desktop-directories" : "applications", menu_cache_item_get_file_basename(dir), NULL); ok = g_file_set_contents(path, contents, length, init->error); /* FIXME: handle case if directory doesn't exist */ g_free(contents); g_free(path); } } g_key_file_free(kf); } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(dir) menu_cache_item_unref(dir); #endif menu_cache_unref(mc); _mc_failed: return ok; } static GFile *_fm_vfs_menu_set_display_name(GFile *file, const char *display_name, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_set_display_name: %s -> %s", item->path, display_name); */ if (item->path == NULL) { ERROR_UNSUPPORTED(error); return NULL; } if (display_name == NULL || *display_name == '\0') { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Menu item name cannot be empty")); return NULL; } enu.path_str = item->path; enu.display_name = display_name; enu.cancellable = cancellable; enu.error = error; if (RUN_WITH_MENU_CACHE(_fm_vfs_menu_set_display_name_real, &enu)) return g_object_ref(file); return NULL; } static GFileAttributeInfoList *_fm_vfs_menu_query_settable_attributes(GFile *file, GCancellable *cancellable, GError **error) { return g_file_attribute_info_list_ref(_fm_vfs_menu_settable_attributes); } static GFileAttributeInfoList *_fm_vfs_menu_query_writable_namespaces(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static gboolean _fm_vfs_menu_set_attributes_from_info_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; MenuCacheItem *item; gpointer value; const char *display_name = NULL; GIcon *icon = NULL; gint set_hidden = -1; gboolean ok = FALSE; /* check attributes first */ if (g_file_info_get_attribute_data(init->info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, NULL, &value, NULL)) display_name = value; if (g_file_info_get_attribute_data(init->info, G_FILE_ATTRIBUTE_STANDARD_ICON, NULL, &value, NULL)) icon = value; if (g_file_info_get_attribute_data(init->info, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN, NULL, &value, NULL)) set_hidden = (*(gboolean *)value) ? 1 : 0; if (display_name == NULL && icon == NULL && set_hidden < 0) return TRUE; /* nothing to do */ /* now try access item */ mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; item = _vfile_path_to_menu_cache_item(mc, init->path_str); if(item == NULL) g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Invalid menu item")); else if (menu_cache_item_get_file_basename(item) == NULL || menu_cache_item_get_file_dirname(item) == NULL) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("The menu item '%s' doesn't have appropriate entry file"), menu_cache_item_get_id(item)); else if (!g_cancellable_set_error_if_cancelled(init->cancellable, init->error)) { char *path; GKeyFile *kf; GError *err = NULL; gboolean no_error = TRUE; /* for hidden on directory: use _add_directory() or _remove_directory() */ if (set_hidden >= 0 && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) { #if MENU_CACHE_CHECK_VERSION(0, 5, 0) char *unescaped = g_uri_unescape_string(init->path_str, NULL); if (set_hidden > 0) no_error = _remove_directory(unescaped, init->cancellable, init->error); else no_error = _add_directory(unescaped, init->cancellable, init->error); g_free(unescaped); ok = no_error; #else g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Change hidden status isn't supported for menu directory")); no_error = FALSE; #endif if (display_name == NULL && icon == NULL) /* nothing else to update */ goto _done; set_hidden = -1; /* don't set NoDisplay for a directory */ } /* in all other cases - update Name, Icon or NoDisplay and save keyfile */ path = menu_cache_item_get_file_path(item); kf = g_key_file_new(); ok = g_key_file_load_from_file(kf, path, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &err); g_free(path); if (ok) /* otherwise there is no reason to continue */ { char *contents; gsize length; if (display_name) { /* get locale name */ const gchar * const *langs = g_get_language_names(); if (strcmp(langs[0], "C") != 0) { char *lang; /* remove encoding from locale name */ char *sep = strchr(langs[0], '.'); if (sep) lang = g_strndup(langs[0], sep - langs[0]); else lang = g_strdup(langs[0]); g_key_file_set_locale_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, lang, display_name); g_free(lang); } else g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, display_name); } if (icon) { char *icon_str = g_icon_to_string(icon); /* FIXME: need to change encoding in some cases? */ g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, icon_str); g_free(icon_str); } if (set_hidden >= 0) { g_key_file_set_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, (set_hidden > 0)); } contents = g_key_file_to_data(kf, &length, &err); if (contents == NULL) ok = FALSE; else { path = g_build_filename(g_get_user_data_dir(), (menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) ? "desktop-directories" : "applications", menu_cache_item_get_file_basename(item), NULL); ok = g_file_set_contents(path, contents, length, &err); /* FIXME: handle case if directory doesn't exist */ g_free(contents); g_free(path); } } g_key_file_free(kf); if (no_error && !ok) /* we got error in err */ g_propagate_error(init->error, err); else if (!ok) /* both init->error and err contain error */ g_error_free(err); else if (!no_error) /* we got error in init->error */ ok = FALSE; } _done: #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(item) menu_cache_item_unref(item); #endif menu_cache_unref(mc); _mc_failed: return ok; } static gboolean _fm_vfs_menu_set_attributes_from_info(GFile *file, GFileInfo *info, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); FmVfsMenuMainThreadData enu; if (item->path == NULL) { ERROR_UNSUPPORTED(error); return FALSE; } enu.path_str = item->path; enu.info = info; // enu.flags = flags; enu.cancellable = cancellable; enu.error = error; return (RUN_WITH_MENU_CACHE(_fm_vfs_menu_set_attributes_from_info_real, &enu)); } static gboolean _fm_vfs_menu_set_attribute(GFile *file, const char *attribute, GFileAttributeType type, gpointer value_p, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); GFileInfo *info; gboolean result; g_debug("_fm_vfs_menu_set_attribute: %s on %s", attribute, item->path); if (item->path == NULL) { ERROR_UNSUPPORTED(error); return FALSE; } if (value_p == NULL) goto _invalid_arg; if (strcmp(attribute, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME) == 0) { if (type != G_FILE_ATTRIBUTE_TYPE_STRING) goto _invalid_arg; info = g_file_info_new(); g_file_info_set_display_name(info, value_p); } else if (strcmp(attribute, G_FILE_ATTRIBUTE_STANDARD_ICON) == 0) { if (type != G_FILE_ATTRIBUTE_TYPE_OBJECT) goto _invalid_arg; if (!G_IS_ICON(value_p)) goto _invalid_arg; info = g_file_info_new(); g_file_info_set_icon(info, value_p); } else if (strcmp(attribute, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) == 0) { if (type != G_FILE_ATTRIBUTE_TYPE_BOOLEAN) goto _invalid_arg; info = g_file_info_new(); g_file_info_set_is_hidden(info, *(gboolean *)value_p); } else { g_set_error(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Setting attribute '%s' not supported"), attribute); return FALSE; } result = _fm_vfs_menu_set_attributes_from_info(file, info, flags, cancellable, error); g_object_unref(info); return result; _invalid_arg: g_set_error(error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("Invalid value for attribute '%s'"), attribute); return FALSE; } static inline GFile *_g_file_new_for_id(const char *id) { char *file_path; GFile *file; file_path = g_build_filename(g_get_user_data_dir(), "applications", id, NULL); /* we can try to guess file path and make directories but it hardly worth the efforts so it's easier to just make new file by its ID since ID is unique thru all the menu */ if (file_path == NULL) return NULL; file = g_file_new_for_path(file_path); g_free(file_path); return file; } static gboolean _fm_vfs_menu_read_fn_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; MenuCacheItem *item = NULL; init->result = NULL; mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; if(init->path_str) item = _vfile_path_to_menu_cache_item(mc, init->path_str); /* If item wasn't found or isn't a file then we cannot read it. */ if(item != NULL && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY, _("The '%s' is a menu directory"), init->path_str); else if(item == NULL || menu_cache_item_get_type(item) != MENU_CACHE_TYPE_APP) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("The '%s' isn't a menu item"), init->path_str ? init->path_str : "/"); else { char *file_path; GFile *gf; GError *err = NULL; file_path = menu_cache_item_get_file_path(item); if (file_path) { gf = g_file_new_for_path(file_path); g_free(file_path); if (gf) { init->result = g_file_read(gf, init->cancellable, &err); if (init->result == NULL) { /* never return G_IO_ERROR_IS_DIRECTORY */ if (err->domain == G_IO_ERROR && err->code == G_IO_ERROR_IS_DIRECTORY) { g_error_free(err); g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_NOT_REGULAR_FILE, _("The '%s' entry file is broken"), init->path_str); } else g_propagate_error(init->error, err); } g_object_unref(gf); } } } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(item) menu_cache_item_unref(item); #endif menu_cache_unref(mc); _mc_failed: return FALSE; } static GFileInputStream *_fm_vfs_menu_read_fn(GFile *file, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_read_fn %s", item->path); */ enu.path_str = item->path; enu.cancellable = cancellable; enu.error = error; RUN_WITH_MENU_CACHE(_fm_vfs_menu_read_fn_real, &enu); return enu.result; } static GFileOutputStream *_fm_vfs_menu_append_to(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } /* ---- FmMenuVFileOutputStream class ---- */ #define FM_TYPE_MENU_VFILE_OUTPUT_STREAM (fm_vfs_menu_file_output_stream_get_type()) #define FM_MENU_VFILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST((o), \ FM_TYPE_MENU_VFILE_OUTPUT_STREAM, \ FmMenuVFileOutputStream)) typedef struct _FmMenuVFileOutputStream FmMenuVFileOutputStream; typedef struct _FmMenuVFileOutputStreamClass FmMenuVFileOutputStreamClass; struct _FmMenuVFileOutputStream { GFileOutputStream parent; GOutputStream *real_stream; gchar *path; /* "Dir/App.desktop" */ GString *content; gboolean do_close; }; struct _FmMenuVFileOutputStreamClass { GFileOutputStreamClass parent_class; }; static GType fm_vfs_menu_file_output_stream_get_type (void); G_DEFINE_TYPE(FmMenuVFileOutputStream, fm_vfs_menu_file_output_stream, G_TYPE_FILE_OUTPUT_STREAM); static void fm_vfs_menu_file_output_stream_finalize(GObject *object) { FmMenuVFileOutputStream *stream = FM_MENU_VFILE_OUTPUT_STREAM(object); if(stream->real_stream) g_object_unref(stream->real_stream); g_free(stream->path); g_string_free(stream->content, TRUE); G_OBJECT_CLASS(fm_vfs_menu_file_output_stream_parent_class)->finalize(object); } static gssize fm_vfs_menu_file_output_stream_write(GOutputStream *stream, const void *buffer, gsize count, GCancellable *cancellable, GError **error) { if (g_cancellable_set_error_if_cancelled(cancellable, error)) return -1; g_string_append_len(FM_MENU_VFILE_OUTPUT_STREAM(stream)->content, buffer, count); return (gssize)count; } static gboolean fm_vfs_menu_file_output_stream_close(GOutputStream *gos, GCancellable *cancellable, GError **error) { FmMenuVFileOutputStream *stream = FM_MENU_VFILE_OUTPUT_STREAM(gos); GKeyFile *kf; gsize len = 0; gchar *content; gboolean ok; if (g_cancellable_set_error_if_cancelled(cancellable, error)) return FALSE; if (!stream->do_close) return TRUE; kf = g_key_file_new(); /* parse entered file content first */ if (stream->content->len > 0) g_key_file_load_from_data(kf, stream->content->str, stream->content->len, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); /* FIXME: don't ignore some errors? */ /* correct invalid data in desktop entry file: Name and Exec are mandatory, Type must be Application, and Category should include requested one */ if(!g_key_file_has_key(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL)) g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, ""); if(!g_key_file_has_key(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL)) g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, ""); g_key_file_set_string(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, G_KEY_FILE_DESKTOP_TYPE_APPLICATION); content = g_key_file_to_data(kf, &len, error); g_key_file_free(kf); if (!content) return FALSE; ok = g_output_stream_write_all(stream->real_stream, content, len, &len, cancellable, error); g_free(content); if (!ok || !g_output_stream_close(stream->real_stream, cancellable, error)) return FALSE; stream->do_close = FALSE; if (stream->path && !_add_application(stream->path, cancellable, error)) return FALSE; return TRUE; } static void fm_vfs_menu_file_output_stream_class_init(FmMenuVFileOutputStreamClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS(klass); gobject_class->finalize = fm_vfs_menu_file_output_stream_finalize; stream_class->write_fn = fm_vfs_menu_file_output_stream_write; stream_class->close_fn = fm_vfs_menu_file_output_stream_close; /* we don't implement seek/truncate/etag/query so no GFileOutputStream funcs */ } static void fm_vfs_menu_file_output_stream_init(FmMenuVFileOutputStream *stream) { stream->content = g_string_sized_new(1024); stream->do_close = TRUE; } static FmMenuVFileOutputStream *_fm_vfs_menu_file_output_stream_new(const gchar *path) { FmMenuVFileOutputStream *stream; stream = g_object_new(FM_TYPE_MENU_VFILE_OUTPUT_STREAM, NULL); if (path) stream->path = g_strdup(path); return stream; } static GFileOutputStream *_vfile_menu_create(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error, const gchar *path) { FmMenuVFileOutputStream *stream; GFileOutputStream *ostream; GError *err = NULL; GFile *parent; if (g_cancellable_set_error_if_cancelled(cancellable, error)) return NULL; // g_file_delete(file, cancellable, NULL); /* remove old if there is any */ ostream = g_file_create(file, flags, cancellable, &err); if (ostream == NULL) { if (g_cancellable_is_cancelled(cancellable) || err->domain != G_IO_ERROR || err->code != G_IO_ERROR_NOT_FOUND) { g_propagate_error(error, err); return NULL; } /* .local/share/applications/ isn't found? make it! */ g_clear_error(&err); parent = g_file_get_parent(file); if (!g_file_make_directory_with_parents(parent, cancellable, error)) { g_object_unref(parent); return NULL; } g_object_unref(parent); ostream = g_file_create(file, flags, cancellable, error); if (ostream == NULL) return ostream; } stream = _fm_vfs_menu_file_output_stream_new(path); stream->real_stream = G_OUTPUT_STREAM(ostream); return (GFileOutputStream*)stream; } static GFileOutputStream *_vfile_menu_replace(GFile *file, const char *etag, gboolean make_backup, GFileCreateFlags flags, GCancellable *cancellable, GError **error, const gchar *path) { FmMenuVFileOutputStream *stream; GFileOutputStream *ostream; if (g_cancellable_set_error_if_cancelled(cancellable, error)) return NULL; stream = _fm_vfs_menu_file_output_stream_new(path); ostream = g_file_replace(file, etag, make_backup, flags, cancellable, error); if (ostream == NULL) { g_object_unref(stream); return NULL; } stream->real_stream = G_OUTPUT_STREAM(ostream); return (GFileOutputStream*)stream; } static gboolean _fm_vfs_menu_create_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; char *unescaped = NULL, *id; gboolean is_invalid = TRUE; init->result = NULL; if(init->path_str) { MenuCacheItem *item; #if !MENU_CACHE_CHECK_VERSION(0, 5, 0) GSList *list, *l; #endif mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; unescaped = g_uri_unescape_string(init->path_str, NULL); /* ensure new menu item has suffix .desktop */ if (!g_str_has_suffix(unescaped, ".desktop")) { id = unescaped; unescaped = g_strconcat(unescaped, ".desktop", NULL); g_free(id); } id = strrchr(unescaped, '/'); if (id) id++; else id = unescaped; #if MENU_CACHE_CHECK_VERSION(0, 5, 0) item = menu_cache_find_item_by_id(mc, id); if (item) menu_cache_item_unref(item); /* use item simply as marker */ #else list = menu_cache_list_all_apps(mc); for (l = list; l; l = l->next) if (strcmp(menu_cache_item_get_id(l->data), id) == 0) break; if (l) item = l->data; else item = NULL; g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref); #endif if(item == NULL) is_invalid = FALSE; /* g_debug("create id %s, category %s", id, category); */ menu_cache_unref(mc); } if(is_invalid) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Cannot create menu item '%s'"), init->path_str ? init->path_str : "/"); else { GFile *gf = _g_file_new_for_id(id); if (gf) { init->result = _vfile_menu_create(gf, G_FILE_CREATE_NONE, init->cancellable, init->error, unescaped); g_object_unref(gf); } } g_free(unescaped); _mc_failed: return FALSE; } static GFileOutputStream *_fm_vfs_menu_create(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_create %s", item->path); */ enu.path_str = item->path; enu.cancellable = cancellable; enu.error = error; // enu.flags = flags; RUN_WITH_MENU_CACHE(_fm_vfs_menu_create_real, &enu); return enu.result; } static gboolean _fm_vfs_menu_replace_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc; char *unescaped = NULL, *id; gboolean is_invalid = TRUE; init->result = NULL; if(init->path_str) { MenuCacheItem *item, *item2; mc = _get_menu_cache(init->error); if(mc == NULL) goto _mc_failed; /* prepare id first */ unescaped = g_uri_unescape_string(init->path_str, NULL); id = strrchr(unescaped, '/'); if (id != NULL) id++; else id = unescaped; /* get existing item */ item = _vfile_path_to_menu_cache_item(mc, init->path_str); if (item != NULL) /* item is there, OK, we'll replace it then */ is_invalid = FALSE; /* if not found then check item by id to exclude conflicts */ else { #if MENU_CACHE_CHECK_VERSION(0, 5, 0) item2 = menu_cache_find_item_by_id(mc, id); #else GSList *list = menu_cache_list_all_apps(mc), *l; for (l = list; l; l = l->next) if (strcmp(menu_cache_item_get_id(l->data), id) == 0) break; if (l) item2 = menu_cache_item_ref(l->data); else item2 = NULL; g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref); #endif if(item2 == NULL) is_invalid = FALSE; else /* item was found in another category */ menu_cache_item_unref(item2); } menu_cache_unref(mc); } if(is_invalid) g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Cannot create menu item '%s'"), init->path_str ? init->path_str : "/"); else { GFile *gf = _g_file_new_for_id(id); if (gf) { /* FIXME: use flags and make_backup */ init->result = _vfile_menu_replace(gf, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, init->cancellable, init->error, /* don't insert it into XML */ NULL); g_object_unref(gf); } } g_free(unescaped); _mc_failed: return FALSE; } static GFileOutputStream *_fm_vfs_menu_replace(GFile *file, const char *etag, gboolean make_backup, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_replace %s", item->path); */ enu.path_str = item->path; enu.cancellable = cancellable; enu.error = error; // enu.flags = flags; // enu.make_backup = make_backup; RUN_WITH_MENU_CACHE(_fm_vfs_menu_replace_real, &enu); return enu.result; } /* not in main thread; returns NULL on failure */ static GKeyFile *_g_key_file_from_item(GFile *file, GCancellable *cancellable, GError **error) { char *contents; gsize length; GKeyFile *kf; if (!g_file_load_contents(file, cancellable, &contents, &length, NULL, error)) return NULL; kf = g_key_file_new(); if (!g_key_file_load_from_data(kf, contents, length, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, error)) { g_key_file_free(kf); kf = NULL; } g_free(contents); return kf; } /* not in main thread; returns FALSE on failure, consumes key file */ static gboolean _g_key_file_into_item(GFile *file, GKeyFile *kf, GCancellable *cancellable, GError **error) { char *contents; gsize length; gboolean result = FALSE; contents = g_key_file_to_data(kf, &length, error); g_key_file_free(kf); if (contents == NULL) return FALSE; result = g_file_replace_contents(file, contents, length, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, cancellable, error); g_free(contents); return result; } static gboolean _fm_vfs_menu_delete_file(GFile *file, GCancellable *cancellable, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(file); GKeyFile *kf; GError *err = NULL; g_debug("_fm_vfs_menu_delete_file %s", item->path); /* load contents */ kf = _g_key_file_from_item(file, cancellable, &err); if (kf == NULL) { #if MENU_CACHE_CHECK_VERSION(0, 5, 0) /* it might be just a directory */ if (err->domain == G_IO_ERROR && err->code == G_IO_ERROR_IS_DIRECTORY) { char *unescaped = g_uri_unescape_string(item->path, NULL); gboolean ok = _remove_directory(unescaped, cancellable, error); g_error_free(err); g_free(unescaped); return ok; } /* else it just failed */ #endif g_propagate_error(error, err); return FALSE; } /* set NoDisplay=true and save */ g_key_file_set_boolean(kf, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, TRUE); return _g_key_file_into_item(file, kf, cancellable, error); } static gboolean _fm_vfs_menu_trash(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_menu_make_directory(GFile *file, GCancellable *cancellable, GError **error) { #if !MENU_CACHE_CHECK_VERSION(0, 5, 0) /* creating a directory with libmenu-cache < 0.5.0 will lead to invisible directory; inexperienced user will be confused; therefore we disable such operation in such conditions */ ERROR_UNSUPPORTED(error); return FALSE; #else FmMenuVFile *item = FM_MENU_VFILE(file); char *unescaped; gboolean ok; /* XDG desktop menu specification: desktop-entry-id should be *.desktop */ if (g_str_has_suffix(item->path, ".desktop")) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME, _("Name of menu directory should not end with" " \".desktop\"")); return FALSE; } unescaped = g_uri_unescape_string(item->path, NULL); ok = _add_directory(unescaped, cancellable, error); g_free(unescaped); return ok; #endif } static gboolean _fm_vfs_menu_make_symbolic_link(GFile *file, const char *symlink_value, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_menu_copy(GFile *source, GFile *destination, GFileCopyFlags flags, GCancellable *cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_menu_move_real(gpointer data) { FmVfsMenuMainThreadData *init = data; MenuCache *mc = NULL; MenuCacheItem *item = NULL, *item2; char *src_path, *dst_path; char *src_id, *dst_id; gboolean result = FALSE; dst_path = init->destination->path; if (init->path_str == NULL || dst_path == NULL) { g_set_error_literal(init->error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Invalid operation with menu root")); return FALSE; } /* make path strings */ src_path = g_uri_unescape_string(init->path_str, NULL); dst_path = g_uri_unescape_string(dst_path, NULL); src_id = strrchr(src_path, '/'); if (src_id) src_id++; else src_id = src_path; dst_id = strrchr(dst_path, '/'); if (dst_id) dst_id++; else dst_id = dst_path; if (strcmp(src_id, dst_id)) { /* ID change isn't supported now */ ERROR_UNSUPPORTED(init->error); goto _failed; } if (strcmp(src_path, dst_path) == 0) { g_warning("menu: tried to move '%s' into itself", src_path); g_free(src_path); g_free(dst_path); return TRUE; /* nothing was changed */ } /* do actual move */ mc = _get_menu_cache(init->error); if(mc == NULL) goto _failed; item = _vfile_path_to_menu_cache_item(mc, init->path_str); /* TODO: if id changed then check for ID conflicts */ /* TODO: save updated desktop entry for old ID (if different) */ if(item == NULL || menu_cache_item_get_type(item) != MENU_CACHE_TYPE_APP) { /* FIXME: implement directories movement */ g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("The '%s' isn't a menu item"), init->path_str); goto _failed; } item2 = _vfile_path_to_menu_cache_item(mc, init->destination->path); if (item2) { g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_EXISTS, _("Menu path '%s' already exists"), dst_path); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) menu_cache_item_unref(item2); #endif goto _failed; } /* do actual move */ if (_add_application(dst_path, init->cancellable, init->error)) { if (_remove_application(src_path, init->cancellable, init->error)) result = TRUE; else /* failed, rollback */ _remove_application(dst_path, init->cancellable, NULL); } _failed: #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(item) menu_cache_item_unref(item); #endif if(mc) menu_cache_unref(mc); g_free(src_path); g_free(dst_path); return result; } static gboolean _fm_vfs_menu_move(GFile *source, GFile *destination, GFileCopyFlags flags, GCancellable *cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, GError **error) { FmMenuVFile *item = FM_MENU_VFILE(source); FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_move"); */ if(!FM_IS_FILE(destination)) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, _("Invalid destination")); return FALSE; } enu.path_str = item->path; enu.cancellable = cancellable; enu.error = error; // enu.flags = flags; enu.destination = FM_MENU_VFILE(destination); /* FIXME: use progress_callback */ return RUN_WITH_MENU_CACHE(_fm_vfs_menu_move_real, &enu); } /* ---- FmMenuVFileMonitor class ---- */ #define FM_TYPE_MENU_VFILE_MONITOR (fm_vfs_menu_file_monitor_get_type()) #define FM_MENU_VFILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST((o), \ FM_TYPE_MENU_VFILE_MONITOR, FmMenuVFileMonitor)) typedef struct _FmMenuVFileMonitor FmMenuVFileMonitor; typedef struct _FmMenuVFileMonitorClass FmMenuVFileMonitorClass; static GType fm_vfs_menu_file_monitor_get_type (void); struct _FmMenuVFileMonitor { GFileMonitor parent_object; FmMenuVFile *file; MenuCache *cache; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) MenuCacheItem *item; MenuCacheNotifyId notifier; #else GSList *items; gboolean stopped; gpointer notifier; #endif }; struct _FmMenuVFileMonitorClass { GFileMonitorClass parent_class; }; G_DEFINE_TYPE(FmMenuVFileMonitor, fm_vfs_menu_file_monitor, G_TYPE_FILE_MONITOR); static void fm_vfs_menu_file_monitor_finalize(GObject *object) { FmMenuVFileMonitor *mon = FM_MENU_VFILE_MONITOR(object); if(mon->cache) { if(mon->notifier) menu_cache_remove_reload_notify(mon->cache, mon->notifier); menu_cache_unref(mon->cache); } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(mon->item) menu_cache_item_unref(mon->item); #else g_slist_free_full(mon->items, (GDestroyNotify)menu_cache_item_unref); #endif g_object_unref(mon->file); G_OBJECT_CLASS(fm_vfs_menu_file_monitor_parent_class)->finalize(object); } static gboolean fm_vfs_menu_file_monitor_cancel(GFileMonitor *monitor) { FmMenuVFileMonitor *mon = FM_MENU_VFILE_MONITOR(monitor); #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(mon->item) menu_cache_item_unref(mon->item); /* rest will be done in finalizer */ mon->item = NULL; #else mon->stopped = TRUE; #endif return TRUE; } static void fm_vfs_menu_file_monitor_class_init(FmMenuVFileMonitorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GFileMonitorClass *gfilemon_class = G_FILE_MONITOR_CLASS (klass); gobject_class->finalize = fm_vfs_menu_file_monitor_finalize; gfilemon_class->cancel = fm_vfs_menu_file_monitor_cancel; } static void fm_vfs_menu_file_monitor_init(FmMenuVFileMonitor *item) { /* nothing */ } static FmMenuVFileMonitor *_fm_menu_vfile_monitor_new(void) { return (FmMenuVFileMonitor*)g_object_new(FM_TYPE_MENU_VFILE_MONITOR, NULL); } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) static void _reload_notify_handler(MenuCache* cache, gpointer user_data) #else static void _reload_notify_handler(gpointer cache, gpointer user_data) #endif { FmMenuVFileMonitor *mon = FM_MENU_VFILE_MONITOR(user_data); GSList *items, *new_items, *ol, *nl; MenuCacheItem *dir; GFile *file; const char *de_name; guint32 de_flag; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(mon->item == NULL) /* menu folder was destroyed or monitor cancelled */ return; dir = mon->item; if(mon->file->path) mon->item = _vfile_path_to_menu_cache_item(cache, mon->file->path); else mon->item = MENU_CACHE_ITEM(menu_cache_dup_root_dir(cache)); if(mon->item && menu_cache_item_get_type(mon->item) != MENU_CACHE_TYPE_DIR) { menu_cache_item_unref(mon->item); mon->item = NULL; } if(mon->item == NULL) /* folder was destroyed - emit event and exit */ { menu_cache_item_unref(dir); g_file_monitor_emit_event(G_FILE_MONITOR(mon), G_FILE(mon->file), NULL, G_FILE_MONITOR_EVENT_DELETED); return; } items = menu_cache_dir_list_children(MENU_CACHE_DIR(dir)); menu_cache_item_unref(dir); new_items = menu_cache_dir_list_children(MENU_CACHE_DIR(mon->item)); #else if(mon->stopped) /* menu folder was destroyed or monitor cancelled */ return; if(mon->file->path) dir = _vfile_path_to_menu_cache_item(cache, mon->file->path); else dir = MENU_CACHE_ITEM(menu_cache_get_root_dir(cache)); if(dir == NULL) /* folder was destroyed - emit event and exit */ { mon->stopped = TRUE; g_file_monitor_emit_event(G_FILE_MONITOR(mon), G_FILE(mon->file), NULL, G_FILE_MONITOR_EVENT_DELETED); return; } /* emit change on the folder in any case */ g_file_monitor_emit_event(G_FILE_MONITOR(mon), G_FILE(mon->file), NULL, G_FILE_MONITOR_EVENT_CHANGED); items = mon->items; mon->items = g_slist_copy_deep(menu_cache_dir_get_children(MENU_CACHE_DIR(dir)), (GCopyFunc)menu_cache_item_ref, NULL); new_items = g_slist_copy_deep(mon->items, (GCopyFunc)menu_cache_item_ref, NULL); #endif for (ol = items; ol; ) /* remove all separatorts first */ { nl = ol->next; if (menu_cache_item_get_id(ol->data) == NULL) { menu_cache_item_unref(ol->data); items = g_slist_delete_link(items, ol); } ol = nl; } for (ol = new_items; ol; ) { nl = ol->next; if (menu_cache_item_get_id(ol->data) == NULL) { menu_cache_item_unref(ol->data); new_items = g_slist_delete_link(new_items, ol); } ol = nl; } /* we have two copies of lists now, compare them and emit events */ ol = items; de_name = g_getenv("XDG_CURRENT_DESKTOP"); if(de_name) de_flag = menu_cache_get_desktop_env_flag(cache, de_name); else de_flag = (guint32)-1; while (ol) { for (nl = new_items; nl; nl = nl->next) if (strcmp(menu_cache_item_get_id(ol->data), menu_cache_item_get_id(nl->data)) == 0) break; /* the same id found */ if (nl) { /* check if any visible attribute of it was changed */ if (g_strcmp0(menu_cache_item_get_name(ol->data), menu_cache_item_get_name(nl->data)) == 0 || g_strcmp0(menu_cache_item_get_icon(ol->data), menu_cache_item_get_icon(nl->data)) == 0 || menu_cache_app_get_is_visible(ol->data, de_flag) != menu_cache_app_get_is_visible(nl->data, de_flag)) { file = _fm_vfs_menu_resolve_relative_path(G_FILE(mon->file), menu_cache_item_get_id(nl->data)); g_file_monitor_emit_event(G_FILE_MONITOR(mon), file, NULL, G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED); g_object_unref(file); } /* free both new and old from the list */ menu_cache_item_unref(nl->data); new_items = g_slist_delete_link(new_items, nl); nl = ol->next; /* use 'nl' as storage */ menu_cache_item_unref(ol->data); items = g_slist_delete_link(items, ol); ol = nl; } else /* id not found (removed), go to next */ ol = ol->next; } /* emit events for removed files */ while (items) { file = _fm_vfs_menu_resolve_relative_path(G_FILE(mon->file), menu_cache_item_get_id(items->data)); g_file_monitor_emit_event(G_FILE_MONITOR(mon), file, NULL, G_FILE_MONITOR_EVENT_DELETED); g_object_unref(file); menu_cache_item_unref(items->data); items = g_slist_delete_link(items, items); } /* emit events for added files */ while (new_items) { file = _fm_vfs_menu_resolve_relative_path(G_FILE(mon->file), menu_cache_item_get_id(new_items->data)); g_file_monitor_emit_event(G_FILE_MONITOR(mon), file, NULL, G_FILE_MONITOR_EVENT_CREATED); g_object_unref(file); menu_cache_item_unref(new_items->data); new_items = g_slist_delete_link(new_items, new_items); } } static gboolean _fm_vfs_menu_monitor_dir_real(gpointer data) { FmVfsMenuMainThreadData *init = data; FmMenuVFileMonitor *mon; #if !MENU_CACHE_CHECK_VERSION(0, 4, 0) MenuCacheItem *dir; #endif init->result = NULL; if(g_cancellable_set_error_if_cancelled(init->cancellable, init->error)) return FALSE; /* open menu cache instance */ mon = _fm_menu_vfile_monitor_new(); if(mon == NULL) /* out of memory! */ return FALSE; mon->file = FM_MENU_VFILE(g_object_ref(init->destination)); mon->cache = _get_menu_cache(init->error); if(mon->cache == NULL) goto _fail; /* check if requested path exists within cache */ #if MENU_CACHE_CHECK_VERSION(0, 4, 0) if(mon->file->path) mon->item = _vfile_path_to_menu_cache_item(mon->cache, mon->file->path); else mon->item = MENU_CACHE_ITEM(menu_cache_dup_root_dir(mon->cache)); if(mon->item == NULL || menu_cache_item_get_type(mon->item) != MENU_CACHE_TYPE_DIR) #else if(mon->file->path) dir = _vfile_path_to_menu_cache_item(mon->cache, mon->file->path); else dir = MENU_CACHE_ITEM(menu_cache_get_root_dir(mon->cache)); if(dir == NULL) #endif { g_set_error(init->error, G_IO_ERROR, G_IO_ERROR_FAILED, _("FmMenuVFileMonitor: folder '%s' not found in menu cache"), mon->file->path); goto _fail; } #if !MENU_CACHE_CHECK_VERSION(0, 4, 0) /* for old libmenu-cache we have no choice but copy all the data right now */ mon->items = g_slist_copy_deep(menu_cache_dir_get_children(MENU_CACHE_DIR(dir)), (GCopyFunc)menu_cache_item_ref, NULL); #endif if(g_cancellable_set_error_if_cancelled(init->cancellable, init->error)) goto _fail; /* current directory contents belong to mon->item now */ /* attach reload notify handler */ mon->notifier = menu_cache_add_reload_notify(mon->cache, &_reload_notify_handler, mon); init->result = mon; return TRUE; _fail: g_object_unref(mon); return FALSE; } static GFileMonitor *_fm_vfs_menu_monitor_dir(GFile *file, GFileMonitorFlags flags, GCancellable *cancellable, GError **error) { FmVfsMenuMainThreadData enu; /* g_debug("_fm_vfs_menu_monitor_dir %s", FM_MENU_VFILE(file)->path); */ enu.cancellable = cancellable; enu.error = error; // enu.flags = flags; enu.destination = FM_MENU_VFILE(file); RUN_WITH_MENU_CACHE(_fm_vfs_menu_monitor_dir_real, &enu); return (GFileMonitor*)enu.result; } static GFileMonitor *_fm_vfs_menu_monitor_file(GFile *file, GFileMonitorFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } #if GLIB_CHECK_VERSION(2, 22, 0) static GFileIOStream *_fm_vfs_menu_open_readwrite(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileIOStream *_fm_vfs_menu_create_readwrite(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileIOStream *_fm_vfs_menu_replace_readwrite(GFile *file, const char *etag, gboolean make_backup, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } #endif /* Glib >= 2.22 */ static void fm_menu_g_file_init(GFileIface *iface) { GFileAttributeInfoList *list; iface->dup = _fm_vfs_menu_dup; iface->hash = _fm_vfs_menu_hash; iface->equal = _fm_vfs_menu_equal; iface->is_native = _fm_vfs_menu_is_native; iface->has_uri_scheme = _fm_vfs_menu_has_uri_scheme; iface->get_uri_scheme = _fm_vfs_menu_get_uri_scheme; iface->get_basename = _fm_vfs_menu_get_basename; iface->get_path = _fm_vfs_menu_get_path; iface->get_uri = _fm_vfs_menu_get_uri; iface->get_parse_name = _fm_vfs_menu_get_parse_name; iface->get_parent = _fm_vfs_menu_get_parent; iface->prefix_matches = _fm_vfs_menu_prefix_matches; iface->get_relative_path = _fm_vfs_menu_get_relative_path; iface->resolve_relative_path = _fm_vfs_menu_resolve_relative_path; iface->get_child_for_display_name = _fm_vfs_menu_get_child_for_display_name; iface->enumerate_children = _fm_vfs_menu_enumerate_children; iface->query_info = _fm_vfs_menu_query_info; iface->query_filesystem_info = _fm_vfs_menu_query_filesystem_info; iface->find_enclosing_mount = _fm_vfs_menu_find_enclosing_mount; iface->set_display_name = _fm_vfs_menu_set_display_name; iface->query_settable_attributes = _fm_vfs_menu_query_settable_attributes; iface->query_writable_namespaces = _fm_vfs_menu_query_writable_namespaces; iface->set_attribute = _fm_vfs_menu_set_attribute; iface->set_attributes_from_info = _fm_vfs_menu_set_attributes_from_info; iface->read_fn = _fm_vfs_menu_read_fn; iface->append_to = _fm_vfs_menu_append_to; iface->create = _fm_vfs_menu_create; iface->replace = _fm_vfs_menu_replace; iface->delete_file = _fm_vfs_menu_delete_file; iface->trash = _fm_vfs_menu_trash; iface->make_directory = _fm_vfs_menu_make_directory; iface->make_symbolic_link = _fm_vfs_menu_make_symbolic_link; iface->copy = _fm_vfs_menu_copy; iface->move = _fm_vfs_menu_move; iface->monitor_dir = _fm_vfs_menu_monitor_dir; iface->monitor_file = _fm_vfs_menu_monitor_file; #if GLIB_CHECK_VERSION(2, 22, 0) iface->open_readwrite = _fm_vfs_menu_open_readwrite; iface->create_readwrite = _fm_vfs_menu_create_readwrite; iface->replace_readwrite = _fm_vfs_menu_replace_readwrite; iface->supports_thread_contexts = TRUE; #endif /* Glib >= 2.22 */ list = g_file_attribute_info_list_new(); g_file_attribute_info_list_add(list, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN, G_FILE_ATTRIBUTE_TYPE_BOOLEAN, G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); g_file_attribute_info_list_add(list, G_FILE_ATTRIBUTE_STANDARD_ICON, G_FILE_ATTRIBUTE_TYPE_OBJECT, G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); _fm_vfs_menu_settable_attributes = list; } /* ---- FmFile implementation ---- */ static gboolean _fm_vfs_menu_wants_incremental(GFile* file) { return FALSE; } static void fm_menu_fm_file_init(FmFileInterface *iface) { iface->wants_incremental = _fm_vfs_menu_wants_incremental; } /* ---- interface for loading ---- */ static GFile *_fm_vfs_menu_new_for_uri(const char *uri) { FmMenuVFile *item = _fm_menu_vfile_new(); if(uri == NULL) uri = ""; /* skip menu:/ */ if(g_ascii_strncasecmp(uri, "menu:", 5) == 0) uri += 5; while(*uri == '/') uri++; /* skip "applications/" or "applications.menu/" */ if(g_ascii_strncasecmp(uri, "applications", 12) == 0) { uri += 12; if(g_ascii_strncasecmp(uri, ".menu", 5) == 0) uri += 5; } while(*uri == '/') /* skip starting slashes */ uri++; /* save the rest of path, NULL means the root path */ if(*uri) { char *end; item->path = g_strdup(uri); for(end = item->path + strlen(item->path); end > item->path; end--) if(end[-1] == '/') /* skip trailing slashes */ end[-1] = '\0'; else break; } /* g_debug("_fm_vfs_menu_new_for_uri %s -> %s", uri, item->path); */ return (GFile*)item; } FM_DEFINE_MODULE(vfs, menu) FmFileInitTable fm_module_init_vfs = { .new_for_uri = &_fm_vfs_menu_new_for_uri }; libfm-1.4.0/src/modules/vfs-search.c000066400000000000000000001341571475513661000172740ustar00rootroot00000000000000/* * fm-vfs-search.c * * Copyright 2012 Hong Jen Yee (PCMan) * Copyright 2010 Shae Smittle * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * */ #ifdef HAVE_CONFIG_H #include #endif #include "fm-file.h" #include #include #include #include #include #define _GNU_SOURCE /* for FNM_CASEFOLD in fnmatch.h, a GNU extension */ #include #if __GNUC__ >= 4 #pragma GCC diagnostic ignored "-Wcomment" /* for comments below */ #endif /* ---- Classes structures ---- */ typedef struct _FmSearchIntIter FmSearchIntIter; struct _FmSearchIntIter { FmSearchIntIter *parent; /* recursion path */ GFile *folder_path; /* path to folder */ GFileEnumerator *enu; /* children enumerator */ }; #define FM_TYPE_VFS_SEACRH_ENUMERATOR (fm_vfs_search_enumerator_get_type()) #define FM_VFS_SEACRH_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST((o),\ FM_TYPE_VFS_SEACRH_ENUMERATOR, FmVfsSearchEnumerator)) typedef struct _FmVfsSearchEnumerator FmVfsSearchEnumerator; typedef struct _FmVfsSearchEnumeratorClass FmVfsSearchEnumeratorClass; struct _FmVfsSearchEnumerator { GFileEnumerator parent; FmSearchIntIter* iter; char* attributes; GFileQueryInfoFlags flags; GSList* target_folders; /* GFile */ char** name_patterns; GRegex* name_regex; char* content_pattern; GRegex* content_regex; char** mime_types; guint64 min_mtime; guint64 max_mtime; guint64 min_size; guint64 max_size; gboolean name_case_insensitive : 1; gboolean content_case_insensitive : 1; gboolean recursive : 1; gboolean show_hidden : 1; }; struct _FmVfsSearchEnumeratorClass { GFileEnumeratorClass parent_class; }; #define FM_TYPE_SEARCH_VFILE (fm_vfs_search_file_get_type()) #define FM_SEARCH_VFILE(o) (G_TYPE_CHECK_INSTANCE_CAST((o), \ FM_TYPE_SEARCH_VFILE, FmSearchVFile)) typedef struct _FmSearchVFile FmSearchVFile; typedef struct _FmSearchVFileClass FmSearchVFileClass; static GType fm_vfs_search_file_get_type (void); struct _FmSearchVFile { GObject parent_object; char *path; /* full search path */ GFile *current; /* last scanned directory */ }; struct _FmSearchVFileClass { GObjectClass parent_class; }; /* beforehand declarations */ static gboolean fm_search_job_match_file(FmVfsSearchEnumerator * priv, GFileInfo * info, GFile * parent, GCancellable *cancellable, GError **error); static void fm_search_job_match_folder(FmVfsSearchEnumerator * priv, GFile * folder_path, GCancellable *cancellable, GError **error); static void parse_search_uri(FmVfsSearchEnumerator* priv, const char* uri_str); /* ---- Directory iterator ---- */ /* caller should g_object_ref(folder_path) if success */ static inline FmSearchIntIter *_search_iter_new(FmSearchIntIter *parent, const char *attributes, GFileQueryInfoFlags flags, GFile *folder_path, GCancellable *cancellable, GError **error) { GFileEnumerator *enu; FmSearchIntIter *iter; enu = g_file_enumerate_children(folder_path, attributes, flags, cancellable, error); if(enu == NULL) return NULL; iter = g_slice_new(FmSearchIntIter); iter->parent = parent; iter->folder_path = folder_path; iter->enu = enu; return iter; } static inline void _search_iter_free(FmSearchIntIter *iter, GCancellable *cancellable) { g_file_enumerator_close(iter->enu, cancellable, NULL); g_object_unref(iter->enu); g_object_unref(iter->folder_path); g_slice_free(FmSearchIntIter, iter); } /* ---- search enumerator class ---- */ static GType fm_vfs_search_enumerator_get_type (void); G_DEFINE_TYPE(FmVfsSearchEnumerator, fm_vfs_search_enumerator, G_TYPE_FILE_ENUMERATOR) static void _fm_vfs_search_enumerator_dispose(GObject *object) { FmVfsSearchEnumerator *priv = FM_VFS_SEACRH_ENUMERATOR(object); FmSearchIntIter *iter; while((iter = priv->iter)) { priv->iter = iter->parent; _search_iter_free(iter, NULL); } if(priv->attributes) { g_free(priv->attributes); priv->attributes = NULL; } if(priv->target_folders) { g_slist_foreach(priv->target_folders, (GFunc)g_object_unref, NULL); g_slist_free(priv->target_folders); priv->target_folders = NULL; } if(priv->name_patterns) { g_strfreev(priv->name_patterns); priv->name_patterns = NULL; } if(priv->name_regex) { g_regex_unref(priv->name_regex); priv->name_regex = NULL; } if(priv->content_pattern) { g_free(priv->content_pattern); priv->content_pattern = NULL; } if(priv->content_regex) { g_regex_unref(priv->content_regex); priv->content_regex = NULL; } if(priv->mime_types) { g_strfreev(priv->mime_types); priv->mime_types = NULL; } G_OBJECT_CLASS(fm_vfs_search_enumerator_parent_class)->dispose(object); } static GFileInfo *_fm_vfs_search_enumerator_next_file(GFileEnumerator *enumerator, GCancellable *cancellable, GError **error) { FmVfsSearchEnumerator *enu = FM_VFS_SEACRH_ENUMERATOR(enumerator); FmSearchIntIter *iter; GFileInfo * file_info; GError *err = NULL; FmSearchVFile *container; /* g_debug("_fm_vfs_search_enumerator_next_file"); */ while(!g_cancellable_set_error_if_cancelled(cancellable, error)) { iter = enu->iter; if(iter == NULL) /* ended with folder */ { if(enu->target_folders == NULL) break; iter = _search_iter_new(NULL, enu->attributes, enu->flags, enu->target_folders->data, cancellable, error); if(iter == NULL) break; /* data is moved into iter now so free link itself */ enu->target_folders = g_slist_delete_link(enu->target_folders, enu->target_folders); container = FM_SEARCH_VFILE(g_file_enumerator_get_container(enumerator)); if(container->current) g_object_unref(container->current); container->current = g_object_ref(iter->folder_path); enu->iter = iter; } file_info = g_file_enumerator_next_file(iter->enu, cancellable, &err); if(file_info && g_file_info_get_name(file_info)) { /* check if directory itself matches criteria */ if(fm_search_job_match_file(enu, file_info, iter->folder_path, cancellable, &err)) { g_debug("found matched: %s", g_file_info_get_name(file_info)); return file_info; } /* recurse upon each directory */ if(err == NULL && enu->recursive && /* SF bug #969: very possibly we get multiple instances of the same file if we follow symlink to a directory FIXME: make it optional? */ !g_file_info_get_is_symlink(file_info) && g_file_info_get_file_type(file_info) == G_FILE_TYPE_DIRECTORY) { if(enu->show_hidden || !g_file_info_get_is_hidden(file_info)) { const char * name = g_file_info_get_name(file_info); GFile * file = g_file_get_child(iter->folder_path, name); /* go into directory and iterate it now */ fm_search_job_match_folder(enu, file, cancellable, &err); g_object_unref(file); } } g_object_unref(file_info); if(err == NULL) continue; } if(err != NULL) /* file_info == NULL */ { if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_PERMISSION_DENIED) { g_error_free(err); /* ignore this error */ err = NULL; continue; } g_propagate_error(error, err); break; } /* else end of file list - go up */ enu->iter = iter->parent; container = FM_SEARCH_VFILE(g_file_enumerator_get_container(enumerator)); if(container->current) g_object_unref(container->current); if(enu->iter) container->current = g_object_ref(enu->iter->folder_path); else container->current = NULL; _search_iter_free(iter, cancellable); } return NULL; } static gboolean _fm_vfs_search_enumerator_close(GFileEnumerator *enumerator, GCancellable *cancellable, GError **error) { FmVfsSearchEnumerator *enu = FM_VFS_SEACRH_ENUMERATOR(enumerator); FmSearchIntIter *iter; while((iter = enu->iter)) { enu->iter = iter->parent; _search_iter_free(iter, cancellable); } return TRUE; } static void fm_vfs_search_enumerator_class_init(FmVfsSearchEnumeratorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GFileEnumeratorClass *enumerator_class = G_FILE_ENUMERATOR_CLASS(klass); gobject_class->dispose = _fm_vfs_search_enumerator_dispose; enumerator_class->next_file = _fm_vfs_search_enumerator_next_file; enumerator_class->close_fn = _fm_vfs_search_enumerator_close; } static void fm_vfs_search_enumerator_init(FmVfsSearchEnumerator *enumerator) { /* nothing */ } static GFileEnumerator *_fm_vfs_search_enumerator_new(GFile *file, const char *path_str, const char *attributes, GFileQueryInfoFlags flags, GError **error) { FmVfsSearchEnumerator *enumerator; enumerator = g_object_new(FM_TYPE_VFS_SEACRH_ENUMERATOR, "container", file, NULL); enumerator->attributes = g_strdup(attributes); enumerator->flags = flags; parse_search_uri(enumerator, path_str); /* FIXME: don't ignore flags */ return G_FILE_ENUMERATOR(enumerator); } /* ---- The search engine ---- */ /* * name: parse_date_str * @str: a string in YYYY-MM-DD format * Return: a time_t value */ static time_t parse_date_str(const char* str) { int len = strlen(str); if(G_LIKELY(len >= 8)) { struct tm timeinfo = {0}; if(sscanf(str, "%04d-%02d-%02d", &timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday) == 3) { timeinfo.tm_year -= 1900; /* should be years since 1900 */ --timeinfo.tm_mon; /* month should be 0-11 */ return mktime(&timeinfo); } } return 0; } /* * parse_search_uri * @job * @uri: a search uri * * Format of a search URI is similar to that of an http URI: * * search://,,?&&... * The optional parameter key/value pairs are: * show_hidden=<0 or 1>: whether to search for hidden files * recursive=<0 or 1>: whether to search sub folders recursively * name=: patterns of filenames, separated by comma * name_regex=: regular expression * name_case_sensitive=<0 or 1> * content=: search for files containing the pattern * content_regex=: regular expression * content_case_sensitive=<0 or 1> * mime_types=: mime-types to search for, can use /* (ex: image/*), separated by ';' * min_size= * max_size= * min_mtime=YYYY-MM-DD * max_mtime=YYYY-MM-DD * * An example to search all *.desktop files in /usr/share and /usr/local/share * can be written like this: * * search:///usr/share,/usr/local/share?recursive=1&show_hidden=0&name=*.desktop&name_ci=0 * * If the folder paths and parameters contain invalid characters for a * URI, they should be escaped. * */ static void parse_search_uri(FmVfsSearchEnumerator* priv, const char* uri_str) { const char scheme[] = "search://"; /* NOTE: sizeof(scheme) includes '\0' */ if(g_ascii_strncasecmp(uri_str, scheme, sizeof(scheme)-1) == 0) { const char* p = uri_str + sizeof(scheme)-1; /* skip scheme part */ char* params = strchr(p, '?'); char* name_regex = NULL; char* content_regex = NULL; /* add folder paths */ while (p) { char* sep = strchr(p, ','); /* use , to separate multiple paths */ char *path; if (sep && (params == NULL || sep < params)) path = g_uri_unescape_segment(p, sep, NULL); else if (params != NULL) { path = g_uri_unescape_segment(p, params, NULL); sep = NULL; } else path = g_uri_unescape_string(p, NULL); /* g_debug("target folder path: %s", path); */ /* add the path to target folders */ priv->target_folders = g_slist_prepend(priv->target_folders, fm_file_new_for_commandline_arg(path)); g_free(path); p = sep; if (p) /* it's on ':' now */ p++; } /* priv->target_folders = g_slist_reverse(priv->target_folders); */ /* decode parameters */ if(params) { params++; /* skip '?' */ while(*params) { /* parameters are in name=value pairs */ char *name; char* value = strchr(params, '='); char* sep = strchr(params, '&'); if (value && (sep == NULL || value < sep)) { name = g_strndup(params, value - params); if (sep) value = g_uri_unescape_segment(value+1, sep, NULL); else value = g_uri_unescape_string(value+1, NULL); } else if (sep) { name = g_strndup(params, sep - params); value = NULL; } else /* value == NULL && sep == NULL */ name = g_strdup(params); /* g_printf("parameter name/value: %s = %s\n", name, value); */ if(strcmp(name, "show_hidden") == 0) priv->show_hidden = (value[0] == '1') ? TRUE : FALSE; else if(strcmp(name, "recursive") == 0) priv->recursive = (value[0] == '1') ? TRUE : FALSE; else if(strcmp(name, "name") == 0) priv->name_patterns = g_strsplit(value, ",", 0); else if(strcmp(name, "name_regex") == 0) { g_free(name_regex); name_regex = value; value = NULL; } else if(strcmp(name, "name_ci") == 0) priv->name_case_insensitive = (value[0] == '1') ? TRUE : FALSE; else if(strcmp(name, "content") == 0) { g_free(priv->content_pattern); priv->content_pattern = value; value = NULL; } else if(strcmp(name, "content_regex") == 0) { g_free(content_regex); content_regex = value; value = NULL; } else if(strcmp(name, "content_ci") == 0) priv->content_case_insensitive = (value[0] == '1') ? TRUE : FALSE; else if(strcmp(name, "mime_types") == 0) { priv->mime_types = g_strsplit(value, ";", -1); /* For mime_type patterns such as image/* and audio/*, * we move the trailing '*' to begining of the string * as a measure of optimization. Later we can detect if it's a * pattern or a full type name by checking the first char. */ if(priv->mime_types) { char** pmime_type; for(pmime_type = priv->mime_types; *pmime_type; ++pmime_type) { char* mime_type = *pmime_type; int len = strlen(mime_type); /* if the mime_type is end with "/*" */ if(len > 2 && /*mime_type[len - 2] == '/' &&*/ mime_type[len - 1] == '*') { /* move the trailing * to first char */ memmove(mime_type + 1, mime_type, len - 1); mime_type[0] = '*'; } } if (!g_strstr_len(priv->attributes, -1, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE)) { gchar * attributes = g_strconcat(priv->attributes, ",", G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, NULL); g_free(priv->attributes); priv->attributes = attributes; } } } else if(strcmp(name, "min_size") == 0) priv->min_size = atoll(value); else if(strcmp(name, "max_size") == 0) priv->max_size = atoll(value); else if(strcmp(name, "min_mtime") == 0) priv->min_mtime = (guint64)parse_date_str(value); else if(strcmp(name, "max_mtime") == 0) priv->max_mtime = (guint64)parse_date_str(value); g_free(name); g_free(value); /* continue with the next param=value pair */ if(sep) params = sep + 1; else break; } if(name_regex) { /* we set G_REGEX_RAW because GLib might cause a crash if a search is done in a non-utf8 string */ GRegexCompileFlags flags = G_REGEX_RAW; if(priv->name_case_insensitive) flags |= G_REGEX_CASELESS; priv->name_regex = g_regex_new(name_regex, flags, 0, NULL); g_free(name_regex); } if(content_regex) { GRegexCompileFlags flags = G_REGEX_RAW; /* like above */ if(priv->content_case_insensitive) flags |= G_REGEX_CASELESS; priv->content_regex = g_regex_new(content_regex, flags, 0, NULL); g_free(content_regex); } if(priv->content_case_insensitive) /* case insensitive */ { if(priv->content_pattern) /* make sure the pattern is lower case */ { char* down = g_utf8_strdown(priv->content_pattern, -1); g_free(priv->content_pattern); priv->content_pattern = down; } } } } } static void fm_search_job_match_folder(FmVfsSearchEnumerator * priv, GFile * folder_path, GCancellable *cancellable, GError **error) { FmSearchIntIter *iter; FmSearchVFile *container; /* FIXME: make error if NULL */ iter = _search_iter_new(priv->iter, priv->attributes, priv->flags, folder_path, cancellable, error); if(iter == NULL) /* error */ return; g_object_ref(folder_path); /* it's copied into iter */ priv->iter = iter; container = FM_SEARCH_VFILE(g_file_enumerator_get_container(G_FILE_ENUMERATOR(priv))); if(container->current) g_object_unref(container->current); container->current = g_object_ref(folder_path); } static gboolean fm_search_job_match_filename(FmVfsSearchEnumerator* priv, GFileInfo* info) { gboolean ret; /* g_debug("fm_search_job_match_filename: %s", g_file_info_get_name(info)); */ if(priv->name_regex) { const char* name = g_file_info_get_name(info); ret = g_regex_match(priv->name_regex, name, 0, NULL); } else if(priv->name_patterns) { ret = FALSE; const char* name = g_file_info_get_name(info); char** ppattern; for(ppattern = priv->name_patterns; *ppattern; ++ppattern) { const char* pattern = *ppattern; /* FIXME: FNM_CASEFOLD is a GNU extension */ int flags = FNM_PERIOD; if(priv->name_case_insensitive) flags |= FNM_CASEFOLD; if(fnmatch(pattern, name, flags) == 0) ret = TRUE; } } else ret = TRUE; return ret; } static gboolean fm_search_job_match_content_line_based(FmVfsSearchEnumerator* priv, GFileInfo* info, GInputStream* stream, GCancellable* cancellable, GError** error) { gboolean ret = FALSE; /* create a buffered data input stream for line-based I/O */ GDataInputStream *input_stream = g_data_input_stream_new(stream); do { gsize line_len; char* line = g_data_input_stream_read_line(input_stream, &line_len, cancellable, error); if(line == NULL) /* error or EOF */ break; if(priv->content_regex) { /* match using regexp */ ret = g_regex_match(priv->content_regex, line, 0, NULL); } else if(priv->content_pattern && priv->content_case_insensitive) { /* case insensitive search is line-based because we need to * do utf8 validation + case conversion and it's easier to * do with lines than with raw streams. */ if(g_utf8_validate(line, -1, NULL)) { /* this whole line contains valid UTF-8 */ char* down = g_utf8_strdown(line, -1); g_free(line); line = down; } else /* non-UTF8, treat as ASCII */ { char* p; for(p = line; *p; ++p) *p = g_ascii_tolower(*p); } if(strstr(line, priv->content_pattern)) ret = TRUE; } g_free(line); }while(ret == FALSE); g_object_unref(input_stream); return ret; } static gboolean fm_search_job_match_content_exact(FmVfsSearchEnumerator* priv, GFileInfo* info, GInputStream* stream, GCancellable* cancellable, GError** error) { gboolean ret = FALSE; char *buf, *pbuf; gssize size; /* Ensure that the allocated buffer is longer than the string being * searched for. Otherwise it's not possible for the buffer to * contain a string fully matching the pattern. */ int pattern_len = strlen(priv->content_pattern); int buf_size = pattern_len > 4095 ? pattern_len : 4095; int bytes_to_read; buf = g_new(char, buf_size + 1); /* +1 for terminating null char. */ bytes_to_read = buf_size; pbuf = buf; for(;;) { char* found; size = g_input_stream_read(stream, pbuf, bytes_to_read, cancellable, error); if(size <=0) /* EOF or error */ break; pbuf[size] = '\0'; /* make the string null terminated */ found = strstr(buf, priv->content_pattern); if(found) /* the string is found in the buffer */ { ret = TRUE; break; } else if(size == bytes_to_read) /* if size < bytes_to_read, we're at EOF and there are no further data. */ { /* Preserve the last bytes and move them to * the beginning of the buffer. * Append further data after this chunk of data at next read. */ int preserve_len = pattern_len - 1; char* buf_end = buf + buf_size; memmove(buf, buf_end - preserve_len, preserve_len); pbuf = buf + preserve_len; bytes_to_read = buf_size - preserve_len; } } g_free(buf); return ret; } static gboolean fm_search_job_match_content(FmVfsSearchEnumerator* priv, GFileInfo* info, GFile* parent, GCancellable* cancellable, GError** error) { gboolean ret; if(priv->content_pattern || priv->content_regex) { ret = FALSE; if(g_file_info_get_file_type(info) == G_FILE_TYPE_REGULAR && g_file_info_get_size(info) > 0) { GFile* file = g_file_get_child(parent, g_file_info_get_name(info)); /* NOTE: I disabled mmap-based search since this could cause * unexpected crashes sometimes if the mapped files are * removed or changed during the search. */ GFileInputStream * stream = g_file_read(file, cancellable, error); g_object_unref(file); if(stream) { if(priv->content_pattern && !priv->content_case_insensitive) { /* stream based search optimized for case sensitive * exact match. */ ret = fm_search_job_match_content_exact(priv, info, G_INPUT_STREAM(stream), cancellable, error); } else { /* grep-like regexp search and case insensitive search * are line-based. */ ret = fm_search_job_match_content_line_based(priv, info, G_INPUT_STREAM(stream), cancellable, error); } g_input_stream_close(G_INPUT_STREAM(stream), cancellable, NULL); g_object_unref(stream); } } } else ret = TRUE; return ret; } static gboolean fm_search_job_match_file_type(FmVfsSearchEnumerator* priv, GFileInfo* info) { gboolean ret; if(priv->mime_types) { const char* file_type = g_file_info_get_content_type(info); char** pmime_type; ret = FALSE; for(pmime_type = priv->mime_types; *pmime_type; ++pmime_type) { const char* mime_type = *pmime_type; /* For mime_type patterns such as image/* and audio/*, * we move the trailing '*' to begining of the string * as a measure of optimization. We can know it's a * pattern not a full type name by checking the first char. */ if(mime_type[0] == '*') { if(g_str_has_prefix(file_type, mime_type + 1)) { ret = TRUE; break; } } else if(g_content_type_is_a(file_type, mime_type)) { ret = TRUE; break; } } } else ret = TRUE; return ret; } static gboolean fm_search_job_match_size(FmVfsSearchEnumerator* priv, GFileInfo* info) { guint64 size = g_file_info_get_size(info); gboolean ret = TRUE; if(priv->min_size > 0 && size < priv->min_size) ret = FALSE; else if(priv->max_size > 0 && size > priv->max_size) ret = FALSE; else if ((priv->min_size > 0 || priv->max_size > 0) && g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) ret = FALSE; return ret; } static gboolean fm_search_job_match_mtime(FmVfsSearchEnumerator* priv, GFileInfo* info) { gboolean ret = TRUE; if(priv->min_mtime || priv->max_mtime) { guint64 mtime = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_TIME_MODIFIED); /* g_print("file mtime: %llu, min_mtime=%llu, max_mtime=%llu\n", mtime, priv->min_mtime, priv->max_mtime); */ if(priv->min_mtime > 0 && mtime < priv->min_mtime) ret = FALSE; /* earlier than min_mtime */ else if(priv->max_mtime > 0 && mtime > priv->max_mtime) ret = FALSE; /* later than max_mtime */ } return ret; } static gboolean fm_search_job_match_file(FmVfsSearchEnumerator * priv, GFileInfo * info, GFile * parent, GCancellable *cancellable, GError **error) { //g_print("matching file %s\n", g_file_info_get_name(info)); if(!priv->show_hidden && g_file_info_get_is_hidden(info)) return FALSE; if(!fm_search_job_match_filename(priv, info)) return FALSE; if(!fm_search_job_match_file_type(priv, info)) return FALSE; if(!fm_search_job_match_size(priv, info)) return FALSE; if(!fm_search_job_match_mtime(priv, info)) return FALSE; if(!fm_search_job_match_content(priv, info, parent, cancellable, error)) return FALSE; return TRUE; } /* end of rule functions */ /* ---- FmSearchVFile class ---- */ static void fm_search_g_file_init(GFileIface *iface); static void fm_search_fm_file_init(FmFileInterface *iface); G_DEFINE_TYPE_WITH_CODE(FmSearchVFile, fm_vfs_search_file, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_FILE, fm_search_g_file_init) G_IMPLEMENT_INTERFACE(FM_TYPE_FILE, fm_search_fm_file_init)) static void fm_vfs_search_file_finalize(GObject *object) { FmSearchVFile *item = FM_SEARCH_VFILE(object); g_free(item->path); if(item->current) g_object_unref(item->current); G_OBJECT_CLASS(fm_vfs_search_file_parent_class)->finalize(object); } static void fm_vfs_search_file_class_init(FmSearchVFileClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = fm_vfs_search_file_finalize; } static void fm_vfs_search_file_init(FmSearchVFile *item) { /* nothing */ } static FmSearchVFile *_fm_search_vfile_new(void) { return (FmSearchVFile*)g_object_new(FM_TYPE_SEARCH_VFILE, NULL); } /* ---- GFile implementation ---- */ #define ERROR_UNSUPPORTED(err) g_set_error_literal(err, G_IO_ERROR, \ G_IO_ERROR_NOT_SUPPORTED, _("Operation not supported")) static GFile *_fm_vfs_search_dup(GFile *file) { FmSearchVFile *item, *new_item; item = FM_SEARCH_VFILE(file); new_item = _fm_search_vfile_new(); if(item->path) new_item->path = g_strdup(item->path); return (GFile*)new_item; } static guint _fm_vfs_search_hash(GFile *file) { return g_str_hash(FM_SEARCH_VFILE(file)->path); } static gboolean _fm_vfs_search_equal(GFile *file1, GFile *file2) { char *path1 = FM_SEARCH_VFILE(file1)->path; char *path2 = FM_SEARCH_VFILE(file2)->path; return g_str_equal(path1, path2); } static gboolean _fm_vfs_search_is_native(GFile *file) { return FALSE; } static gboolean _fm_vfs_search_has_uri_scheme(GFile *file, const char *uri_scheme) { return g_ascii_strcasecmp(uri_scheme, "search") == 0; } static char *_fm_vfs_search_get_uri_scheme(GFile *file) { return g_strdup("search"); } static char *_fm_vfs_search_get_basename(GFile *file) { return g_strdup("/"); } static char *_fm_vfs_search_get_path(GFile *file) { return NULL; } static char *_fm_vfs_search_get_uri(GFile *file) { FmSearchVFile *item = FM_SEARCH_VFILE(file); if(item->current) return g_file_get_uri(item->current); return g_strdup(item->path); } static char *_fm_vfs_search_get_parse_name(GFile *file) { /* FIXME: need name to be converted to UTF-8? */ return g_strdup(_("Search")); } static GFile *_fm_vfs_search_get_parent(GFile *file) { return NULL; } static gboolean _fm_vfs_search_prefix_matches(GFile *prefix, GFile *file) { return FALSE; } static char *_fm_vfs_search_get_relative_path(GFile *parent, GFile *descendant) { return NULL; } static GFile *_fm_vfs_search_resolve_relative_path(GFile *file, const char *relative_path) { return NULL; } static GFile *_fm_vfs_search_get_child_for_display_name(GFile *file, const char *display_name, GError **error) { FmSearchVFile *new_item; g_return_val_if_fail(file != NULL, NULL); if (display_name == NULL || *display_name == '\0') return g_object_ref(file); /* just append "/"display_name to file->path */ new_item = _fm_search_vfile_new(); new_item->path = g_strdup_printf("%s/%s", FM_SEARCH_VFILE(file)->path, display_name); return (GFile*)new_item; } static GFileEnumerator *_fm_vfs_search_enumerate_children(GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { const char *path = FM_SEARCH_VFILE(file)->path; return _fm_vfs_search_enumerator_new(file, path, attributes, flags, error); } static GFileInfo *_fm_vfs_search_query_info(GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { GFileInfo *fileinfo = g_file_info_new(); GIcon* icon; /* g_debug("_fm_vfs_search_query_info on %s", FM_SEARCH_VFILE(file)->path); */ /* FIXME: use matcher to set only requested data */ g_file_info_set_name(fileinfo, FM_SEARCH_VFILE(file)->path); g_file_info_set_display_name(fileinfo, _("Search Results")); icon = g_themed_icon_new("search"); g_file_info_set_icon(fileinfo, icon); g_object_unref(icon); g_file_info_set_file_type(fileinfo, G_FILE_TYPE_DIRECTORY); return fileinfo; } static GFileInfo *_fm_vfs_search_query_filesystem_info(GFile *file, const char *attributes, GCancellable *cancellable, GError **error) { /* FIXME: set some info on it */ ERROR_UNSUPPORTED(error); return NULL; } static GMount *_fm_vfs_search_find_enclosing_mount(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFile *_fm_vfs_search_set_display_name(GFile *file, const char *display_name, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileAttributeInfoList *_fm_vfs_search_query_settable_attributes(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileAttributeInfoList *_fm_vfs_search_query_writable_namespaces(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static gboolean _fm_vfs_search_set_attribute(GFile *file, const char *attribute, GFileAttributeType type, gpointer value_p, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_search_set_attributes_from_info(GFile *file, GFileInfo *info, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static GFileInputStream *_fm_vfs_search_read_fn(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileOutputStream *_fm_vfs_search_append_to(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileOutputStream *_fm_vfs_search_create(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileOutputStream *_fm_vfs_search_replace(GFile *file, const char *etag, gboolean make_backup, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static gboolean _fm_vfs_search_delete_file(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_search_trash(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_search_make_directory(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_search_make_symbolic_link(GFile *file, const char *symlink_value, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_search_copy(GFile *source, GFile *destination, GFileCopyFlags flags, GCancellable *cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static gboolean _fm_vfs_search_move(GFile *source, GFile *destination, GFileCopyFlags flags, GCancellable *cancellable, GFileProgressCallback progress_callback, gpointer progress_callback_data, GError **error) { ERROR_UNSUPPORTED(error); return FALSE; } static GFileMonitor *_fm_vfs_search_monitor_dir(GFile *file, GFileMonitorFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileMonitor *_fm_vfs_search_monitor_file(GFile *file, GFileMonitorFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } #if GLIB_CHECK_VERSION(2, 22, 0) static GFileIOStream *_fm_vfs_search_open_readwrite(GFile *file, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileIOStream *_fm_vfs_search_create_readwrite(GFile *file, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } static GFileIOStream *_fm_vfs_search_replace_readwrite(GFile *file, const char *etag, gboolean make_backup, GFileCreateFlags flags, GCancellable *cancellable, GError **error) { ERROR_UNSUPPORTED(error); return NULL; } #endif /* Glib >= 2.22 */ static void fm_search_g_file_init(GFileIface *iface) { iface->dup = _fm_vfs_search_dup; iface->hash = _fm_vfs_search_hash; iface->equal = _fm_vfs_search_equal; iface->is_native = _fm_vfs_search_is_native; iface->has_uri_scheme = _fm_vfs_search_has_uri_scheme; iface->get_uri_scheme = _fm_vfs_search_get_uri_scheme; iface->get_basename = _fm_vfs_search_get_basename; iface->get_path = _fm_vfs_search_get_path; iface->get_uri = _fm_vfs_search_get_uri; iface->get_parse_name = _fm_vfs_search_get_parse_name; iface->get_parent = _fm_vfs_search_get_parent; iface->prefix_matches = _fm_vfs_search_prefix_matches; iface->get_relative_path = _fm_vfs_search_get_relative_path; iface->resolve_relative_path = _fm_vfs_search_resolve_relative_path; iface->get_child_for_display_name = _fm_vfs_search_get_child_for_display_name; iface->enumerate_children = _fm_vfs_search_enumerate_children; iface->query_info = _fm_vfs_search_query_info; iface->query_filesystem_info = _fm_vfs_search_query_filesystem_info; iface->find_enclosing_mount = _fm_vfs_search_find_enclosing_mount; iface->set_display_name = _fm_vfs_search_set_display_name; iface->query_settable_attributes = _fm_vfs_search_query_settable_attributes; iface->query_writable_namespaces = _fm_vfs_search_query_writable_namespaces; iface->set_attribute = _fm_vfs_search_set_attribute; iface->set_attributes_from_info = _fm_vfs_search_set_attributes_from_info; iface->read_fn = _fm_vfs_search_read_fn; iface->append_to = _fm_vfs_search_append_to; iface->create = _fm_vfs_search_create; iface->replace = _fm_vfs_search_replace; iface->delete_file = _fm_vfs_search_delete_file; iface->trash = _fm_vfs_search_trash; iface->make_directory = _fm_vfs_search_make_directory; iface->make_symbolic_link = _fm_vfs_search_make_symbolic_link; iface->copy = _fm_vfs_search_copy; iface->move = _fm_vfs_search_move; iface->monitor_dir = _fm_vfs_search_monitor_dir; iface->monitor_file = _fm_vfs_search_monitor_file; #if GLIB_CHECK_VERSION(2, 22, 0) iface->open_readwrite = _fm_vfs_search_open_readwrite; iface->create_readwrite = _fm_vfs_search_create_readwrite; iface->replace_readwrite = _fm_vfs_search_replace_readwrite; iface->supports_thread_contexts = TRUE; #endif /* Glib >= 2.22 */ } /* ---- FmFile implementation ---- */ static gboolean _fm_vfs_search_wants_incremental(GFile* file) { return TRUE; } static void fm_search_fm_file_init(FmFileInterface *iface) { iface->wants_incremental = _fm_vfs_search_wants_incremental; } /* ---- interface for loading ---- */ static GFile *_fm_vfs_search_new_for_uri(const char *uri) { FmSearchVFile *item; g_return_val_if_fail(uri != NULL, NULL); item = _fm_search_vfile_new(); item->path = g_strdup(uri); return (GFile*)item; } FM_DEFINE_MODULE(vfs, search) FmFileInitTable fm_module_init_vfs = { .new_for_uri = &_fm_vfs_search_new_for_uri }; libfm-1.4.0/src/tests/000077500000000000000000000000001475513661000145465ustar00rootroot00000000000000libfm-1.4.0/src/tests/Makefile.am000066400000000000000000000011241475513661000166000ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl NULL= AM_CPPFLAGS = \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/base \ -I$(top_srcdir)/src/extra \ -I$(top_srcdir)/src/actions \ -I$(top_srcdir)/src/job \ $(GIO_CFLAGS) \ -Werror-implicit-function-declaration \ $(NULL) noinst_PROGRAMS = $(TEST_PROGS) file-search-cli-demo TEST_PROGS += fm-path fm_path_SOURCES = test-fm-path.c fm_path_LDADD= \ $(top_builddir)/src/libfm.la \ $(GIO_LIBS) \ $(NULL) file_search_cli_demo_SOURCES = libfm-file-search-cli-demo.c file_search_cli_demo_LDADD = \ $(top_builddir)/src/libfm.la \ $(GIO_LIBS) \ $(NULL) libfm-1.4.0/src/tests/libfm-file-search-cli-demo.c000066400000000000000000000135731475513661000216630ustar00rootroot00000000000000/* * libfm-file-search-cli-demo.c * * Copyright 2010 Shae Smittle * Copyright 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * */ #include #include #include #include "fm.h" #include static char * target = NULL; static char * target_contains = NULL; static char * path_list = NULL; static char * target_type = NULL; static gboolean not_recursive = FALSE; static gboolean show_hidden = FALSE; static gboolean regex_target = FALSE; static gboolean regex_content = FALSE; static gboolean exact_target = FALSE; static gboolean exact_content = FALSE; static gboolean case_insensitive_target = FALSE; static gboolean case_insensitive_content = FALSE; static gint64 min_size = -1; static gint64 max_size = -1; static GOptionEntry entries[] = { {"target", 't', 0, G_OPTION_ARG_STRING, &target, "phrase to search for in file names", NULL }, {"contains", 'c', 0, G_OPTION_ARG_STRING, &target_contains, "phrase to search for in file contents", NULL}, {"paths", 'p', 0, G_OPTION_ARG_STRING, &path_list, "paths to search through i.e. /usr/share/local:/usr/share", NULL}, {"type", 'y', 0, G_OPTION_ARG_STRING, &target_type, "system string representation of type of files to search", NULL}, {"norecurse", 'r', 0, G_OPTION_ARG_NONE, ¬_recursive, "disables recursively searching directories", NULL}, {"showhidden", 's', 0, G_OPTION_ARG_NONE, &show_hidden, "enables searching hidden files", NULL}, {"regextarget", 'e', 0, G_OPTION_ARG_NONE, ®ex_target, "enables regex target searching", NULL}, {"regexcontent", 'g', 0, G_OPTION_ARG_NONE, ®ex_content, "enables regex target searching", NULL}, {"exacttarget", 'x', 0, G_OPTION_ARG_NONE, &exact_target, "enables regex target searching", NULL}, {"exactcontent", 'a', 0, G_OPTION_ARG_NONE, &exact_content, "enables regex target searching", NULL}, {"name-ci", 'n', 0, G_OPTION_ARG_NONE, &case_insensitive_target, "enables case insensitive target searching", NULL}, {"content-ci", 'i', 0, G_OPTION_ARG_NONE, &case_insensitive_content, "enables case insensitive content searching", NULL}, {"min-size", 'u', 0,G_OPTION_ARG_INT64, &min_size, "minimum size of file that is a match", NULL}, {"max-size", 'w', 0, G_OPTION_ARG_INT64, &max_size, "maximum size of file taht is a match", NULL}, {NULL} }; static void on_files_added(FmFolder* folder, GSList* files, gpointer user_data) { GSList* l; for(l = files; l; l = l->next) { FmFileInfo* file = FM_FILE_INFO(l->data); FmPath* path = fm_file_info_get_path(file); char* path_str = fm_path_display_name(path, FALSE); g_printf("file found: %s\n", path_str); } } #if 0 static gboolean on_timeout(gpointer user_data) { g_printf("timeout!\n"); gtk_main_quit(); return FALSE; } #endif static GMainLoop *loop; static void on_finish_loading(FmFolder* folder) { g_printf("finished\n"); g_main_loop_quit(loop); } int main(int argc, char** argv) { GOptionContext * context; #if !GLIB_CHECK_VERSION(2, 36, 0) g_type_init(); #endif fm_init(NULL); context = g_option_context_new(" - test for libfm file search"); g_option_context_add_main_entries(context, entries, NULL); if(g_option_context_parse(context, &argc, &argv, NULL) == FALSE) return 1; GString* search_uri = g_string_sized_new(1024); g_string_append(search_uri, "search:/"); g_string_append(search_uri, path_list); g_string_append_c(search_uri, '?'); g_string_append_printf(search_uri, "recursive=%d", not_recursive ? 0 : 1); g_string_append_printf(search_uri, "&show_hidden=%d", show_hidden ? 1 : 0); if(target) { g_string_append_printf(search_uri, "&name=%s", target); if(case_insensitive_target) g_string_append_printf(search_uri, "&name_ci=%d", case_insensitive_target ? 0 : 1); } if(target_contains) { if(regex_content) g_string_append_printf(search_uri, "&content_regex=%s", target_contains); else g_string_append_printf(search_uri, "&content=%s", target_contains); if(case_insensitive_content) g_string_append_printf(search_uri, "&content_ci=%d", case_insensitive_target ? 0 : 1); } if(target_type) g_string_append_printf(search_uri, "&types=%s", target_type); if(min_size > 0) g_string_append_printf(search_uri, "&min_size=%llu", (long long unsigned int)min_size); if(max_size > 0) g_string_append_printf(search_uri, "&max_size=%llu", (long long unsigned int)max_size); // g_string_append(search_uri, "search://usr/share?recursive=1&name=*.mo&name_mode=widecard&show_hidden=0&name_case_sensitive=1"); g_print("URI: %s\n", search_uri->str); FmFolder* folder = fm_folder_from_uri(search_uri->str); g_string_free(search_uri, TRUE); g_signal_connect(folder, "files-added", G_CALLBACK(on_files_added), NULL); g_signal_connect(folder, "finish-loading", G_CALLBACK(on_finish_loading), NULL); /* g_timeout_add_seconds(30, on_timeout, NULL); */ loop = g_main_loop_new(NULL, TRUE); g_main_loop_run(loop); g_main_loop_unref(loop); g_object_unref(folder); fm_finalize(); return 0; } libfm-1.4.0/src/tests/test-fm-path.c000066400000000000000000000326561475513661000172370ustar00rootroot00000000000000/* * test-fm-path.c * * Copyright 2011 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ //ignore for test disabled asserts #ifdef G_DISABLE_ASSERT # undef G_DISABLE_ASSERT #endif #include #define TEST_PARSING(func, str_to_parse, ...) \ G_STMT_START { \ const char* expected[] = {__VA_ARGS__}; \ test_parsing(func, str_to_parse, expected, G_N_ELEMENTS(expected)); \ } G_STMT_END typedef FmPath* (*FmPathFunc)(const char*); static void test_parsing(FmPathFunc func, const char* str, const char** expected, int n_expected) { GSList* elements = NULL, *l; int i; FmPath *path, *element; g_print("\ntry to parse \'%s\':\n[", str); path = func(str); for(element = path; element; element = fm_path_get_parent(element)) elements = g_slist_prepend(elements, element); for(i = 0, l = elements; l; l=l->next, ++i) { g_assert_cmpint(i, <, n_expected); element = (FmPath*)l->data; g_print("\'%s\'", fm_path_get_basename(element)); if(l->next) g_print(", "); g_assert_cmpstr(fm_path_get_basename(element), ==, expected[i]); } g_slist_free(elements); g_print("]\n"); g_assert_cmpint(i, ==, n_expected); fm_path_unref(path); } static void test_uri_parsing() { // test URIs TEST_PARSING(fm_path_new_for_uri, "file:///test/path/", "/", "test", "path"); TEST_PARSING(fm_path_new_for_uri, "file:/test/path", "/", "test", "path"); /* The 'test' in this format is a host part of URI */ #if 0 TEST_PARSING(fm_path_new_for_uri, "file://test/path", "/", "path"); #endif /* it is changed since 1.2.0 and file://test/ is handled literally */ TEST_PARSING(fm_path_new_for_uri, "file://test/path", "file://test/", "path"); TEST_PARSING(fm_path_new_for_uri, "http://test/path/", "http://test/", "path"); TEST_PARSING(fm_path_new_for_uri, "http://test", "http://test/"); TEST_PARSING(fm_path_new_for_uri, "http:/test", #if 0 "http://test/"); #endif "http:///", "test"); #if 0 TEST_PARSING(fm_path_new_for_uri, "http://////test", "http://test/"); #endif TEST_PARSING(fm_path_new_for_uri, "http://wiki.lxde.org/zh/%E9%A6%96%E9%A0%81", #if 0 /* It should not do any break in URI since 1.0.1 */ "http://wiki.lxde.org/", "zh", "首頁"); #endif "http://wiki.lxde.org/", "zh", "%E9%A6%96%E9%A0%81"); TEST_PARSING(fm_path_new_for_uri, "mailto:test", "mailto:test"); TEST_PARSING(fm_path_new_for_uri, "http://test/path/to/file", "http://test/", "path", "to", "file"); // FIXME: is this ok? TEST_PARSING(fm_path_new_for_uri, "http://test/path/to/file?test_arg=xx", "http://test/", "path/to/file?test_arg=xx"); // test user name, password, and port TEST_PARSING(fm_path_new_for_uri, "ftp://user@host", "ftp://user@host/"); TEST_PARSING(fm_path_new_for_uri, "ftp://user:pass@host", "ftp://user:pass@host/"); TEST_PARSING(fm_path_new_for_uri, "ftp://user@host:21", "ftp://user@host:21/"); TEST_PARSING(fm_path_new_for_uri, "ftp://user:pass@host:21", "ftp://user:pass@host:21/"); TEST_PARSING(fm_path_new_for_uri, "ftp://user:pass@host:21/path", "ftp://user:pass@host:21/", "path"); TEST_PARSING(fm_path_new_for_uri, "ftp://user:pass@host:21/path/", "ftp://user:pass@host:21/", "path"); TEST_PARSING(fm_path_new_for_uri, "ftp://user:pass@host:21/path//", "ftp://user:pass@host:21/", "path"); #if 0 TEST_PARSING(fm_path_new_for_uri, "ftp://user:pass@host:21/../", "ftp://user:pass@host:21/", "path"); #endif // test special locations TEST_PARSING(fm_path_new_for_uri, "computer:", "computer:///"); TEST_PARSING(fm_path_new_for_uri, "computer:/", "computer:///"); TEST_PARSING(fm_path_new_for_uri, "computer:///", "computer:///"); TEST_PARSING(fm_path_new_for_uri, "computer://///", "computer:///"); TEST_PARSING(fm_path_new_for_uri, "computer://device", "computer:///", "device"); TEST_PARSING(fm_path_new_for_uri, "computer:///device", "computer:///", "device"); TEST_PARSING(fm_path_new_for_uri, "trash:", "trash:///"); TEST_PARSING(fm_path_new_for_uri, "trash:/", "trash:///"); TEST_PARSING(fm_path_new_for_uri, "trash://", "trash:///"); TEST_PARSING(fm_path_new_for_uri, "trash:///", "trash:///"); TEST_PARSING(fm_path_new_for_uri, "trash:////", "trash:///"); TEST_PARSING(fm_path_new_for_uri, "trash:/file/", "trash:///", "file"); TEST_PARSING(fm_path_new_for_uri, "trash://file", "trash:///", "file"); TEST_PARSING(fm_path_new_for_uri, "trash:///file/", "trash:///", "file"); TEST_PARSING(fm_path_new_for_uri, "trash:////file/", "trash:///", "file"); TEST_PARSING(fm_path_new_for_uri, "trash:///file/../test", "trash:///", "test"); /* TEST_PARSING(fm_path_new_for_uri, "menu:"); TEST_PARSING(fm_path_new_for_uri, "menu:/"); TEST_PARSING(fm_path_new_for_uri, "menu://"); TEST_PARSING(fm_path_new_for_uri, "menu:///"); */ TEST_PARSING(fm_path_new_for_uri, "menu://applications/", "menu://applications/"); TEST_PARSING(fm_path_new_for_uri, "menu://applications/xxxx", "menu://applications/", "xxxx"); TEST_PARSING(fm_path_new_for_uri, "menu://applications/xxxx/", "menu://applications/", "xxxx"); TEST_PARSING(fm_path_new_for_uri, "menu://settings/xxxx/", "menu://settings/", "xxxx"); TEST_PARSING(fm_path_new_for_uri, "menu://settings", "menu://settings/"); /* This is not yet implemented TEST_PARSING(fm_path_new_for_uri, "applications://xxx", "menu://applications/", "xxx"); */ // test invalid URIs, should fallback to root. TEST_PARSING(fm_path_new_for_uri, "invalid_uri", "/"); TEST_PARSING(fm_path_new_for_uri, "invalid_uri:", "/"); TEST_PARSING(fm_path_new_for_uri, "invalid_uri:/", "/"); TEST_PARSING(fm_path_new_for_uri, "invalid_uri:/invalid", "/"); TEST_PARSING(fm_path_new_for_uri, "invalid_uri://///invalid", "/"); TEST_PARSING(fm_path_new_for_uri, "", "/"); TEST_PARSING(fm_path_new_for_uri, NULL, "/"); } static void test_path_parsing() { TEST_PARSING(fm_path_new_for_path, "/test/path", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "/test/path/", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "/test/path//", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "/test//path//", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "/test///path//", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "//test/path", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "//", "/"); TEST_PARSING(fm_path_new_for_path, "////", "/"); TEST_PARSING(fm_path_new_for_path, "/", "/"); // canonicalize TEST_PARSING(fm_path_new_for_path, "/test/./path", "/", "test", "path"); TEST_PARSING(fm_path_new_for_path, "/test/../path", "/", "path"); TEST_PARSING(fm_path_new_for_path, "/../path", "/", "path"); TEST_PARSING(fm_path_new_for_path, "/./path", "/", "path"); TEST_PARSING(fm_path_new_for_path, "invalid_path", "/"); TEST_PARSING(fm_path_new_for_path, "", "/"); TEST_PARSING(fm_path_new_for_path, NULL, "/"); } static void test_path_child() { FmPath* parent = fm_path_get_home(); FmPath* path; g_print("\n"); path = fm_path_new_child(parent, "child"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "child"); fm_path_unref(path); path = fm_path_new_child(parent, "child/"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "child"); fm_path_unref(path); path = fm_path_new_child(parent, "child///"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "child"); fm_path_unref(path); path = fm_path_new_child(parent, ".."); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert(path == fm_path_get_parent(parent)); fm_path_unref(path); path = fm_path_new_child(parent, "../"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert(path == fm_path_get_parent(parent)); fm_path_unref(path); path = fm_path_new_child(parent, "/"); g_assert(path == parent); fm_path_unref(path); parent = fm_path_get_root(); path = fm_path_new_child(parent, ".."); g_assert(path == parent); fm_path_unref(path); path = fm_path_new_child(parent, "../"); g_assert(path == parent); fm_path_unref(path); parent = NULL; path = fm_path_new_child(parent, "/"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "/"); fm_path_unref(path); path = fm_path_new_child(parent, "//"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "/"); fm_path_unref(path); path = fm_path_new_child(parent, "///"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "/"); fm_path_unref(path); /* FIXME: how to handle this case? path = fm_path_new_child(parent, "/test"); g_printf("path->name = %s\n", path->name); g_assert_cmpstr(path->name, ==, "/test/"); fm_path_unref(path); */ path = fm_path_new_child(parent, "trash:"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "trash:///"); fm_path_unref(path); path = fm_path_new_child(parent, "trash:/"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "trash:///"); fm_path_unref(path); path = fm_path_new_child(parent, "trash:////"); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "trash:///"); fm_path_unref(path); path = fm_path_new_child(parent, ".."); g_printf("path->name = %s\n", fm_path_get_basename(path)); g_assert_cmpstr(fm_path_get_basename(path), ==, "/"); fm_path_unref(path); path = fm_path_new_child(parent, "../"); g_assert_cmpstr(fm_path_get_basename(path), ==, "/"); fm_path_unref(path); /* path = fm_path_new_child(parent, ".."); g_assert(path == NULL); path = fm_path_new_child(parent, "."); g_assert(path == NULL); */ } static void test_predefined_paths() { FmPath* path; path = fm_path_new_for_uri("trash:///"); g_assert(path == fm_path_get_trash()); fm_path_unref(path); path = fm_path_new_for_uri("trash:///xxx"); g_assert(fm_path_get_parent(path) == fm_path_get_trash()); fm_path_unref(path); path = fm_path_new_for_uri("menu://"); g_assert(path == fm_path_get_apps_menu()); fm_path_unref(path); path = fm_path_new_for_uri("menu://applications"); g_assert(path == fm_path_get_apps_menu()); fm_path_unref(path); path = fm_path_new_for_uri("menu://applications/test/"); g_assert(fm_path_get_parent(path) == fm_path_get_apps_menu()); fm_path_unref(path); /* path = fm_path_new_for_path(g_get_home_dir()); g_assert(path == fm_path_get_home()); fm_path_unref(path); tmp = g_build_filename(g_get_home_dir(), "xxxx", "xx", NULL); path = fm_path_new_for_path(tmp); g_debug("path->name=%s", path->parent->parent->name); g_assert(path->parent->parent == fm_path_get_home()); fm_path_unref(path); g_free(tmp); path = fm_path_new_for_path(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); g_assert(path == fm_path_get_desktop()); fm_path_unref(path); tmp = g_build_filename(g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP), "xxxx", "xx", NULL); path = fm_path_new_for_path(tmp); g_assert(path->parent->parent == fm_path_get_desktop()); fm_path_unref(path); g_free(tmp); */ } int main (int argc, char *argv[]) { #if !GLIB_CHECK_VERSION(2, 36, 0) g_type_init(); #endif fm_init(NULL); g_test_init (&argc, &argv, NULL); // initialize test program g_test_add_func("/FmPath/new_child_len", test_path_child); g_test_add_func("/FmPath/path_parsing", test_path_parsing); g_test_add_func("/FmPath/uri_parsing", test_uri_parsing); g_test_add_func("/FmPath/predefined_paths", test_predefined_paths); return g_test_run(); } libfm-1.4.0/src/tools/000077500000000000000000000000001475513661000145445ustar00rootroot00000000000000libfm-1.4.0/src/tools/libfm-pref-apps.c000066400000000000000000000076371475513661000177110ustar00rootroot00000000000000/* * libfm-prefapps.c * * Copyright 2010 - 2012 Hong Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "fm-gtk.h" #include "../glib-compat.h" static GtkDialog* dlg; static GtkComboBox* browser; static GtkComboBox* mail_client; int main(int argc, char** argv) { GtkBuilder* b; FmMimeType *mt; #ifdef ENABLE_NLS bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain( GETTEXT_PACKAGE ); #endif gtk_init(&argc, &argv); fm_gtk_init(NULL); #if GTK_CHECK_VERSION(3, 10, 0) b = gtk_builder_new_from_file(PACKAGE_UI_DIR "/preferred-apps.ui"); #else b = gtk_builder_new(); gtk_builder_add_from_file(b, PACKAGE_UI_DIR "/preferred-apps.ui", NULL); #endif dlg = GTK_DIALOG(gtk_builder_get_object(b, "dlg")); browser = GTK_COMBO_BOX(gtk_builder_get_object(b, "browser")); mail_client = GTK_COMBO_BOX(gtk_builder_get_object(b, "mail_client")); g_object_unref(b); /* Set icon name for main (dlg) window so it displays in the panel. LP #737274 */ gtk_window_set_icon_name(GTK_WINDOW(dlg), "preferences-desktop"); /* make sure we're using menu from lxmenu-data */ g_setenv("XDG_MENU_PREFIX", "lxde-", TRUE); mt = fm_mime_type_from_name("x-scheme-handler/http"); fm_app_chooser_combo_box_setup_for_mime_type(browser, mt); fm_mime_type_unref(mt); mt = fm_mime_type_from_name("x-scheme-handler/mailto"); fm_app_chooser_combo_box_setup_for_mime_type(mail_client, mt); fm_mime_type_unref(mt); if(gtk_dialog_run(dlg) == GTK_RESPONSE_OK) { gboolean is_changed; GAppInfo* app; const GList* custom_apps, *l; /* get currently selected web browser */ app = fm_app_chooser_combo_box_dup_selected_app(browser, &is_changed); if(app) { if(is_changed) { g_app_info_set_as_default_for_type(app, "x-scheme-handler/http", NULL); g_app_info_set_as_default_for_type(app, "x-scheme-handler/https", NULL); } g_object_unref(app); } custom_apps = fm_app_chooser_combo_box_get_custom_apps(browser); if(custom_apps) { for(l=custom_apps;l;l=l->next) { app = G_APP_INFO(l->data); /* x-scheme-handler/http is set by chooser already */ #if GLIB_CHECK_VERSION(2, 27, 6) g_app_info_set_as_last_used_for_type(app, "x-scheme-handler/https", NULL); #else g_app_info_add_supports_type(app, "x-scheme-handler/https", NULL); #endif } /* custom_apps is owned by the combobox and shouldn't be freed. */ } /* get selected mail client */ app = fm_app_chooser_combo_box_dup_selected_app(mail_client, &is_changed); if(app) { if(is_changed) g_app_info_set_as_default_for_type(app, "x-scheme-handler/mailto", NULL); g_object_unref(app); } } gtk_widget_destroy((GtkWidget*)dlg); fm_gtk_finalize(); return 0; } libfm-1.4.0/src/tools/lxshortcut.c000066400000000000000000000146501475513661000171350ustar00rootroot00000000000000/* * lxshortcut.c * * Copyright 2008 * Copyright 2013 Andriy Grytsenko (LStranger) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #ifdef ENABLE_NLS #include #endif static gboolean no_display = FALSE; static char* ifile = NULL; static char* ofile = NULL; static GOptionEntry opt_entries[] = { {"no-display", 'n', 0, G_OPTION_ARG_NONE, &no_display, NULL, NULL}, {"input", 'i', 0, G_OPTION_ARG_FILENAME, &ifile, N_("source file name or desktop id"), N_("SOURCE")}, {"output", 'o', 0, G_OPTION_ARG_FILENAME, &ofile, N_("result file name"), N_("RESULT")}, { NULL } }; static gpointer dlg_init(GtkBuilder *ui, gpointer uidata, FmFileInfoList *files) { gpointer widget; g_debug("dlg_init"); /* FIXME: handle NoDisplay */ #define HIDE_WIDGET(x) widget = gtk_builder_get_object(ui, x); \ if (widget) \ gtk_widget_hide(widget) /* remove permissions tab */ HIDE_WIDGET("permissions_tab"); /* remove unwanted texts (times, target, etc.) */ HIDE_WIDGET("target"); HIDE_WIDGET("target_label"); HIDE_WIDGET("total_size"); HIDE_WIDGET("total_size_label"); HIDE_WIDGET("size_on_disk"); HIDE_WIDGET("size_on_disk_label"); HIDE_WIDGET("mtime"); HIDE_WIDGET("mtime_label"); HIDE_WIDGET("atime"); HIDE_WIDGET("atime_label"); HIDE_WIDGET("ctime"); HIDE_WIDGET("ctime_label"); #undef HIDE_WIDGET return (gpointer)-1; } static void dlg_finish(gpointer data, gboolean cancelled) { /* FIXME: handle NoDisplay */ } static FmFilePropertiesExtensionInit ext_table = { .init = &dlg_init, .finish = &dlg_finish }; int main(int argc, char **argv) { GError *err = NULL; FmConfig *config; GtkDialog *dlg; char *sfile = NULL, *tfile = NULL; const char * const *strv; char *bl[] = {"*", NULL}; char *wl[] = {"gtk_file_prop:application/x-desktop", NULL}; char *contents; gsize len; FmPath *path; FmFileInfo *fi; FmFileInfoList *files; #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #endif if (argc == 1) { /* FIXME: we should just call 'lxshortcut --help' */ g_print("Error: You need at least one option\n"); g_print("for help run 'lxshortcut --help\n"); return 1; } /* initialize GTK+ and parse the command line arguments */ if (G_UNLIKELY(!gtk_init_with_args(&argc, &argv, " ", opt_entries, GETTEXT_PACKAGE, &err))) { g_print("Error: %s\n", err->message); return 1; } if (!ifile && !ofile) return 1; /* setup LibFM for its default config */ config = fm_config_new(); fm_config_load_from_file(config, "/dev/null"); fm_gtk_init(config); /* set modules blacklist and allow only application/x-desktop */ fm_config->modules_blacklist = g_strdupv(bl); fm_config->modules_whitelist = g_strdupv(wl); if (ofile) tfile = g_strdup(ofile); if (ifile) { // FIXME: this won't work for files without full path if (strchr(ifile, '/')) /* if this is a file path */ { if (!ofile) /* store to the same file if not otherwise specified. */ tfile = g_strdup(ifile); else sfile = g_strdup(ifile); } else /* otherwise treat it as desktop id */ { /* find in g_get_user_data_dir() */ sfile = g_build_filename(g_get_user_data_dir(), "applications", ifile, NULL); if (!ofile) tfile = g_strdup(sfile); if (!g_file_test(sfile, G_FILE_TEST_IS_REGULAR)) { /* otherwise find in g_get_system_data_dirs() */ g_free(sfile); sfile = NULL; for (strv = g_get_system_data_dirs(); *strv; strv++) { sfile = g_build_filename(*strv, "applications", ifile, NULL); if (g_file_test(sfile, G_FILE_TEST_IS_REGULAR)) break; g_free(sfile); sfile = NULL; } } } } /* if we got sfile then copy found sfile into tfile */ if (sfile && g_file_get_contents(sfile, &contents, &len, NULL)) { g_file_set_contents(tfile, contents, len, NULL); /* FIXME: check errors */ g_free(contents); } else if (!g_file_test(tfile, G_FILE_TEST_EXISTS)) /* if no sfile is set then create an empty tfile */ g_file_set_contents(tfile, "[Desktop Entry]\n" "Type=Application", -1, NULL); g_free(sfile); /* we have existing target file now with actual contents, let edit it */ path = fm_path_new_for_path(tfile); /* get file info of it */ fi = fm_file_info_new(); fm_file_info_set_path(fi, path); fm_path_unref(path); fm_file_info_set_from_native_file(fi, tfile, &err); if (!fm_file_info_is_desktop_entry(fi)) { g_print("Error: file %s is not a desktop entry file\n", tfile); g_free(tfile); fm_file_info_unref(fi); return 1; } g_free(tfile); files = fm_file_info_list_new(); fm_file_info_list_push_tail_noref(files, fi); /* add own extension for it */ fm_file_properties_add_for_mime_type("application/x-desktop", &ext_table); dlg = fm_file_properties_widget_new(files, TRUE); fm_file_info_list_unref(files); gtk_dialog_run(dlg); gtk_widget_destroy(GTK_WIDGET(dlg)); fm_gtk_finalize(); return 0; } libfm-1.4.0/src/udisks/000077500000000000000000000000001475513661000147065ustar00rootroot00000000000000libfm-1.4.0/src/udisks/dbus-utils.c000066400000000000000000000030071475513661000171450ustar00rootroot00000000000000/* * dbus-utils.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "dbus-utils.h" #include GHashTable* dbus_get_all_props(DBusGProxy* proxy, const char* iface, GError** err) { GHashTable* props = NULL; dbus_g_proxy_call(proxy, "GetAll", err, G_TYPE_STRING, iface, G_TYPE_INVALID, dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &props, G_TYPE_INVALID); return props; } GError* g_udisks_error_to_gio_error(GError* error) { if(error) { int code = G_IO_ERROR_FAILED; error = g_error_new_literal(G_IO_ERROR, code, error->message); return error; } return NULL; } libfm-1.4.0/src/udisks/dbus-utils.h000066400000000000000000000065621475513661000171630ustar00rootroot00000000000000/* * dbus-utils.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __DBUS_UTILS_H__ #define __DBUS_UTILS_H__ #include #include G_BEGIN_DECLS // char* dbus_get_prop(DBusGProxy* proxy, const char* iface, const char* prop); GHashTable* dbus_get_all_props(DBusGProxy* proxy, const char* iface, GError** err); static inline const char* dbus_prop_str(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_get_string(val) : NULL; } static inline const char* dbus_prop_obj_path(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? (char*)g_value_get_boxed(val) : NULL; } static inline const char** dbus_prop_strv(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? (const char**)g_value_get_boxed(val) : NULL; } static inline char* dbus_prop_dup_str(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_dup_string(val) : NULL; } static inline char* dbus_prop_dup_obj_path(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_strdup((char*)g_value_get_boxed(val)) : NULL; } static inline char** dbus_prop_dup_strv(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_dup_boxed(val) : NULL; } static inline gboolean dbus_prop_bool(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_get_boolean(val) : FALSE; } static inline gint dbus_prop_int(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_get_int(val) : 0; } static inline guint dbus_prop_uint(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_get_uint(val) : 0; } static inline gint64 dbus_prop_int64(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_get_int64(val) : 0; } static inline guint64 dbus_prop_uint64(GHashTable* props, const char* name) { GValue* val = (GValue*)g_hash_table_lookup(props, name); return val ? g_value_get_uint64(val) : 0; } // GHashTable* dbus_get_prop_async(); // GHashTable* dbus_get_all_props_async(); GError* g_udisks_error_to_gio_error(GError* error); G_END_DECLS #endif /* __DBUS_UTILS_H__ */ libfm-1.4.0/src/udisks/fm-udisks.c000066400000000000000000000031441475513661000167560ustar00rootroot00000000000000/* * fm-udisks.c * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "fm-udisks.h" #include "g-udisks-volume-monitor.h" gboolean _fm_udisks_init() { /* glib < 2.23.2 has errors if an extension poinbt is already registered */ #if !GLIB_CHECK_VERSION(2, 23, 2) if(!g_io_extension_point_lookup(G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME)) #endif { g_io_extension_point_register(G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME); } /* register our own volume monitor to override the one provided in gvfs. */ g_io_extension_point_implement(G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME, G_UDISKS_VOLUME_MONITOR_TYPE, "udisks-monitor", 2 /* the gdu monitor provided by gvfs uses priority 3 */ ); return TRUE; } void _fm_udisks_finalize() { g_io_scheduler_cancel_all_jobs(); } libfm-1.4.0/src/udisks/fm-udisks.h000066400000000000000000000020301475513661000167540ustar00rootroot00000000000000/* * fm-udisks.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __FM_UDISKS_H__ #define __FM_UDISKS_H__ #include G_BEGIN_DECLS gboolean _fm_udisks_init(); void _fm_udisks_finalize(); G_END_DECLS #endif /* __FM_UDISKS_H__ */ libfm-1.4.0/src/udisks/g-udisks-device.c000066400000000000000000000305071475513661000200420ustar00rootroot00000000000000// g-udisks-device.c // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifdef HAVE_CONFIG_H #include #endif #include "g-udisks-device.h" #include "dbus-utils.h" #include "udisks-device.h" #include #include /* This array is taken from gnome-disk-utility: gdu-volume.c * Copyright (C) 2007 David Zeuthen, licensed under GNU LGPL */ static const struct { const char *disc_type; const char *icon_name; const char *ui_name; const char *ui_name_blank; } disc_data[] = { /* Translator: The word "blank" is used as an adjective, e.g. we are decsribing discs that are already blank */ {"optical_cd", "media-optical-cd-rom", N_("CD-ROM Disc"), N_("Blank CD-ROM Disc")}, {"optical_cd_r", "media-optical-cd-r", N_("CD-R Disc"), N_("Blank CD-R Disc")}, {"optical_cd_rw", "media-optical-cd-rw", N_("CD-RW Disc"), N_("Blank CD-RW Disc")}, {"optical_dvd", "media-optical-dvd-rom", N_("DVD-ROM Disc"), N_("Blank DVD-ROM Disc")}, {"optical_dvd_r", "media-optical-dvd-r", N_("DVD-ROM Disc"), N_("Blank DVD-ROM Disc")}, {"optical_dvd_rw", "media-optical-dvd-rw", N_("DVD-RW Disc"), N_("Blank DVD-RW Disc")}, {"optical_dvd_ram", "media-optical-dvd-ram", N_("DVD-RAM Disc"), N_("Blank DVD-RAM Disc")}, {"optical_dvd_plus_r", "media-optical-dvd-r-plus", N_("DVD+R Disc"), N_("Blank DVD+R Disc")}, {"optical_dvd_plus_rw", "media-optical-dvd-rw-plus", N_("DVD+RW Disc"), N_("Blank DVD+RW Disc")}, {"optical_dvd_plus_r_dl", "media-optical-dvd-dl-r-plus", N_("DVD+R DL Disc"), N_("Blank DVD+R DL Disc")}, {"optical_dvd_plus_rw_dl", "media-optical-dvd-dl-r-plus", N_("DVD+RW DL Disc"), N_("Blank DVD+RW DL Disc")}, {"optical_bd", "media-optical-bd-rom", N_("Blu-Ray Disc"), N_("Blank Blu-Ray Disc")}, {"optical_bd_r", "media-optical-bd-r", N_("Blu-Ray R Disc"), N_("Blank Blu-Ray R Disc")}, {"optical_bd_re", "media-optical-bd-re", N_("Blu-Ray RW Disc"), N_("Blank Blu-Ray RW Disc")}, {"optical_hddvd", "media-optical-hddvd-rom", N_("HD DVD Disc"), N_("Blank HD DVD Disc")}, {"optical_hddvd_r", "media-optical-hddvd-r", N_("HD DVD-R Disc"), N_("Blank HD DVD-R Disc")}, {"optical_hddvd_rw", "media-optical-hddvd-rw", N_("HD DVD-RW Disc"), N_("Blank HD DVD-RW Disc")}, {"optical_mo", "media-optical-mo", N_("MO Disc"), N_("Blank MO Disc")}, {"optical_mrw", "media-optical-mrw", N_("MRW Disc"), N_("Blank MRW Disc")}, {"optical_mrw_w", "media-optical-mrw-w", N_("MRW/W Disc"), N_("Blank MRW/W Disc")}, {NULL, NULL, NULL, NULL} }; static void g_udisks_device_finalize (GObject *object); G_DEFINE_TYPE(GUDisksDevice, g_udisks_device, G_TYPE_OBJECT) static void g_udisks_device_class_init(GUDisksDeviceClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = g_udisks_device_finalize; } static void clear_props(GUDisksDevice* dev) { g_free(dev->dev_file); g_free(dev->dev_file_presentation); g_free(dev->name); g_free(dev->icon_name); g_free(dev->usage); g_free(dev->type); g_free(dev->uuid); g_free(dev->label); g_free(dev->vender); g_free(dev->model); g_free(dev->conn_iface); g_free(dev->media); g_free(dev->partition_slave); g_strfreev(dev->mount_paths); } static void set_props(GUDisksDevice* dev, GHashTable* props) { dev->dev_file = dbus_prop_dup_str(props, "DeviceFile"); dev->dev_file_presentation = dbus_prop_dup_str(props, "DeviceFilePresentation"); dev->is_sys_internal = dbus_prop_bool(props, "DeviceIsSystemInternal"); dev->is_removable = dbus_prop_bool(props, "DeviceIsRemovable"); dev->is_read_only = dbus_prop_bool(props, "DeviceIsReadOnly"); dev->is_drive = dbus_prop_bool(props, "DeviceIsDrive"); dev->is_optic_disc = dbus_prop_bool(props, "DeviceIsOpticalDisc"); dev->is_mounted = dbus_prop_bool(props, "DeviceIsMounted"); dev->is_media_available = dbus_prop_bool(props, "DeviceIsMediaAvailable"); dev->is_media_change_notification_polling = dbus_prop_bool(props, "DeviceIsMediaChangeDetectionPolling"); dev->is_luks = dbus_prop_bool(props, "DeviceIsLuks"); dev->is_luks_clear_text = dbus_prop_bool(props, "DeviceIsLuksCleartext"); dev->is_linux_md_component = dbus_prop_bool(props, "DeviceIsLinuxMdComponent"); dev->is_linux_md = dbus_prop_bool(props, "DeviceIsLinuxMd"); dev->is_linux_lvm2lv = dbus_prop_bool(props, "DeviceIsLinuxLvm2LV"); dev->is_linux_lvm2pv = dbus_prop_bool(props, "DeviceIsLinuxLvm2PV"); dev->is_linux_dmmp_component = dbus_prop_bool(props, "DeviceIsLinuxDmmpComponent"); dev->is_linux_dmmp = dbus_prop_bool(props, "DeviceIsLinuxDmmp"); dev->is_ejectable = dbus_prop_bool(props, "DriveIsMediaEjectable"); dev->is_disc_blank = dbus_prop_bool(props, "OpticalDiscIsBlank"); dev->is_hidden = dbus_prop_bool(props, "DevicePresentationHide"); dev->auto_mount = !dbus_prop_bool(props, "DevicePresentationNopolicy"); dev->mounted_by_uid = dbus_prop_uint(props, "DeviceMountedByUid"); dev->mount_paths = dbus_prop_dup_strv(props, "DeviceMountPaths"); dev->dev_size = dbus_prop_uint64(props, "DeviceSize"); dev->partition_size = dbus_prop_uint64(props, "PartitionSize"); dev->luks_unlocked_by_uid = dbus_prop_uint(props, "LuksCleartextUnlockedByUid"); dev->num_audio_tracks = dbus_prop_uint(props, "OpticalDiscNumAudioTracks"); dev->name = dbus_prop_dup_str(props, "DevicePresentationName"); dev->icon_name = dbus_prop_dup_str(props, "DevicePresentationIconName"); dev->usage = dbus_prop_dup_str(props, "IdUsage"); dev->type = dbus_prop_dup_str(props, "IdType"); dev->uuid = dbus_prop_dup_str(props, "IdUuid"); dev->label = dbus_prop_dup_str(props, "IdLabel"); dev->vender = dbus_prop_dup_str(props, "DriveVendor"); dev->model = dbus_prop_dup_str(props, "DriveModel"); dev->conn_iface = dbus_prop_dup_str(props, "DriveConnectionInterface"); dev->media = dbus_prop_dup_str(props, "DriveMedia"); dev->partition_slave = dbus_prop_dup_obj_path(props, "PartitionSlave"); /* how to support LUKS? */ /* 'LuksHolder' read 'o' 'LuksCleartextSlave' read 'o' */ } static void g_udisks_device_finalize(GObject *object) { GUDisksDevice *self; g_return_if_fail(object != NULL); g_return_if_fail(G_IS_UDISKS_DEVICE(object)); self = G_UDISKS_DEVICE(object); g_free(self->obj_path); clear_props(self); G_OBJECT_CLASS(g_udisks_device_parent_class)->finalize(object); } static void g_udisks_device_init(GUDisksDevice *self) { } GUDisksDevice *g_udisks_device_new(const char* obj_path, GHashTable* props) { GUDisksDevice* dev = (GUDisksDevice*)g_object_new(G_TYPE_UDISKS_DEVICE, NULL); dev->obj_path = g_strdup(obj_path); set_props(dev, props); return dev; } void g_udisks_device_update(GUDisksDevice* dev, GHashTable* props) { clear_props(dev); set_props(dev, props); } DBusGProxy* g_udisks_device_get_proxy(GUDisksDevice* dev, DBusGConnection* con) { DBusGProxy* proxy = dbus_g_proxy_new_for_name(con, "org.freedesktop.UDisks", dev->obj_path, "org.freedesktop.UDisks.Device"); return proxy; } const char* g_udisks_device_get_icon_name(GUDisksDevice* dev) { const char* icon_name = NULL; if(dev->icon_name && *dev->icon_name) icon_name = dev->icon_name; else if(dev->media && *dev->media) /* by media type */ { if(dev->is_optic_disc) { if(dev->num_audio_tracks > 0) icon_name = "media-optical-audio"; else { guint i; icon_name = "media-optical"; for( i = 0; i < G_N_ELEMENTS(disc_data); ++i) { if(strcmp(dev->media, disc_data[i].disc_type) == 0) { if(dev->is_disc_blank) icon_name = disc_data[i].icon_name; break; } } } } else { if(strcmp (dev->media, "flash_cf") == 0) icon_name = "media-flash-cf"; else if(strcmp (dev->media, "flash_ms") == 0) icon_name = "media-flash-ms"; else if(strcmp (dev->media, "flash_sm") == 0) icon_name = "media-flash-sm"; else if(strcmp (dev->media, "flash_sd") == 0) icon_name = "media-flash-sd"; else if(strcmp (dev->media, "flash_sdhc") == 0) icon_name = "media-flash-sd"; else if(strcmp (dev->media, "flash_mmc") == 0) icon_name = "media-flash-sd"; else if(strcmp (dev->media, "floppy") == 0) icon_name = "media-floppy"; else if(strcmp (dev->media, "floppy_zip") == 0) icon_name = "media-floppy-zip"; else if(strcmp (dev->media, "floppy_jaz") == 0) icon_name = "media-floppy-jaz"; else if(g_str_has_prefix (dev->media, "flash")) icon_name = "media-flash"; } } else if(dev->conn_iface && *dev->conn_iface) /* by connection interface */ { if(g_str_has_prefix(dev->conn_iface, "ata")) icon_name = dev->is_removable ? "drive-removable-media-ata" : "drive-harddisk-ata"; else if(g_str_has_prefix (dev->conn_iface, "scsi")) icon_name = dev->is_removable ? "drive-removable-media-scsi" : "drive-harddisk-scsi"; else if(strcmp (dev->conn_iface, "usb") == 0) icon_name = dev->is_removable ? "drive-removable-media-usb" : "drive-harddisk-usb"; else if (strcmp (dev->conn_iface, "firewire") == 0) icon_name = dev->is_removable ? "drive-removable-media-ieee1394" : "drive-harddisk-ieee1394"; } if(!icon_name) { if(dev->is_removable) icon_name = "drive-removable-media"; else icon_name = "drive-harddisk"; } return icon_name; } const char* g_udisks_device_get_disc_name(GUDisksDevice* dev) { const char* name = NULL; if(!dev->is_optic_disc) return NULL; if(dev->media && *dev->media) { if(dev->num_audio_tracks > 0 && g_str_has_prefix(dev->media, "optical_cd")) name = _("Audio CD"); else { guint i; for( i = 0; i < G_N_ELEMENTS(disc_data); ++i) { if(strcmp(dev->media, disc_data[i].disc_type) == 0) { if(dev->is_disc_blank) name = disc_data[i].ui_name_blank; else name = disc_data[i].ui_name; break; } } } } if(!name) { if(dev->is_disc_blank) name = _("Blank Optical Disc"); else name = _("Optical Disc"); } return name; } gboolean g_udisks_device_is_volume(GUDisksDevice* dev) { /* also treat blank optical discs as volumes here to be compatible with gvfs. * FIXME: this is useless unless we support burn:/// * So, should we support this? Personally I think it's a bad idea. */ return (g_strcmp0(dev->usage, "filesystem") == 0 || dev->is_disc_blank); } libfm-1.4.0/src/udisks/g-udisks-device.h000066400000000000000000000071711475513661000200500ustar00rootroot00000000000000// g-udisks-device.h // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __G_UDISKS_DEVICE_H__ #define __G_UDISKS_DEVICE_H__ #include #include G_BEGIN_DECLS #define G_TYPE_UDISKS_DEVICE (g_udisks_device_get_type()) #define G_UDISKS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ G_TYPE_UDISKS_DEVICE, GUDisksDevice)) #define G_UDISKS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ G_TYPE_UDISKS_DEVICE, GUDisksDeviceClass)) #define G_IS_UDISKS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ G_TYPE_UDISKS_DEVICE)) #define G_IS_UDISKS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ G_TYPE_UDISKS_DEVICE)) #define G_UDISKS_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ G_TYPE_UDISKS_DEVICE, GUDisksDeviceClass)) typedef struct _GUDisksDevice GUDisksDevice; typedef struct _GUDisksDeviceClass GUDisksDeviceClass; typedef struct _GUDisksDevicePrivate GUDisksDevicePrivate; struct _GUDisksDevice { GObject parent; char* obj_path; /* dbus object path */ char* dev_file; char* dev_file_presentation; gboolean is_sys_internal : 1; gboolean is_removable : 1; gboolean is_read_only : 1; gboolean is_drive : 1; gboolean is_optic_disc : 1; gboolean is_mounted : 1; gboolean is_media_available : 1; gboolean is_media_change_notification_polling : 1; gboolean is_luks : 1; gboolean is_luks_clear_text : 1; gboolean is_linux_md_component : 1; gboolean is_linux_md : 1; gboolean is_linux_lvm2lv : 1; gboolean is_linux_lvm2pv : 1; gboolean is_linux_dmmp_component : 1; gboolean is_linux_dmmp : 1; gboolean is_ejectable : 1; gboolean is_disc_blank : 1; gboolean is_hidden : 1; gboolean auto_mount : 1; guint mounted_by_uid; char** mount_paths; guint64 dev_size; guint64 partition_size; guint num_audio_tracks; guint luks_unlocked_by_uid; char* name; char* icon_name; char* usage; char* type; char* uuid; char* label; char* vender; char* model; char* conn_iface; char* media; char* partition_slave; }; struct _GUDisksDeviceClass { GObjectClass parent_class; }; GType g_udisks_device_get_type (void); GUDisksDevice* g_udisks_device_new (const char* obj_path, GHashTable* props); void g_udisks_device_update(GUDisksDevice* dev, GHashTable* props); DBusGProxy* g_udisks_device_get_proxy(GUDisksDevice* dev, DBusGConnection* con); const char* g_udisks_device_get_icon_name(GUDisksDevice* dev); /* this is only valid if the device contains a optic disc */ const char* g_udisks_device_get_disc_name(GUDisksDevice* dev); gboolean g_udisks_device_is_volume(GUDisksDevice* dev); G_END_DECLS #endif /* __G_UDISKS_DEVICE_H__ */ libfm-1.4.0/src/udisks/g-udisks-drive.c000066400000000000000000000360461475513661000177200ustar00rootroot00000000000000// g-udisks-drive.c // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifdef HAVE_CONFIG_H #include #endif #include "g-udisks-drive.h" #include "g-udisks-device.h" #include "g-udisks-volume.h" #include #include "udisks-device.h" #include "dbus-utils.h" typedef struct { GUDisksDrive* drv; GAsyncReadyCallback callback; GMountUnmountFlags flags; GMountOperation* op; GCancellable* cancellable; gpointer user_data; DBusGProxy* proxy; DBusGProxyCall* call; GList* mounts; }EjectData; static guint sig_changed; static guint sig_disconnected; static guint sig_eject_button; static guint sig_stop_button; static void g_udisks_drive_drive_iface_init (GDriveIface * iface); static void g_udisks_drive_finalize (GObject *object); G_DEFINE_TYPE_EXTENDED (GUDisksDrive, g_udisks_drive, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE (G_TYPE_DRIVE, g_udisks_drive_drive_iface_init)) static void g_udisks_drive_class_init(GUDisksDriveClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = g_udisks_drive_finalize; } static gboolean g_udisks_drive_can_eject (GDrive* base) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); return drv->dev->is_ejectable; } static gboolean g_udisks_drive_can_poll_for_media (GDrive* base) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); return drv->dev->is_media_change_notification_polling; } static gboolean g_udisks_drive_can_start (GDrive* base) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return FALSE; } static gboolean g_udisks_drive_can_start_degraded (GDrive* base) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return FALSE; } static gboolean g_udisks_drive_can_stop (GDrive* base) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return FALSE; } static GList* g_udisks_drive_get_volumes (GDrive* base) { /* FIXME: is it a better idea to save all volumes in GUDisksDrive instead? */ GUDisksDrive* drv = G_UDISKS_DRIVE(base); GList* vols = g_volume_monitor_get_volumes(G_VOLUME_MONITOR(drv->mon)); GList* l; GList* ret = NULL; for(l = vols;l;l=l->next) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); if(vol->drive == drv) ret = g_list_prepend(ret, vol); else g_object_unref(vol); } g_list_free(vols); return ret; } static void on_eject_cancelled(GCancellable* cancellable, gpointer user_data); static void finish_eject(GSimpleAsyncResult* res, EjectData* data) { g_simple_async_result_complete(res); g_object_unref(res); g_object_unref(data->drv); if(data->cancellable) { g_signal_handlers_disconnect_by_func(data->cancellable, on_eject_cancelled, data); g_object_unref(data->cancellable); } if(data->proxy) g_object_unref(data->proxy); g_slice_free(EjectData, data); } static void on_ejected(DBusGProxy *proxy, GError *error, gpointer user_data) { EjectData* data = (EjectData*)user_data; GSimpleAsyncResult* res; if(error) { error = g_udisks_error_to_gio_error(error); res = g_simple_async_result_new_from_error(G_OBJECT(data->drv), data->callback, data->user_data, error); g_error_free(error); } else { res = g_simple_async_result_new(G_OBJECT(data->drv), data->callback, data->user_data, NULL); g_simple_async_result_set_op_res_gboolean(res, TRUE); } finish_eject(res, data); } static void do_eject(EjectData* data) { data->proxy = g_udisks_device_get_proxy(data->drv->dev, data->drv->mon->con); data->call = org_freedesktop_UDisks_Device_drive_eject_async( data->proxy, NULL, on_ejected, data); } static void unmount_before_eject(EjectData* data); static void on_unmounted(GObject* mnt, GAsyncResult* res, gpointer input_data) { #define data ((EjectData*)input_data) GError* err = NULL; /* FIXME: with this approach, we could have racing condition. * Someone may mount other volumes before we finishing unmounting them all. */ gboolean success = g_mount_unmount_with_operation_finish(G_MOUNT(mnt), res, &err); if(success) { if(data->mounts) /* we still have some volumes on this drive mounted */ unmount_before_eject(data); else /* all unmounted, do the eject. */ do_eject(data); } else { GSimpleAsyncResult* res; GError* error = g_udisks_error_to_gio_error(err); g_error_free(err); res = g_simple_async_result_new_from_error(G_OBJECT(data->drv), data->callback, data->user_data, err); finish_eject(res, data); g_error_free(error); } #undef data } static void unmount_before_eject(EjectData* data) { GMount* mnt = G_MOUNT(data->mounts->data); data->mounts = g_list_delete_link(data->mounts, data->mounts); /* pop the first GMount in the list. */ g_mount_unmount_with_operation(mnt, data->flags, data->op, data->cancellable, on_unmounted, data); /* FIXME: Notify volume monitor!! */ g_object_unref(mnt); } static void on_eject_cancelled(GCancellable* cancellable, gpointer user_data) { EjectData* data = (EjectData*)user_data; /* cancel the dbus call if needed */ if(data->call) dbus_g_proxy_cancel_call(data->proxy, data->call); } static void g_udisks_drive_eject_with_operation (GDrive* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); GList* vols = g_udisks_drive_get_volumes(base); GList* mounts = NULL; EjectData* data; /* umount all volumes/mounts first */ if(vols) { GList* l; for(l = vols; l; l=l->next) { GVolume* vol = G_VOLUME(l->data); GMount* mnt = g_volume_get_mount(vol); if(mnt) mounts = g_list_prepend(mounts, mnt); g_object_unref(vol); } g_list_free(vols); } data = g_slice_new0(EjectData); data->drv = g_object_ref(drv); data->callback = callback; data->cancellable = cancellable ? g_object_ref(cancellable) : NULL; data->flags = flags; data->op = mount_operation ? g_object_ref(mount_operation) : NULL; data->user_data = user_data; if(cancellable) g_signal_connect(cancellable, "cancelled", G_CALLBACK(on_eject_cancelled), data); if(mounts) /* unmount all GMounts first, and do eject in ready callback */ { /* NOTE: is this really needed? * I read the source code of UDisks and found it calling "eject" * command internally. According to manpage of "eject", it unmounts * partitions before ejecting the device. So I don't think that we * need to unmount ourselves. However, without this, we won't have * correct "mount-pre-unmount" signals. So, let's do it. */ data->mounts = mounts; unmount_before_eject(data); } else /* no volume is mounted. it's safe to do eject directly. */ do_eject(data); } static gboolean g_udisks_drive_eject_with_operation_finish (GDrive* base, GAsyncResult* res, GError** error) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); return !g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(res), error); } static void g_udisks_drive_eject (GDrive* base, GMountUnmountFlags flags, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); g_udisks_drive_eject_with_operation(base, flags, NULL, cancellable, callback, user_data); } static gboolean g_udisks_drive_eject_finish (GDrive* base, GAsyncResult* res, GError** error) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); return g_udisks_drive_eject_with_operation_finish(base, res, error); } static char** g_udisks_drive_enumerate_identifiers (GDrive* base) { char** kinds = g_new0(char*, 4); kinds[0] = g_strdup(G_VOLUME_IDENTIFIER_KIND_LABEL); kinds[1] = g_strdup(G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); kinds[2] = g_strdup(G_VOLUME_IDENTIFIER_KIND_UUID); kinds[3] = NULL; return kinds; } static GIcon* g_udisks_drive_get_icon (GDrive* base) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); if(!drv->icon) { const char* icon_name = g_udisks_device_get_icon_name(drv->dev); drv->icon = g_themed_icon_new_with_default_fallbacks(icon_name); } return (GIcon*)g_object_ref(drv->icon); } static char* g_udisks_drive_get_identifier (GDrive* base, const char* kind) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); if(kind) { if(strcmp(kind, G_VOLUME_IDENTIFIER_KIND_LABEL) == 0) return g_strdup(drv->dev->label); else if(strcmp(kind, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE) == 0) return g_strdup(drv->dev->dev_file); else if(strcmp(kind, G_VOLUME_IDENTIFIER_KIND_UUID) == 0) return g_strdup(drv->dev->uuid); } return NULL; } static char* g_udisks_drive_get_name (GDrive* base) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return g_strdup(""); } static GDriveStartStopType g_udisks_drive_get_start_stop_type (GDrive* base) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return G_DRIVE_START_STOP_TYPE_UNKNOWN; } static gboolean g_udisks_drive_has_media (GDrive* base) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); return drv->dev->is_media_available; } static gboolean g_udisks_drive_has_volumes (GDrive* base) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); return FALSE; } static gboolean g_udisks_drive_is_media_check_automatic (GDrive* base) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* FIXME: is this correct? */ return drv->dev->is_media_change_notification_polling; } static gboolean g_udisks_drive_is_media_removable (GDrive* base) { GUDisksDrive* drv = G_UDISKS_DRIVE(base); return drv->dev->is_removable; } static void g_udisks_drive_poll_for_media (GDrive* base, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ } static gboolean g_udisks_drive_poll_for_media_finish (GDrive* base, GAsyncResult* res, GError** error) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); return FALSE; } static void g_udisks_drive_start (GDrive* base, GDriveStartFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ } static gboolean g_udisks_drive_start_finish (GDrive* base, GAsyncResult* res, GError** error) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return FALSE; } static void g_udisks_drive_stop (GDrive* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ } static gboolean g_udisks_drive_stop_finish (GDrive* base, GAsyncResult* res, GError** error) { //GUDisksDrive* drv = G_UDISKS_DRIVE(base); /* TODO */ return FALSE; } void g_udisks_drive_drive_iface_init (GDriveIface * iface) { iface->get_name = g_udisks_drive_get_name; iface->get_icon = g_udisks_drive_get_icon; iface->has_volumes = g_udisks_drive_has_volumes; iface->get_volumes = g_udisks_drive_get_volumes; iface->is_media_removable = g_udisks_drive_is_media_removable; iface->has_media = g_udisks_drive_has_media; iface->is_media_check_automatic = g_udisks_drive_is_media_check_automatic; iface->can_eject = g_udisks_drive_can_eject; iface->can_poll_for_media = g_udisks_drive_can_poll_for_media; iface->eject = g_udisks_drive_eject; iface->eject_finish = g_udisks_drive_eject_finish; iface->eject_with_operation = g_udisks_drive_eject_with_operation; iface->eject_with_operation_finish = g_udisks_drive_eject_with_operation_finish; iface->poll_for_media = g_udisks_drive_poll_for_media; iface->poll_for_media_finish = g_udisks_drive_poll_for_media_finish; iface->get_identifier = g_udisks_drive_get_identifier; iface->enumerate_identifiers = g_udisks_drive_enumerate_identifiers; iface->get_start_stop_type = g_udisks_drive_get_start_stop_type; iface->can_start = g_udisks_drive_can_start; iface->can_start_degraded = g_udisks_drive_can_start_degraded; iface->can_stop = g_udisks_drive_can_stop; iface->start = g_udisks_drive_start; iface->start_finish = g_udisks_drive_start_finish; iface->stop = g_udisks_drive_stop; iface->stop_finish = g_udisks_drive_stop_finish; sig_changed = g_signal_lookup("changed", G_TYPE_DRIVE); sig_disconnected = g_signal_lookup("disconnected", G_TYPE_DRIVE); sig_eject_button = g_signal_lookup("eject-button", G_TYPE_DRIVE); sig_stop_button = g_signal_lookup("stop-button", G_TYPE_DRIVE); } static void g_udisks_drive_finalize(GObject *object) { GUDisksDrive *self; g_return_if_fail(object != NULL); g_return_if_fail(G_IS_UDISKS_DRIVE(object)); self = G_UDISKS_DRIVE(object); if(self->dev) g_object_unref(self->dev); G_OBJECT_CLASS(g_udisks_drive_parent_class)->finalize(object); } static void g_udisks_drive_init(GUDisksDrive *self) { } GUDisksDrive *g_udisks_drive_new(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GUDisksDrive* drv = (GUDisksDrive*)g_object_new(G_TYPE_UDISKS_DRIVE, NULL); drv->dev = g_object_ref(dev); drv->mon = mon; return drv; } void g_udisks_drive_changed(GUDisksDrive* drv) { g_signal_emit(drv, sig_changed, 0); } void g_udisks_drive_disconnected(GUDisksDrive* drv) { g_signal_emit(drv, sig_disconnected, 0); } libfm-1.4.0/src/udisks/g-udisks-drive.h000066400000000000000000000044111475513661000177140ustar00rootroot00000000000000// g-udisks-drive.h // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __G_UDISKS_DRIVE_H__ #define __G_UDISKS_DRIVE_H__ #include #include "g-udisks-device.h" #include "g-udisks-volume-monitor.h" G_BEGIN_DECLS #define G_TYPE_UDISKS_DRIVE (g_udisks_drive_get_type()) #define G_UDISKS_DRIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ G_TYPE_UDISKS_DRIVE, GUDisksDrive)) #define G_UDISKS_DRIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ G_TYPE_UDISKS_DRIVE, GUDisksDriveClass)) #define G_IS_UDISKS_DRIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ G_TYPE_UDISKS_DRIVE)) #define G_IS_UDISKS_DRIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ G_TYPE_UDISKS_DRIVE)) #define G_UDISKS_DRIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ G_TYPE_UDISKS_DRIVE, GUDisksDriveClass)) typedef struct _GUDisksDrive GUDisksDrive; typedef struct _GUDisksDriveClass GUDisksDriveClass; struct _GUDisksDrive { GObject parent; GUDisksDevice* dev; GIcon* icon; char* name; GUDisksVolumeMonitor* mon; }; struct _GUDisksDriveClass { GObjectClass parent_class; }; GType g_udisks_drive_get_type(void); GUDisksDrive* g_udisks_drive_new(GUDisksVolumeMonitor* mon, GUDisksDevice* dev); void g_udisks_drive_changed(GUDisksDrive* drv); void g_udisks_drive_disconnected(GUDisksDrive* drv); G_END_DECLS #endif /* __G_UDISKS_DRIVE_H__ */ libfm-1.4.0/src/udisks/g-udisks-mount.c000066400000000000000000000313201475513661000177370ustar00rootroot00000000000000// g-udisks-mount.c // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifdef HAVE_CONFIG_H #include #endif #include "g-udisks-volume.h" #include "udisks-device.h" #include "dbus-utils.h" typedef struct { GUDisksMount* mnt; GAsyncReadyCallback callback; gpointer user_data; DBusGProxy* proxy; DBusGProxyCall* call; }AsyncData; static void g_udisks_mount_mount_iface_init(GMountIface *iface); static void g_udisks_mount_finalize (GObject *object); static void g_udisks_mount_unmount_with_operation (GMount* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data); G_DEFINE_TYPE_EXTENDED (GUDisksMount, g_udisks_mount, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE (G_TYPE_MOUNT, g_udisks_mount_mount_iface_init)) static void g_udisks_mount_class_init(GUDisksMountClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = g_udisks_mount_finalize; } static void g_udisks_mount_finalize(GObject *object) { GUDisksMount *self; g_return_if_fail(object != NULL); g_return_if_fail(G_IS_UDISKS_MOUNT(object)); self = G_UDISKS_MOUNT(object); if(self->root) g_object_unref(self->root); G_OBJECT_CLASS(g_udisks_mount_parent_class)->finalize(object); } static void g_udisks_mount_init(GUDisksMount *self) { } GUDisksMount *g_udisks_mount_new(GUDisksVolume* vol) { GUDisksMount* mnt = g_object_new(G_TYPE_UDISKS_MOUNT, NULL); /* we don't do g_object_ref here to prevent circular reference. */ mnt->vol = vol; return mnt; } static gboolean g_udisks_mount_can_eject (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return mnt->vol ? mnt->vol->dev->is_ejectable : FALSE; } static gboolean g_udisks_mount_can_unmount (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return mnt->vol ? mnt->vol->dev->is_mounted : FALSE; } typedef struct { GUDisksMount* mnt; GAsyncReadyCallback callback; gpointer user_data; }EjectData; static void on_drive_ejected(GObject* drive, GAsyncResult* res, gpointer user_data) { EjectData* data = (EjectData*)user_data; if(data->callback) data->callback(G_OBJECT(data->mnt), res, data->user_data); g_object_unref(data->mnt); g_slice_free(EjectData, data); } static void g_udisks_mount_eject_with_operation (GMount* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); GDrive* drv = g_mount_get_drive(base); if(drv) { EjectData* data = g_slice_new(EjectData); data->mnt = g_object_ref(mnt); data->callback = callback; data->user_data = user_data; g_drive_eject_with_operation(drv, flags, mount_operation, cancellable, on_drive_ejected, data); g_object_unref(drv); } } static gboolean g_udisks_mount_eject_with_operation_finish(GMount* base, GAsyncResult* res, GError** error) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return g_volume_eject_with_operation_finish(G_VOLUME(mnt->vol), res, error); } static void g_udisks_mount_eject (GMount* base, GMountUnmountFlags flags, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { //GUDisksMount* mnt = G_UDISKS_MOUNT(base); g_udisks_mount_eject_with_operation(base, flags, NULL, cancellable, callback, user_data); } static gboolean g_udisks_mount_eject_finish(GMount* base, GAsyncResult* res, GError** error) { //GUDisksMount* mnt = G_UDISKS_MOUNT(base); return g_udisks_mount_eject_with_operation_finish(base, res, error); } static GDrive* g_udisks_mount_get_drive (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return mnt->vol ? g_volume_get_drive(G_VOLUME(mnt->vol)) : NULL; } static GIcon* g_udisks_mount_get_icon (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return mnt->vol ? g_volume_get_icon(G_VOLUME(mnt->vol)) : NULL; } static char* g_udisks_mount_get_name (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return mnt->vol ? g_volume_get_name(G_VOLUME(mnt->vol)) : NULL; } static GFile* g_udisks_mount_get_root (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); if(!mnt->root && mnt->vol->dev->is_mounted && mnt->vol->dev->mount_paths) { /* TODO */ mnt->root = g_file_new_for_path(mnt->vol->dev->mount_paths[0]); } return mnt->root ? (GFile*)g_object_ref(mnt->root) : NULL; } static char* g_udisks_mount_get_uuid (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return mnt->vol ? g_volume_get_uuid(G_VOLUME(mnt->vol)) : NULL; } static GVolume* g_udisks_mount_get_volume (GMount* base) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); return (GVolume*)mnt->vol; } typedef struct { GUDisksMount* mnt; GAsyncReadyCallback callback; gpointer user_data; GFile* root; }GuessContentData; static char** g_udisks_mount_guess_content_type_finish (GMount* base, GAsyncResult* res, GError** error) { g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(res), error); return g_strdupv((char**)g_simple_async_result_get_op_res_gpointer(G_SIMPLE_ASYNC_RESULT(res))); } static void guess_content_data_free(gpointer user_data) { GuessContentData* data = (GuessContentData*)user_data; g_object_unref(data->mnt); if(data->root) g_object_unref(data->root); g_slice_free(GuessContentData, data); } static gboolean guess_content_job(GIOSchedulerJob *job, GCancellable* cancellable, gpointer user_data) { GuessContentData* data = (GuessContentData*)user_data; char** content_types; GSimpleAsyncResult* res; content_types = g_content_type_guess_for_tree(data->root); res = g_simple_async_result_new(G_OBJECT(data->mnt), data->callback, data->user_data, NULL); g_simple_async_result_set_op_res_gpointer(res, content_types, (GDestroyNotify)g_strfreev); g_simple_async_result_complete_in_idle(res); g_object_unref(res); return FALSE; } static void g_udisks_mount_guess_content_type (GMount* base, gboolean force_rescan, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); GFile* root = g_udisks_mount_get_root(base); g_debug("guess content type"); if(root) { /* FIXME: this is not really cancellable. */ GuessContentData* data = g_slice_new(GuessContentData); /* NOTE: this should be an asynchronous action, but * g_content_type_guess_for_tree provided by glib is not * cancellable. So, we got some problems here. * If we really want a perfect asynchronous implementation, * another option is using fork() to implement this. */ data->mnt = g_object_ref(mnt); data->root = root; data->callback = callback; data->user_data = user_data; g_io_scheduler_push_job(guess_content_job, data, guess_content_data_free, G_PRIORITY_DEFAULT, cancellable); } } static gchar** g_udisks_mount_guess_content_type_sync (GMount* base, gboolean force_rescan, GCancellable* cancellable, GError** error) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); if(mnt->root) { char** ret; GFile* root = g_udisks_mount_get_root(G_MOUNT(mnt)); ret = g_content_type_guess_for_tree(root); g_object_unref(root); return ret; } return NULL; } //static void g_udisks_mount_remount (GMount* base, GMountMountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) //{ // GUDisksMount* mnt = G_UDISKS_MOUNT(base); /* TODO */ //} static void unmount_callback(DBusGProxy *proxy, GError *error, gpointer user_data) { AsyncData* data = (AsyncData*)user_data; GSimpleAsyncResult* res; if(error) { error = g_udisks_error_to_gio_error(error); res = g_simple_async_result_new_from_error(G_OBJECT(data->mnt), data->callback, data->user_data, error); g_error_free(error); } else { res = g_simple_async_result_new(G_OBJECT(data->mnt), data->callback, data->user_data, NULL); g_simple_async_result_set_op_res_gboolean(res, TRUE); } g_simple_async_result_complete(res); g_object_unref(res); g_object_unref(data->mnt); g_object_unref(data->proxy); g_slice_free(AsyncData, data); } static void on_unmount_cancelled(GCancellable* cancellable, gpointer user_data) { AsyncData* data = (AsyncData*)user_data; dbus_g_proxy_cancel_call(data->proxy, data->call); } static void g_udisks_mount_unmount_with_operation (GMount* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { GUDisksMount* mnt = G_UDISKS_MOUNT(base); if(mnt->vol) { GUDisksDevice* dev = mnt->vol->dev; GUDisksVolumeMonitor* mon = mnt->vol->mon; AsyncData* data = g_slice_new(AsyncData); DBusGProxy* proxy = g_udisks_device_get_proxy(dev, mon->con); data->mnt = g_object_ref(mnt); data->callback = callback; data->user_data = user_data; data->proxy = proxy; g_signal_emit_by_name(mon, "mount-pre-unmount", mnt); g_signal_emit_by_name(mnt, "pre-unmount"); data->call = org_freedesktop_UDisks_Device_filesystem_unmount_async( proxy, NULL, unmount_callback, data); if(cancellable) g_signal_connect(cancellable, "cancelled", G_CALLBACK(on_unmount_cancelled), data); } } static gboolean g_udisks_mount_unmount_with_operation_finish(GMount* base, GAsyncResult* res, GError** error) { //GUDisksMount* mnt = G_UDISKS_MOUNT(base); return !g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(res), error); } static void g_udisks_mount_unmount (GMount* base, GMountUnmountFlags flags, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { g_udisks_mount_unmount_with_operation(base, flags, NULL, cancellable, callback, user_data); } static gboolean g_udisks_mount_unmount_finish(GMount* base, GAsyncResult* res, GError** error) { //GUDisksMount* mnt = G_UDISKS_MOUNT(base); return g_udisks_mount_unmount_with_operation_finish(base, res, error); } void g_udisks_mount_mount_iface_init(GMountIface *iface) { iface->get_root = g_udisks_mount_get_root; iface->get_name = g_udisks_mount_get_name; iface->get_icon = g_udisks_mount_get_icon; iface->get_uuid = g_udisks_mount_get_uuid; iface->get_drive = g_udisks_mount_get_drive; iface->get_volume = g_udisks_mount_get_volume; iface->can_unmount = g_udisks_mount_can_unmount; iface->can_eject = g_udisks_mount_can_eject; iface->unmount = g_udisks_mount_unmount; iface->unmount_finish = g_udisks_mount_unmount_finish; iface->unmount_with_operation = g_udisks_mount_unmount_with_operation; iface->unmount_with_operation_finish = g_udisks_mount_unmount_with_operation_finish; iface->eject = g_udisks_mount_eject; iface->eject_finish = g_udisks_mount_eject_finish; iface->eject_with_operation = g_udisks_mount_eject_with_operation; iface->eject_with_operation_finish = g_udisks_mount_eject_with_operation_finish; iface->guess_content_type = g_udisks_mount_guess_content_type; iface->guess_content_type_finish = g_udisks_mount_guess_content_type_finish; iface->guess_content_type_sync = g_udisks_mount_guess_content_type_sync; } libfm-1.4.0/src/udisks/g-udisks-mount.h000066400000000000000000000041501475513661000177450ustar00rootroot00000000000000// g-udisks-mount.h // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __G_UDISKS_MOUNT_H__ #define __G_UDISKS_MOUNT_H__ #include G_BEGIN_DECLS #define G_TYPE_UDISKS_MOUNT (g_udisks_mount_get_type()) #define G_UDISKS_MOUNT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ G_TYPE_UDISKS_MOUNT, GUDisksMount)) #define G_UDISKS_MOUNT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ G_TYPE_UDISKS_MOUNT, GUDisksMountClass)) #define G_IS_UDISKS_MOUNT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ G_TYPE_UDISKS_MOUNT)) #define G_IS_UDISKS_MOUNT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ G_TYPE_UDISKS_MOUNT)) #define G_UDISKS_MOUNT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ G_TYPE_UDISKS_MOUNT, GUDisksMountClass)) typedef struct _GUDisksMount GUDisksMount; typedef struct _GUDisksMountClass GUDisksMountClass; typedef struct _GUDisksMountPrivate GUDisksMountPrivate; struct _GUDisksMount { GObject parent; struct _GUDisksVolume* vol; GFile* root; }; struct _GUDisksMountClass { GObjectClass parent_class; }; GType g_udisks_mount_get_type(void); GUDisksMount* g_udisks_mount_new(struct _GUDisksVolume* vol); G_END_DECLS #endif /* __G_UDISKS_MOUNT_H__ */ libfm-1.4.0/src/udisks/g-udisks-volume-monitor.c000066400000000000000000000456631475513661000216100ustar00rootroot00000000000000/* * g-udisks-volume-monitor.c * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "dbus-utils.h" #include "udisks.h" #include "g-udisks-volume-monitor.h" #include "g-udisks-device.h" #include "g-udisks-drive.h" #include "g-udisks-volume.h" /* FIXME: later we need to remove this when gio-udisks becomes an * independent gio module. */ #include "fm-config.h" static guint sig_drive_changed; static guint sig_drive_connected; static guint sig_drive_disconnected; static guint sig_drive_eject_button; static guint sig_mount_added; static guint sig_mount_changed; static guint sig_mount_premount; static guint sig_mount_removed; static guint sig_volume_added; static guint sig_volume_changed; static guint sig_volume_removed; static void g_udisks_device_added(GUDisksDevice* dev, GUDisksVolumeMonitor* mon); static void g_udisks_device_changed(GUDisksDevice* dev, GUDisksVolumeMonitor* mon); static void g_udisks_device_removed(GUDisksDevice* dev, GUDisksVolumeMonitor* mon); typedef void (*GUDisksDeviceEventHandler)(GUDisksDevice*, GUDisksVolumeMonitor*); typedef struct { GUDisksDevice* dev; GUDisksDeviceEventHandler func; }QueuedEvent; static void g_udisks_volume_monitor_finalize (GObject *object); static GMount* get_mount_for_mount_path(const char *mount_path, GCancellable *cancellable); static gboolean is_supported(void); static GList* get_connected_drives(GVolumeMonitor *mon); static GList* get_volumes(GVolumeMonitor *mon); static GList* get_mounts(GVolumeMonitor *mon); static GVolume *get_volume_for_uuid(GVolumeMonitor *mon, const char *uuid); static GMount *get_mount_for_uuid(GVolumeMonitor *mon, const char *uuid); static void drive_eject_button(GVolumeMonitor *mon, GDrive *drive); static void add_device(GUDisksVolumeMonitor* mon, DBusGProxy* proxy, const char* obj_path, gboolean emit_signal); static void on_device_added(DBusGProxy* proxy, const char* obj_path, gpointer user_data); static void on_device_removed(DBusGProxy* proxy, const char* obj_path, gpointer user_data); static void on_device_changed(DBusGProxy* proxy, const char* obj_path, gpointer user_data); static GList* find_device_l(GUDisksVolumeMonitor* mon, const char* obj_path); static GList* find_drive_l(GUDisksVolumeMonitor* mon, GUDisksDevice* dev); static GList* find_volume_l(GUDisksVolumeMonitor* mon, GUDisksDevice* dev); static inline GUDisksDevice* find_device(GUDisksVolumeMonitor* mon, const char* obj_path) { GList* l = find_device_l(mon, obj_path); return l ? G_UDISKS_DEVICE(l->data) : NULL; } static inline GUDisksDrive* find_drive(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GList* l = find_drive_l(mon, dev); return l ? G_UDISKS_DRIVE(l->data) : NULL; } static inline GUDisksVolume* find_volume(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GList* l = find_volume_l(mon, dev); return l ? G_UDISKS_VOLUME(l->data) : NULL; } G_DEFINE_TYPE(GUDisksVolumeMonitor, g_udisks_volume_monitor, G_TYPE_NATIVE_VOLUME_MONITOR); static void g_udisks_volume_monitor_class_init(GUDisksVolumeMonitorClass *klass) { GObjectClass *g_object_class = G_OBJECT_CLASS(klass); GNativeVolumeMonitorClass *parent_class = G_NATIVE_VOLUME_MONITOR_CLASS(klass); GVolumeMonitorClass *monitor_class = G_VOLUME_MONITOR_CLASS (klass); g_object_class->finalize = g_udisks_volume_monitor_finalize; parent_class->get_mount_for_mount_path = get_mount_for_mount_path; monitor_class->get_mounts = get_mounts; monitor_class->get_volumes = get_volumes; monitor_class->get_connected_drives = get_connected_drives; monitor_class->get_volume_for_uuid = get_volume_for_uuid; monitor_class->get_mount_for_uuid = get_mount_for_uuid; monitor_class->is_supported = is_supported; monitor_class->drive_eject_button = drive_eject_button; sig_drive_changed = g_signal_lookup("drive-changed", G_TYPE_VOLUME_MONITOR); sig_drive_connected = g_signal_lookup("drive-connected", G_TYPE_VOLUME_MONITOR); sig_drive_disconnected = g_signal_lookup("drive-disconnected", G_TYPE_VOLUME_MONITOR); sig_drive_eject_button = g_signal_lookup("drive-eject-button", G_TYPE_VOLUME_MONITOR); sig_mount_added = g_signal_lookup("mount-added", G_TYPE_VOLUME_MONITOR); sig_mount_changed = g_signal_lookup("mount-changed", G_TYPE_VOLUME_MONITOR); sig_mount_premount = g_signal_lookup("mount-premount", G_TYPE_VOLUME_MONITOR); sig_mount_removed = g_signal_lookup("mount-removed", G_TYPE_VOLUME_MONITOR); sig_volume_added = g_signal_lookup("volume-added", G_TYPE_VOLUME_MONITOR); sig_volume_changed = g_signal_lookup("volume-changed", G_TYPE_VOLUME_MONITOR); sig_volume_removed = g_signal_lookup("volume-removed", G_TYPE_VOLUME_MONITOR); } static void g_udisks_volume_monitor_finalize(GObject *object) { GUDisksVolumeMonitor *self; g_return_if_fail(object != NULL); g_return_if_fail(G_IS_UDISKS_VOLUME_MONITOR(object)); self = G_UDISKS_VOLUME_MONITOR(object); if(self->idle_handler) { GList* l; g_source_remove(self->idle_handler); for(l = self->queued_events; l; l=l->next) { QueuedEvent* q = (QueuedEvent*)l->data; g_object_unref(q->dev); g_slice_free(QueuedEvent, q); } g_list_free(self->queued_events); } if(self->udisks_proxy) { dbus_g_proxy_disconnect_signal(self->udisks_proxy, "DeviceAdded", G_CALLBACK(on_device_added), self); dbus_g_proxy_disconnect_signal(self->udisks_proxy, "DeviceRemoved", G_CALLBACK(on_device_removed), self); dbus_g_proxy_disconnect_signal(self->udisks_proxy, "DeviceChanged", G_CALLBACK(on_device_changed), self); g_object_unref(self->udisks_proxy); } if(self->devices) { g_list_foreach(self->devices, (GFunc)g_object_unref, NULL); g_list_free(self->devices); } if(self->drives) { g_list_foreach(self->drives, (GFunc)g_object_unref, NULL); g_list_free(self->drives); } if(self->volumes) { g_list_foreach(self->volumes, (GFunc)g_object_unref, NULL); g_list_free(self->volumes); } G_OBJECT_CLASS(g_udisks_volume_monitor_parent_class)->finalize(object); } static void update_volume_drive(GUDisksVolume* vol, GUDisksVolumeMonitor* mon) { /* set association between drive and volumes here */ GUDisksDevice* dev; if(vol->dev->is_drive) /* it's a drive itself (cdrom is an example) */ dev = vol->dev; else if(vol->dev->partition_slave) dev = find_device(mon, vol->dev->partition_slave); else dev = NULL; /* no ref_count handling is needed. volume manager owns all the objects. */ if(dev) { GUDisksDrive* drv = find_drive(mon, dev); vol->drive = drv; } else vol->drive = NULL; } static void g_udisks_volume_monitor_init(GUDisksVolumeMonitor *self) { self->con = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); if(self->con) { GPtrArray* ret; /* FIXME: handle disconnecting from dbus */ self->udisks_proxy = dbus_g_proxy_new_for_name(self->con, "org.freedesktop.UDisks", "/org/freedesktop/UDisks", "org.freedesktop.UDisks"); if(org_freedesktop_UDisks_enumerate_devices(self->udisks_proxy, &ret, NULL)) { guint i; char** paths = (char**)ret->pdata; for(i=0; ilen;++i) add_device(self, self->udisks_proxy, paths[i], FALSE); g_ptr_array_free(ret, TRUE); } dbus_g_proxy_add_signal(self->udisks_proxy, "DeviceAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_add_signal(self->udisks_proxy, "DeviceRemoved", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_add_signal(self->udisks_proxy, "DeviceChanged", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); dbus_g_proxy_connect_signal(self->udisks_proxy, "DeviceAdded", G_CALLBACK(on_device_added), self, NULL); dbus_g_proxy_connect_signal(self->udisks_proxy, "DeviceRemoved", G_CALLBACK(on_device_removed), self, NULL); dbus_g_proxy_connect_signal(self->udisks_proxy, "DeviceChanged", G_CALLBACK(on_device_changed), self, NULL); /* find drives for volumes */ if(self->volumes && self->drives) g_list_foreach(self->volumes, (GFunc)update_volume_drive, self); } } GNativeVolumeMonitor *g_udisks_volume_monitor_new(void) { return g_object_new(G_UDISKS_VOLUME_MONITOR_TYPE, NULL); } GMount* get_mount_for_mount_path(const char *mount_path, GCancellable *cancellable) { /* TODO */ return NULL; } gboolean is_supported(void) { return TRUE; } GList* get_connected_drives(GVolumeMonitor *mon) { GUDisksVolumeMonitor* umon = G_UDISKS_VOLUME_MONITOR(mon); GList* drvs = g_list_copy(umon->drives); g_list_foreach(drvs, (GFunc)g_object_ref, NULL); return drvs; } GList* get_volumes(GVolumeMonitor *mon) { GUDisksVolumeMonitor* umon = G_UDISKS_VOLUME_MONITOR(mon); GList* vols = g_list_copy(umon->volumes); g_list_foreach(vols, (GFunc)g_object_ref, NULL); return vols; } GList* get_mounts(GVolumeMonitor *mon) { GUDisksVolumeMonitor* umon = G_UDISKS_VOLUME_MONITOR(mon); GList* l; GList* mnts = NULL; for(l = umon->volumes; l; l=l->next) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); if(vol->mount) mnts = g_list_prepend(mnts, g_object_ref(vol->mount)); } return mnts; } GVolume *get_volume_for_uuid(GVolumeMonitor *mon, const char *uuid) { GUDisksVolumeMonitor* umon = G_UDISKS_VOLUME_MONITOR(mon); GList* l; for(l = umon->volumes; l; l=l->next) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); if(g_strcmp0(vol->dev->uuid, uuid) == 0) return (GVolume*)g_object_ref(vol); } return NULL; } GMount *get_mount_for_uuid(GVolumeMonitor *mon, const char *uuid) { GUDisksVolumeMonitor* umon = G_UDISKS_VOLUME_MONITOR(mon); GList* l; for(l = umon->volumes; l; l=l->next) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); if(g_strcmp0(vol->dev->uuid, uuid) == 0) return g_volume_get_mount(G_VOLUME(vol)); } return NULL; } /* signal added in 2.17 */ void drive_eject_button(GVolumeMonitor *mon, GDrive *drive) { /* TODO */ //GUDisksVolumeMonitor* umon = G_UDISKS_VOLUME_MONITOR(mon); } GList* find_device_l(GUDisksVolumeMonitor* mon, const char* obj_path) { GList* l; for(l = mon->devices; l; l=l->next) { GUDisksDevice* dev = G_UDISKS_DEVICE(l->data); if(g_strcmp0(dev->obj_path, obj_path) == 0) return l; } return NULL; } GList* find_drive_l(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GList* l; for(l = mon->drives; l; l=l->next) { GUDisksDrive* drv = G_UDISKS_DRIVE(l->data); if(G_UNLIKELY(drv->dev == dev)) return l; } return NULL; } GList* find_volume_l(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GList* l; for(l = mon->volumes; l; l=l->next) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); if(G_UNLIKELY(vol->dev == dev)) return l; } return NULL; } static void add_drive(GUDisksVolumeMonitor* mon, GUDisksDevice* dev, gboolean emit_signal) { if(!find_drive(mon, dev)) { GUDisksDrive* drv = g_udisks_drive_new(mon, dev); mon->drives = g_list_prepend(mon->drives, drv); if(emit_signal) g_signal_emit(mon, sig_drive_connected, 0, drv); } } static void add_volume(GUDisksVolumeMonitor* mon, GUDisksDevice* dev, gboolean emit_signal) { if(!find_volume(mon, dev)) { GUDisksVolume* vol = g_udisks_volume_new(mon, dev); mon->volumes = g_list_prepend(mon->volumes, vol); if(emit_signal) g_signal_emit(mon, sig_volume_added, 0, vol); } } static void remove_drive(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GList* l = find_drive_l(mon, dev); if(l) { GUDisksDrive* drv = G_UDISKS_DRIVE(l->data); mon->drives = g_list_delete_link(mon->drives, l); g_signal_emit(mon, sig_drive_disconnected, 0, drv); g_udisks_drive_disconnected(drv); drv->mon = NULL; for(l = mon->volumes; l; l=l->next) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); if(vol->drive == drv) { vol->drive = NULL; /* FIXME: emit sigal for volume change */ } } g_object_unref(drv); } } static void remove_volume(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GList* l = find_volume_l(mon, dev); if(l) { GUDisksVolume* vol = G_UDISKS_VOLUME(l->data); mon->volumes = g_list_delete_link(mon->volumes, l); g_signal_emit(mon, sig_volume_removed, 0, vol); g_udisks_volume_removed(vol); vol->mon = NULL; vol->drive = NULL; g_object_unref(vol); } } static void _g_udisks_device_added(GUDisksDevice* dev, GUDisksVolumeMonitor* mon, gboolean emit_signal) { /* FIXME: how should we treat sys internal devices? * make this optional */ if(!dev->is_hidden && (!dev->is_sys_internal || fm_config->show_internal_volumes) ) { if(dev->is_drive) add_drive(mon, dev, emit_signal); if(g_udisks_device_is_volume(dev)) add_volume(mon, dev, emit_signal); } } static void g_udisks_device_added(GUDisksDevice* dev, GUDisksVolumeMonitor* mon) { g_debug("g_udisks_device_added"); _g_udisks_device_added(dev, mon, TRUE); } static void g_udisks_device_changed(GUDisksDevice* dev, GUDisksVolumeMonitor* mon) { GUDisksDrive* drv = find_drive(mon, dev); GUDisksVolume* vol = find_volume(mon, dev); /* gboolean is_drive = dev->is_drive; char* usage = g_strdup(dev->usage); */ g_debug("g_udisks_device_changed"); if(drv) { g_signal_emit(mon, sig_drive_changed, 0, drv); g_udisks_drive_changed(drv); /* it's no longer a drive */ if(!dev->is_drive) remove_drive(mon, dev); } else { if(dev->is_drive) add_drive(mon, dev, TRUE); } if(vol) { update_volume_drive(vol, mon); g_signal_emit(mon, sig_volume_changed, 0, vol); g_udisks_volume_changed(vol); /* it's no longer a volume */ if(!g_udisks_device_is_volume(dev)) remove_volume(mon, dev); } else { /* we got a usable volume now */ if(g_udisks_device_is_volume(dev)) add_volume(mon, dev, TRUE); } } static void g_udisks_device_removed(GUDisksDevice* dev, GUDisksVolumeMonitor* mon) { g_debug("g_udisks_device_removed"); if(dev->is_drive) remove_drive(mon, dev); remove_volume(mon, dev); } static gboolean on_idle(GUDisksVolumeMonitor* mon) { GList* l; g_debug("on_idle: %d", g_list_length(mon->queued_events)); for(l = mon->queued_events; l; l=l->next) { QueuedEvent* q = (QueuedEvent*)l->data; q->func(q->dev, mon); g_object_unref(q->dev); g_slice_free(QueuedEvent, q); } g_list_free(mon->queued_events); mon->queued_events = NULL; mon->idle_handler = 0; return FALSE; } static void g_udisks_device_queue_event(GUDisksDevice* dev, GUDisksDeviceEventHandler func, GUDisksVolumeMonitor* mon) { QueuedEvent* q = g_slice_new(QueuedEvent); q->dev = g_object_ref(dev); q->func = func; mon->queued_events = g_list_append(mon->queued_events, q); if(0 == mon->idle_handler) mon->idle_handler = g_idle_add_full(G_PRIORITY_HIGH, (GSourceFunc)on_idle, mon, NULL); } static void add_device(GUDisksVolumeMonitor* mon, DBusGProxy* proxy, const char* obj_path, gboolean emit_signal) { if(!find_device(mon, obj_path)) { DBusGProxy *dev_proxy = dbus_g_proxy_new_for_name(mon->con, "org.freedesktop.UDisks", obj_path, "org.freedesktop.DBus.Properties"); GError* err = NULL; GHashTable* props = dbus_get_all_props(dev_proxy, "org.freedesktop.UDisks.Device", &err); if(props) { GUDisksDevice* dev = g_udisks_device_new(obj_path, props); g_hash_table_destroy(props); mon->devices = g_list_prepend(mon->devices, dev); if(emit_signal) g_udisks_device_queue_event(dev, g_udisks_device_added, mon); else _g_udisks_device_added(dev, mon, FALSE); } else { g_debug("%s", err->message); g_error_free(err); } g_object_unref(dev_proxy); } g_debug("device_added: %s", obj_path); } void on_device_added(DBusGProxy* proxy, const char* obj_path, gpointer user_data) { GUDisksVolumeMonitor* mon = G_UDISKS_VOLUME_MONITOR(user_data); add_device(mon, proxy, obj_path, TRUE); } void on_device_removed(DBusGProxy* proxy, const char* obj_path, gpointer user_data) { GUDisksVolumeMonitor* mon = G_UDISKS_VOLUME_MONITOR(user_data); GList* l; l = find_device_l(mon, obj_path); if(l) { GUDisksDevice* dev = G_UDISKS_DEVICE(l->data); mon->devices = g_list_delete_link(mon->devices, l); g_udisks_device_queue_event(dev, g_udisks_device_removed, mon); g_object_unref(dev); } g_debug("device_removed: %s", obj_path); } void on_device_changed(DBusGProxy* proxy, const char* obj_path, gpointer user_data) { GUDisksVolumeMonitor* mon = G_UDISKS_VOLUME_MONITOR(user_data); GUDisksDevice* dev = find_device(mon, obj_path); if(dev) { DBusGProxy *dev_proxy = dbus_g_proxy_new_for_name(mon->con, "org.freedesktop.UDisks", obj_path, "org.freedesktop.DBus.Properties"); GError* err = NULL; GHashTable* props = dbus_get_all_props(dev_proxy, "org.freedesktop.UDisks.Device", &err); if(props) { g_udisks_device_update(dev, props); g_hash_table_destroy(props); g_udisks_device_queue_event(dev, g_udisks_device_changed, mon); } g_object_unref(dev_proxy); } g_debug("device_changed: %s", obj_path); } libfm-1.4.0/src/udisks/g-udisks-volume-monitor.h000066400000000000000000000044241475513661000216030ustar00rootroot00000000000000/* * g-udisks-volume-monitor.h * * Copyright 2010 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __G_UDISKS_VOLUME_MONITOR_H__ #define __G_UDISKS_VOLUME_MONITOR_H__ #include #include G_BEGIN_DECLS #define G_UDISKS_VOLUME_MONITOR_TYPE (g_udisks_volume_monitor_get_type()) #define G_UDISKS_VOLUME_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ G_UDISKS_VOLUME_MONITOR_TYPE, GUDisksVolumeMonitor)) #define G_UDISKS_VOLUME_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ G_UDISKS_VOLUME_MONITOR_TYPE, GUDisksVolumeMonitorClass)) #define G_IS_UDISKS_VOLUME_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ G_UDISKS_VOLUME_MONITOR_TYPE)) #define G_IS_UDISKS_VOLUME_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ G_UDISKS_VOLUME_MONITOR_TYPE)) typedef struct _GUDisksVolumeMonitor GUDisksVolumeMonitor; typedef struct _GUDisksVolumeMonitorClass GUDisksVolumeMonitorClass; struct _GUDisksVolumeMonitor { GNativeVolumeMonitor parent; DBusGConnection* con; DBusGProxy* udisks_proxy; GList* devices; GList* drives; GList* volumes; guint idle_handler; GList* queued_events; }; struct _GUDisksVolumeMonitorClass { GNativeVolumeMonitorClass parent_class; }; GType g_udisks_volume_monitor_get_type (void); GNativeVolumeMonitor* g_udisks_volume_monitor_new (void); G_END_DECLS #endif /* __G_UDISKS_VOLUME_MONITOR_H__ */ libfm-1.4.0/src/udisks/g-udisks-volume.c000066400000000000000000000331001475513661000201020ustar00rootroot00000000000000// g-udisks-volume.c // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifdef HAVE_CONFIG_H #include #endif #include "g-udisks-volume.h" #include #include #include "udisks.h" #include "udisks-device.h" #include "g-udisks-mount.h" #include "dbus-utils.h" typedef struct { GUDisksVolume* vol; GAsyncReadyCallback callback; gpointer user_data; DBusGProxy* proxy; DBusGProxyCall* call; GCancellable* cancellable; }AsyncData; static guint sig_changed; static guint sig_removed; static void g_udisks_volume_volume_iface_init (GVolumeIface * iface); static void g_udisks_volume_finalize (GObject *object); static void g_udisks_volume_eject_with_operation (GVolume* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data); // static gboolean g_udisks_volume_eject_co (UdisksVolumeEjectData* data); // static gboolean g_udisks_volume_eject_with_operation_co (UdisksVolumeEjectWithOperationData* data); G_DEFINE_TYPE_EXTENDED (GUDisksVolume, g_udisks_volume, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE (G_TYPE_VOLUME, g_udisks_volume_volume_iface_init)) static void g_udisks_volume_class_init(GUDisksVolumeClass *klass) { GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS(klass); g_object_class->finalize = g_udisks_volume_finalize; } static void g_udisks_volume_clear(GUDisksVolume* vol) { if(vol->mount) { g_object_unref(vol->mount); vol->mount = NULL; } if(vol->icon) { g_object_unref(vol->icon); vol->icon = NULL; } if(vol->name) { g_free(vol->name); vol->name = NULL; } } static void g_udisks_volume_finalize(GObject *object) { GUDisksVolume *self; g_return_if_fail(object != NULL); g_return_if_fail(G_IS_UDISKS_VOLUME(object)); self = G_UDISKS_VOLUME(object); if(self->dev) g_object_unref(self->dev); g_udisks_volume_clear(self); G_OBJECT_CLASS(g_udisks_volume_parent_class)->finalize(object); } static void g_udisks_volume_init(GUDisksVolume *self) { } GUDisksVolume *g_udisks_volume_new(GUDisksVolumeMonitor* mon, GUDisksDevice* dev) { GUDisksVolume* vol = (GUDisksVolume*)g_object_new(G_TYPE_UDISKS_VOLUME, NULL); vol->dev = g_object_ref(dev); vol->mon = mon; return vol; } static gboolean g_udisks_volume_can_eject (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); return vol->dev->is_ejectable; } static gboolean g_udisks_volume_can_mount (GVolume* base) { /* FIXME, is this correct? */ GUDisksVolume* vol = G_UDISKS_VOLUME(base); return !vol->dev->is_mounted; } static void g_udisks_volume_eject (GVolume* base, GMountUnmountFlags flags, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { //GUDisksVolume* vol = G_UDISKS_VOLUME(base); g_udisks_volume_eject_with_operation(base, flags, NULL, cancellable, callback, user_data); } typedef struct { GUDisksVolume* vol; GAsyncReadyCallback callback; gpointer user_data; }EjectData; static void on_drive_ejected(GObject* drive, GAsyncResult* res, gpointer user_data) { EjectData* data = (EjectData*)user_data; if(data->callback) data->callback(G_OBJECT(data->vol), res, data->user_data); g_object_unref(data->vol); g_slice_free(EjectData, data); } static void g_udisks_volume_eject_with_operation (GVolume* base, GMountUnmountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer user_data) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); if(vol->drive && g_drive_can_eject(G_DRIVE(vol->drive))) { EjectData* data = g_slice_new(EjectData); data->vol = g_object_ref(vol); data->callback = callback; data->user_data = user_data; g_drive_eject_with_operation(G_DRIVE(vol->drive), flags, mount_operation, cancellable, on_drive_ejected, data); } } static char** g_udisks_volume_enumerate_identifiers (GVolume* base) { //GUDisksVolume* vol = G_UDISKS_VOLUME(base); char** kinds = g_new0(char*, 4); kinds[0] = g_strdup(G_VOLUME_IDENTIFIER_KIND_LABEL); kinds[1] = g_strdup(G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); kinds[2] = g_strdup(G_VOLUME_IDENTIFIER_KIND_UUID); kinds[3] = NULL; return kinds; } static GFile* g_udisks_volume_get_activation_root (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); /* FIXME: is this corrcet? */ return vol->mount ? g_mount_get_root((GMount*)vol->mount) : NULL; } static GDrive* g_udisks_volume_get_drive (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); return vol->drive ? (GDrive*)g_object_ref(vol->drive) : NULL; } static GIcon* g_udisks_volume_get_icon (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); if(!vol->icon) { const char* icon_name = g_udisks_device_get_icon_name(vol->dev); vol->icon = g_themed_icon_new_with_default_fallbacks(icon_name); } return (GIcon*)g_object_ref(vol->icon); } static char* g_udisks_volume_get_identifier (GVolume* base, const char* kind) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); if(kind) { if(strcmp(kind, G_VOLUME_IDENTIFIER_KIND_LABEL) == 0) return g_strdup(vol->dev->label); else if(strcmp(kind, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE) == 0) return g_strdup(vol->dev->dev_file); else if(strcmp(kind, G_VOLUME_IDENTIFIER_KIND_UUID) == 0) return g_strdup(vol->dev->uuid); } return NULL; } static GMount* g_udisks_volume_get_mount (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); if(vol->dev->is_mounted && !vol->mount) { /* FIXME: will this work? */ vol->mount = g_udisks_mount_new(vol); } return vol->mount ? (GMount*)g_object_ref(vol->mount) : NULL; } static char* g_udisks_volume_get_name (GVolume* base) { /* TODO */ GUDisksVolume* vol = G_UDISKS_VOLUME(base); if(!vol->name) { GUDisksDevice* dev = vol->dev; /* build a human readable name */ /* FIXME: find a better way to build a nicer volume name */ if(dev->label && *dev->label) vol->name = g_strdup(dev->label); /* else if(vol->dev->partition_size > 0) { char* size_str = g_format_size_for_display(vol->dev->partition_size); vol->name = g_strdup_printf("%s Filesystem", size_str); g_free(size_str); } */ else if(dev->is_optic_disc) vol->name = g_strdup(g_udisks_device_get_disc_name(dev)); else if(dev->dev_file_presentation && *dev->dev_file_presentation) vol->name = g_path_get_basename(dev->dev_file_presentation); else if(dev->dev_file && *dev->dev_file) vol->name = g_path_get_basename(vol->dev->dev_file); else vol->name = g_path_get_basename(vol->dev->obj_path); } return g_strdup(vol->name); } static char* g_udisks_volume_get_uuid (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); return g_strdup(vol->dev->uuid); } static void on_mount_cancelled(GCancellable* cancellable, gpointer user_data) { AsyncData* data = (AsyncData*)user_data; dbus_g_proxy_cancel_call(data->proxy, data->call); } static void mount_callback(DBusGProxy *proxy, char * OUT_mount_path, GError *error, gpointer user_data) { AsyncData* data = (AsyncData*)user_data; GSimpleAsyncResult* res; g_debug("mount callback!!"); if(error) { error = g_udisks_error_to_gio_error(error); res = g_simple_async_result_new_from_error(G_OBJECT(data->vol), data->callback, data->user_data, error); g_error_free(error); } else { res = g_simple_async_result_new(G_OBJECT(data->vol), data->callback, data->user_data, NULL); g_simple_async_result_set_op_res_gboolean(res, TRUE); /* FIXME: ensure we have working mount paths to generate GMount object. */ if(data->vol->dev->mount_paths) { char** p = data->vol->dev->mount_paths; for(; *p; ++p) if(strcmp(*p, OUT_mount_path) == 0) break; if(!*p) /* OUT_mount_path is not in mount_paths */ { int len = g_strv_length(data->vol->dev->mount_paths); data->vol->dev->mount_paths = g_realloc(data->vol->dev->mount_paths, + 2); memcpy(data->vol->dev->mount_paths, data->vol->dev->mount_paths + sizeof(char*), len * sizeof(char*)); data->vol->dev->mount_paths[0] = g_strdup(OUT_mount_path); } } else { data->vol->dev->mount_paths = g_new0(char*, 2); data->vol->dev->mount_paths[0] = g_strdup(OUT_mount_path); data->vol->dev->mount_paths[1] = NULL; } } g_simple_async_result_complete(res); g_object_unref(res); if(data->cancellable) { g_signal_handlers_disconnect_by_func(data->cancellable, on_mount_cancelled, data); g_object_unref(data->cancellable); } g_object_unref(data->vol); g_object_unref(data->proxy); g_slice_free(AsyncData, data); } static void g_udisks_volume_mount_fn(GVolume* base, GMountMountFlags flags, GMountOperation* mount_operation, GCancellable* cancellable, GAsyncReadyCallback callback, void* user_data) { /* FIXME: need to make sure this works correctly */ GUDisksVolume* vol = G_UDISKS_VOLUME(base); GUDisksDevice* dev = vol->dev; GUDisksVolumeMonitor* mon = vol->mon; AsyncData* data = g_slice_new(AsyncData); DBusGProxy* proxy = g_udisks_device_get_proxy(dev, mon->con); data->vol = g_object_ref(vol); data->callback = callback; data->user_data = user_data; data->proxy = proxy; g_debug("mount_fn"); data->call = org_freedesktop_UDisks_Device_filesystem_mount_async( proxy, dev->type ? dev->type : "auto", NULL, mount_callback, data); if(cancellable) { data->cancellable = g_object_ref(cancellable); g_signal_connect(cancellable, "cancelled", G_CALLBACK(on_mount_cancelled), data); } } static gboolean g_udisks_volume_mount_finish(GVolume* base, GAsyncResult* res, GError** error) { //GUDisksVolume* vol = G_UDISKS_VOLUME(base); return !g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(res), error); } static gboolean g_udisks_volume_should_automount (GVolume* base) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); return vol->dev->auto_mount; } static gboolean g_udisks_volume_eject_with_operation_finish (GVolume* base, GAsyncResult* res, GError** error) { GUDisksVolume* vol = G_UDISKS_VOLUME(base); /* FIXME: is this correct? */ return g_drive_eject_with_operation_finish(G_DRIVE(vol->drive), res, error); } static gboolean g_udisks_volume_eject_finish (GVolume* base, GAsyncResult* res, GError** error) { //GUDisksVolume* vol = G_UDISKS_VOLUME(base); return g_udisks_volume_eject_with_operation_finish(base, res, error); } static void g_udisks_volume_volume_iface_init (GVolumeIface * iface) { // g_udisks_volume_parent_iface = g_type_interface_peek_parent (iface); iface->can_eject = g_udisks_volume_can_eject; iface->can_mount = g_udisks_volume_can_mount; iface->eject = g_udisks_volume_eject; iface->eject_finish = g_udisks_volume_eject_finish; iface->eject_with_operation = g_udisks_volume_eject_with_operation; iface->eject_with_operation_finish = g_udisks_volume_eject_with_operation_finish; iface->enumerate_identifiers = g_udisks_volume_enumerate_identifiers; iface->get_activation_root = g_udisks_volume_get_activation_root; iface->get_drive = g_udisks_volume_get_drive; iface->get_icon = g_udisks_volume_get_icon; iface->get_identifier = g_udisks_volume_get_identifier; iface->get_mount = g_udisks_volume_get_mount; iface->get_name = g_udisks_volume_get_name; iface->get_uuid = g_udisks_volume_get_uuid; iface->mount_fn = g_udisks_volume_mount_fn; iface->mount_finish = g_udisks_volume_mount_finish; iface->should_automount = g_udisks_volume_should_automount; sig_changed = g_signal_lookup("changed", G_TYPE_VOLUME); sig_removed = g_signal_lookup("removed", G_TYPE_VOLUME); } void g_udisks_volume_changed(GUDisksVolume* vol) { g_udisks_volume_clear(vol); g_signal_emit(vol, sig_changed, 0); } void g_udisks_volume_removed(GUDisksVolume* vol) { vol->drive = NULL; g_signal_emit(vol, sig_removed, 0); } libfm-1.4.0/src/udisks/g-udisks-volume.h000066400000000000000000000046161475513661000201210ustar00rootroot00000000000000// g-udisks-volume.h // // Copyright 2010 Hong Jen Yee (PCMan) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA. #ifndef __G_UDISKS_VOLUME_H__ #define __G_UDISKS_VOLUME_H__ #include #include "g-udisks-device.h" #include "g-udisks-drive.h" #include "g-udisks-mount.h" #include "g-udisks-volume-monitor.h" G_BEGIN_DECLS #define G_TYPE_UDISKS_VOLUME (g_udisks_volume_get_type()) #define G_UDISKS_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\ G_TYPE_UDISKS_VOLUME, GUDisksVolume)) #define G_UDISKS_VOLUME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\ G_TYPE_UDISKS_VOLUME, GUDisksVolumeClass)) #define G_IS_UDISKS_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ G_TYPE_UDISKS_VOLUME)) #define G_IS_UDISKS_VOLUME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\ G_TYPE_UDISKS_VOLUME)) #define G_UDISKS_VOLUME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\ G_TYPE_UDISKS_VOLUME, GUDisksVolumeClass)) typedef struct _GUDisksVolume GUDisksVolume; typedef struct _GUDisksVolumeClass GUDisksVolumeClass; struct _GUDisksVolume { GObject parent; GUDisksDevice* dev; GIcon* icon; char* name; GUDisksDrive* drive; GUDisksMount* mount; GUDisksVolumeMonitor* mon; }; struct _GUDisksVolumeClass { GObjectClass parent_class; }; GType g_udisks_volume_get_type(void); GUDisksVolume* g_udisks_volume_new(GUDisksVolumeMonitor* mon, GUDisksDevice* dev); void g_udisks_volume_changed(GUDisksVolume* vol); void g_udisks_volume_removed(GUDisksVolume* vol); G_END_DECLS #endif /* __G_UDISKS_VOLUME_H__ */ libfm-1.4.0/src/udisks/gen-binding000077500000000000000000000003501475513661000170130ustar00rootroot00000000000000#!/bin/sh dbus-binding-tool --mode=glib-client /usr/share/dbus-1/interfaces/org.freedesktop.UDisks.xml > udisks.h dbus-binding-tool --mode=glib-client /usr/share/dbus-1/interfaces/org.freedesktop.UDisks.Device.xml > udisks-device.h libfm-1.4.0/src/udisks/udisks-device.h000066400000000000000000001344501475513661000176250ustar00rootroot00000000000000/* Generated by dbus-binding-tool; do not edit! */ #include #include G_BEGIN_DECLS #ifndef _DBUS_GLIB_ASYNC_DATA_FREE #define _DBUS_GLIB_ASYNC_DATA_FREE static #ifdef G_HAVE_INLINE inline #endif void _dbus_glib_async_data_free (gpointer stuff) { g_slice_free (DBusGAsyncData, stuff); } #endif #ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_UDisks_Device #define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_UDisks_Device static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_job_cancel (DBusGProxy *proxy, GError **error) { return dbus_g_proxy_call (proxy, "JobCancel", error, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_job_cancel_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_job_cancel_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_job_cancel_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_job_cancel_async (DBusGProxy *proxy, org_freedesktop_UDisks_Device_job_cancel_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "JobCancel", org_freedesktop_UDisks_Device_job_cancel_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_partition_table_create (DBusGProxy *proxy, const char * IN_scheme, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "PartitionTableCreate", error, G_TYPE_STRING, IN_scheme, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_partition_table_create_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_partition_table_create_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_partition_table_create_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_partition_table_create_async (DBusGProxy *proxy, const char * IN_scheme, const char ** IN_options, org_freedesktop_UDisks_Device_partition_table_create_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "PartitionTableCreate", org_freedesktop_UDisks_Device_partition_table_create_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_scheme, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_partition_delete (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "PartitionDelete", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_partition_delete_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_partition_delete_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_partition_delete_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_partition_delete_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_partition_delete_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "PartitionDelete", org_freedesktop_UDisks_Device_partition_delete_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_partition_create (DBusGProxy *proxy, const guint64 IN_offset, const guint64 IN_size, const char * IN_type, const char * IN_label, const char ** IN_flags, const char ** IN_options, const char * IN_fstype, const char ** IN_fsoptions, char** OUT_created_device, GError **error) { return dbus_g_proxy_call (proxy, "PartitionCreate", error, G_TYPE_UINT64, IN_offset, G_TYPE_UINT64, IN_size, G_TYPE_STRING, IN_type, G_TYPE_STRING, IN_label, G_TYPE_STRV, IN_flags, G_TYPE_STRV, IN_options, G_TYPE_STRING, IN_fstype, G_TYPE_STRV, IN_fsoptions, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_created_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_partition_create_reply) (DBusGProxy *proxy, char *OUT_created_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_partition_create_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_created_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_created_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_partition_create_reply)data->cb) (proxy, OUT_created_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_partition_create_async (DBusGProxy *proxy, const guint64 IN_offset, const guint64 IN_size, const char * IN_type, const char * IN_label, const char ** IN_flags, const char ** IN_options, const char * IN_fstype, const char ** IN_fsoptions, org_freedesktop_UDisks_Device_partition_create_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "PartitionCreate", org_freedesktop_UDisks_Device_partition_create_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_UINT64, IN_offset, G_TYPE_UINT64, IN_size, G_TYPE_STRING, IN_type, G_TYPE_STRING, IN_label, G_TYPE_STRV, IN_flags, G_TYPE_STRV, IN_options, G_TYPE_STRING, IN_fstype, G_TYPE_STRV, IN_fsoptions, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_partition_modify (DBusGProxy *proxy, const char * IN_type, const char * IN_label, const char ** IN_flags, GError **error) { return dbus_g_proxy_call (proxy, "PartitionModify", error, G_TYPE_STRING, IN_type, G_TYPE_STRING, IN_label, G_TYPE_STRV, IN_flags, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_partition_modify_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_partition_modify_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_partition_modify_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_partition_modify_async (DBusGProxy *proxy, const char * IN_type, const char * IN_label, const char ** IN_flags, org_freedesktop_UDisks_Device_partition_modify_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "PartitionModify", org_freedesktop_UDisks_Device_partition_modify_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_type, G_TYPE_STRING, IN_label, G_TYPE_STRV, IN_flags, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_filesystem_create (DBusGProxy *proxy, const char * IN_fstype, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "FilesystemCreate", error, G_TYPE_STRING, IN_fstype, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_filesystem_create_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_filesystem_create_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_filesystem_create_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_filesystem_create_async (DBusGProxy *proxy, const char * IN_fstype, const char ** IN_options, org_freedesktop_UDisks_Device_filesystem_create_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FilesystemCreate", org_freedesktop_UDisks_Device_filesystem_create_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_fstype, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_filesystem_set_label (DBusGProxy *proxy, const char * IN_new_label, GError **error) { return dbus_g_proxy_call (proxy, "FilesystemSetLabel", error, G_TYPE_STRING, IN_new_label, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_filesystem_set_label_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_filesystem_set_label_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_filesystem_set_label_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_filesystem_set_label_async (DBusGProxy *proxy, const char * IN_new_label, org_freedesktop_UDisks_Device_filesystem_set_label_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FilesystemSetLabel", org_freedesktop_UDisks_Device_filesystem_set_label_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_new_label, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_filesystem_mount (DBusGProxy *proxy, const char * IN_filesystem_type, const char ** IN_options, char ** OUT_mount_path, GError **error) { return dbus_g_proxy_call (proxy, "FilesystemMount", error, G_TYPE_STRING, IN_filesystem_type, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_STRING, OUT_mount_path, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_filesystem_mount_reply) (DBusGProxy *proxy, char * OUT_mount_path, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_filesystem_mount_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char * OUT_mount_path; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_mount_path, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_filesystem_mount_reply)data->cb) (proxy, OUT_mount_path, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_filesystem_mount_async (DBusGProxy *proxy, const char * IN_filesystem_type, const char ** IN_options, org_freedesktop_UDisks_Device_filesystem_mount_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FilesystemMount", org_freedesktop_UDisks_Device_filesystem_mount_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_filesystem_type, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_filesystem_unmount (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "FilesystemUnmount", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_filesystem_unmount_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_filesystem_unmount_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_filesystem_unmount_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_filesystem_unmount_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_filesystem_unmount_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FilesystemUnmount", org_freedesktop_UDisks_Device_filesystem_unmount_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_filesystem_check (DBusGProxy *proxy, const char ** IN_options, gboolean* OUT_is_clean, GError **error) { return dbus_g_proxy_call (proxy, "FilesystemCheck", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_BOOLEAN, OUT_is_clean, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_filesystem_check_reply) (DBusGProxy *proxy, gboolean OUT_is_clean, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_filesystem_check_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; gboolean OUT_is_clean; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_BOOLEAN, &OUT_is_clean, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_filesystem_check_reply)data->cb) (proxy, OUT_is_clean, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_filesystem_check_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_filesystem_check_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FilesystemCheck", org_freedesktop_UDisks_Device_filesystem_check_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_filesystem_list_open_files (DBusGProxy *proxy, GPtrArray** OUT_processes, GError **error) { return dbus_g_proxy_call (proxy, "FilesystemListOpenFiles", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID)), OUT_processes, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_filesystem_list_open_files_reply) (DBusGProxy *proxy, GPtrArray *OUT_processes, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_filesystem_list_open_files_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; GPtrArray* OUT_processes; dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID)), &OUT_processes, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_filesystem_list_open_files_reply)data->cb) (proxy, OUT_processes, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_filesystem_list_open_files_async (DBusGProxy *proxy, org_freedesktop_UDisks_Device_filesystem_list_open_files_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FilesystemListOpenFiles", org_freedesktop_UDisks_Device_filesystem_list_open_files_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_luks_unlock (DBusGProxy *proxy, const char * IN_passphrase, const char ** IN_options, char** OUT_cleartext_device, GError **error) { return dbus_g_proxy_call (proxy, "LuksUnlock", error, G_TYPE_STRING, IN_passphrase, G_TYPE_STRV, IN_options, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_cleartext_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_luks_unlock_reply) (DBusGProxy *proxy, char *OUT_cleartext_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_luks_unlock_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_cleartext_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_cleartext_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_luks_unlock_reply)data->cb) (proxy, OUT_cleartext_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_luks_unlock_async (DBusGProxy *proxy, const char * IN_passphrase, const char ** IN_options, org_freedesktop_UDisks_Device_luks_unlock_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LuksUnlock", org_freedesktop_UDisks_Device_luks_unlock_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_passphrase, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_luks_lock (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LuksLock", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_luks_lock_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_luks_lock_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_luks_lock_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_luks_lock_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_luks_lock_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LuksLock", org_freedesktop_UDisks_Device_luks_lock_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_luks_change_passphrase (DBusGProxy *proxy, const char * IN_current_passphrase, const char * IN_new_passphrase, GError **error) { return dbus_g_proxy_call (proxy, "LuksChangePassphrase", error, G_TYPE_STRING, IN_current_passphrase, G_TYPE_STRING, IN_new_passphrase, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_luks_change_passphrase_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_luks_change_passphrase_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_luks_change_passphrase_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_luks_change_passphrase_async (DBusGProxy *proxy, const char * IN_current_passphrase, const char * IN_new_passphrase, org_freedesktop_UDisks_Device_luks_change_passphrase_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LuksChangePassphrase", org_freedesktop_UDisks_Device_luks_change_passphrase_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_current_passphrase, G_TYPE_STRING, IN_new_passphrase, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_linux_md_add_spare (DBusGProxy *proxy, const char* IN_component, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdAddSpare", error, DBUS_TYPE_G_OBJECT_PATH, IN_component, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_linux_md_add_spare_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_linux_md_add_spare_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_linux_md_add_spare_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_linux_md_add_spare_async (DBusGProxy *proxy, const char* IN_component, const char ** IN_options, org_freedesktop_UDisks_Device_linux_md_add_spare_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdAddSpare", org_freedesktop_UDisks_Device_linux_md_add_spare_async_callback, stuff, _dbus_glib_async_data_free, DBUS_TYPE_G_OBJECT_PATH, IN_component, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_linux_md_expand (DBusGProxy *proxy, const GPtrArray* IN_components, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdExpand", error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), IN_components, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_linux_md_expand_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_linux_md_expand_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_linux_md_expand_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_linux_md_expand_async (DBusGProxy *proxy, const GPtrArray* IN_components, const char ** IN_options, org_freedesktop_UDisks_Device_linux_md_expand_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdExpand", org_freedesktop_UDisks_Device_linux_md_expand_async_callback, stuff, _dbus_glib_async_data_free, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), IN_components, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_linux_md_remove_component (DBusGProxy *proxy, const char* IN_component, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdRemoveComponent", error, DBUS_TYPE_G_OBJECT_PATH, IN_component, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_linux_md_remove_component_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_linux_md_remove_component_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_linux_md_remove_component_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_linux_md_remove_component_async (DBusGProxy *proxy, const char* IN_component, const char ** IN_options, org_freedesktop_UDisks_Device_linux_md_remove_component_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdRemoveComponent", org_freedesktop_UDisks_Device_linux_md_remove_component_async_callback, stuff, _dbus_glib_async_data_free, DBUS_TYPE_G_OBJECT_PATH, IN_component, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_linux_md_stop (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdStop", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_linux_md_stop_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_linux_md_stop_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_linux_md_stop_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_linux_md_stop_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_linux_md_stop_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdStop", org_freedesktop_UDisks_Device_linux_md_stop_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_linux_lvm2_lv_stop (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2LVStop", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_linux_lvm2_lv_stop_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_linux_lvm2_lv_stop_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_linux_lvm2_lv_stop_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_linux_lvm2_lv_stop_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_linux_lvm2_lv_stop_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2LVStop", org_freedesktop_UDisks_Device_linux_lvm2_lv_stop_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_linux_md_check (DBusGProxy *proxy, const char ** IN_options, guint64* OUT_number_of_errors, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdCheck", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_UINT64, OUT_number_of_errors, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_linux_md_check_reply) (DBusGProxy *proxy, guint64 OUT_number_of_errors, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_linux_md_check_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; guint64 OUT_number_of_errors; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_UINT64, &OUT_number_of_errors, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_linux_md_check_reply)data->cb) (proxy, OUT_number_of_errors, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_linux_md_check_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_linux_md_check_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdCheck", org_freedesktop_UDisks_Device_linux_md_check_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_inhibit_polling (DBusGProxy *proxy, const char ** IN_options, char ** OUT_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveInhibitPolling", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_STRING, OUT_cookie, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_inhibit_polling_reply) (DBusGProxy *proxy, char * OUT_cookie, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_inhibit_polling_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char * OUT_cookie; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_cookie, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_inhibit_polling_reply)data->cb) (proxy, OUT_cookie, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_inhibit_polling_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_drive_inhibit_polling_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveInhibitPolling", org_freedesktop_UDisks_Device_drive_inhibit_polling_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_uninhibit_polling (DBusGProxy *proxy, const char * IN_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveUninhibitPolling", error, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_uninhibit_polling_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_uninhibit_polling_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_uninhibit_polling_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_uninhibit_polling_async (DBusGProxy *proxy, const char * IN_cookie, org_freedesktop_UDisks_Device_drive_uninhibit_polling_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveUninhibitPolling", org_freedesktop_UDisks_Device_drive_uninhibit_polling_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_poll_media (DBusGProxy *proxy, GError **error) { return dbus_g_proxy_call (proxy, "DrivePollMedia", error, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_poll_media_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_poll_media_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_poll_media_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_poll_media_async (DBusGProxy *proxy, org_freedesktop_UDisks_Device_drive_poll_media_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DrivePollMedia", org_freedesktop_UDisks_Device_drive_poll_media_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_eject (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "DriveEject", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_eject_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_eject_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_eject_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_eject_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_drive_eject_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveEject", org_freedesktop_UDisks_Device_drive_eject_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_detach (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "DriveDetach", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_detach_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_detach_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_detach_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_detach_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_drive_detach_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveDetach", org_freedesktop_UDisks_Device_drive_detach_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_set_spindown_timeout (DBusGProxy *proxy, const gint IN_timeout_seconds, const char ** IN_options, char ** OUT_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveSetSpindownTimeout", error, G_TYPE_INT, IN_timeout_seconds, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_STRING, OUT_cookie, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_set_spindown_timeout_reply) (DBusGProxy *proxy, char * OUT_cookie, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_set_spindown_timeout_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char * OUT_cookie; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_cookie, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_set_spindown_timeout_reply)data->cb) (proxy, OUT_cookie, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_set_spindown_timeout_async (DBusGProxy *proxy, const gint IN_timeout_seconds, const char ** IN_options, org_freedesktop_UDisks_Device_drive_set_spindown_timeout_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveSetSpindownTimeout", org_freedesktop_UDisks_Device_drive_set_spindown_timeout_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT, IN_timeout_seconds, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_unset_spindown_timeout (DBusGProxy *proxy, const char * IN_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveUnsetSpindownTimeout", error, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_unset_spindown_timeout_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_unset_spindown_timeout_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_unset_spindown_timeout_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_unset_spindown_timeout_async (DBusGProxy *proxy, const char * IN_cookie, org_freedesktop_UDisks_Device_drive_unset_spindown_timeout_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveUnsetSpindownTimeout", org_freedesktop_UDisks_Device_drive_unset_spindown_timeout_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data (DBusGProxy *proxy, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "DriveAtaSmartRefreshData", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveAtaSmartRefreshData", org_freedesktop_UDisks_Device_drive_ata_smart_refresh_data_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest (DBusGProxy *proxy, const char * IN_test, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "DriveAtaSmartInitiateSelftest", error, G_TYPE_STRING, IN_test, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest_async (DBusGProxy *proxy, const char * IN_test, const char ** IN_options, org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveAtaSmartInitiateSelftest", org_freedesktop_UDisks_Device_drive_ata_smart_initiate_selftest_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_test, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_Device_drive_benchmark (DBusGProxy *proxy, const gboolean IN_do_write_benchmark, const char ** IN_options, GPtrArray** OUT_read_transfer_rate_results, GPtrArray** OUT_write_transfer_rate_results, GPtrArray** OUT_access_time_results, GError **error) { return dbus_g_proxy_call (proxy, "DriveBenchmark", error, G_TYPE_BOOLEAN, IN_do_write_benchmark, G_TYPE_STRV, IN_options, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT64, G_TYPE_DOUBLE, G_TYPE_INVALID)), OUT_read_transfer_rate_results, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT64, G_TYPE_DOUBLE, G_TYPE_INVALID)), OUT_write_transfer_rate_results, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT64, G_TYPE_DOUBLE, G_TYPE_INVALID)), OUT_access_time_results, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_Device_drive_benchmark_reply) (DBusGProxy *proxy, GPtrArray *OUT_read_transfer_rate_results, GPtrArray *OUT_write_transfer_rate_results, GPtrArray *OUT_access_time_results, GError *error, gpointer userdata); static void org_freedesktop_UDisks_Device_drive_benchmark_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; GPtrArray* OUT_read_transfer_rate_results; GPtrArray* OUT_write_transfer_rate_results; GPtrArray* OUT_access_time_results; dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT64, G_TYPE_DOUBLE, G_TYPE_INVALID)), &OUT_read_transfer_rate_results, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT64, G_TYPE_DOUBLE, G_TYPE_INVALID)), &OUT_write_transfer_rate_results, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT64, G_TYPE_DOUBLE, G_TYPE_INVALID)), &OUT_access_time_results, G_TYPE_INVALID); (*(org_freedesktop_UDisks_Device_drive_benchmark_reply)data->cb) (proxy, OUT_read_transfer_rate_results, OUT_write_transfer_rate_results, OUT_access_time_results, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_Device_drive_benchmark_async (DBusGProxy *proxy, const gboolean IN_do_write_benchmark, const char ** IN_options, org_freedesktop_UDisks_Device_drive_benchmark_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveBenchmark", org_freedesktop_UDisks_Device_drive_benchmark_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_BOOLEAN, IN_do_write_benchmark, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } #endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_UDisks_Device */ G_END_DECLS libfm-1.4.0/src/udisks/udisks.h000066400000000000000000001123661475513661000163720ustar00rootroot00000000000000/* Generated by dbus-binding-tool; do not edit! */ #include #include G_BEGIN_DECLS #ifndef _DBUS_GLIB_ASYNC_DATA_FREE #define _DBUS_GLIB_ASYNC_DATA_FREE static #ifdef G_HAVE_INLINE inline #endif void _dbus_glib_async_data_free (gpointer stuff) { g_slice_free (DBusGAsyncData, stuff); } #endif #ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_UDisks #define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_UDisks static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_enumerate_adapters (DBusGProxy *proxy, GPtrArray** OUT_devices, GError **error) { return dbus_g_proxy_call (proxy, "EnumerateAdapters", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), OUT_devices, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_enumerate_adapters_reply) (DBusGProxy *proxy, GPtrArray *OUT_devices, GError *error, gpointer userdata); static void org_freedesktop_UDisks_enumerate_adapters_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; GPtrArray* OUT_devices; dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &OUT_devices, G_TYPE_INVALID); (*(org_freedesktop_UDisks_enumerate_adapters_reply)data->cb) (proxy, OUT_devices, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_enumerate_adapters_async (DBusGProxy *proxy, org_freedesktop_UDisks_enumerate_adapters_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "EnumerateAdapters", org_freedesktop_UDisks_enumerate_adapters_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_enumerate_expanders (DBusGProxy *proxy, GPtrArray** OUT_devices, GError **error) { return dbus_g_proxy_call (proxy, "EnumerateExpanders", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), OUT_devices, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_enumerate_expanders_reply) (DBusGProxy *proxy, GPtrArray *OUT_devices, GError *error, gpointer userdata); static void org_freedesktop_UDisks_enumerate_expanders_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; GPtrArray* OUT_devices; dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &OUT_devices, G_TYPE_INVALID); (*(org_freedesktop_UDisks_enumerate_expanders_reply)data->cb) (proxy, OUT_devices, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_enumerate_expanders_async (DBusGProxy *proxy, org_freedesktop_UDisks_enumerate_expanders_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "EnumerateExpanders", org_freedesktop_UDisks_enumerate_expanders_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_enumerate_ports (DBusGProxy *proxy, GPtrArray** OUT_devices, GError **error) { return dbus_g_proxy_call (proxy, "EnumeratePorts", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), OUT_devices, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_enumerate_ports_reply) (DBusGProxy *proxy, GPtrArray *OUT_devices, GError *error, gpointer userdata); static void org_freedesktop_UDisks_enumerate_ports_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; GPtrArray* OUT_devices; dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &OUT_devices, G_TYPE_INVALID); (*(org_freedesktop_UDisks_enumerate_ports_reply)data->cb) (proxy, OUT_devices, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_enumerate_ports_async (DBusGProxy *proxy, org_freedesktop_UDisks_enumerate_ports_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "EnumeratePorts", org_freedesktop_UDisks_enumerate_ports_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_enumerate_devices (DBusGProxy *proxy, GPtrArray** OUT_devices, GError **error) { return dbus_g_proxy_call (proxy, "EnumerateDevices", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), OUT_devices, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_enumerate_devices_reply) (DBusGProxy *proxy, GPtrArray *OUT_devices, GError *error, gpointer userdata); static void org_freedesktop_UDisks_enumerate_devices_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; GPtrArray* OUT_devices; dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &OUT_devices, G_TYPE_INVALID); (*(org_freedesktop_UDisks_enumerate_devices_reply)data->cb) (proxy, OUT_devices, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_enumerate_devices_async (DBusGProxy *proxy, org_freedesktop_UDisks_enumerate_devices_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "EnumerateDevices", org_freedesktop_UDisks_enumerate_devices_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_enumerate_device_files (DBusGProxy *proxy, char *** OUT_device_files, GError **error) { return dbus_g_proxy_call (proxy, "EnumerateDeviceFiles", error, G_TYPE_INVALID, G_TYPE_STRV, OUT_device_files, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_enumerate_device_files_reply) (DBusGProxy *proxy, char * *OUT_device_files, GError *error, gpointer userdata); static void org_freedesktop_UDisks_enumerate_device_files_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char ** OUT_device_files; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRV, &OUT_device_files, G_TYPE_INVALID); (*(org_freedesktop_UDisks_enumerate_device_files_reply)data->cb) (proxy, OUT_device_files, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_enumerate_device_files_async (DBusGProxy *proxy, org_freedesktop_UDisks_enumerate_device_files_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "EnumerateDeviceFiles", org_freedesktop_UDisks_enumerate_device_files_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_find_device_by_device_file (DBusGProxy *proxy, const char * IN_device_file, char** OUT_device, GError **error) { return dbus_g_proxy_call (proxy, "FindDeviceByDeviceFile", error, G_TYPE_STRING, IN_device_file, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_find_device_by_device_file_reply) (DBusGProxy *proxy, char *OUT_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_find_device_by_device_file_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_find_device_by_device_file_reply)data->cb) (proxy, OUT_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_find_device_by_device_file_async (DBusGProxy *proxy, const char * IN_device_file, org_freedesktop_UDisks_find_device_by_device_file_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FindDeviceByDeviceFile", org_freedesktop_UDisks_find_device_by_device_file_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_device_file, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_find_device_by_major_minor (DBusGProxy *proxy, const gint64 IN_device_major, const gint64 IN_device_minor, char** OUT_device, GError **error) { return dbus_g_proxy_call (proxy, "FindDeviceByMajorMinor", error, G_TYPE_INT64, IN_device_major, G_TYPE_INT64, IN_device_minor, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_find_device_by_major_minor_reply) (DBusGProxy *proxy, char *OUT_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_find_device_by_major_minor_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_find_device_by_major_minor_reply)data->cb) (proxy, OUT_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_find_device_by_major_minor_async (DBusGProxy *proxy, const gint64 IN_device_major, const gint64 IN_device_minor, org_freedesktop_UDisks_find_device_by_major_minor_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "FindDeviceByMajorMinor", org_freedesktop_UDisks_find_device_by_major_minor_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT64, IN_device_major, G_TYPE_INT64, IN_device_minor, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_drive_inhibit_all_polling (DBusGProxy *proxy, const char ** IN_options, char ** OUT_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveInhibitAllPolling", error, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_STRING, OUT_cookie, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_drive_inhibit_all_polling_reply) (DBusGProxy *proxy, char * OUT_cookie, GError *error, gpointer userdata); static void org_freedesktop_UDisks_drive_inhibit_all_polling_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char * OUT_cookie; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_cookie, G_TYPE_INVALID); (*(org_freedesktop_UDisks_drive_inhibit_all_polling_reply)data->cb) (proxy, OUT_cookie, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_drive_inhibit_all_polling_async (DBusGProxy *proxy, const char ** IN_options, org_freedesktop_UDisks_drive_inhibit_all_polling_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveInhibitAllPolling", org_freedesktop_UDisks_drive_inhibit_all_polling_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_drive_uninhibit_all_polling (DBusGProxy *proxy, const char * IN_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveUninhibitAllPolling", error, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_drive_uninhibit_all_polling_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_drive_uninhibit_all_polling_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_drive_uninhibit_all_polling_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_drive_uninhibit_all_polling_async (DBusGProxy *proxy, const char * IN_cookie, org_freedesktop_UDisks_drive_uninhibit_all_polling_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveUninhibitAllPolling", org_freedesktop_UDisks_drive_uninhibit_all_polling_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_drive_set_all_spindown_timeouts (DBusGProxy *proxy, const gint IN_timeout_seconds, const char ** IN_options, char ** OUT_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveSetAllSpindownTimeouts", error, G_TYPE_INT, IN_timeout_seconds, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_STRING, OUT_cookie, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_drive_set_all_spindown_timeouts_reply) (DBusGProxy *proxy, char * OUT_cookie, GError *error, gpointer userdata); static void org_freedesktop_UDisks_drive_set_all_spindown_timeouts_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char * OUT_cookie; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_cookie, G_TYPE_INVALID); (*(org_freedesktop_UDisks_drive_set_all_spindown_timeouts_reply)data->cb) (proxy, OUT_cookie, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_drive_set_all_spindown_timeouts_async (DBusGProxy *proxy, const gint IN_timeout_seconds, const char ** IN_options, org_freedesktop_UDisks_drive_set_all_spindown_timeouts_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveSetAllSpindownTimeouts", org_freedesktop_UDisks_drive_set_all_spindown_timeouts_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT, IN_timeout_seconds, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_drive_unset_all_spindown_timeouts (DBusGProxy *proxy, const char * IN_cookie, GError **error) { return dbus_g_proxy_call (proxy, "DriveUnsetAllSpindownTimeouts", error, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_drive_unset_all_spindown_timeouts_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_drive_unset_all_spindown_timeouts_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_drive_unset_all_spindown_timeouts_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_drive_unset_all_spindown_timeouts_async (DBusGProxy *proxy, const char * IN_cookie, org_freedesktop_UDisks_drive_unset_all_spindown_timeouts_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "DriveUnsetAllSpindownTimeouts", org_freedesktop_UDisks_drive_unset_all_spindown_timeouts_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_vg_start (DBusGProxy *proxy, const char * IN_uuid, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2VGStart", error, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_vg_start_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_vg_start_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_vg_start_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_vg_start_async (DBusGProxy *proxy, const char * IN_uuid, const char ** IN_options, org_freedesktop_UDisks_linux_lvm2_vg_start_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2VGStart", org_freedesktop_UDisks_linux_lvm2_vg_start_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_vg_stop (DBusGProxy *proxy, const char * IN_uuid, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2VGStop", error, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_vg_stop_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_vg_stop_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_vg_stop_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_vg_stop_async (DBusGProxy *proxy, const char * IN_uuid, const char ** IN_options, org_freedesktop_UDisks_linux_lvm2_vg_stop_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2VGStop", org_freedesktop_UDisks_linux_lvm2_vg_stop_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_vg_set_name (DBusGProxy *proxy, const char * IN_uuid, const char * IN_name, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2VGSetName", error, G_TYPE_STRING, IN_uuid, G_TYPE_STRING, IN_name, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_vg_set_name_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_vg_set_name_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_vg_set_name_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_vg_set_name_async (DBusGProxy *proxy, const char * IN_uuid, const char * IN_name, org_freedesktop_UDisks_linux_lvm2_vg_set_name_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2VGSetName", org_freedesktop_UDisks_linux_lvm2_vg_set_name_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_uuid, G_TYPE_STRING, IN_name, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_vg_add_pv (DBusGProxy *proxy, const char * IN_uuid, const char* IN_physical_volume, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2VGAddPV", error, G_TYPE_STRING, IN_uuid, DBUS_TYPE_G_OBJECT_PATH, IN_physical_volume, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_vg_add_pv_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_vg_add_pv_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_vg_add_pv_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_vg_add_pv_async (DBusGProxy *proxy, const char * IN_uuid, const char* IN_physical_volume, const char ** IN_options, org_freedesktop_UDisks_linux_lvm2_vg_add_pv_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2VGAddPV", org_freedesktop_UDisks_linux_lvm2_vg_add_pv_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_uuid, DBUS_TYPE_G_OBJECT_PATH, IN_physical_volume, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_vg_remove_pv (DBusGProxy *proxy, const char * IN_vg_uuid, const char * IN_pv_uuid, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2VGRemovePV", error, G_TYPE_STRING, IN_vg_uuid, G_TYPE_STRING, IN_pv_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_vg_remove_pv_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_vg_remove_pv_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_vg_remove_pv_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_vg_remove_pv_async (DBusGProxy *proxy, const char * IN_vg_uuid, const char * IN_pv_uuid, const char ** IN_options, org_freedesktop_UDisks_linux_lvm2_vg_remove_pv_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2VGRemovePV", org_freedesktop_UDisks_linux_lvm2_vg_remove_pv_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_vg_uuid, G_TYPE_STRING, IN_pv_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_lv_set_name (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_uuid, const char * IN_name, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2LVSetName", error, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_uuid, G_TYPE_STRING, IN_name, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_lv_set_name_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_lv_set_name_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_lv_set_name_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_lv_set_name_async (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_uuid, const char * IN_name, org_freedesktop_UDisks_linux_lvm2_lv_set_name_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2LVSetName", org_freedesktop_UDisks_linux_lvm2_lv_set_name_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_uuid, G_TYPE_STRING, IN_name, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_lv_start (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_uuid, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2LVStart", error, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_lv_start_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_lv_start_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_lv_start_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_lv_start_async (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_uuid, const char ** IN_options, org_freedesktop_UDisks_linux_lvm2_lv_start_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2LVStart", org_freedesktop_UDisks_linux_lvm2_lv_start_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_lv_remove (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_uuid, const char ** IN_options, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2LVRemove", error, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_lv_remove_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_lv_remove_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_lv_remove_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_lv_remove_async (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_uuid, const char ** IN_options, org_freedesktop_UDisks_linux_lvm2_lv_remove_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2LVRemove", org_freedesktop_UDisks_linux_lvm2_lv_remove_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_uuid, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_lvm2_lv_create (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_name, const guint64 IN_size, const guint IN_num_stripes, const guint64 IN_stripe_size, const guint IN_num_mirrors, const char ** IN_options, const char * IN_fstype, const char ** IN_fsoptions, char** OUT_created_device, GError **error) { return dbus_g_proxy_call (proxy, "LinuxLvm2LVCreate", error, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_name, G_TYPE_UINT64, IN_size, G_TYPE_UINT, IN_num_stripes, G_TYPE_UINT64, IN_stripe_size, G_TYPE_UINT, IN_num_mirrors, G_TYPE_STRV, IN_options, G_TYPE_STRING, IN_fstype, G_TYPE_STRV, IN_fsoptions, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_created_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_lvm2_lv_create_reply) (DBusGProxy *proxy, char *OUT_created_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_lvm2_lv_create_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_created_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_created_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_lvm2_lv_create_reply)data->cb) (proxy, OUT_created_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_lvm2_lv_create_async (DBusGProxy *proxy, const char * IN_group_uuid, const char * IN_name, const guint64 IN_size, const guint IN_num_stripes, const guint64 IN_stripe_size, const guint IN_num_mirrors, const char ** IN_options, const char * IN_fstype, const char ** IN_fsoptions, org_freedesktop_UDisks_linux_lvm2_lv_create_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxLvm2LVCreate", org_freedesktop_UDisks_linux_lvm2_lv_create_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_group_uuid, G_TYPE_STRING, IN_name, G_TYPE_UINT64, IN_size, G_TYPE_UINT, IN_num_stripes, G_TYPE_UINT64, IN_stripe_size, G_TYPE_UINT, IN_num_mirrors, G_TYPE_STRV, IN_options, G_TYPE_STRING, IN_fstype, G_TYPE_STRV, IN_fsoptions, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_md_start (DBusGProxy *proxy, const GPtrArray* IN_components, const char ** IN_options, char** OUT_device, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdStart", error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), IN_components, G_TYPE_STRV, IN_options, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_md_start_reply) (DBusGProxy *proxy, char *OUT_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_md_start_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_md_start_reply)data->cb) (proxy, OUT_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_md_start_async (DBusGProxy *proxy, const GPtrArray* IN_components, const char ** IN_options, org_freedesktop_UDisks_linux_md_start_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdStart", org_freedesktop_UDisks_linux_md_start_async_callback, stuff, _dbus_glib_async_data_free, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), IN_components, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_linux_md_create (DBusGProxy *proxy, const GPtrArray* IN_components, const char * IN_level, const guint64 IN_stripe_size, const char * IN_name, const char ** IN_options, char** OUT_device, GError **error) { return dbus_g_proxy_call (proxy, "LinuxMdCreate", error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), IN_components, G_TYPE_STRING, IN_level, G_TYPE_UINT64, IN_stripe_size, G_TYPE_STRING, IN_name, G_TYPE_STRV, IN_options, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_device, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_linux_md_create_reply) (DBusGProxy *proxy, char *OUT_device, GError *error, gpointer userdata); static void org_freedesktop_UDisks_linux_md_create_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char* OUT_device; dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_device, G_TYPE_INVALID); (*(org_freedesktop_UDisks_linux_md_create_reply)data->cb) (proxy, OUT_device, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_linux_md_create_async (DBusGProxy *proxy, const GPtrArray* IN_components, const char * IN_level, const guint64 IN_stripe_size, const char * IN_name, const char ** IN_options, org_freedesktop_UDisks_linux_md_create_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "LinuxMdCreate", org_freedesktop_UDisks_linux_md_create_async_callback, stuff, _dbus_glib_async_data_free, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), IN_components, G_TYPE_STRING, IN_level, G_TYPE_UINT64, IN_stripe_size, G_TYPE_STRING, IN_name, G_TYPE_STRV, IN_options, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_inhibit (DBusGProxy *proxy, char ** OUT_cookie, GError **error) { return dbus_g_proxy_call (proxy, "Inhibit", error, G_TYPE_INVALID, G_TYPE_STRING, OUT_cookie, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_inhibit_reply) (DBusGProxy *proxy, char * OUT_cookie, GError *error, gpointer userdata); static void org_freedesktop_UDisks_inhibit_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; char * OUT_cookie; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_cookie, G_TYPE_INVALID); (*(org_freedesktop_UDisks_inhibit_reply)data->cb) (proxy, OUT_cookie, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_inhibit_async (DBusGProxy *proxy, org_freedesktop_UDisks_inhibit_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "Inhibit", org_freedesktop_UDisks_inhibit_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID); } static #ifdef G_HAVE_INLINE inline #endif gboolean org_freedesktop_UDisks_uninhibit (DBusGProxy *proxy, const char * IN_cookie, GError **error) { return dbus_g_proxy_call (proxy, "Uninhibit", error, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID, G_TYPE_INVALID); } typedef void (*org_freedesktop_UDisks_uninhibit_reply) (DBusGProxy *proxy, GError *error, gpointer userdata); static void org_freedesktop_UDisks_uninhibit_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data) { DBusGAsyncData *data = (DBusGAsyncData*) user_data; GError *error = NULL; dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID); (*(org_freedesktop_UDisks_uninhibit_reply)data->cb) (proxy, error, data->userdata); return; } static #ifdef G_HAVE_INLINE inline #endif DBusGProxyCall* org_freedesktop_UDisks_uninhibit_async (DBusGProxy *proxy, const char * IN_cookie, org_freedesktop_UDisks_uninhibit_reply callback, gpointer userdata) { DBusGAsyncData *stuff; stuff = g_slice_new (DBusGAsyncData); stuff->cb = G_CALLBACK (callback); stuff->userdata = userdata; return dbus_g_proxy_begin_call (proxy, "Uninhibit", org_freedesktop_UDisks_uninhibit_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_cookie, G_TYPE_INVALID); } #endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_UDisks */ G_END_DECLS libfm-1.4.0/src/vapi/000077500000000000000000000000001475513661000143435ustar00rootroot00000000000000libfm-1.4.0/src/vapi/libfm.vapi000066400000000000000000000061761475513661000163270ustar00rootroot00000000000000namespace Fm { // [CCode (cheader_filename = "fm.h")] [Compact] [CCode (ref_function = "fm_path_ref", unref_function = "fm_path_unref", cname = "FmPath", cprefix = "fm_path_", cheader_filename = "fm-path.h")] public class Path { public Path(); public unowned Path get_parent(); public unowned string get_basename(); // FmPathFlags get_flags(); public bool has_prefix(Path prefix); public bool is_native(); public bool is_trash(); public bool is_trash_root(); public bool is_virtual(); public bool is_local(); public bool is_xdg_menu(); public string to_str(); public string to_uri(); public GLib.File to_gfile(); public string display_name(bool human_readable); public string display_basename(); public uint hash(); public bool equal(Path* p2); public bool equal_str(string str, int n); public int depth(); } [Compact] [CCode (ref_function = "fm_icon_ref", unref_function = "fm_icon_unref", cname = "FmIcon", cprefix = "fm_icon_", cheader_filename = "fm-icon.h")] public class Icon { public uint n_ref; public GLib.Icon gicon; public void* user_data; } [Compact] [CCode (ref_function = "fm_mime_type_ref", unref_function = "fm_mime_type_unref", cname = "FmMimeType", cprefix = "fm_mime_type_", cheader_filename = "fm-mime-type.h")] public class MimeType { public unowned Fm.Icon get_icon(); public unowned string get_type(); public unowned string get_desc(); } [Compact] [CCode (ref_function = "fm_file_info_ref", unref_function = "fm_file_info_unref", cname = "FmFileInfo", cprefix = "fm_file_info_", cheader_filename = "fm-file-info.h")] public class FileInfo { public FileInfo (); public unowned Path get_path(); public unowned string? get_name(); public unowned string? get_disp_name(); public void set_path(Path path); public void set_disp_name(string name); public int64 get_size(); public unowned string? get_disp_size(); public int64 get_blocks(); public Posix.mode_t get_mode(); public unowned MimeType get_mime_type(); public bool is_dir(); public bool is_symlink(); public bool is_shortcut(); public bool is_mountable(); public bool is_image(); public bool is_text(); public bool is_desktop_entry(); public bool is_unknown_type(); public bool is_hidden; public bool is_executable_type(); public unowned string? get_target(); public unowned string? get_collate_key(); public unowned string? get_desc(); public unowned string? get_disp_mtime(); public unowned time_t get_mtime(); public unowned time_t get_atime(); public bool can_thumbnail(); } [CCode (cname = "FmAppInfo", cprefix = "fm_app_info_", cheader_filename = "fm-app-info.h")] namespace AppInfo { public bool launch(GLib.List files, GLib.AppLaunchContext launch_context) throws GLib.Error; public bool launch_uris(GLib.List uris, GLib.AppLaunchContext launch_context) throws GLib.Error; public bool launch_default_for_uri(string *uri, GLib.AppLaunchContext *launch_context) throws GLib.Error; public static unowned GLib.AppInfo create_from_commandline(string commandline, string? application_name, GLib.AppInfoCreateFlags flags) throws GLib.Error; } }